[{"data":1,"prerenderedAt":291},["ShallowReactive",2],{"content-\u002Fautomate\u002Fai-data-entry":3,"content-doc-\u002Fautomate\u002Fai-data-entry-inline":3},{"id":4,"title":5,"author":6,"body":7,"date":6,"description":283,"extension":284,"meta":285,"navigation":286,"order":6,"path":287,"seo":288,"stem":289,"__hash__":290},"automate\u002Fautomate\u002Fai-data-entry.md","AI Data Entry | axiom",null,{"type":8,"value":9,"toc":266},"minimark",[10,19,24,27,31,34,37,41,43,46,49,58,61,65,67,70,73,77,79,87,90,98,100,114,126,133,135,151,160,170,174,176,179,183,187,189,192,197,205,241,245,248,252,255,259,262],[11,12],"left-hero-automate",{"description":13,"primaryText":14,"primaryTo":15,"secondaryText":16,"secondaryTo":17,"title":18},"Describe the job and axiom's AI builds a bot that types each row from your spreadsheet into any web app, then helps you run and fix it. Start no-code, in code, or with a Claude skill.","Get started no-code","#no-code","Get started code","#code","AI Data Entry",[20,21,23],"h2",{"id":22},"what-ai-data-entry-means","What AI data entry means",[25,26],"hr",{},[28,29,30],"p",{},"AI data entry means a bot does the keying and the AI does the building.",[28,32,33],{},"Point it at your web app, describe where each value goes, and it works through your data one row at a time, text fields, dropdowns, dates, toggles, saving each record and starting the next.",[28,35,36],{},"It never gets bored or loses its place on row forty.",[20,38,40],{"id":39},"where-the-ai-actually-helps","Where the AI actually helps",[25,42],{},[28,44,45],{},"Three places. First, building: you describe the entry in plain words and the AI lays out the steps to review before anything runs.",[28,47,48],{},"Second, the source data: real spreadsheets are messy, a date in the wrong format, a name in caps, an address on two lines, and an AI step can normalise a value before it goes in so a bad row does not stall the run.",[28,50,51,52,57],{},"Third, help while you build: a no-code ",[53,54,56],"a",{"href":55},"\u002Fai-assistant","AI assistant"," in the extension, powered by Claude, adds steps, loops a range, or fixes a broken selector on request.",[28,59,60],{},"The keying itself is plain automation; the AI builds it and cleans the input, it does not invent values.",[20,62,64],{"id":63},"who-this-is-for","Who this is for",[25,66],{},[28,68,69],{},"Anyone who re-keys data into a web app with no import button: CRMs, dashboards, billing portals, legacy internal tools.",[28,71,72],{},"If your data already lives in a sheet or CSV and you're copying it across by hand, hand it off.",[20,74,76],{"id":75},"how-id-approach-it","How I'd approach it",[25,78],{},[28,80,81,82,86],{},"Describe the entry, listing the fields and where each value comes from, and let ",[53,83,85],{"href":84},"\u002Fbuild-with-no-code\u002Fdescription","Build with description"," lay out the first draft.",[28,88,89],{},"Run one row to check it before you loop the rest, and delete or mark each row as it goes in so a re-run never enters the same record twice.",[20,91,93,94],{"id":92},"build-the-data-entry-bot-from-a-description","Build the data entry bot from a description ",[95,96],"span",{"id":97},"no-code",[25,99],{},[28,101,102,103,109,110,113],{},"Describe the entry in the ",[53,104,108],{"href":105,"rel":106},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb",[107],"nofollow","Chrome extension"," and the AI builds the steps for you. ",[53,111,112],{"href":84},"Explore no-code",".",[115,116,123],"build-with-description",{":instructions":117,":maxChars":118,":secondaryLinks":119,"instructionsLabel":120,"panelHeading":121,"panelStatus":122,"primaryText":108,"primaryTo":105},"[\"Read the rows from my Google Sheet\",\"Go to the web app\",\"Enter the customer name\",\"Enter the email and phone\",\"Select the account type\",\"Click save\",\"Delete the row I just entered\"]","500","[]","Instructions","Describe your data entry bot","Ready",[28,124,125],{},"An example is on the right. Describe the entry and the AI lays out the steps.",[20,127,129,130],{"id":128},"build-the-data-entry-bot-in-code","Build the data entry bot in code ",[95,131],{"id":132},"code",[25,134],{},[28,136,137,141,142,146,147,113],{},[138,139,140],"strong",{},"Build with code."," Describe the entry to our ",[53,143,145],{"href":144},"\u002Fbuild-in-claude","Claude skill"," and it generates and debugs a ready-to-run script you own. Prefer to write it yourself? ",[53,148,150],{"href":149},"\u002Fbuild-with-code","Explore the code tool",[152,153,157],"build-with-code",{":secondaryLinks":119,"code":154,"filename":155,"primaryText":156,"primaryTo":144},"import { AxiomApi } from \"axiom-api\";\n\nconst axiom = new AxiomApi(process.env.AXIOM_API_KEY);\n\n\u002F\u002F One row from your Google Sheet\nconst row = { name: \"Ada Lovelace\", email: \"ada@example.com\", phone: \"020 7946 0000\" };\n\nawait axiom.browserOpen();\ntry {\n  await axiom.goto(\"https:\u002F\u002Fapp.example.com\u002Fcustomers\u002Fnew\");\n  await axiom.enterText('input[aria-label=\"Customer name\"]', row.name);\n  await axiom.enterText('input[aria-label=\"Email\"]', row.email);\n  await axiom.enterText('input[aria-label=\"Phone\"]', row.phone);\n  await axiom.click('button[type=submit]');\n} finally {\n  await axiom.browserClose();\n}\n","data-entry.js","Generate it with the Claude skill",[28,158,159],{},"axiom's step functions, the same library the no-code builder uses. The Claude skill generates and debugs the script for you, and it runs on our cloud Chromium.",[161,162],"ask-claude-automate",{"description":163,"eyebrow":164,"image":165,"imageAlt":166,"primaryText":167,"primaryTo":55,"secondaryText":168,"secondaryTo":144,"title":169},"axiom's no-code AI assistant is built into the Chrome extension, powered by Claude. Describe the entry and it adds, loops, and edits the steps, configures the run, and debugs anything that breaks. Prefer to drive from Claude itself? The Claude skill builds it too.","AI assistant, built in","\u002Flanding\u002Fai-assistant.webp","axiom's AI assistant building a data entry bot in the extension","Meet the AI assistant","Use the Claude skill","An AI assistant helps you build the data entry bot.",[20,171,173],{"id":172},"what-can-the-data-entry-bot-handle","What can the data entry bot handle?",[25,175],{},[28,177,178],{},"Most web apps. A couple of cases worth knowing first.",[180,181],"tone-cards",{":cards":182},"[{\"title\":\"Works well\",\"items\":[\"Typing rows from a sheet into a web app\",\"CRMs, dashboards, and legacy internal tools\",\"Dropdowns, dates, toggles, and checkboxes\",\"Tidying messy source data with an AI step\",\"Scheduled, unattended runs\"]},{\"title\":\"Harder\",\"items\":[\"Apps behind SSO or two-factor login\",\"File attachments on a record\",\"Strict server-side validation\",\"Tables that load on infinite scroll\"]},{\"title\":\"Don't try\",\"items\":[\"Entering data you are not allowed to handle\",\"Bypassing a paywall or a rate limit\",\"Anything against a site's terms\"]}]",[20,184,186],{"id":185},"what-id-watch-out-for","What I'd watch out for",[25,188],{},[28,190,191],{},"Data entry looks simple, but a few things trip up a bot.",[193,194,196],"h3",{"id":195},"target-each-field-with-a-custom-css-selector","Target each field with a custom CSS selector",[28,198,199,200,204],{},"Many web apps render inputs without a stable id, so a position-based selector breaks when the layout shifts. In the ",[53,201,203],{"href":202},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool","selector tool",", use a custom CSS selector on an attribute that does not move, like the field's aria-label. For example:",[206,207,212],"pre",{"className":208,"code":209,"language":210,"meta":211,"style":211},"language-css shiki shiki-themes github-light-default github-dark-default","input[aria-label=\"Email\"]\n","css","",[132,213,214],{"__ignoreMap":211},[95,215,218,222,226,230,234,238],{"class":216,"line":217},"line",1,[95,219,221],{"class":220},"sjgCt","input",[95,223,225],{"class":224},"s4rv2","[",[95,227,229],{"class":228},"sHrmB","aria-label",[95,231,233],{"class":232},"sjeE4","=",[95,235,237],{"class":236},"sSVrQ","\"Email\"",[95,239,240],{"class":224},"]\n",[193,242,244],{"id":243},"delete-or-mark-each-row-after-it-goes-in","Delete or mark each row after it goes in",[28,246,247],{},"Have the bot delete or flag the row right after it saves, so a re-run picks up where it left off instead of entering the same data twice.",[193,249,251],{"id":250},"clean-the-data-before-it-loops","Clean the data before it loops",[28,253,254],{},"Strict validation stops a bad row, and one stuck row stalls the whole run. Use an AI step to normalise dates, names, and addresses up front, and check a sample first.",[193,256,258],{"id":257},"test-one-record-first","Test one record first",[28,260,261],{},"Run one row and check the app before you loop. Watch the first run on the desktop app to see exactly where each field lands.",[263,264,265],"style",{},"html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":211,"searchDepth":267,"depth":267,"links":268},3,[269,271,272,273,274,275,276,277],{"id":22,"depth":270,"text":23},2,{"id":39,"depth":270,"text":40},{"id":63,"depth":270,"text":64},{"id":75,"depth":270,"text":76},{"id":92,"depth":270,"text":93},{"id":128,"depth":270,"text":129},{"id":172,"depth":270,"text":173},{"id":185,"depth":270,"text":186,"children":278},[279,280,281,282],{"id":195,"depth":267,"text":196},{"id":243,"depth":267,"text":244},{"id":250,"depth":267,"text":251},{"id":257,"depth":267,"text":258},"AI data entry that builds itself from a description. Read each row from a spreadsheet, fill every field in your web app, and save, one record after another. No-code, code, or a Claude skill.","md",{},true,"\u002Fautomate\u002Fai-data-entry",{"title":5,"description":283},"automate\u002Fai-data-entry","OrmYm7kJkYhgLBwcs5VwT8mqg_LwliYhWm8C3r_TvTk",1783069574967]