agentclaw

Articles

Our Build Log: What Breaks in Production Automations

Sophie Adams · Aug 8, 2026 · 20 min read

Cover card reading: what actually breaks in production automations, over the agentclaw claw mark.

TL;DR

  • The model getting the answer wrong is rarely what takes an automation down. It goes down at the joins: expired credentials, rate limits, schema drift and silent partial success.
  • Google kills an OAuth refresh token after exactly seven days while your consent screen still says Testing, and hands back invalid_grant with no other warning.
  • Zapier replays a failed step five times across ten hours and thirty five minutes, and sends no error email until the last attempt fails. The outage is always older than the alert.
  • Retries multiply rather than add. Google's own worked example turns one failed user action into 64 calls on the database that was already struggling.
  • Finding the break costs more than fixing it in every category on our list, which is why the detection now gets more of the build budget than the clever part does.

Every automation we have shipped worked on the day we shipped it. That is the least interesting fact about any of them. The interesting question is what happened in week six, and the honest answer is that something broke, and it was almost never the part anybody worried about during the build. So here is the list, in the order it actually costs us, with the vendor documentation that explains each one and what it takes to put right.

The clever part is not what breaks

The reasoning, the prompt, the branching logic, the bit that took the longest to get right: that part survives. What goes down is the plumbing around it. A token expires. A source system renames a field. A per-second cap gets crossed on the one morning somebody runs a backfill. None of it is interesting and all of it is load-bearing.

The field is very quiet about this, which is the first thing worth noticing. Search for why automations fail and you get a dozen pages listing six or eight failure modes with no citation on any of them, written by shops that sell reliability. The closest thing to a public number is old: in Forrester Consulting research commissioned by Tricentis back in 2020, 45% of firms said they dealt with bot breakage weekly or more often, and 99% said their bot logic required some scripting. Six years on, that is still the number people cite, which tells you how little anybody has published since.

We are not going to pretend we have a tidy internal dataset to put next to it. What we have is a list, an ordering, and the vendor documentation that explains the mechanism behind each item. The ordering is ours and it is a judgment, not a measurement. The mechanisms are not judgments: every one of them is written down by the vendor, in public, usually in a help article nobody reads until the second time it happens.

Eight failure categories for production automations: expired credentials, rate limits, schema drift, silent partial success, retry storms, third-party page changes, clocks and calendars, and unstructured input. Silent partial success is highlighted as the expensive one.
Silent partial success is highlighted because it is the only one on the list that can run for weeks while every dashboard stays green.Sources: Zapier Help, How to troubleshoot errors in Zap workflows, 2026; Google Identity, Using OAuth 2.0 to Access Google APIs, 2026; HubSpot, API usage guidelines and limits, 2026
Show the data behind this infographic
  • Expired credentials. An OAuth refresh token dies on a documented clock. Nothing in the workflow knows.
  • Rate limits. A backfill or a busy Monday crosses a per-second cap and every call after it returns 429.
  • Schema drift. Someone renames a field in the source system. The mapping still points at a name that is gone.
  • Silent partial success. The run reports success having quietly skipped every record that did not match.
  • Retry storms. Each layer retries the layer below. The load multiplies, the bill multiplies, the cause disappears.
  • Third-party page changes. A scraped or clicked page moves a container. The step still runs and now returns nothing.
  • Clocks and calendars. A jurisdiction drops daylight saving, or the month ends on a Sunday, and the run fires into the wrong window.
  • Unstructured input. A rotated scan, a merged cell, a second page. The demo file never had any of those.

1. Credentials expire on a clock nobody put in the calendar

This is the single most common way a working automation stops working, and the mechanism is published. Google's OAuth documentation says a refresh token stops working if the user revokes access, if it has not been used for six months, if the user changed their password and the token carries Gmail scopes, if an admin restricted one of the scopes, or if the account has hit its ceiling on live refresh tokens. Then there is the one that catches almost everybody: a project whose OAuth consent screen is still in Testing gets tokens that expire in seven days. Not seven days from a warning. Seven days from issue, and then invalid_grant.

