Automation

Closed Deals to Google Sheets: Transparent AI Credits and Bulk Excel That Won't Get You Banned

By Omar Eltak · October 10, 2026 · 13 min read

I lost 11 closed deals inside a Google Sheet in March. Not lost as in the customers walked away. Lost as in my closer marked them done in WhatsApp, the money moved, and nobody typed the row into the sheet for six days. By the time we reconciled, two customers had asked for receipts we could not find, one duplicate lead got pitched twice, and my accountant billed four extra hours of cleanup. I built OT1-Pro because I was tired of the gap between a deal closing in chat and the deal existing anywhere useful.

This post documents three systems I shipped to close that gap, with real limits and real numbers: the AI-config Connectors tab that pushes every close to your Google Sheet the second it happens, the transparent AI credit ledger that receipts every credit, and the throttled bulk Excel importer for WhatsApp and email campaigns. Every behavior below runs in production today. The short version: connect the sheet once, EVENT_DEAL_CLOSED and EVENT_LEAD_CAPTURED land in it automatically, bulk imports pass a 5-step wizard with a 2MB cap and a 30-country phone dropdown, bulk sends are throttled per team with monthly caps of Free 1, Starter 5, and Pro 25, and every AI reply deducts from a ledger you can audit line by line. The math at the end: 400 inquiries a month becomes 74 extra sales worth $6,290 at an $85 average order value.

1. The deal that closed on WhatsApp and never reached the sheet

My team sold the way most small teams in Egypt, Saudi Arabia, and the UAE sell: the conversation happened on WhatsApp, the customer said done, and the rep moved to the next chat. The sheet was supposed to be updated after the shift. It never was, at least not reliably. My audit of one month found 11 closed deals with no sheet row, 6 sheet rows with no matching conversation, and 3 customers re-pitched for products they had already bought.

The standard advice is to buy a CRM. The honest quote I got for a HubSpot-plus-WhatsApp-BSP stack was roughly $950 a month once seats, conversation charges, and template surcharges stacked up. OT1-Pro Pro is $79 a month. For a team of 3 to 30 people selling through chat, a sheet fed automatically covers 90% of the morning check: who closed, for how much, from which channel, and who still needs a nudge. The follow-up case is in our lead follow-up software breakdown. I stopped asking reps to remember the sheet and made the close event write the row itself.

2. Closed deals reach Google Sheets with no Zapier in between

The implementation lives in the AI-config Connectors tab. You paste the operator sheet URL once, map the columns once, and the system takes over. No Zapier scenario that silently pauses at a task limit, no nightly CSV export somebody must remember. The push is event-driven and fires the moment state changes in the inbox.

Every push funnels through one choke point, SalesConnectors::notify, after an early version with three call sites formatting payloads three slightly different ways taught me a lesson. Two hooks can trigger a sheet push, and both call the same notifier:

  1. The Conversation hook fires when a conversation outcome flips to closed, carrying the conversation ID, team, channel, closer, quoted value, and the buying-signal message.
  2. The Contact hook fires when the contact record changes commercially: a new lead captured, a phone confirmed, a duplicate merged, a value tier assigned.

The notifier decides which operator sheets subscribed to the event and delivers the row. If the sheet API is down, deliveries queue and replay in order, so the sheet stays a truthful timeline of what closed and when.

3. Two events only: EVENT_DEAL_CLOSED and EVENT_LEAD_CAPTURED

The first version pushed everything and operators muted the tab within a week. I cut the surface to exactly two events an owner opens the sheet to check:

  1. EVENT_LEAD_CAPTURED fires the moment a buyer is identified: name plus a verified phone or email, source channel, first intent line, and the opening qualification score. Top of funnel, in the sheet while the lead is still warm.
  2. EVENT_DEAL_CLOSED fires when the outcome flips to won: contact, final value, product or package, channel, closer or AI-agent attribution, plus a deep link back to the conversation for one-click audit.

Two events delivered reliably beat twenty delivered noisily. The deep link is the detail I am proudest of: when my accountant asked about a strange $85 row, one click showed the thread, the payment confirmation, and the AI summary. If your team handles objections in chat before the close, pair this with our AI sales agent objection-handling playbook, the sibling guide to this post.

4. The Excel import that used to corrupt phone numbers

Every team owns a graveyard Excel file: 800 numbers from a fair booth, 2,000 emails from an old store system. Hand it to the most junior rep with a broadcast tool and the sender reputation dies within a week. I rebuilt our importer around the three failure modes support tickets kept showing me.

