AI Workflow Automation

Traditional automation handles work that follows rules. AI workflow automation extends that to work that requires interpretation — reading a document, understanding an unstructured request, deciding which of several paths applies — while keeping the deterministic parts deterministic.

The combination matters. The most reliable automations we build are mostly ordinary workflow with AI applied at the specific steps that need judgement, not an agent improvising the whole process.

What Gets Automated Well

  • Intake and triage — classifying, routing and enriching incoming requests, tickets or emails.
  • Document-driven processes — extracting what matters from a document and starting the right workflow. See document intelligence.
  • Cross-system coordination — the copy-paste work between systems that never integrated.
  • Preparation and drafting — producing the first version of a response, report or record for a person to approve.
  • Exception handling — spotting the cases that need attention rather than processing everything identically.

What We Will Talk You Out Of

Automating a broken process. If the workflow itself is unclear, has undocumented exceptions, or exists because of a constraint that no longer applies, automating it locks in the problem and makes it faster. Process first, automation second — that sequencing is usually where the real saving is.

We are also cautious about full autonomy on consequential steps. Anything irreversible or costly routes to a human for approval; the agent prepares the decision rather than making it.

How the Work Runs

We start by mapping the workflow as it actually happens rather than as documented, identify where the time genuinely goes, and pick the narrowest slice that delivers value. That slice gets built, evaluated and put in front of real users before scope expands — the same staged approach described on our AI agents page.

Describe a workflow that is costing you time and we will tell you honestly which parts are worth automating.

Related services

When Should a Workflow Use AI at All?

Most workflows should not. If the rules are clear and the inputs are structured, conventional automation is cheaper, faster, deterministic and easier to audit. Adding a language model to a task that a rule handles correctly makes it slower, more expensive and less predictable.

AI earns its place where the input is unstructured or variable — free text, documents, email, mixed formats — or where the step requires judgement that resists enumeration: classifying an ambiguous request, summarising a long thread, extracting fields from documents that all differ, drafting a response for a person to approve.

What Does a Well-Designed AI Workflow Look Like?

Almost always a hybrid. Deterministic code handles routing, validation, record-keeping and anything with a clear rule. The model handles the specific step that needs language understanding. Its output is validated before it is used, and consequential actions route to a person.

The common failure is putting the model in charge of the whole workflow, including the parts a simple condition would handle perfectly. That produces something impressive in a demo and unreliable in production.

Which Workflows Are Worth Automating First?

  • High frequency × real duration. Ten minutes, forty times a week beats a day, twice a year.
  • Meaningful error cost. Where a mistake has downstream consequences, consistency is worth as much as speed.
  • Stable rules. Rules that change quarterly mean automation that changes quarterly.
  • Clear ownership. Someone must own the outcome and be able to decide when it is behaving correctly.

Fix the Process Before Automating It

Automating a bad process makes bad outcomes arrive faster and with more authority. If a step exists only to work around a system limitation, remove the limitation. If four people approve because nobody trusts the data, fix the data. The cheapest automation is frequently the step you delete.

Related: AI agents · document intelligence · Microsoft Copilot Studio.

When a Step Fails Halfway Through

Most of the design work in a production automation goes into the second attempt rather than the first. A workflow that reads an email, extracts fields, creates a record and sends a confirmation can stop at four points, and the recovery is different at each one. Stop after the record is created but before the confirmation goes out, and a retry from the top produces a second record.

The dividing line is between steps that are safe to repeat and steps that are not. Reading, classifying and extracting are safe: run them again and you get the same answer or a close one, at the cost of another call. Writes are not, and neither is anything that leaves your systems, including a sent email, a created ticket, an approved invoice or a posted transaction.