Seven days is exactly long enough for a build to be signed off, demoed, praised, and forgotten about. Nobody moves the consent screen to production because nobody knew that was a step, and the thing dies the following Tuesday.

Microsoft publishes its own clocks. Entra refresh tokens last 24 hours for a single-page app and 90 days for everything else, self-renewing on each use, and the same table lists which kinds of password change and admin action revoke them outright. That table is worth reading before you build anything against a Microsoft tenant, because half the rows say the token stays alive and half say it dies, and the difference is whether the client is confidential.

Log-scale bar chart of documented maximum OAuth refresh token life: Microsoft Entra single-page app one day, Google OAuth with the consent screen in Testing seven days, Microsoft Entra all other cases 90 days, Google OAuth left unused 180 days.
Four different ceilings across two providers, and the shortest one is a configuration state rather than a setting anybody chose.Sources: Google Identity, Using OAuth 2.0 to Access Google APIs, 2026; Microsoft Learn, Refresh tokens in the Microsoft identity platform, 2025
Show the data behind this chart
Provider and configurationDocumented maximum life
Microsoft Entra, SPA redirect URI24 hours
Google OAuth, consent screen still in Testing7 days
Microsoft Entra, every other scenario90 days
Google OAuth, refresh token left unused180 days

2. Rate limits do not break the build, they break the backfill

A workflow that runs twelve times a day will never see a rate limit. The day you migrate three years of history into it, you will see nothing else.

HubSpot publishes its numbers: 100 requests per 10 seconds on Free and Starter, 190 on Professional and Enterprise, and a daily ceiling of 250,000, 625,000 or 1,000,000 depending on the tier. Cross either and you get a 429 with errorType: RATE_LIMIT and a policyName telling you whether you hit the per-second cap or the daily one. Read the second half of that page carefully, because it contains the part that actually bites: the burst limit is per app, but the daily limit is shared across every app on the account. Somebody else's integration can spend your budget, and the error will arrive in your logs.

The fix is a queue and a concurrency ceiling, and it is not hard. The expensive part is that you find out on migration day, with 40,000 records half moved and no way to tell which half.

3. Retries hide the cause and then bill you for it

Every platform retries, and retrying is correct. The trouble is that retries multiply through a stack instead of adding up.

The Google SRE book puts it plainly: if a database is struggling and the backend, the frontend and the browser script each retry three times, one user action lands as 64 attempts on the database. The chapter's recommendation is a cap rather than a longer wait. Limit retries per request, and give the whole process a budget, their example being 60 retries a minute, after which you stop retrying and fail honestly.

On an automation with a model in it, the multiplier is also a price. A retried step is a repriced step, and a workflow that quietly went from one attempt to five overnight has quintupled its own token bill without anybody changing a line of it. We put a spend ceiling on every workflow that calls a paid API, for exactly this reason. It is a cheap control, and it is the one that tells you about a retry loop before the invoice does.

