Skip to main content
DoneThat

AI Adoption GuideGeneralSelect

Workflow automation

Workflow automation uses AI or AI-generated code to remove predictable, repetitive work when triggers, inputs, outputs, exceptions, and ownership are clear.

By Don, DoneThat’s AI coach · updated

Decide from the written path, not from the pain

Automate a workflow when the trigger, the inputs, the outputs, the exceptions, and the owner are already clear enough to write down. If you cannot name those five things without guessing, the work is not ready for a bot. Pain is a reason to document the path. It is not a reason to wire tools together.

The quality outcome is specific. Every automated run cites the trigger that fired, the source record it read, and the person who owns exceptions. If a field is missing on the source, the destination field stays empty. The automation does not invent a destination. A person still owns what the bot cannot resolve.

Workflow tools in this class, Zapier, Make, n8n, Microsoft Power Automate, Copilot, all do the same job at this stage: watch for an event, read a record, write somewhere else. Pick whichever your stack already uses. The selection question is not which vendor is cleverest. It is whether the path you are about to encode is stable enough that a machine should follow it without improvising.

If the process has no named owner, stop. An automation with no exception owner is an unattended queue. Destinations go stale and nobody is accountable when a run writes the wrong thing. Name a person, a role, or an on-call rotation before you connect the first step.

When the path is still fuzzy, write it as a vibe scripting draft first: trigger, fields, branching, and the human handoff. Only promote that draft into a live flow once the exceptions are boring.

Name the trigger, the source, and the exception owner before you build

Write three labels on the flow itself, not in a slide deck.

The trigger is the event that is allowed to start a run. Be exact: "ticket status changes to Escalated," not "when something important happens." Vague triggers fire on noise. Exact triggers fire on a field you can cite.

The source record is the object the run is allowed to read. Cite its system and its identifier field, such as the ticket ID in the helpdesk or the row ID in the intake sheet. Downstream steps may only pull values that exist on that record or on records it explicitly links to. If you need a lookup, name the lookup key. Do not browse adjacent systems hoping a match appears.

The exception owner is the person who gets the run when a required field is blank, a lookup returns nothing, or the destination refuses the write. Put their name or role on the flow. Route those runs to a review queue they already check. Do not email "the team."

An ops coordinator wants a follow-up task created whenever a support ticket moves to Escalated. The trigger is that status change. The source record is the ticket. Allowed fields are ticket ID, customer name as stored on the ticket, current queue, and the account owner field if it is populated. The exception owner is the weekday ops lead. The destination is the existing task list for that queue. If the account owner field is empty, the task is still created with ticket ID, customer name, and queue filled, and the owner field left blank. The ops lead sees the blank and assigns a person. The bot does not pick an email from a similar company name or from the last ticket that looked related.

If the trigger lives in a system that already exposes tools through MCP, use that connection so the flow reads the same record a person would see in the app, not a scraped copy that drifts.

Copy only fields the source record cites

Map destination columns to source fields by name. Each mapping should be defensible in one sentence: "Customer name comes from ticket.customer_name." If you cannot point at the field, do not write it.

Do not compute a "better" value in the mapping layer unless that computation is itself a documented rule with a named owner. Concatenating first and last name when both exist is a cited rule. Inferring a company domain from a free-text notes field is invention.

Data enrichment is a different job. Enrichment looks up missing attributes from a second, trusted source and still leaves a blank when that source has nothing. Do not fold enrichment into the automation because a field looks empty. If you need enrichment, make it an explicit step with its own source, its own blanks, and the same exception owner.

Mark destination fields that the receiving system actually requires. If a required field is blank on the source, fail the run into the exception queue. Do not substitute a placeholder, a default email, or yesterday's value. Optional fields stay empty when the source is empty. Empty is a valid state. A guessed value is a silent error.

AI-generated code and Copilot-style builders will happily fill gaps. Your job is to refuse those gaps. If the generated step includes a fallback like "use ops@company if owner is missing," delete the fallback. Missing owner is an exception, not a default.

Reusable AI Skills help when several flows share the same mapping rules: same field names, same blank policy, same exception routing. Put the policy in the skill so a new flow cannot quietly invent a different default.

Empty stays empty: never invent a destination

The most common harmful write is a destination the source never named. A missing account-owner email is not an invitation to search the directory for someone with a similar title.

Inventing a destination email is a hard stop. Once a record lands in the wrong inbox, you have created work for a person who did not ask for it and hidden the gap from the exception owner. Leave the address blank, park the run in the review queue, and let the named owner choose the destination. If the source record does not cite a destination, the automation does not send it there.

When a lookup is allowed, constrain it. Look up the account owner only by the customer ID on the ticket, in the account table, and only if that query returns exactly one row. Zero rows or two rows is an exception. Do not take the first of two. Do not fuzzy-match the company name.

Treat the first run as a review, not as production

The first execution is a test against live-shaped data, not a go-live. Run it into a holding area the exception owner already watches, such as a review sheet or a draft folder. Do not write to the production destination on run one.

Check whether the trigger fired only on the event you named, whether every filled field came from the cited source, whether blanks stayed blank, whether the exception path fired when you removed a required field on purpose, and whether anything received a destination you did not map.

If Copilot or another builder generated the flow, read every step as if a junior operator wrote it. Generated mappings often include helpful defaults. Remove them before the second run.

Promote to production only after the exception owner has cleared a review batch and agreed the blanks and the routing match the written path. Keep the exception owner on the flow after promotion.

A process with no owner should never reach this step. If nobody will take the exception queue, turn the automation off.

What a finished run must show

Each run should show the trigger event, the source record identifier, which fields were copied, which stayed empty, the destination only if the source cited it, and whether the run completed or went to the exception owner. If it went to exceptions, the reason is the missing field or the failed lookup, not a generic error.

That trace is how you answer why a task has no owner: point at the ticket, the blank field, and the ops lead's queue, never at a guessed email. If you cannot produce that trace, the flow is not done. Tighten the trigger, shrink the field map, name the owner, and send the next batch to review again.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other. This one is rated high effort to implement, so the baseline matters more than usual.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first