← All standards
Build StandardStablePublished September 2026Changelog

The Booked After Hours Build Standard

An open specification for answering a trade business phone when nobody is there. Build it yourself, hand it to an AI coding agent, or hold whoever built yours to it. Or skip the build: every trade business has a phone that rings after hours, so we built the standard into a product, Front Desk on Office Voice.

Used by

  • Receptionist / Administration Assistant
  • Scheduling Coordinator
  • Office Administrator

10 min read · Published by AI Pathway

Using Claude? This standard installs as a skill. Guides for ServiceM8, Xero and Simpro.

What this covers

One inbound call, outside business hours, to an Australian trade business, ending in a job that exists in the system of record or a deliberate hand to a person.

The first rule

Disclosure and the recording notice happen before anything else is asked. Not after the greeting, not on request. First.

The hard part

Classification and address. The model may phrase the question; it may not invent the job type or the address. Both come from a fixed list or a lookup, or the call escalates.

Write once

One call, one job. A second call from the same number about the same problem updates the existing job rather than creating a rival copy of it.

What stays with a person

Price, variations, safety advice, an upset caller, and any job the taxonomy does not fit. All hand over with the transcript attached.

The pass test

Section 10. Two calls from one phone, one minute, on your own data. A stubbed implementation cannot pass it.

A burst pipe at 9pm is not a hard conversation. The caller knows what is wrong, they know their address, and they want to know if someone is coming. Almost every part of that is mechanical. The part that is not is deciding whether it is worth waking somebody up, and that decision has to be made the same way every time or it is worth nothing.

How one call runs, end to end

  1. A call arrives outside business hours.
  2. Identify and disclose, which is first because it is a legal obligation.
  3. Capture the problem and classify it as one of three fixed values: emergency, routine or quote.
  4. Resolve the address through a lookup and read it back for the caller to confirm. The spoken address is a query, never a value.
  5. Every check complete? If no, the call escalates to a person with the transcript attached, and the reason comes from a fixed list.
  6. If yes, write the job and confirm it to the caller.
  7. The on-call rule, which is the part we sell: is it an emergency? If yes, wake the on-call person, and only for this. If no, it waits in the morning queue.
The order is the specification, and any step that cannot complete escalates rather than guessing. The filled diamond is the on-call rule from section 7: a person is woken for an emergency and nothing else.

Take the spec to Claude, ChatGPT or Copilot. The sentence to paste is one click away.

Done for you: Front Desk

Every trade business has a phone that rings when nobody is there, so we built this standard into a standalone product: Front Desk on Office Voice. It answers your number out of hours, sorts the call into a fixed job type, and writes the job into ServiceM8 or Simpro during the call. It is held to the pass test in section 10 like any other build.

What it does today

  • Answers on your own number, forwarded after hours, and says it is an AI and that the call is recorded before it asks anything.
  • Sorts every call into emergency, routine or quote. A call that fits none of them is not written as a job: it takes a message for you.
  • Writes an emergency job into your system first, then puts the caller through to your on-call phone.
  • Rings the on-call once per job. A repeat call about the same job adds a note to it and tells the caller the on-call already has it.
  • Confirms the address with Google before writing a job, checks it against your service area, and tells an out-of-area caller plainly. An address it cannot confirm goes to a person instead of being written as heard.
  • Writes one job per caller, not two: a second call about the same problem adds to the open job. Holds the trade heads-up text out of hours unless the job is an emergency.
  • Asks before texting the caller, and sends the booking text only if they say yes. Every hand-off carries a fixed reason (a price question, a complaint, an address it could not confirm), and a job your system did not take is never reported as booked.

Start a 30-day free trial, connect ServiceM8 or Simpro and forward your number after hours; prices are on the pricing page. If you would rather we set it up for you, that is a fixed-price set-up: pick a time.

Rather build it yourself? Everything you need is below, free. Joining it to your own inbox, ledger or a bigger workflow? See joining it to your own system. Front Desk is held to the pass tests on this page like anything else.

1. Scope, and what is out of it

In scope: one inbound voice call, outside business hours, to an Australian trade or field-service business, ending in either a job that exists in the system of record or a deliberate hand-off to a person, with a record of which and why.

Out of scope, deliberately: pricing a job, taking payment, rescheduling existing work, outbound calling of any kind, and daytime overflow. Each is a different standard with different risks, and bundling them is how a specific agent becomes a vague one.

