Case study

The 9pm phone call

What happens when a homeowner calls a New England window and door replacement contractor after hours. We built and run the system behind it: two brands, two states, and 45 automations sitting between the phone and the calendar. The client is anonymous throughout.

45 automated workflows across two brands3 inbound phone numbers covered2 states of service territoryPhone, website form, cost calculator, SMS, WhatsApp and email unified on one record12 workflows changed in the identity rollout, 3 verified correct and deliberately left alone24-hour message recovery window, in both directions

The problem with 5pm

A homeowner whose window failed does not wait until business hours to start calling. They work down a list until somebody picks up. Every contractor knows this, and the usual answer is voicemail with a promise to call back tomorrow, which is a queue with better manners. The job is usually gone by then.

What we built instead

The call is answered, the caller is recognised, the job is qualified, and the estimate is booked before they hang up. Four things, in one conversation, at any hour.

Round the clock AI phone answering

An AI voice agent answers inbound calls on every company number, at any hour, including nights, weekends and holidays.

  • Runs on three inbound numbers across two brands.
  • No after hours callback rule beyond next business day, because the call is handled live instead of queued.

Caller recognized before the greeting

The inbound webhook looks the number up against the CRM and passes caller identity and history to the agent before it speaks.

  • Lookup runs on every inbound call through a dedicated caller lookup workflow.
  • Resolution searches leads first, then contacts, then resolves up to the parent household record.

Qualification on the call

The agent runs a real qualification sequence: decision maker test, replacement versus repair, service area check, address collection.

  • Decision maker test, replacement versus repair test, declined areas list and address collection are all specified in the current prompt version.
  • Service area is also checked programmatically against town, ZIP and state.

Books the estimate live during the call

The agent offers real open slots pulled from the live calendar and completes the booking inside the conversation.

  • Two step booking rule in the prompt: offer, then confirm.
  • Slots come from the live scheduling system, so a slot offered is a slot that exists.

Honest failure wording

If the booking does not complete, the agent says so plainly instead of claiming the visit is on the calendar.

  • Explicit failed booking wording is defined in the prompt.
  • The agent is barred from stating a visit is booked when booking did not succeed.

It is worth being precise about what this is not: the agent handles intake and booking and then hands off. It does not replace the person who runs the office, and it is not supposed to.

Staying in control of it

The objection we hear most is not “will it work”. It is “what will it say when I am not listening”. That is a fair question, and the answer is not a promise.

Hard guardrails on what the agent may say

The agent cannot quote prices or ranges, cannot promise an install date, cannot book outside working hours, does not ask the customer for their phone number, and never explains internal logic.

  • Six named prohibitions enforced at the prompt level.
  • Operator instructions that request a prohibited behavior are ignored by design.

Time boxed operator instructions

The owner adds a plain English rule with a start and end time to a table, and the next call follows it. Rules expire on their own.

  • Instruction table with active flag, start, end and priority fields.
  • Active rules are read at the start of every call and passed to the agent as dynamic variables.
  • Empty start means effective immediately, empty end means effective while active.
  • Guidance caps it at roughly five active rules for reliable adherence.

Hard schedule limits enforced twice

Critical date restrictions are set both in the agent instructions and in the calendar's minimum booking notice, so disallowed slots never reach the agent.

  • Operator guide explicitly recommends duplicating hard constraints as a booking notice setting.

Three leads, one household

The husband calls, the wife texts, the son fills out the form. In most systems that is three leads and three half-finished follow-ups, and the office finds out at the estimate.

One household, many people

Every phone number and email belongs to a contact, and every contact belongs to one lead record. A message from any of them lands on the same record.

  • Contacts table linking many contacts to one lead, rolled out across six intake and call workflows.
  • Resolution contract: search leads, then contacts, then resolve up to the parent lead.
  • Lead always wins when the same identifier matches both.

Phone matching that does not invent matches

Numbers are matched on the last ten digits after stripping formatting, instead of on literal string variants or substring containment.

  • Migrated from five literal format variants to normalized last ten digit equality.
  • Substring containment matching was identified as a false positive source and replaced.
  • Email matching is case insensitive, and unusable identifiers match nothing rather than matching everything.

Sends come from the number the customer knows

Outbound messages resolve the number that last spoke with the customer, so the thread stays continuous.

  • Last sender resolution runs in the four outbound lifecycle workflows before sending.

The system tells on itself

The dangerous automation failure is the quiet one: the message that never arrived, the booking that never landed, discovered a week later by a customer. We would rather the system embarrass us than surprise them.

Message recovery watchdog

A sweep of the last twenty four hours of carrier traffic recovers anything the live path missed, and alerts the team every time it has to.

  • Two directional twenty four hour window, upgraded from an outbound only ninety minute window.
  • Deduplication against message IDs, so anything it writes is by definition something the live path lost.
  • Alerts fire on recovered inbound only. Routine outbound backfill stays silent.
  • Bulk ID fetch plus set difference instead of one lookup per candidate message.

Whole message understanding, not first word

Reply matching reads the entire message, so a real sentence is treated as a sentence and not as a bare command.

  • This exact failure happened once and was traced to first word classification.
  • Matching now requires the whole body, case insensitive, with tolerated trailing punctuation.
  • The old first word value is retained for debugging.

Carrier decoupled webhooks

Webhooks acknowledge the carrier immediately instead of holding the connection open for the whole workflow run.

  • Response mode switched to immediate acknowledgement with a correct content type.
  • Two specific carrier error codes were traced to this design and eliminated.
  • Mattered most on a handler with a one minute wait node that exceeded the carrier timeout on every run.