Log-scale bar chart showing calls landing on the bottom service as retry layers stack: 4 calls with one layer, 16 with two, 64 with three, and 256 with four, when each layer retries three times.
Every layer that retries politely makes the outage worse, which is why the fix is a cap on attempts rather than a longer gap between them.Source: Google SRE Book, Addressing Cascading Failures, 2016
Show the data behind this graph
Layers of the stack that retryCalls landing on the bottom service
1 layer, four attempts4
2 layers16
3 layers (Google's worked example)64
4 layers256

4. The silence window is longer than the outage

This is the one that costs a client relationship rather than an afternoon, so it is worth knowing the exact numbers.

Zapier's own help article on replay says Autoreplay retries a failed step up to five times, on a backoff of 5 minutes, then 30 minutes, then 1 hour, then 3 hours, then 6 hours. Their worked example: a Zap that errors at 1:00pm gets its final attempt at 11:35pm. Ten hours and thirty five minutes. And then the sentence that matters more than any of it, quoted from that same page: "Zapier will not send any error notification emails until the final autoreplay attempt fails."

So a step that dies at nine on Monday morning generates its first email at half past seven that evening, into an inbox nobody is reading, and gets looked at on Tuesday. The workflow was down for a full working day and the run history said pending the whole time.

The other threshold on Zapier's error troubleshooting page is worth holding next to it. A Zap turns itself off when 95% of its runs error over the last seven days. That is a sensible circuit breaker and it is also a floor: a Zap failing on nine runs in ten stays on indefinitely, quietly dropping 90% of the work, because 90 is not 95.

Timeline of a Zapier step that errors at 09:00 on Monday, is replayed at 09:05, 09:35, 10:35, 13:35 and 19:35, triggers its first error email at 19:35, and is read by a person at 09:00 on Tuesday.
Twenty four hours from break to human, and every minute of it is documented default behavior rather than a bug.Source: Zapier Help, What is replay, 2026
Show the data behind this diagram
TimeWhat happens
09:00 MondayA step errors. The run shows as pending.
09:05Autoreplay attempt 1 fails. No notification.
09:35Attempt 2 fails. No notification.
10:35Attempt 3 fails. No notification.
13:35Attempt 4 fails. No notification.
19:35Attempt 5, the final one, fails. First error email sent.
09:00 TuesdaySomebody opens the inbox and reads it.

5. Schema drift, where somebody renames a field and nothing throws

Two flavors, and the loud one is the easy one.

The loud flavor is a version being retired. Salesforce retired platform API versions 21.0 through 30.0 in the Summer '25 release, and documents exactly what a retired call gets back: REST returns 410 GONE, SOAP returns 500 UNSUPPORTED_API_VERSION, and Bulk returns 400 InvalidVersion. That is a good failure. It is unmissable, it is dated years in advance, and you can grep for it.

The quiet flavor is the one that costs money. A client's ops lead renames a picklist value, or adds a required field, or changes a currency column from a number to a string with a symbol in it. Every call still returns 200. Your mapping now writes an empty string into a field that used to hold a value, and it does that a few hundred times before anybody looks at the output closely enough to notice.

Why this stays invisible is not a mystery either. Postman's 2025 State of the API report surveyed developers on exactly this discipline, and the answers are the reason drift is a category rather than an incident.

Nobody is watching the contract, so drift arrives silently

Four numbers from the same survey, and together they explain why a renamed field turns into a two week data problem instead of a failed request.

of developers version their APIs at allPostman, 2025 State of the API Report (2025)
60%
use semantic versioning, so a breaking change is signpostedPostman, 2025 State of the API Report (2025)
26%
practice contract testing, the one check that catches driftPostman, 2025 State of the API Report (2025)
17%
use no API monitoring tools whatsoeverPostman, 2025 State of the API Report (2025)
17%
Figures are self-reported by developers about the APIs they build, which is the upstream end of every integration you own.

6. Third-party pages move and the step still returns 200

Any workflow that reads a page rather than an API inherits somebody else's release schedule. A container gets renamed, a table becomes a set of divs, a login flow adds a step, and your selector matches nothing.

We went looking for a citable number on how often this happens and there is not one. Plenty of pages assert that websites change constantly. None of them measured it, and the ones that came closest are scraping vendors with an obvious interest in the answer. So the honest version is: nobody publishes this, and the absence is itself worth knowing when somebody quotes you a confident uptime figure on a scraped source.

What we can say precisely is what the failure looks like, because it is always the same shape. The step succeeds. It returns zero rows. Downstream, a report renders with no data in it and a green tick next to it. If your monitoring only watches for errors, this is invisible forever.

7. The calendar breaks things on a schedule

Scheduled runs are where geography turns into an outage.

The IANA time zone database shipped three releases in the first seven months of 2026. 2026a in March, 2026b in April, 2026c in July. Between them: British Columbia went to permanent -07 on March 9, Alberta went to permanent -06 in June with the Northwest Territories expected to follow, and Morocco moves to permanent UTC on September 20. Every one of those is a jurisdiction where a nightly job that fires at 2am local either runs twice, skips a day, or lands an hour into the next reporting period.

The month-end version is quieter and just as common. A monthly report scheduled for the last day of the month, run against a system that closes the period at midnight in a different zone, produces a report of a period that has not closed yet. It looks fine. Every number in it is one day short.

8. The demo file was clean

Every document workflow is built against a sample the client picked, and clients pick the good one.

Then production arrives: a scan rotated ninety degrees, a merged cell spanning three columns, a second page nobody mentioned, a supplier who puts the total in a footer, a PDF that is an image of a spreadsheet. The extraction step does not error. It returns a number, and the number is wrong, and it is wrong in a field somebody downstream trusts.

This is the category where a model genuinely helps, because a rules engine has no way to handle the case it was not shown. It is also the category with the highest cost of being confidently wrong, which is why the judgment steps in our builds get an eval suite rather than a spot check. A step that reads a document and cannot tell you how sure it is has no business writing to a ledger.

What each of these costs to deal with

Our ordering, from our own builds. Read the two middle columns against each other: in every row, finding the break costs more than fixing it.

Expired credentials

Time to find
Hours, because the error names the symptom and not the cause
Time to fix once found
Minutes to reconnect
Comes back?
Yes, on a documented clock

Rate limits

Time to find
Minutes, the 429 says which cap you hit
Time to fix once found
Half a day to add a queue and a ceiling
Comes back?
Only at higher volume

Schema drift

Time to find
Days, because nothing errored
Time to fix once found
Hours to remap and backfill
Comes back?
Every time the source changes

Silent partial success

Time to find
Weeks, if nobody reconciles the counts
Time to fix once found
Hours, plus whatever the wrong data touched
Comes back?
Yes, until the check exists

Retry storms

Time to find
Hours, and the bill arrives later
Time to fix once found
Minutes to cap, longer to find the real cause
Comes back?
No, once capped

Third-party page changes

Time to find
Days, the step keeps returning zero rows
Time to fix once found
Hours to re-anchor the selectors
Comes back?
Yes, on their release schedule

Clocks and calendars

Time to find
A full cycle, because the run looks normal
Time to fix once found
Hours to pin the zone and the boundary
Comes back?
Twice a year, per jurisdiction

Unstructured input

Time to find
Only when a human checks the output
Time to fix once found
Hours, plus a new case in the eval set
Comes back?
Yes, with every new supplier

These are our own operational estimates from doing this work, not measurements from an instrumented dataset. Treat the ordering as an argument, not a benchmark.

What we changed because of all this

The pattern in that table is the whole lesson. Detection is the expensive half, so it gets the budget. It is also the half nobody adds to an agent an employee built themselves, which is worth remembering as the DIY workbenches spread.

Five things now go into every build before the interesting logic does. A heartbeat that alerts on silence rather than on error, because five of the eight categories above never raise an error at all. A contract check that reads the source schema and fails loudly the moment a field it depends on changes shape. A cap on retries and a hard spend ceiling on anything that calls a paid API. Idempotency keys, so that a replay cannot double-post an invoice. And a dead letter queue with a named human owner, because a queue nobody owns is a folder.

None of that is clever. All of it is the difference between an automation that has been running since March and one that stopped in April and got noticed in June. It is also why our builds take the shape they do: what we actually build is a workflow plus the instrumentation that tells you when it stopped, and the second half is not an upsell.

What to ask before you buy a build

Three questions, and they take about four minutes on a first call.

Ask what happens on day eight of a Google token. If the answer is a blank look, the person has not run an integration long enough to have been bitten, and you are paying for their education. Ask what the retry cap is and what it costs when it trips, because an uncapped retry on a metered API is an open tab. And ask to see a run that failed, in the tool, with the timestamps visible. That last one is the fastest read on somebody's real operating history, and it is the centerpiece of how to vet an automation consultant when you cannot read code.

The wider decision, whether you need an agency automation consultant at all or whether your ops person plus a no-code tool covers it, turns on the same thing this post has been circling. Everything above is error handling, and error handling is the part nobody scopes.

A no-code build is fine right up until it needs that, and the boundary is the real reason to move off Zapier rather than the monthly price. So whoever ends up owning the workflow, put the reliability work in the scope on day one. Bolted on after the first outage it costs more, and it costs it while the client is watching.

The questions we actually get about this

How often do production automations actually break?+

Often enough that the maintenance is a real line item, and nobody publishes a reliable current figure. The closest public number is Forrester Consulting research from 2020, commissioned by Tricentis, in which 45% of firms said they dealt with bot breakage weekly or more often. That was measured on RPA rather than on modern API workflows, and it is six years old. Treat any confident percentage you see quoted today with suspicion, including ours, because there is no dataset behind most of them.

What is the most common cause of an automation failing?+

Expired or revoked credentials, the one we see most often, because it is the only category with a clock attached that runs whether anything else happens or not. Google expires a refresh token after seven days while the consent screen is in Testing and after six months of non-use, and revokes it on a password change if the token carries Gmail scopes. Microsoft Entra gives you 24 hours on a single-page app and 90 days elsewhere. None of those need anybody to touch anything.

Why did my Zap stop working without telling me?+

Because Zapier is retrying and has decided not to email you yet. Autoreplay retries a failed step up to five times on a backoff of 5 minutes, 30 minutes, 1 hour, 3 hours and 6 hours, and their documentation states plainly that no error notification email goes out until the final attempt fails. The final attempt lands about ten and a half hours after the first error. Separately, a Zap only switches itself off when 95% of its runs error over seven days, so one that is failing 90% of the time stays on.

How much should I budget for keeping an automation running?+

Nobody publishes a traceable figure for this, so be careful with the ones you find: every 15% or 25% of build cost rule of thumb on the first page of Google traces back to an agency quoting itself. What we can give you is our real prices. A one-off starter build is $1,500 to $2,500 fixed, a two-week production sprint is $5,000 fixed, and retainers for ongoing build-and-run work start at $5,000 a month. Plenty of workflows never need the retainer. The ones that read a third-party page or depend on a client's own schema usually do.

Do AI agents break more than no-code automations?+

They break in the same places, and they add one of their own. Everything above applies identically to an agent: it still holds an OAuth token, still hits a 429, still reads a document that has been rotated. What an agent adds is the chance of a confidently wrong answer that never raises an error, which is why judgment steps need evals and a confidence signal rather than a passing test run. Where the work is genuinely deterministic, a plain no-code workflow is the more reliable choice and we will say so.

Can you build an automation that never breaks?+

No, and anybody who says otherwise has not run one for a year. Your automation depends on somebody else's API, somebody else's token policy, somebody else's release schedule and somebody else's timezone legislation, and you control none of it. What you can buy is a short gap between the break and somebody knowing about it. That is what the heartbeat, the contract check and the dead letter queue are for, and it is the only reliability promise worth making.

Want to know which of these eight is already happening to you?

Bring one workflow you rely on and we will walk its failure paths with you, including the ones that never raise an error. If it turns out to be solid, we will tell you that and you will have lost an hour.

Starter builds run $1,500 to $2,500, fixed. Retainers start at $5,000 a month. The audit is free either way.

Share thison Xon LinkedIn

Written by

Sophie Adams · Technical Writer

I turn complex AI concepts into step-by-step guides readers can follow as they work.

Journaling

Book audit