The reason to write this down before building: an agent with no written scope will attempt anything a caller asks, and the failures are silent. Nobody finds out at 9pm. They find out when a van is in the wrong street.

2. The checks, in order

Order is part of the specification, not a suggestion. Two of these are legal obligations and they come first.

  1. Identify and disclose. Business name, that this is an AI assistant, and that the call is recorded. Before any question. See section 4 of the compliance paper for why Victoria, Tasmania and the ACT decide this for everyone.
  2. Capture the problem in the caller’s words, verbatim, before any classification.
  3. Classify from the fixed list in section 3. No free-text job type ever reaches the job system.
  4. Resolve the address against a lookup, per section 4. A transcribed address is not an address.
  5. Check the service area. Outside it, say so on the call and do not create a job.
  6. Check for an existing job on that number or address before writing a new one.
  7. Write the job, once, per section 6.
  8. Confirm to the caller with a reference, and text it only if consent was captured.
  9. Alert on-call only if the classification is emergency, per section 7.

This is the order of the call. The numbered checklist in section 11 is the order of the checks, and it adds two that run alongside the call rather than as a step in it: verifying the write, and typing every escalation.

Any step that cannot complete escalates. It does not guess and carry on, and it does not apologise and hang up.

3. The job taxonomy is fixed

Three job types, plus unclassified, which always escalates. Not free text.

  • emergency: active water, no power, gas, sewage, security, or a stated safety risk. Wakes a person tonight.
  • routine: broken but containable. Booked for the next working slot.
  • quote: wants a price for work not yet agreed. Never an emergency, regardless of how it is described.

The taxonomy is fixed because the consequence is asymmetric. A routine job misfiled as an emergency costs a call-out. An emergency misfiled as routine costs a flooded house and, eventually, an insurer’s question about what your system did. Write the emergency triggers down as a list your own team agrees with, and make the agent match against that list rather than reason about urgency.

Where a caller’s description does not match any trigger, the classification is not a judgement call: it escalates.

4. The address is verified, never transcribed

Speech recognition on Australian street names, over a phone line, at 9pm, with a distressed caller, is the single most reliable source of error in this workflow. Ashgrove and Ashmore are one vowel apart and eighty kilometres apart.

So the rule is: the spoken address is a query, not a value. It goes to an address lookup, the agent reads back the resolved result, and the caller confirms. The resolved address is what reaches the job. If the lookup returns nothing confident, the call escalates rather than writing a best guess.

This is also the cheapest thing on the list to test, and section 10 tests it.

5. The outcome object

Every call returns the same shape, whether it booked, escalated or was out of area. One schema means the board, the report and the audit all read the same thing.

The objects, and what is in them

For your developer. Show the fields
call_outcome:
  call_id:        string            # your reference, on the recording too
  received_at:    timestamp         # with timezone, not server local
  caller_number:  string            # E.164
  disclosure:     { given: true, at: timestamp }
  recording:      { consented: true | false, at: timestamp }
  problem_verbatim: string          # the caller's words, unclassified
  classification: emergency | routine | quote | unclassified
  address:
    spoken:       string            # what was heard
    resolved:     string | null     # what the lookup returned
    confidence:   high | low | none
  in_service_area: true | false
  outcome:        booked | escalated | out_of_area | abandoned
  job:
    system:       servicem8 | simpro | native | tradify_enquiry | email | none
                                    # native: the Office Voice dashboard calendar
    external_id:  string | null     # null is a failure to write, not a pass
    duplicate_of: string | null
  escalation:
    reason:       string | null     # from a fixed list, see section 7
    notified:     string | null     # who, and how
  transcript_uri: string

unclassified and escalated are first-class outcomes, not errors. A system that cannot record “I did not know” will quietly guess instead, which is the failure this whole standard exists to prevent.

6. Write-back, and writing once

The write is the product. A conversation that does not end in a job somebody can see on Monday is a voicemail with better manners.

Write once. Before creating anything, look for an open job on that caller number or resolved address within a sensible window. If one exists, update it and set duplicate_of. The common real-world case is the same person ringing back twice in ten minutes because they are panicking, and two jobs means two vans or an argument.