Conflicts surface instead of failing silently

If a slot is taken, the appointment is marked unbooked and an alert with a direct link to the record is posted to the team chat.

  • Failed create and failed reschedule both write an explicit unbooked status.
  • Every failure posts an alert with the reason and a deep link to the record.

The calendar, from both sides

Two way calendar sync

Appointments created or changed in the CRM push to the calendar, and calendar-side bookings, reschedules and cancellations write back.

  • Dedicated sync workflow for CRM to calendar, plus separate booking, reschedule and cancel workflows for the reverse direction.
  • Only appointments in a schedulable status with a linked lead and a date are pushed.

Settle delay that prevents double bookings

The sync waits about thirty seconds after a time change, because people set the date first and correct the time a moment later.

  • Thirty second settle delay is deliberate and documented for operators.

Text replies that do real things

A customer replying YES confirms the appointment, CANCEL cancels it in the calendar, RESCHEDULE alerts the office. Everything else is forwarded and logged.

  • Intent routing implemented in the inbound SMS handlers for both brands and in the WhatsApp handler.
  • Cancel executes against the calendar directly.

Where the money went

Marketing attribution on every lead

Each lead is stamped with a computed acquisition channel derived from up to eight signals, including UTM parameters, ad click IDs, referrer and the self-reported answer.

  • Eight signals read per lead, including UTM fields, Google and Facebook click IDs, referrer, self reported source.
  • Channel is computed automatically rather than entered by staff.

Instant cost calculator with an emailed PDF estimate

Visitors get three price tiers on the spot, then receive a PDF of their estimate by email while the office gets a notification with the same numbers.

  • Three tier output, standard through deluxe.
  • PDF generated and emailed to the visitor on submission, with an admin-editable postscript offer.
  • Admin notification sent simultaneously so follow up can be proactive.
  • A condensed popup version mirrors the same flow and the same settings.

AI email intake with drafted replies

Inbound email is polled, classified by AI, turned into a CRM record and answered with an AI drafted reply.

  • Email intake workflows built for both brands, one of them a full rebuild.
  • Classification and auto-reply run in the same flow as record creation.

How we work

Most automation lives in the builder’s head, which makes both the builder and the client hostages. We write it down instead.

A living technical document

The whole system is documented in a versioned document covering every workflow, table and known defect, updated with each release.

  • Currently at version 1.10, with forty five appendix sections, twenty three tables and roughly two thousand paragraphs.
  • Each version records what changed against the prior version.
  • Known defects are written down with the fix described, including the ones not yet fixed.

Audit before change

Before a structural change ships, every live workflow is reviewed to classify what breaks, what is already correct and what has latent bugs.

  • The identity model rollout was preceded by a review of all live workflows.
  • Result: twelve needed changes, three that looked broken were verified correct and deliberately left alone, twenty two were not applicable.
  • The audit also caught a decoy node that looked like existing coverage and was in fact disabled and disconnected.

Operator guides in the operator's language

The people who use the system get guides written for them, in their language, describing expected behavior rather than architecture.

  • Separate operator guides exist for scheduling, message reliability and the agent instruction table.
  • Guides are written in the operators' native language.
  • They describe observable signals, for example that a cleared assignment is how you know a cancellation went through.

Client owns the accounts

The build sits on standard tools the client owns directly. No proprietary platform, no hostage data.

  • Stack is a voice agent service, a workflow engine, a relational CRM, a scheduling service, carrier APIs and a team chat app.
  • Workflow JSON is delivered to the client for review and import rather than pushed silently.

What we are not going to tell you

There are no before-and-after percentages on this page. The client has not yet supplied verified outcome numbers, and we are not going to invent them or dress up a plausible guess as a result. Everything above is a mechanism you can check, which we think is the more useful claim anyway. When the numbers exist, we will publish those too.

The open items are written down as well: call instructions are not yet scoped per brand, attribution records a lead as direct when it arrives with no signals, and do-not-contact is honoured at the household rather than per person. That list lives in the technical document alongside the fixes.

Questions this raises

Does the AI actually book the appointment, or just take a message?

It books. The agent pulls real open slots from the live calendar and completes the booking inside the conversation, using an offer-then-confirm rule. If the booking does not go through, it says so plainly rather than claiming a visit is on the calendar.

What stops it saying something it should not?

Six named prohibitions enforced at the prompt level: it cannot quote prices or ranges, cannot promise an install date, cannot book outside working hours, does not ask the customer for their phone number, and never explains internal logic. An operator instruction that asks for a prohibited behaviour is ignored by design.

Can the owner change how it behaves without a developer?

Yes. The owner adds a plain-English rule with a start and end time to a table, and the next call follows it. Rules expire on their own. For example: do not book the next two days, offer the earliest slot after that. Instructions currently apply across all numbers rather than per brand.

Who owns the accounts and the data?

The client does. The build sits on standard tools they own directly — a voice agent service, a workflow engine, a relational CRM, a scheduling service, carrier APIs and a team chat app. There is no proprietary platform in the middle, and workflow files are delivered for review and import rather than pushed silently.

Most contractors start smaller than this. If the website is the part that needs fixing, we rebuild it as a free demo first, by trade electrician, plumber, hvac contractor, remodeling contractor and more, or by area across Massachusetts, New Hampshire, Greater Boston.

Client details are withheld deliberately. We do not publish a client’s name, brands or numbers to sell the next engagement, and yours would get the same treatment.

Free redesignFree scan