SHT-01Agent schedule

Agents that work the phone, then get out of the way.

Three systems in production, 3,915 automated tests across them. One agent or one automation in the CRM you already have is the AI Automation Sprint, $999, 1-2 weeks. The full agent inside a system of your own is part of a custom CRM build, from $2,500, 30-45 days.

One of the systems we built has AI in it, and this is the only sheet where we say so. Everything below names the file it comes from. The agent's job is to hold the call, sort the reply, and put a person in front of the lead while it is still warm. AI goes where it closes a gap in the work, not where it looks good in a deck.

SHT-02Detail A · voice

The call ends. That is the moment the system does its work.

A Vapi assistant holds the conversation. When it ends, Vapi posts the end-of-call report back into the system, which checks a shared secret before it believes anything, reads the duration to tell a real conversation from a wrong number or a voicemail, normalizes the number to E.164 and matches it to a lead record, and sends a Telegram alert carrying the summary, the reason the call ended, the front of the transcript and a link to the recording into one chat, the studio's own founder DM in that system, while the lead is still warm. Short calls and no-answers are recorded but not announced, because an alert that fires for everything gets ignored. Which line an assistant sits on is a setting in the phone provider's dashboard rather than something in the code, so this sheet does not tell you who called whom: what the file proves is the report and the handoff.

  • A Vapi assistant holds the conversation
  • Webhook rejects anything without the shared secret
  • Number normalized to E.164 and matched to the lead record
  • Telegram alert only when a real conversation happened
  • Proof
    wallflow-saas · app/api/vapi/webhook/route.ts, lib/telegram.ts

SHT-03Detail B · telephony behind the dialer

Twilio underneath, and none of it belongs to the agent.

These routes carry the calls a person places, not the ones the voice agent handles: nothing in this directory mentions Vapi. A token endpoint lets the browser dial, and it grants outgoing only, with incoming switched off in one line. A voice route returns the instructions to dial. A status callback writes the final disposition onto the lead by itself, so nobody has to click a button to record that a number was dead. A hook fires when the recording finishes writing, fetches it and has it transcribed, which happens inside that hook rather than in a route of its own. Five files do that work. The sixth dials one hardcoded number and exists to prove the setup is alive.

  • Token endpoint grants outgoing calls only
  • Voice route returns the dial instructions
  • Status callback writes the disposition with no click
  • Recording hook fetches and transcribes after the call
  • Proof
    wallflow-saas · app/api/twilio/ (token, voice, call, call-status, recording-done; test-voice is a debug endpoint)

SHT-04Detail C · follow-up engine

Twelve modules, and most of them exist to stop the machine doing something stupid.

Automated follow-up is easy to build and easy to get wrong in ways nobody notices for a month. Each module below was written after a specific failure, and the failure is written into the top of the file.

C1reply-classifier.ts

A bounce is not a reply

Every message that came back used to count as a human answering. Bounces, out-of-office autoreplies, and opt-out shouts all promoted a lead to 'replied' and quietly paused its sequence, which then had to be undone by hand. The classifier separates the four cases and routes each one differently.

C2hot-replies.ts

A real reply that nobody answered

A lead that answered and has heard nothing back since is the most expensive thing in the pipeline. It goes into a daily digest and stays there until someone actually moves it, rather than being announced once and forgotten.

C3adaptive-cap.ts

The engine throttles itself

When sending volume is high and real replies are not, the daily cap comes down on its own. Sending harder into a spam folder costs the sending domain, and the domain is the one asset here that cannot be replaced.

C4business-days.ts

It knows what a weekend is

Every wait in the system is counted in business days, and a step that lands on a Saturday moves to the Monday. A nudge that arrives on a Sunday reads as a machine, because it is one.

C5sequences.ts

The cadence lives in code

Steps are stored relative to the step before them, and where a subject line has variants, the variant is picked by a deterministic hash of the lead. The same lead always gets the same one, so a restarted sequence never reads as a different sender.

C6gmail.ts

It reads the real inbox

Sends over SMTP and reads replies back over IMAP from the actual mailbox, so a reply is a reply rather than an inference from a tracking pixel. Every message carries a working unsubscribe.

Proof · wallflow-saas · lib/followups/ (12 modules)

SHT-05Detail D · the dialer

A person is on the line. The agent does the paperwork.