The way through is to derive a stable identifier for each unit of work from the source event rather than from the run, so that a duplicated trigger and a retried run resolve to the same key.

  • An idempotency key checked at the write, with the outcome of the previous run recorded against it.
  • A separation between retryable failures, such as a timeout, a rate limit or a transient 5xx, and terminal ones, such as malformed input or a revoked credential, since retrying the second kind only spends the retry budget.
  • Backoff with a cap on attempts, and a dead letter path so repeat failures leave the queue and land where someone will see them instead of looping.
  • A stored record of the last step each item completed, so a resumed run starts at the failure rather than at the beginning.

Measuring a Step That Is Only Usually Right

A model step cannot be tested the way a rule can. A rule either routes the invoice to the right queue or it does not, and one case proves it. A step that is right most of the time needs a set of examples with known answers, and a number that gets re-run whenever the prompt, the model or the upstream format changes.

Assembling that set is the part that gets skipped, and it has to come from the real backlog rather than from clean examples. The email containing two requests, the scan that is rotated, the attachment that is a photograph of a screen, the message where the sender was wrong about what they needed: those are the items that decide whether the workflow holds up, and a score built without them will not survive contact with the queue.

The comparison is against the current process, not against perfection. People misfile, misroute and mistype at some rate today, and that rate, measured or not, is the bar. Scores also move for reasons unrelated to the model: a form gains a field, a new document template enters circulation, an upstream system starts populating something it used to leave blank. Sampling live output on an ongoing basis catches that. A score taken once at launch does not.

  • Accuracy per category rather than overall, because the rare category is usually the expensive one.
  • The proportion of items falling below the confidence threshold and routing to a person, which is the actual workload the change creates.
  • The rate at which a reviewer overturns the output, which is the number that says whether the review step can ever be narrowed.
  • Cost and latency per item tracked alongside accuracy, since the simplest way to raise a score is a larger model on the step that needs it.

What Triggers It, and Where It Runs

The trigger shapes the build more than the model does. A webhook has to be acknowledged inside the sender's timeout, often a few seconds, so the endpoint accepts the payload, puts it on a queue and returns; the work happens after the response. Polling a mailbox or a folder means tracking what has already been handled, and that state has to survive a restart without reprocessing the backlog. A scheduled run has to decide what to do when the previous run is still going.

Model calls are slow relative to everything else in the workflow, and the delay scales with input length. A step that reads a long thread or a multi-page document sits there for seconds, and a step that fans out across many items multiplies that. It is what pushes this work into a background worker, with the result delivered by callback, notification or a status the requester can check, rather than inline behind someone's click.

Execution limits are where this collides with hosting. Serverless functions cap runtime in minutes, so a batch that exceeds the cap has to become one invocation per item with the workflow tracking the parts, not a single long call. Outbound access matters as well: the model API is reached over HTTPS on port 443, and on a restricted network that means an allowlisted host or a private endpoint rather than general egress.

  • A concurrency limit, because the model API and the target systems both rate limit, and a queue drained at full speed will find both.
  • An ordering rule for events about the same record, which can arrive out of sequence or twice.
  • A separate lane for reprocessed items, so a backlog of retries does not sit in front of new work.

What the Model Step Costs to Run

Cost per item comes down to tokens in and tokens out, and for classification, extraction and routing the input side dominates. A step that sends the whole document, the full set of rules and a handful of examples pays for all of it on every item, whether or not the answer depended on more than one paragraph. The largest lever is usually reducing what gets sent, by locating the relevant section with deterministic code first or trimming a thread to the part that carries the request, rather than by changing models.

Where the same instructions and examples prefix every call, caching that prefix removes most of the repeated input cost with providers that support it, since cached input is billed below fresh input. It only applies when the shared portion comes first and is byte for byte identical between calls, which constrains how the prompt is assembled: static content at the front, the variable item at the end. Putting a timestamp or a record ID near the top quietly disables it.