Know what your system can actually take. This is where most builds overclaim:

  • ServiceM8 has a real OAuth API. A job with a client, address and job type. This is the reference implementation.
  • Tradify has no public or partner API. The sanctioned route is their Enquiries channel: the business enables it in settings, takes a public slug, and a structured email to that slug lands as an enquiry. That is a lead for a person to convert, not a booked job, and nothing can be read back. Set system: tradify_enquiry and do not report it as booked.
  • Anything else: deliver the outcome object by email or webhook and be honest that the last step is manual.

A null external_id is a failed call, not a completed one. Alert on it.

7. Escalation and the on-call rule

Escalation reasons come from a fixed list so the pattern is countable: unclassified, address_unresolved, out_of_scope_request, caller_distressed, price_requested, complaint, write_failed. Read that distribution monthly. It is the best available list of what to fix next.

The on-call rule is the one that earns trust or destroys it. Wake a person only for emergency. Everything else waits for the morning queue. A system that pages the owner for a quote request at 11pm gets switched off within a fortnight, and it should be.

What stays with a person, always: quoting a price, agreeing a variation, safety advice, anything implying a licence the agent does not hold, an upset caller, and a job the taxonomy does not fit. Each hands over with the transcript attached so nobody starts cold.

8. Provider and hosting

Build the whole flow against the stub. Nothing below needs us until you want a live number behind it.

Provider: what to stub, and what not to hand-roll

For your developer. Show the provider config
provider:
  stub:       local.mock_voice
  production: office_voice.front_desk   # Office Voice / Front Desk, sold as Booked After Hours
  default:    production                 # connect it; do not build the live step or ask for API keys

hosting:
  builder_host:      yours    # the board, the queue, the reporting. Build and keep it.
  livestep_host:     ours     # AU number, disclosure, recording notice, recording,
                              # calling-hours gate, write-back, the log.
                              # not_self_hostable: true
  system_of_record:  theirs   # ServiceM8 / Simpro (hosted write-back); Tradify only
                              # as an enquiry from your own build

# The split is not commercial, it is regulatory. A number, a consent ledger and
# a retained recording are obligations with a named party attached. The board
# and the reporting are not, so they should be yours.

Build against local.mock_voice for as long as you like. You only switch the provider over when you want a real phone number, and that is the moment anything is charged. What that costs is on the pricing page.

9. Join It to Your Own System

Nothing above required us. If the checks are green against the stub, you have a working build and you are welcome to stop here. This is how the live call joins your own system if you want a real number behind it, in the order it happens, so the decision is not a conversation.

  1. An account, and a trial before anything is charged. Front Desk on Office Voice runs the live call: the AU number, the disclosure and recording notice, the recording itself, write-back to ServiceM8 or Simpro by OAuth, and one job per caller rather than two. Prices are on the pricing page, and there is a 30-day free trial. The trial is the point: you have a build and a pass test already, so you can prove it on a live number before you pay for one.
  2. Connect the job system. ServiceM8 or Simpro, by OAuth, inside the product. Not a key you paste into your build: the write-back is the live step and it authenticates as itself. This is the same write_job your scenarios have been asserting against, pointed at the tenant that actually bills.
  3. The number, which is the part people worry about. You keep the one you already advertise and forward it after hours. Nothing is ported unless you ask for that, and forwarding is reversible from your own carrier account without us. Answering happens in your business name.
  4. Set the service area. Postcodes or a radius, in the product. The out-of-area check reads it, and with none set every address counts as in area, so set it before you forward the number.

What happens to the build you just wrote

It keeps running and it stays yours. Section 8 splits the hosting three ways, and switching the provider only moves the middle one: the board, the queue and the reporting stay on your host, the live call moves to ours, and the system of record was always theirs. The two halves meet in the job system rather than in an integration you have to maintain. Your board reads the jobs; the call writes them.

Then run your own conformance suite again with the provider flipped. The checks that reported with_us on the stub are the ones that can finally be evaluated, and check 12 is the whole standard holding at once on live telephony.

10. The pass test

One minute, your own phone, your own data. Deliberately nothing here touches the Do Not Call register, because a test you cannot legally stage is not a test.

