- A "loop" is any task where you copy the same kind of data between the same tabs to produce one output. Spreadsheet to CRM is the textbook case.
- You do not automate the whole job at once. You automate the loop inside it. That is the part that repeats, and the part a machine can take.
- The first build is a prompt you paste into any AI chat tool. It cleans and structures the messy rows in seconds.
- The second build is a short script that writes straight to your CRM. No AI at runtime, no monthly fee, and it never gets bored on row 38.
- The same pattern fits any repetitive task, so once you can automate the data entry you do by hand, you can reuse it everywhere.
Welcome to The Loop. Every Wednesday we take one real, repetitive workflow that someone does by hand and unwind it into something you can run. Not a think piece about the future of work. A specific loop, broken into a specific build, with the prompt and the script right there on the page.
Here is the idea that makes this series worth your time. The boring task you repeat every week is not just a chore. It is a specification in disguise. Every time you do it by hand, you are following a recipe you already know by heart. The only reason a machine is not doing it instead is that nobody has written the recipe down and handed it over. The moment you can describe the loop, you can automate it. Describing replaces doing.
This week's loop is the one almost everyone has touched at some point: taking new leads out of a spreadsheet and entering them into a CRM. Let us watch it happen, count what it costs, and then turn it into a build by the end of the page.
The Loop, in Full
Before you can automate anything, you have to see the loop clearly, so here it is start to finish. Picture a Monday morning at a small sales team.
New leads land in a Google Sheet all week, dropped there by a website form. Every Monday, one person opens that sheet next to the CRM and works down the new rows. For each lead they copy the name, email, and company across, check that the person is not already in the system, set a tag for where the lead came from, and move to the next row. At the end they paste a short summary into Slack so the team knows what came in. Thirty to forty rows, about forty-five minutes, every single week.
Written out as steps, the by-hand version looks like this:
- Open the leads spreadsheet and find the rows added since last week.
- For each new row, copy the name, email, and company into the CRM.
- Search the CRM first to make sure the contact does not already exist.
- Set a source tag on the new contact so reporting stays clean.
- Paste a one-line summary of the week's intake into the team channel.
Nothing here is hard. That is exactly why it is worth automating. Hard tasks need judgment. This one needs patience, and patience is the thing humans run out of and machines never do.
The Manual Tax
The real cost of a loop is never just the minutes on the clock. It is the minutes, plus the mistakes, plus the time the work sits waiting. Add those up and you get what we call the manual tax.
Start with the minutes, because they are not unusual. In a survey from Smartsheet, more than 40% of workers said they spend at least a quarter of their work week on manual, repetitive tasks. Forty-five minutes of lead entry is one small brick in a much larger wall.
Then add the two costs that hide behind the minutes:
- Errors. One fat-fingered email address means a real lead never gets a follow-up. The mistake is invisible until a deal that should have existed quietly does not.
- Latency. A lead that came in on Tuesday sits untouched until Monday. By the time anyone reaches out, the person has moved on or talked to a competitor. Speed is part of the product, and the manual loop is slow by design.
Every manual loop is a tax you pay in attention, and attention is the one budget you can never top up.
So the goal is not to save forty-five minutes. The goal is to stop paying the tax: enter every lead correctly, the moment it arrives, without anyone spending their Monday on it.
Unwinding the Loop
Automating starts with description, not code. You describe the loop precisely enough that a machine could follow it without you in the room, and most of the work is done before a single line is written. This is the part BYOBot does through conversation, and it is the difference between an automation that holds up and one that breaks the first time the data looks slightly different.
Here is the same loop, captured as a spec. Notice that the interesting parts are the decisions, not the steps:
| Part of the loop | What it is for this workflow |
|---|---|
| Trigger | New rows appear in the leads sheet (checked on a schedule, or on demand). |
| Input | Name, email, company, and the source column from each new row. |
| Decision: duplicate? | If the email already exists in the CRM, skip it. Never create the same contact twice. |
| Decision: tag | Map the sheet's source column to the CRM's source field so reporting stays clean. |
| Output | A new, tagged contact in the CRM, plus a one-line summary posted to the team. |
| Success signal | Contact count goes up by the number of genuinely new leads, and Slack shows the recap. |
That table is the whole automation. Everything after this is just choosing how hands-off you want the machine to be. If you want to see what this looks like as a guided conversation rather than a table you fill in yourself, that is exactly how BYOBot turns a task into a spec, one question at a time. And if you would rather learn the discipline of writing these specs by hand, we wrote a whole guide on how to write a workflow spec that goes deeper than we can here.
Describe your own version of this loop and BYOBot will turn it into a spec, then a build you can run.
The Build: One Loop, Three Ways to Run It
The same described loop becomes three different builds depending on how much you want running on its own. Start at the top and move down only when you are ready. Most people are surprised how far the prompt gets them.
The Prompt
The prompt build is prompt engineering: a saved prompt you paste into any AI chat tool, with no setup at all. It will not write to your CRM for you, but it will do the tedious middle of the loop, turning messy rows into clean, deduped, CRM-ready records and a ready-to-send summary. You paste the raw rows in, you get structured output back, and you do the final paste yourself.
You are cleaning new leads for CRM entry. I will paste rows copied from a spreadsheet (name, email, company, source). For each row: - Trim whitespace and fix obvious casing (names and companies). - Flag any row whose email is malformed or missing. - Mark as DUPLICATE any email that repeats within this batch. - Map the source column to one of: Website, Referral, Event, Other. Return two things: 1. A clean table ready to paste into the CRM, duplicates and bad rows removed. 2. A one-line summary: how many new leads, broken down by source. Here are the rows: [paste rows here]
That prompt works the same in ChatGPT, Claude, or Gemini, because the prompt is never locked to one vendor. It is the fastest possible win, and for a small team it might be all you ever need. When the volume grows and the manual paste starts to sting, you move down a level. The same logic applies if you want to automate your HubSpot workflows beyond lead entry: get the prompt right first, then let a script carry it.
The Script
The script is where the loop runs without you touching it. For a spreadsheet-to-CRM workflow, the honest answer is not a fancy AI agent clicking around your browser. It is a short, plain script that reads the sheet through an API and writes to the CRM through an API. No AI at runtime, no subscription, and far more reliable than anything navigating a screen.
The script reads new rows with the Google Sheets API, checks each email against the CRM through the HubSpot contacts API, creates only the genuinely new contacts, and posts the recap to your channel. The shape of it is small enough to read in one sitting:
// pseudo-shape of the script BYOBot generates for you
const rows = await sheets.getNewRows(SHEET_ID, lastRunAt);
const recap = { Website: 0, Referral: 0, Event: 0, Other: 0 };
for (const row of rows) {
if (!isValidEmail(row.email)) continue; // skip bad rows
if (await crm.contactExists(row.email)) continue; // never duplicate
await crm.createContact({
email: row.email, name: row.name,
company: row.company, source: mapSource(row.source),
});
recap[mapSource(row.source)]++;
}
await slack.post(`New leads added: ${summarize(recap)}`);
You do not write this from a blank page. BYOBot generates the full version, including the file to create, the exact commands to run, and a list of the credentials to paste in. Your job is to fill in the keys and run it once against a few rows to confirm it behaves. The same approach lets you automate your Google Sheets workflows in general, and you can have it send the Slack summary automatically as the last step so nobody has to remember to.
The Schedule
The schedule is the smallest leap of all once the script runs clean: you stop running it by hand and put it on a timer. The exact same script, triggered every morning, means leads are entered within hours of arriving instead of waiting for Monday. You can schedule it for free with a cron job or a GitHub Actions workflow, or if you would rather stay no-code, a tool like Zapier can run the same logic on a schedule.
Here is how the three builds stack up, so you can pick your stopping point:
| Build | What runs it | Setup | Runs unattended? |
|---|---|---|---|
| The prompt | You, pasting into any AI chat tool | Minutes | No |
| The script | A short script you run when you want | An hour, once | On demand |
| The schedule | The same script on a timer | A few extra minutes | Yes |
Steal This Build
Here is the whole loop as a spec you can hand to BYOBot or build yourself this afternoon. Copy it, change the tool names to match your stack, and you have your own version.
- Trigger: new rows in the leads sheet, on a schedule or on demand.
- Clean: trim and fix the fields, drop malformed emails.
- Dedupe: skip any email already in the CRM.
- Write: create each new contact with the mapped source tag.
- Report: post a one-line recap to the team channel.
The loop you just watched is a lead-entry loop, but the shape is universal. Any task where you copy a known kind of data between the same tools, on a rhythm, fits this exact mold. Learn it once and you start seeing loops everywhere in your week.
Tell BYOBot about a loop in your week
Describe the task you keep doing by hand and BYOBot will design the full playbook: the prompt, the script, and the schedule that runs it for you.
Frequently Asked Questions
-
Look for repetition plus tabs. If you do the same kind of task on a regular rhythm, and it involves copying data between two or more tools to produce one output, it is a loop. The stronger the rhythm and the more tabs involved, the better the candidate. A task you do once is not a loop. A task you do every Monday across a spreadsheet, a CRM, and a chat tool is the textbook case, and the same test applies to any data entry you want to automate.
-
No. BYOBot writes the full script for you, including the file to create, the commands to run, and the exact credentials to paste in. Your job is to fill in the blanks and run it once to confirm it works. This is the heart of no-code automation: you describe the loop in plain language and walk away with the implementation, rather than starting from an empty editor.
-
Yes, with two habits. First, dedupe before you write, so a re-run never creates the same contact twice. Second, run it against a handful of rows first and check the result before you point it at the full list. Scoped API keys help too: give the script permission to create contacts and nothing else. Done this way, automated lead management is more reliable than hand entry, because it never gets bored on row 38.
-
Zapier is one way to run the loop, and a good one for simple no-code syncs. But it is a single execution layer. BYOBot sits upstream of it: it captures the whole loop as a spec, including the dedupe rule, the tagging logic, and the edge cases, then hands you the right build for the job. Sometimes that is a Zapier flow. Sometimes a short script is cheaper and more reliable. The spec is what travels; the tool is a choice you make after.