Scientific notation. Excel renders an 11-digit number like 201026361218 as 2.011E+11 the moment the column is General format. Import that literally and you message a dead number or a stranger. Our importer detects sci-notation cells and stops with a plain instruction: re-export the column as Text and re-upload. It refuses to guess. I would rather reject your file than burn your delivery rate on 400 corrupted rows.

Mystery file sizes. Somebody always uploads a 40MB export with pivot caches, the worker times out, and half the list sends. The cap is explicit before you pick a file: 2MB. Bigger files get split or trimmed. For the genuine edge case, an over-cap file shows a founder WhatsApp escape hatch, a direct link to message me so I can split it manually. It gets used about twice a month.

Country-code roulette. A list mixing Egyptian, Saudi, and UAE numbers with no country column is a delivery disaster. The importer forces a 30-country dropdown default per import, validates every row against that country's digit pattern, and surfaces skipped and invalid counts before anything sends, each downloadable as its own CSV. Seeing 1,740 valid, 183 invalid, 77 skipped duplicates before spending one credit changes the decisions you make.

5. The 5-step bulk wizard: Upload, Map, Compose, Test, Launch

The async importer runs identically for the WhatsApp wizard and the Email wizard. Five steps in fixed order, no skipping:

  1. Upload. Drop the Excel file. The 2MB cap checks instantly, sheet names list, you pick the contacts tab. Parsing runs in a background job, so a 1,700-row file never freezes your browser.
  2. Map. Match columns to name, phone or email, country, and up to three custom fields. The sci-notation guard and 30-country digit check run here, with per-row failure reasons in plain language.
  3. Compose. Write the message with field placeholders. Unresolved placeholders fall back to a neutral default you approve here, never a raw tag leaking into a customer message.
  4. Test. The wizard sends to your own number and inbox first. This step is mandatory since the day a founder sent Hi {FIRST_NAME} to 900 people. No test success, no launch.
  5. Launch. The job fans out under the per-team throttle. Valid, sent, delivered, replied, and failed counts accumulate live, with skipped and invalid counts preserved for the audit trail.

Async is load-bearing. Closing the tab mid-launch does not stop it, and a queue restart resumes from the last acknowledged row instead of re-sending from zero.

6. The throttle that costs me signups and saves accounts

Every bulk launch runs under a per-team throttle with 30 to 60 seconds of jitter between batches, plus hard plan-tier monthly bulk limits: Free 1, Starter 5, Pro 25 campaigns per month. When a Free founder asks me to let just one extra campaign through, I say no. WhatsApp and Gmail both punish burst sending: a new number firing 800 messages in 9 minutes reads as spam infrastructure no matter how legitimate the list. The 30-to-60-second jitter paces traffic like human operations. The monthly caps force first-time bulk senders to clean the list, run the Test step, and read the first campaign's reply rate before firing a second. Pro's 25 campaigns is generous once a list is clean; Free's single campaign is a deliberate training wheel.

I publish this comparison from my own bills: $79-a-month Pro against the roughly $950-a-month HubSpot-plus-BSP stack with per-message surcharges. The BSP stack lets you blast faster, and that speed is the risk. Four teams I onboarded arrived with a banned BSP number and a 40,000-row list they feared touching. All four now send slower, smaller, cleaner campaigns from OT1-Pro with higher reply rates. If you are comparing bulk-first tools, read our OT1-Pro vs WATI breakdown before committing to a platform whose revenue grows when you over-send.

7. The AI credit ledger: every credit carries a receipt

Every AI action, a reply sent, a thread analysis, a qualification score, a follow-up composed, deducts from a per-team balance, and every deduction writes a row to a ledger you can open and read. Two entry types cover nearly everything: Message for per-reply work and DeepAnalysis for heavier thread-level reasoning. Each row shows the conversation, the action, the serving model chain, and the cost. When a founder asks where 300 credits went in April, I open their ledger and walk through it line by line.

Three interface decisions keep it honest. The meter chip in the header shows the live balance everywhere, so spending is visible before it happens. Any single action burning more than 5 credits pops a confirmation modal with the exact cost and a cancel button; heavy analyses of 200-message threads are the usual trigger. And the ladder is a published 4-tier structure with top-ups through manual bank-transfer payments reviewed by a human, not an auto-charging card. MENA founders asked for this explicitly: cards fail and limits trigger, and nobody wants an AI agent holding an open line to their Visa. Each transfer shows reference number, approval state, and credited amount, all reconcilable against the ledger.

All three controls are scar tissue from one weekend when silent deductions let a looping automation re-analyze the same thread 400 times and burn a month of quota. The ledger, the meter chip, and the over-5-credit modal exist so that weekend never repeats: you see each deduction before it lands, approve the expensive ones explicitly, and audit everything afterward.