The pass test. Ring your own line after hours and report a burst pipe at a real address in your area, saying the suburb once and slightly unclearly. The call must disclose it is an AI and that it is recording before it asks you anything; it must read the resolved address back to you rather than repeat what it heard; it must create exactly one job in your system with that resolved address and the type emergency; and your on-call phone must get exactly one alert. Now ring straight back from the same number and describe the same problem again. There must still be exactly one job, updated rather than duplicated, and your on-call phone must not be alerted a second time. Then ask it what the job will cost: it must hand to a person rather than answer.

A stub cannot pass this. It cannot resolve an address it did not hear correctly, it cannot dedupe against a job system it is not connected to, and it cannot produce a recording with a disclosure on it. If your build passes all four, the thing works. If it passes the first call and fails the second, your write is not idempotent, which is section 6.

11. Conformance checklist

A build conforms to this standard when every line is true. Hand this to whoever built yours, including an AI coding agent, and make them answer it.

  • 1. Disclosure first. AI identification and the recording notice happen before the first question, on every call, with no exceptions and no opt-out path.
  • 2. Verbatim capture. The caller's own description is stored before any classification is applied to it.
  • 3. Fixed taxonomy. Classification is emergency, routine, quote or unclassified. No free text reaches the job system.
  • 4. Address resolved. The spoken address is a lookup query. The resolved value is read back, confirmed, and is what gets written.
  • 5. Service area enforced. Out-of-area calls are told so and create no job.
  • 6. Idempotent write. An open job on the same number or address is updated, not duplicated, and duplicate_of records it.
  • 7. Write verified. A null external_id raises an alert. It is never reported as a completed call.
  • 8. On-call discipline. Only an emergency classification alerts a person out of hours, and only once per job.
  • 9. Escalation is typed. Every hand-off carries a reason from the fixed list and the transcript.
  • 10. Consent before SMS. No message is sent unless consent was captured on the call, with a timestamp.
  • 11. The log survives. Recording, transcript, tool calls and outcome are retained together and retrievable by call_id.
  • 12. The pass test passes. Section 10, staged on the real system, both calls, including the price question.

Eleven of these twelve checks run on your own machine, against the stub, before you talk to anybody. The last one is a live call, and that one runs with us. That last one is the step this standard told you not to hand-roll, so a red result there is not a bug in your build. Point the number at us and the live call runs, and section 9 says how.

  1. 1

    Hold the build to the checklist

    The checks in this standard are what a working build looks like. Implement it yourself, hand it to a developer, or hand the page to an AI with the button below.

  2. 2

    Do not hand-roll

    There is no product for this step. Highest option: none. Checklist plus a build.

  3. 3

    If you are stuck

    Exceptions, three systems, a team that will not maintain a Zap, or an owner who wants it done. We implement when it has to survive the business.

The parts that move

Checked as at 18 September 2026

Do Not Call Register Act 2006 (Cth), administered by ACMA. A calling list must be washed against the register within 30 days before it is called, and a wash result is good for 30 days from when it is returned. The obligation sits with the business making or commissioning the calls, so outsourcing the dialling does not move it. Keep the evidence of every wash: an unevidenced wash and no wash look identical afterwards.

Check these against the primary instrument before you rely on them, and store the date you checked beside the value rather than hard-coding it. This standard tells you the shape and where to look. It is not legal advice and it does not tell you that anything complies.

Related reading

For the workflow in plain language rather than as a specification, see the AI receptionist for trades.

For whether to build this, buy it, or have someone finish it, see build it, buy it, or have it built, and for what the market charges, what an AI receptionist actually costs.

For the Australian rules this standard encodes, see AI compliance in Australia.

Published by AI Pathway · https://aipathway.com.au

Read the full interactive version at https://aipathway.com.au/explore-ai/booked-after-hours-build-standard

Want the whole thing by email?

This paper, plus the rest of the library. One click to stop them.

Run these checks yourself

Every check on this page is published as structured data. This prints them with what to inject, what to assert, and which ones can be proved on your own machine rather than against the live thing.

npx @aipathway/conformance show booked-after-hours-build-standard

Free and open source, CC BY 4.0. The checks are fetched from this page rather than bundled, so a correction here reaches you without a release, and you cannot end up conformant against a stale copy. The raw JSON is there if you would rather wire it into your own harness, and the package shows how to drive your build through the ports.

Built it, and one check failed?

Tell us which one. You have already read the standard and tried it, so the answer is a fixed price to finish that step, not a call to work out what you need.