On this page
- What onboarding automation actually is
- Who this is for, and who it is not for
- What we actually build
- How it works technically
- The five kinds of onboarding step
- The build process, stage by stage
- What you get at handover
- Where these projects go wrong
- What it costs to run once it is live
- How to tell whether you need this
- How to start
What onboarding automation actually is
Onboarding automation turns a new customer or new employee setup from a checklist into a tracked state machine. Every step has a kind, an owner, a dependency on other steps, a due date and a defined failure behaviour. The system provisions what can be provisioned, chases the humans who owe something, verifies that each action actually took effect, and escalates on a schedule instead of when somebody remembers. It ends at an observed event, not at the bottom of a list.
The difference from a checklist is that a checklist records intent and a state machine records reality. A checklist tells you eleven of fourteen boxes are ticked. A state machine tells you the account is blocked on a tax form requested nine days ago, that two reminders were sent, that the third fires tomorrow, and that the whole thing then becomes a named person's problem.
Most of this is not a model problem. Provisioning, dependency handling, retries and nudges are ordinary software. Models earn a place in three narrow spots: reading and validating documents people upload, drafting the chase messages, and answering the newcomer's questions from your own handbook.
- Verify stepsEvery provisioning step needs a matching verification step. Create calls report success and then quietly do nothing more often than anyone expects.
- One state eachEach onboarding sits in exactly one named state with logged transitions. Progress bars built from checkbox counts hide the step that is stuck.
- Chase, never decideAutomation is strong at chasing people and weak at judging. Assemble the packet for a human decision and leave the decision alone.
- Exit criteriaOnboarding finishes at an observed event. If nobody can name that event, the sequence has no finish line and will always look complete.
- Pin the versionA template edited mid-flight breaks running instances. Each instance pins the template version it started on.
- State machine
- A model of a process in which each item sits in exactly one named state and every move between states is an explicit, logged transition with a rule attached.
- Exit criteria
- The condition that defines onboarding as finished, expressed as an observed event rather than a completed list. Without one, onboarding ends when somebody stops looking.
- Compensating action
- The operation that undoes a completed step when a later step fails. Provisioning without one leaves half-created accounts behind every time something goes wrong.
- Dependency edge
- A declared prerequisite between two steps. Declaring dependencies is what lets independent work run at the same time instead of queueing behind the slowest item.
- Nudge schedule
- The timed sequence of reminders sent to whoever owes an outstanding step, counted from the due date, with a stop condition and a defined escalation point.
Who this is for, and who it is not for
This is worth building when onboarding crosses more than two teams, takes more calendar days than touch hours, and stalls in different places each time. It is not worth building when you onboard a handful of accounts a month through one person who is good at it.
| What is true of your onboarding | Verdict | Reasoning |
|---|---|---|
| Calendar time is many times the actual working time | Good fit | The gap is waiting and chasing, which is exactly what a sequence removes |
| Three or more teams touch a single onboarding | Good fit | Handoffs are where things stall, and handoffs are what a state machine makes visible |
| Provisioning involves several systems and often needs redoing | Good fit | Idempotent, verified provisioning is deterministic work with a clear payoff |
| A handful of accounts a month, one owner, no complaints | Poor fit | A well-kept sheet beats a build. Revisit at volume |
| Every onboarding is genuinely bespoke | Partial fit | Automate provisioning and verification, leave the sequence human |
| The process itself is about to change | Wait | Encoding a process you are redesigning is the fastest route to shelfware |
- Nobody can name the finish line. If you cannot say what event means this customer is onboarded, the system will report success on incomplete work.
- The steps are not written down anywhere true. The documented process and the real one are different documents. We map the real one, and that is a week of work by itself.
- No owner for the sequence after launch. Templates rot faster than pipelines, because the business changes underneath them. Read who owns the automation after launch before starting.
- You want it to replace the human welcome. It should not. The system removes chasing, not contact.
If your onboarding is slow mainly because one team is overloaded, a sequence will surface that in week one and change nothing. Automation makes a bottleneck visible and measurable, which is useful, but the fix is staffing or scope. We would rather say that on the call than build you an expensive dashboard of the same problem.
What we actually build
Five components, and the template definition is the one that decides whether the rest ages well.
The template definition
A declarative file per onboarding type, holding every step with its kind, actor, owner, dependencies, due offset, nudge schedule, validation and failure behaviour. It lives in version control and changes go through review. Running instances pin the version they started on, so editing a template never mutates work already in flight.
The engine
A scheduler that walks the dependency graph, starts everything whose prerequisites are met, holds state per instance, and wakes on timers. Independent steps run at the same time, which is where most of the calendar time comes back. A linear checklist waits on its slowest item even when nine other things could have started on day one.
Provisioning and verification
Typed integrations with each system that has to create something, written idempotently and keyed, with timeouts, bounded retries and a compensating action. Every one is paired with a verification step that checks the thing exists and works. This is standard integration work, covered under systems integration, and it is most of the engineering hours.
The human layer
Forms and upload links for collection, a review queue for decisions, nudges on a schedule with stop conditions, and escalation to a named person after a set number of unanswered reminders. Uploaded documents are validated against a schema and read for content, which is where document processing belongs rather than a person squinting at a scan.
Observability
A stuck-step histogram, cycle time per step, chase count per step, first-time-right rate on collected documents, and time to the exit event. The stuck-step histogram is the single most useful chart we build, because it names the one step that costs you a week.
- A versioned template file per onboarding type, editable by an operations lead
- Idempotent provisioning integrations, each with a compensating action
- A verify step for every provision step, with its own retry and escalation
- Forms, upload links and schema validation for everything collected
- A queue for the decisions humans must make, with the evidence attached
How it works technically
One instance moves through a lifecycle with timers on it. The times below are the shape, not a promise; your own dependency graph decides the real numbers.
A state transition in the source system fires, not an event. Deals move backwards and forwards, so we trigger on entering a state and guard with an idempotency key on the account, which is what stops two instances existing for one customer.
Plan tier, region and segment select the template. The instance records the template version, so later edits do not rewrite work in progress.
Every step with no unmet dependency starts at once. Collection requests go out, provisioning that needs nothing else runs immediately.
Nudges fire from the due date on the recipient's own calendar, skipping their night and their public holidays. Each stops the moment the step completes rather than on a daily poll.
After the configured number of unanswered nudges, the step moves to a named person with the history attached. Escalation is a state, so it is visible and countable.
Dependencies met, provisioning runs idempotently with bounded retries. A verify step then confirms the result. A failure goes to a dead letter queue a human reads, never into a silent skip.
The instance closes only when the named event is observed. Steps finishing is not the same as onboarding finishing, and conflating the two is how companies report success on accounts that never started.
Idempotency, and why it decides everything
Every write in this system will happen twice eventually. A webhook retries, a worker restarts mid-step, an operator clicks the button again. If provisioning is not keyed, you get two workspaces, two licences and a support ticket. Keys go on instance creation and on every provisioning call, derived from stable identifiers rather than timestamps. The mechanics are covered in idempotency in automation, and it is the concept that separates a sequence that survives from one that quietly corrupts your data.
# onboarding/templates/customer_standard.yaml
# One file per template. Versioned in the repo and reviewed like code.
template: customer_standard
version: 11
clock: account.billing_country # due dates in the customer's calendar
steps:
- id: collect_tax_details
kind: collect # provision | collect | decide | teach | verify
actor: customer
owner: role:account_manager
depends_on: []
due_after: P2D # ISO 8601 duration from template start
nudge:
at: [P1D, P3D, P7D] # measured from the due date, not the start
channel: [email, in_app]
stop_on: step_complete
escalate_after: 3 # then it becomes a named person's problem
validation:
schema: schemas/tax_details.v3.json
on_invalid: return_to_actor_with_reason
- id: provision_workspace
kind: provision
actor: system
depends_on: [collect_tax_details, decide_plan_tier]
idempotency_key: "{{account.id}}:workspace:v1"
timeout: PT90S
retry: {attempts: 3, backoff: exponential, jitter: true}
on_fail: dead_letter # a queue a human reads every morning
compensate: revoke_workspace # what undoes it if a later step fails
- id: verify_workspace_reachable
kind: verify # every provision step needs one of these
actor: system
depends_on: [provision_workspace]
check: http_get {{workspace.url}}/health expect 200
on_fail: raise_to:role:platform_oncall
exit_criteria: # onboarding does not end when the steps end
- verify_workspace_reachable.passed
- first_value_event within P14D # name the event or there is no finish lineThree details in that file do the heavy lifting. The clock is the customer's, not the server's, so a due date does not land on a holiday somewhere. The nudge schedule counts from the due date and carries a stop condition and an escalation, so reminders end. And the compensating action is declared at the same time as the provisioning, because nobody ever goes back and adds one.
The five kinds of onboarding step
Before automating anything, label every step. The argument about which label applies is where the real design happens, and it usually exposes two or three steps that were never going to work as written.
The ChatGPTalker Onboarding Step Grid
Every step in an onboarding is one of five kinds, and each kind has exactly one correct treatment.
The system creates something: an account, an access grant, a licence, a key. Deterministic, idempotent, fully automatable, and it must carry a compensating action that undoes it.
Someone outside the system owes information or a document. This cannot be automated, only chased and validated. The automation is the nudge schedule, the schema check and the escalation.
A person makes a judgement: approve a limit, assign a tier, sign off an exception. Automate the packet that lands in front of them, with the evidence assembled. Never the decision.
A human has to learn something. Automation schedules it, delivers it and records completion, and completion is evidence of attendance rather than competence. Do not let a dashboard tell you otherwise.
Confirm a previous step took effect: the account exists, the payment cleared, the data landed, the access works. This kind is missing from almost every checklist we are shown, and it is the one that turns a list into a system.
Two rules make the grid useful. Every Provision step must have a matching Verify step. And no step may carry two kinds, because a step that is both a collect and a decide is two steps wearing one name, and it will be the step that stalls.
The build process, stage by stage
Six stages. The first two are archaeology, and they are the reason the rest works.
- Walk the last ten onboardings
Not the documented process, the real one. We read the actual threads, tickets and tasks for ten recent instances and build a timeline of each. The documented process is a description of an intention; the threads are what happened.
- Label every step with its kind
The step grid applied to the real process. This is where missing verify steps appear, where two steps hiding in one name get separated, and where somebody says out loud that a step nobody performs is still on the list.
- Model the graph
Dependencies, owners, due offsets, escalation targets, exit criteria. Drawing the graph almost always shows that half the sequence could have run in parallel and never did, which is where the calendar time hides.
- Build provisioning and verification
Idempotent integrations with compensating actions, paired verify steps, dead letter queues. Most of the hours land here, and the count of systems matters far more than the count of steps.
- Human layer
Forms, upload validation, nudge schedules with stop conditions, decision queues, escalation routing. Also the messages themselves, which should read as though a person wrote them, because a recipient who feels processed replies more slowly.
- Run in parallel, then switch
The system tracks real onboardings while humans still act, so the graph is corrected against reality before it takes control. Then provisioning is handed over one step at a time, starting with the reversible ones. Rollout advice is in rolling out automation to a team.
Walking ten real onboardings feels like a week spent not building. Every project that skipped it has encoded a process that does not exist, discovered this during rollout, and paid for the week twice. If your team says the process is already documented, ask when the document was last edited and compare it against one real thread.
What you get at handover
A running engine, templates an operations lead can edit without an engineer, and enough measurement to tell whether the process is getting better or just faster at being wrong.
- The engine and integrations in your repository, with infrastructure as code
- Template files per onboarding type, documented, versioned, and editable without a deploy
- A test harness that runs a template end to end against sandbox systems before it ships
- Dashboards: stuck steps, cycle time per step, chase counts, first-time-right rate, time to exit event
- A runbook covering how to add a step, change a nudge schedule, reverse a provisioning action and handle a dead letter
Where these projects go wrong
Onboarding failures are mostly about state, ownership and reversal. Very few of them are about the model.
| Failure | How it shows up | What prevents it |
|---|---|---|
| No verify step | The system reports a provisioned account that does not work | A verify step paired to every provision, with its own retry and escalation |
| Template edited mid-flight | In-progress onboardings jump states or skip steps after a change | Instances pin the template version they started on; changes apply to new instances |
| Duplicate instances | Two onboardings, two workspaces, one confused customer | Idempotency key on instance creation, and triggering on state entry rather than events |
| No compensating actions | Half-provisioned accounts accumulating quietly across systems | Declare the undo beside the do, and test the reversal path once per quarter |
| Nudges that never stop | Reminders after completion, or forever, and recipients filtering you out | Stop conditions evaluated on state change, not a daily poll, plus a hard escalation cap |
| Timezone and holiday mistakes | Reminders at three in the morning, deadlines on a public holiday | Compute every due date and nudge in the recipient's own calendar |
| Offboarding forgotten | Access outliving employment, discovered during an audit | Build the reverse graph in the same project, not as a later phase |
Employee onboarding and offboarding are the same graph in two directions, and only one of them ever gets built. Access granted on day one outlives the job, nobody notices until an access review, and the finding lands on the person who sponsored the automation. Build the reverse path in the same project even if you launch it later.
Automating the decision instead of the packet
The most tempting mistake is letting the system approve things. It reads well in a demo: the model reviews the documents and grants the tier. Then a case arrives that needed a human to notice something nobody wrote down, and the decision is defensible to nobody. Automate the assembly instead. Pull the documents, run the checks, lay the evidence out, and put one screen in front of a person with a yes and a no on it. That removes most of the work and none of the accountability.
What it costs to run once it is live
Model spend on an onboarding system is small, because most steps never touch a model. The recurring cost is integration maintenance: systems change their APIs, permissions get revoked, and a step that worked in March fails silently in September unless something is watching.
Set the price fields to your provider's current published rate per million tokens. The defaults are illustrative figures for the arithmetic, not quoted prices.
Run that with your own numbers and the point becomes obvious quickly. Model spend on this workload is usually a rounding error against a single integration breaking for a week. Budget accordingly, and be suspicious of any proposal where token cost is the headline number.
- Integration maintenance. The real recurring cost. Every connected system is a dependency with its own release schedule.
- Credential rotation. Service accounts expire and get revoked during unrelated security work. Monitor the auth path, not just the happy path.
- Template maintenance. Pricing changes, a new plan tier, a new region, and the template needs an edit. Budget an owner rather than a project.
- Sandbox environments. Testing a provisioning change against production is how you create a real account for a customer who does not exist.
- Infrastructure. A scheduler, a queue, a database and a log store. Small next to everything above.
The number that predicts trouble is the dead letter queue depth over time. A flat line means integrations are healthy. A slow climb nobody clears means the system is degrading while every dashboard still shows green, because the failures are sitting somewhere polite and out of sight.
How to tell whether you need this
Pull the last ten onboardings and answer five questions. It takes an afternoon and it decides the whole thing.
- How many calendar days did each take, and how many hours of actual work went into it? A large gap is waiting, and waiting is what a sequence removes.
- Which step was the last one done in each case? If the same step is late in seven of ten, you have one problem rather than a process problem.
- How many steps had to be redone because the first attempt did not take effect? That count is your missing verification.
- How many chase messages did a human write by hand? Those are free to automate and nobody enjoys writing them.
- Can everyone in the room name the event that means onboarding finished? If two people give different answers, fix that before anything is built.
If the ten instances look similar and the gap between calendar time and touch time is wide, the build pays back on that gap alone. If they look nothing alike, automate provisioning and verification only, keep the sequence in human hands, and revisit when volume argues otherwise.
How to start
Bring artefacts, not a description. The first call goes fastest when we can look at real instances and a list of the systems that have to be touched.
- Ten recent onboardings, with their threads and tickets, however messy
- The list of systems something has to be created in, and who owns access to each
- The current checklist, if one exists, plus an honest note on where it lies
- Whoever will own the templates afterwards, on the call from the beginning
The first deliverable is a labelled graph of your real process with the missing verify steps marked. That document is useful even if you never build anything, which is the point of producing it first.
ChatGPTalker, Onboarding Automation: state machines, the five kinds of onboarding step, idempotent provisioning and exit criteria.