An automation that works on the day it ships is a low bar. The interesting question is whether it still works, correctly and unattended, eighteen months later — after two API deprecations, a vendor changing an email template, and the person who built it moving on.
These are the seven ways it goes wrong, in rough order of how often they show up in audits.
1. Silent failure
The run errors. The platform records it in a log nobody opens. Six weeks later somebody notices the numbers do not add up. This is the single most common failure mode and it is a configuration problem, not a technical one — almost every platform can alert on failure, and almost nobody switches it on.
The fix is a failure path that reaches a human who can act: an error branch that posts to a channel with the run ID, the input that caused it, and the error message. Not an email to a shared inbox.
2. The run that never happened
Subtler and worse. A webhook stops firing. A scheduled trigger silently detaches after a credential expires. There is no error, because there is no run — and error alerting catches nothing.
3. Partial execution
Step 3 of 6 fails. Steps 1 and 2 already wrote data. The record now exists in a state the rest of the system does not expect — an order created but never invoiced, a contact enriched but never assigned.
- Do the reads and validation first, the writes last. Fail before you have changed anything.
- Where multiple writes are unavoidable, write a status field the workflow updates as it progresses, so a recovery run knows where it stopped.
- Never leave a half-written record with no marker distinguishing it from a complete one.
4. Duplicate execution
A retry fires after a timeout that actually succeeded. A webhook is delivered twice. The customer gets two invoices, or two welcome emails, or is charged twice.
The answer is idempotency: design each step so running it twice produces the same result as running it once. In practice that means deriving a stable key from the input (an order ID, a message ID, a hash of the payload) and checking whether that key was already processed before doing the work.
# Not idempotent — a retry creates a second record
create_invoice(order)
# Idempotent — a retry is a no-op
key = "invoice:" + order.id
if not seen(key):
create_invoice(order)
mark_seen(key)Idempotency is also what makes recovery safe: when a run fails halfway, you can simply re-run the whole thing rather than reasoning about which steps completed.
5. Schema drift
An upstream system renames a field, changes a date format, or starts returning null where it used to return an empty string. The automation keeps running and starts writing garbage — which is worse than stopping, because nothing alerts and the bad data spreads.
- Validate the shape of incoming data at the entry point and fail loudly when it does not match.
- Treat an unexpected
nullas an error, not as a value to write. - Prefer explicit field mapping over passing whole objects through — you find out about changes at the boundary rather than three systems downstream.
6. Rate limits and volume
The automation works fine on 20 records a day and falls over on the day 2,000 arrive after a backlog clears. Rate limits are the usual cause; so are per-run timeouts on hosted platforms.
- Batch and paginate rather than looping one call per record where the API supports it.
- Implement exponential backoff on 429 and 5xx responses — and cap the retries so a genuinely broken endpoint does not retry forever.
- Test with a volume spike deliberately, before reality provides one.
7. Business-rule drift and orphaning
The last two are organisational rather than technical, and they are what actually kills automations long-term. The process changes and the automation keeps doing the old thing perfectly. Or the person who built it leaves, nobody else understands it, and it becomes a black box that everyone is afraid to touch and nobody dares switch off.
The organisational fix
Step 1: Assign a named owner
Not a team — a person, recorded somewhere findable. Reassign it explicitly when they move on.
Step 2: Document what it does in plain language
One page: what triggers it, what it touches, what it writes, who to tell when it breaks. Written for a stranger.
Step 3: Review it on a schedule
Quarterly is enough. Does it still match how the business actually works? Has anything upstream changed?
Step 4: Keep a kill switch
One obvious way to disable it that does not require understanding it. During an incident, nobody wants to reverse-engineer a workflow to stop it.
Every automation is a small piece of software that nobody has agreed to maintain. Naming an owner is the cheapest reliability work available.
The design checklist
- Does a named human get alerted when this fails?
- Would I be alerted if it silently stopped running at all?
- Is every write step safe to run twice?
- Does it fail before writing anything, rather than halfway through?
- Does it validate the shape of its inputs?
- Does it survive 100× the normal volume arriving at once?
- Could someone who has never seen it fix it from the documentation?
Seven questions. Answering them at design time costs an hour; answering them after an incident costs considerably more. The ROI model assumes the automation keeps working — this is the work that makes that assumption true.
Frequently asked questions
What does idempotent mean in an automation workflow?
An idempotent step produces the same result whether it runs once or many times. In practice you derive a stable key from the input — an order ID, a message ID — record that the key has been processed, and skip the work if it has. It matters because retries, duplicate webhooks and manual re-runs are all normal events, and without idempotency each one creates duplicate records or duplicate charges.
How do I get alerted when a scheduled automation stops running entirely?
Error alerting cannot catch this, because a trigger that never fires produces no error. Use a heartbeat: have the workflow ping a monitoring service on every successful run, and configure that service to alert if the ping does not arrive within the expected interval. Several free dead-man's-switch services exist for exactly this.
Should an automation stop on error or keep going?
Stop, in almost every case. Continuing past a failed step is how you get partially-written records that nobody can distinguish from complete ones. The exception is batch processing of independent items, where one bad record should not block the other 499 — there, log the failure per item, continue, and report the failures at the end.
How often should automated workflows be reviewed?
Quarterly for anything touching money, customers or compliance; twice a year for internal conveniences. The review is short: is it still running, is it still correct, has anything upstream changed, and is the documented owner still the right person. Most of the failures in this article are caught by that fifteen-minute check long before they cause damage.