Model selection is per step, not per workflow. Sorting into a short list of known categories is work a small fast model does well; extraction from documents that vary in layout, and drafting that a person will put their name to, usually are not. Mixing sizes inside one workflow is normal, and a step that runs on every item deserves more scrutiny than one that runs only on the exceptions.

  • Token counts measured on real inputs rather than one representative document, because the long tail sets the bill.
  • Retries, evaluation runs and reprocessing after a prompt change, all billed like any other call.
  • Output size, which shrinks when a step returns a structured value instead of prose, and which shortens latency at the same time.

What the Build Depends On From Your Side

Access is the usual critical path. Access means credentials in a non-production environment where one exists, and where it does not, a scoped account in production with writes disabled until the read path has been verified. The delay is rarely technical; it is that issuing those credentials involves people who are not on the project.

The second dependency is someone who can settle what the right answer is. Every workflow with a judgment step contains cases where two competent people disagree, and those have to be decided by a person with the standing to decide them rather than inferred from a handful of examples. Without that, the ambiguity gets resolved by whoever writes the prompt, which is the wrong place for it.

The third is a route into each system the workflow touches. Where a documented API exists, this is ordinary work. Where it does not, the options are file exchange, direct database access, or driving the interface the way a person would, each with its own fragility. Establishing which one applies says more about the effort involved than anything about the model step does.

  • Credentials and the scopes attached to them, per system, and confirmation of whether a sandbox tenant exists.
  • Real inputs in the state they arrive in, including the malformed and ambiguous ones, rather than a cleaned sample.
  • A decision on data handling: which fields may leave your network, and whether anything has to remain in a particular region.
  • Somewhere for exceptions to land that a person already watches, rather than a new queue nobody has the habit of opening.

Frequently Asked Questions

What do we actually end up with?

A running process rather than an application you open. Output arrives where the work already lived: a drafted reply in the mailbox, a populated record in the system that holds records, an item in a review queue. Alongside it sit the workflow definition, the prompts, the evaluation set, the exception path and the logs, all of which need an owner once the build is over. It is not a chat interface over your data, and it does not become a system of record; the systems you have stay where they are.

What does it run on?

An orchestration layer plus the systems you already run. That layer is either a workflow platform your own team can administer or plain code in a queue worker, and the deciding factor is usually who maintains it a year from now rather than what it can express. The model is a network dependency reached over HTTPS on port 443, so on a restricted network it needs an allowlisted host or a private endpoint. That request is worth raising early, since it typically goes through a different team than the rest of the work.

What has to already exist before this is worth starting?

A version of the process that runs today, some accumulated history of it, and a route into each system it touches. Volume matters for a reason beyond payback: a step that runs a few times a month will never produce enough examples to measure against, so confidence in it has to come from review rather than from a score. If the process is mid-change, with a system being replaced or a policy under review, building against it means building it twice.

How does the integration itself proceed?

Writes are enabled behind a flag and usually land in a draft or staging state first, so a mistake is visible and reversible before it reaches a customer or a ledger. Triggers move last: the workflow runs on demand or over a sample while its output is being checked, and only gets connected to the live event once that output holds up. Webhook registration is the step that most often needs something from your side, since it generally requires an administrator in the source system rather than the account the workflow itself uses.

What do we have to decide rather than you?

The questions where the model would only be guessing at your preference. Which categories exist and what belongs in each. What happens to an item that fits none of them. Whether review is per item or sampled for the reversible steps, noting that sampling only works once the error rate is known and stable. The confidence threshold at which an item stops and waits for a person is yours as well, since it trades throughput against the cost of being wrong in your specific process.

Can this run without sending anything to an external model provider?

Yes, with open weight models hosted in your own environment, at the cost of hardware and a capability gap that varies by step. Classification and extraction over predictable inputs are within reach of smaller models; drafting and reasoning over long, inconsistent inputs are where hosted models still pull ahead. Between the two there are regional endpoints and contractual terms covering retention and training on inputs, which differ by provider and are worth confirming in writing before the design fixes what each step sends.