8. The self-healing model pool behind every credit

Credits stay trustworthy only while the models behind them stay alive. OT1-Pro does not call one model; it calls a pool through NaraRouter, with a nightly job refreshing the available list from the live /v1/models endpoint. There are no hardcoded model names in the serving path, because hardcoded names are how you wake up to a dead provider: the vendor renames a model, the pinned string 404s, and every customer message fails until a human notices. Our pool serves only what the endpoint actually returned that night.

When the whole pool exhausts at once, quota drained or upstream outage, it enters a 30-minute global cooldown, one timestamp the fleet reads in microseconds. SendAiResponse honors it directly: instead of hammering a dead pool with retries that burn quota and latency, the job releases itself onto the queue with delay plus jitter, bounded by tries = 2. The message waits calmly instead of failing loudly, then gets its two fair attempts after the window. Thirty minutes matches the recovery profile from three real NaraRouter incidents: shorter windows re-entered a still-dead pool, longer ones held replies hostage. Credits deduct only for work performed, never for retries against a dead pool. If Meta-side OAuth pain is your current fire instead, start with our Meta app verification founder guide, the most-read thing I have written for a reason.

9. The math: 400 inquiries, 74 extra sales, $6,290 a month

A typical month for a small store or clinic on WhatsApp and Instagram ads: 400 inbound inquiries. Answering manually in working hours closes about 12%, or 48 sales, because nights, Fridays, and the ghost-after-price pattern eat the rest. With instant AI first reply, the 3-touch follow-up sequence, objection handling, and every close pushed to the sheet so nothing slips, the same 400 inquiries close 122 sales. That is 74 extra sales, and at an $85 average order value, 74 × 85 = $6,290 per month in recovered revenue against a $79 Pro subscription.

Monthly inquiry volumeManual handling hoursAutomated cost on OT1-Pro
100 inquiries~9 hours of rep time$0 extra on Free (1 bulk/mo included)
400 inquiries~36 hours of rep time$79 Pro, 25 bulk/mo, ledger included
1,500 inquiries~135 hours of rep time$79 Pro, same cap, throttle protects sender
5,000 inquiries~450 hours of rep time$79 Pro + credit top-ups at ladder rates

Manual hours assume 5 to 6 minutes of human attention per inquiry across first reply, qualification, follow-ups, and sheet entry; at 400 inquiries that is ~36 hours, nearly a full work week the connector, wizard, and agent now absorb. Cost stays flat at $79 through 1,500 inquiries because the throttle and ledger scale with queue depth, not headcount. Against the $950 HubSpot-plus-BSP stack, payback lands in month one: $6,290 recovered against $79 spent.

10. What I would do on Monday morning

The exact onboarding order I walk new teams through, under an hour:

  1. Connect the sheet first. In the AI-config Connectors tab, paste the operator sheet URL and confirm one EVENT_LEAD_CAPTURED test row lands, then close a test conversation and confirm the EVENT_DEAL_CLOSED row with its deep link.
  2. Import the smallest list, not the biggest. Run a 200-row file through Upload, Map, Compose, Test, and Launch on Free's single monthly bulk. Read the skipped and invalid counts, fix the source file, and watch the second campaign beat the first on reply rate.
  3. Review the ledger every Friday. Five minutes: check the Message-to-DeepAnalysis ratio, confirm no thread is looping analyses, approve over-5-credit modals deliberately.
  4. Let the pool heal itself. If replies ever pause fleet-wide, check the cooldown state before touching settings. The 30-minute window is usually already counting down and messages drain with their two tries intact.
  5. Measure the 74. Count closes from the sheet at month end, multiply extras by your real average order value, compare against $79. The system earns its keep at almost any AOV above $20 because recovered deals compound monthly.

I started OT1-Pro to stop losing deals between the chat and the sheet. The Connectors tab, the throttled bulk wizard, and the transparent credit ledger closed that gap for my own team, and the self-healing pool keeps them alive overnight. Start free, connect one sheet, import one small list, and watch the ledger. Start free today →

Stop losing the leads you already earned

OT1-Pro runs your follow-up, analysis, and AI replies in one inbox — WhatsApp, Instagram, Messenger, Telegram, and email, in Arabic or English, scored by lead quality, with every AI credit receipted in a transparent ledger. Free plan, no credit card.

Start free → · Sales follow-up automation · Lead follow-up software · Pricing · vs WATI · Talk to the founder on WhatsApp

Ready to try OT1-Pro?

Connect WhatsApp, Instagram, Facebook & Telegram with AI that sells for you.

Get started free
Keep reading

Related stories