← The work

The approval desk · rebuilt · running daily

Sales & GTM Automation

“How do you have this system continually run without stalling or asking permission?”

  • In production
  • Human-gated
  • Three touches, ever
  • One lead database
  • Paper: coming soon

The outbound sales operation of JSS Software Automations, my one-person company: rebuilt end to end and running headless on a Mac mini. It generates its own leads, works them over email and a call list, and improves itself on a measured cadence. Nothing reaches a person without my written yes in Slack.

The problem

Language models write passable cold email. That was never the hard part. The hard part is operation: an autonomous system acting daily against a finite market where the worst mistakes cannot be taken back. My market is owner-run screen-printing shops, and each will ever receive at most three emails from me. A hallucinated price, a message to someone who asked to be left alone, or an invisible double-send is not a bug to patch next sprint. It is a prospect destroyed in a market too small to regrow. Everything below follows from that.

How it works

1 · Signal generation

Two sources feed the pipeline. A paid shop directory supplies the known universe of shops, refreshed nightly by one crawler. A second sweep finds pain on its own: hiring posts, owner forums, shop-site changes. Channels that proved unreachable or empty for this market were deliberately left unwired.

2 · One lead database

Every lead is one row carrying its full history: emails sent, stage, calls, notes. New shops are qualified against the customer profile by website, email and phone, then bucketed by quoter status: no quoter at all, quoting by hand, or running an auto-quoter worth improving on. Fails are logged as disqualified and rechecked quarterly, and the database is backed up to git nightly.

3 · Outreach

A fixed sequence: the approved cold template, a follow-up if the shop stays cold, a third and final email, then the phone: a daily call list I work myself. The bucket is re-confirmed against the live shop site before every send, the stage sits on the row where I can always see it, and a reply at any point stops the sequence. Three touches per shop, ever, with suppression and the never-contact list checked in code on every send. Volume is a ceiling, not a target, and it scales by adding mailboxes, never by pushing one harder.

4 · Follow-up

A negative reply removes the shop from all future email, silently: I never see it. A question gets a reply drafted on the spot and sent on my yes. Interest sends the booking request, two slots plus a link. No response to either lands on the call list and stays pinned until resolved. A booked meeting is confirmed the morning of, held on the Meet with the demo live, and closed or lost with the reason logged.

5 · Slack, the only surface that reaches me

At the top of every month the desk posts the cold and follow-up templates for my yes; once approved, the sends run. Every client reply, question or booking crosses the gate before anything sends. My phone gets pushed only for a reply, a booking, a breakage, or a hot lead going stale; the daily call list and the weekly scorecard arrive on schedule, and negatives never ping me.

6 · Self-improvement

Weekly, the desk reports how it performed, with suggestions. Verdicts come from fixed-size send waves measured against tripwires registered before the wave starts, so the system cannot grade itself kindly after the fact. Research fires on events only: a tripped wire, the monthly source scan, the quarterly re-read of the customer profile. My edits to its drafts are mined monthly, so the drafting learns my voice. Once a month we set strategy together: cost per held meeting steers channels, the profile and the offer. Price and the offer never move on the system’s own judgment. All of it runs headless on a Mac mini under launchd, with an external watchdog that pushes my phone if anything dies.

Diagram scrolls sideways →

The rebuilt six-stage system on its headless foundation Six stages: signal generation feeds one lead database, which feeds a capped three-touch outreach sequence, then follow-up, with Slack as the gate that reaches Joseph and a self-improvement stage whose findings re-enter outreach. A foundation bar underneath runs everything headless and needs him for exactly five things. nothing reaches a person without my written yes the send path is denied in code, not in a prompt 1 · SIGNALS a paid shop directory, fed nightly pain the system finds: hiring · forums · site changes one crawler, one sweep 2 · ONE DATABASE every shop, one row each, carrying its full history bucketed by quoter status: none · by hand · improvable fails logged, rechecked quarterly 3 · OUTREACH three emails, spaced out, then the call list three touches per shop, ever, suppression checked in code volume is a ceiling, not a target 4 · FOLLOW-UP negative: removed, silently question: drafted, sent on yes interested: booking goes out meetings held, closed or logged 5 · SLACK · THE GATE monthly template approval every reply crosses my yes pings only for signal negatives never ping me 6 · SELF-IMPROVEMENT weekly scorecard, suggestions fixed send waves against pre-registered tripwires my edits mined monthly strategy stays a monthly call with me improvements re-enter outreach THE FOUNDATION headless Mac mini · everything on launchd · a watchdog pushes my phone if anything dies every event and dollar logged once · nightly git backup I am needed for exactly five things: template yes · reply yes / no · change proposals · monthly strategy · the dials
the gate, and the loop that re-enters sending flow enforced in code
Fig. 1. The whole system. Signals land in one database, outreach runs a capped three-touch sequence, every send crosses the Slack gate, and the improvement loop is the only path that feeds back into sending.

What a yes actually is

Human in the loop is usually an undefined pause: no semantics for what counts as approval, where it may be given, whether an edit is one, or what silence means. Every clause below was forced in by a real incident during the first version’s operation, and the rebuilt gate runs the same contract.

Diagram scrolls sideways →

The four possible outcomes of an approval request A routine drafts an action and posts it to the owning channel with one filled sample. Joseph's written reply then determines the outcome: a clear yes executes in that channel only, an edit executes the edited version, an ambiguous reply sends nothing and asks one question, and silence means the item waits whole, ages out and is rebuilt. A routine drafts an action Posted to the owning channel with one filled sample of the exact body My written reply a clear yes execute, in that channel and no other an edit is approval of the edited version ambiguous zero sends, and one question back silence waits whole, ages out, is rebuilt fresh
Fig. 2. Approval semantics, unchanged from V1. Silence is never approval, and a pending item is never partially prepared while it waits. The rule earned its place early: a bare “Looks good.” typed minutes after two different posts nearly shipped a batch against the wrong item. Ever since, ambiguity moves zero emails and asks one question.

Where it came from

The first version ran daily against real prospects, a scheduler working one shared state file. Its real numbers, its incidents, and the operating rules they forced are the subject of the report below. What survived here is everything that worked, rebuilt on a database instead of a shared file and a service instead of a scheduler.

The full report

Autonomous Sales Operations, the report on this system, is being updated against the rebuilt desk so the rules it states are the rules that run. Coming soon.

If you have run an autonomous system against an irreversible channel and found a better place to put the gate, that is the conversation I want. Email me.