To run a bulk AI prompt across thousands of rows in Google Sheets, use a server-side add-on rather than an in-cell =GPT() formula. You write one prompt, reference your columns by header (for example {{Company}}), and the add-on applies it to every row independently, dispatching them in parallel outside the spreadsheet. This is the only reliable way to process thousands of rows, because in-cell custom functions hit the Apps Script six-minute execution limit and recalculate on every edit. ReplyLabs does this from a sidebar, prices the run before it starts, and charges only for rows that succeed. Here is the method, why formulas stall, and how to keep the cost predictable.
What "bulk AI in Google Sheets" means
Bulk AI means applying the same instruction to every row of a column, with each row getting its own result based on its own data. It is the spreadsheet version of a for-loop: one prompt, many inputs, many distinct outputs. Common bulk jobs include:
- Generating a cold-email opener, product description, or reply draft per row.
- Classifying each row as a fit or not, or sorting free text into themes.
- Extracting a job title, city, or funding stage out of a messy notes column.
- Cleaning and translating names, addresses, or descriptions at scale.
The defining feature is volume. Doing this by hand or by copy-pasting into a chatbot does not survive past a few dozen rows, and it falls out of sync the moment the source data changes.
How to run a bulk AI prompt, step by step
- Open the sidebar with Extensions, ReplyLabs, Open sidebar.
- Select the range you want to process.
- Write your prompt and reference input columns by header, for example "Write a one-line opener for
{{Company}}based on{{Recent news}}." - Review the cost preview for your exact row count.
- Click Run. Results stream into a new column, row by row.
Because each row is an independent model call, a failure on one row never blocks the rest, and you only pay for rows that return output. If row 412 has a malformed input and fails, rows 413 onward keep going. The full guide to this flow is in AI in Google Sheets.
Why in-cell AI formulas stall on large ranges
You can write or install an in-cell =GPT() custom function, and it works for a handful of cells. At scale it hits three walls:
- The six-minute limit. Apps Script kills any execution that runs longer, so a few hundred rows can fail mid-way.
- External-call quota.
UrlFetchAppis rate-limited per day, which a real list exhausts quickly. - Recalculation storms. Sheets re-runs custom functions on edit, so the model gets called again, and you pay again.
A batched, server-side add-on dispatches rows in parallel outside the spreadsheet, so none of these apply. This is the core reason dedicated tools beat in-cell formulas for bulk work. For the formula angle specifically, see how to write an AI formula in Google Sheets.
How to write a bulk prompt that holds up at scale
A prompt that works on one row in a chat window often breaks across a thousand rows, because real data is messier than your test case. Four habits keep output consistent:
- Reference columns by header, not by hand. Use
{{Company}}or{{First name}}so the right value is substituted per row. Hard-coding a value gives every row the same answer. - Tell the model what to do with blanks. Real lists have empty cells. A line like "If no recent news is provided, write a warm generic opener" stops the model inventing facts.
- Constrain the format. Say "one sentence, no greeting" or "reply with exactly one of: Fit, Not a fit." Tight output is easy to filter downstream.
- Show one example. A single worked example anchors tone and length far better than adjectives like "concise."
These are not tool-specific tricks; they are how language models behave. They matter more in bulk because you cannot eyeball five thousand outputs, so the prompt has to be right before you run.
How to keep bulk AI cost predictable
Two things stop a bulk run from surprising you. First, see the price for your exact row count before anything runs. Second, pay only for rows that succeed, so failed or skipped rows cost nothing.
ReplyLabs prices AI at the provider's raw cost times 1.25, plus a $0.0025 base fee per succeeded row. A 1,000-row run on a small model lands in low single-digit dollars, and the exact figure shows in the cost preview before you commit. On higher tiers you can bring your own AI key, in which case the AI step runs at your provider's raw rate with no markup. To model a specific run, use the AI cost calculator.
A practical pattern keeps cost down further: draft and test your prompt on a cheap model over twenty rows, confirm the output structure, then either keep that model for the full run or step up one tier if the sample is not sharp enough.
How to keep bulk output tied to real data
Generic AI fills in a name and calls it personalised. The output is only as good as the columns you feed it. A model handed only "Acme Corp" can write something true of any company. A model handed "Acme Corp, a Series B logistics firm that just opened a Rotterdam hub" writes something true of exactly one. That extra context comes from enrichment and scraping, which is why bulk AI rarely lives alone in a real workflow.
In an outbound sequence the AI step is one stage in a chain:
- Scrape company pages or news to fill context columns with real facts.
- Verify the email addresses so you do not waste sends or AI spend on dead rows.
- Filter to the rows worth contacting.
- Run AI to write a personalised line that references the scraped facts.
Because it all happens in one sheet, there is no exporting and re-importing between tools. The verify step matters for cost too: filtering out undeliverable rows before the AI step means you do not spend on rows that will never convert.
A worked example: 2,000 personalised openers
Say you have 2,000 prospects with columns Company, First name, and a scraped About snippet, and you want a one-line opener for each.
- Confirm the inputs are real. Make sure the About column holds scraped text, not a placeholder. Decide what the prompt should do with empty rows.
- Write the prompt. "Write a one-line cold-email opener for
{{First name}}at{{Company}}. Reference one specific detail from this about text:{{About}}. One sentence, no greeting, under 25 words. If the about text is empty, write a warm generic opener that mentions{{Company}}." - Sample. Run the first twenty rows, read them, and tighten the prompt if the openers are too long or generic.
- Run the full list. Output streams into a new column. The cost preview already told you the total.
- Spot-check and ship. Sort by opener length, skim the extremes, then use the column in your sequence.
The thing that makes this work is step one. The opener is only as specific as the About column, which is why scraping feeds the AI step rather than competing with it.
Common questions
How many rows can I run a bulk AI prompt on?
With a server-side add-on, thousands of rows in a single run is normal, because the model runs outside Apps Script and the six-minute limit does not apply. In-cell formulas typically fail on large ranges.
Do I get charged for rows that fail?
With ReplyLabs, no. Only succeeded rows are charged, so failed or skipped rows cost nothing. You still see the maximum estimate in the cost preview before running.
Can I reference my own columns in a bulk prompt?
Yes. Reference any column by its header in double braces, for example {{First name}} or {{Company}}, and the value for that row is substituted before each model call.
Should I test before running thousands of rows?
Always. Run twenty rows first, read every one, and fix the prompt before scaling. Most prompt problems surface in the first twenty rows, and a small fix saves you re-running thousands. See how AI prompts work for more.
Which model should I use for bulk work?
Small, fast models suit classification and short extractions where you want low cost per row. Mid-tier models suit personalised writing. Frontier models earn their cost only on reasoning-heavy rows. The cost preview updates with the model you pick.