A caller opens one tokenised page and works a list: the next number, who it is, what happened last time, and where the outcome goes. Eight endpoints stand behind that page, the campaign, the lead, the log, the callbacks, the calendar, the activity feed, the history, and the outreach record. Nothing is generated for the caller mid-conversation. The software's job is that they never have to look anything up.

  • One tokenised page, no CRM login to hand out
  • Call outcome and callback written as they happen
  • History of the lead visible before the number dials
  • Eight endpoints behind it, all server-side
  • Proof
    wallflow-saas · app/va-dial/[token], app/api/va-* (8 routes)

SHT-06Detail E · scheduled work

Thirteen jobs were written. Five are on a clock, because the rest were shouting.

The parts of the working week that depend on a person remembering are the parts that stop happening in a busy month, so they were written as jobs that run on a schedule. Then they were counted from the other side. Every one of them delivered into the same chat, this studio's own founder DM, at roughly six to eight Telegram messages a weekday, which the note filed with them calls the spam. On 2026-05-15 commit 1e0d7e6, 'pause the 8 founder-bot Telegram crons', took eight out of the schedule and left the code in the repository, callable by hand. Its author is the author who had added those alert crons a month before, which is the part worth sitting with: the person who wrote the reports is the person who switched them off. The lesson is not about cron. The ceiling on automated reporting is not what a system can send, it is what one reader will still open.

  • 01followup-engine · twice a weekday
  • 02reminders · daily
  • 03expire-trials · daily, and silent since its message was cut
  • 04inbox-cleanup · weekly
  • 05va-daily · weekdays, from the CI workflow
  • 06followup-stats · off the schedule 2026-05-15
  • 07lead-rescue · off the schedule 2026-05-15
  • 08morning-briefing · off the schedule 2026-05-15
  • 09evening-reflection · off the schedule 2026-05-15
  • 10weekly-revenue · off the schedule 2026-05-15
  • 11resend-stats · off the schedule 2026-05-15
  • 12competitor-monitor · off the schedule 2026-05-15
  • 13smoke-test · off the schedule 2026-05-15

Proof · wallflow-saas · vercel.json crons, .github/workflows/daily-crons.yml, docs/paused-crons-2026-05-15.md

SHT-07General notes · what this page will not claim

The parts we are not going to tell you.

How accurate is it?
There is no percentage on this page because we do not have one we would be willing to defend. What we can show you is the code that decides, and the failure each rule was written after.
Does it replace someone?
No, and it is not built to. The voice agent's entire design is the handoff, it holds the conversation, works out from the end-of-call report whether the call was real, and gets a human in front of it. The dialer is the same idea from the other end: a person talks, the software keeps the record.
Is the AI in everything you build?
No. The sauna building system deliberately has none. Both AI features it inherited were removed, because neither could actually run and one of them reported work it had not done. It is a better system for it, and we would rather say so than let this page imply otherwise.
Can an agent move a job on its own?
It is not wired to. The agents here classify, route, and notify. Moving a project forward, sending an estimate, or taking a deposit is a deliberate action by a person, and that is a design decision rather than a limitation we are waiting to remove.

SHT-08Detail F · what you can buy on its own

One automation, one sprint.

Not every business needs the whole system. The AI Automation Sprint is one piece with a written scope and one number it should move, built into the tools you already run and live on your own accounts at the end. Pick the leak.

$9991-2 weeks

See it on the ladder →
  • A voice agent that holds the conversation and hands the lead to a person
  • Follow-up on the quotes and enquiries nobody answered
  • Email, WhatsApp and Telegram enquiries sorted into the CRM
  • A call or meeting summary in the client card, with the next step
  • A weekly owner report that sends itself

SHT-09Cross-reference

The agent is only as good as the record behind it.

An agent that handles a call and writes into nothing is a novelty. The reason the handoff works is that there is a system on the other side of it: the lead, the estimate, the deposit, the schedule. That is on its own sheet.

See the system

SHT-10Issued for construction

Start with the audit.

A short video walkthrough of where your lead flow leaks and what it would take to close it. Free, and there is no call afterwards unless you want one.

  • Where the lead flow leaks, walked the way a buyer walks it
  • The one fix worth doing first, and what it is costing to leave
  • What to automate first, and what is not worth automating yet
Get my free audit →

30 seconds to submit · delivered same day · no card, no call