Board 1 — The Journey

Step by Step — What Happens to Every Lead

A "lead" is a person we're trying to reach — a short-term rental owner. Every lead follows these exact steps. Nothing skips ahead.

1
🏠

A new person is found

We spot a short-term rental owner (Airbnb or VRBO host) we'd like to work with. Skylar adds them to the CRM as a lead — our word for a person we're actively trying to reach.

👤 Skylar does this
2
🗄️

Attio remembers them

Attio is our memory — a database that stores everything about each person: their name, their phone number, every message we've ever sent, their replies, and whether they've ever asked us to stop. This is the source of truth.

⚡ Automatic
3
🤖

Skylar enrolls the lead and writes the message

Nothing happens automatically. Skylar runs a command called /enroll — this is how a lead actually enters a campaign. It creates the planned messages and sets the schedule. Skylar writes what each message says, picks the timing, and chooses who gets it. Claude (the AI) can suggest wording or fill in personalization, but Skylar is always the author and the one who kicks it off.

👤 Skylar runs /enroll ·🤖 Claude assists if asked
4

Skylar says yes — or no

Every message needs a real human to approve it before it can go anywhere. Nothing sends on its own. If Skylar says no, the message disappears. If Skylar says yes, it gets scheduled. Creation = approval. No exceptions.

👤 Skylar must approve every send
5
📱

The text goes out automatically

The Worker — a tiny robot program that runs in the cloud every 60 seconds — sees the approved message and sends it at the right time. It uses SignalHouse (our phone service) to actually deliver the text. Like a very reliable postal worker who never sleeps.

⚡ Worker + SignalHouse handle delivery
6a
💬

They write back — everything freezes

When the lead replies, the Worker catches the incoming message and logs it in Attio immediately. All future texts to that person are put on hold until Skylar reads the reply and decides what to do next. A reply could mean anything — the machine doesn't guess, a human decides.

⚡ Worker logs it ·👤 Skylar decides next move
6b
🛑

They say "STOP" — done forever

If the lead says stop, unsubscribe, opt out, or anything like it — they are removed from every channel instantly and permanently. No one can override this. Not Claude, not Skylar. It's built into the code.

🛑 Blocked forever on all channels
Board 2 — The Parts

Every Part — What It Does

Six main parts. Each one has exactly one job. They talk to each other but can't do each other's jobs.

👤 The Boss Skylar — the human decision-maker Makes every important call. Approves every send. Decides who to reach. The whole machine is waiting for a yes or no from here. Without Skylar, nothing moves.
🤖 The Helper Claude — the AI assistant Reads all the data, drafts messages, runs daily checks, and tells Skylar what needs attention. It's like a very fast intern that does all the legwork — but it never sends anything without being told to.
🗄️ The Memory Attio — the CRM database Stores every lead: name, phone, every message sent, every reply, and consent status (did they opt out?). This is the single source of truth. If Attio says something, believe it.
⚙️ The Rail Cloudflare Worker — the automation engine Runs every 60 seconds, around the clock. Sends approved texts on time. Catches incoming replies. Checks every safety rule before any message goes out. It's the machine that never sleeps or forgets.
📡 The Phone Line SignalHouse — texts + calls provider The actual phone service that carries texts and calls out into the world. Think of it like a phone company for business software. The Rail talks to it; it does the actual delivering.
💻 The Desk Terminal CRM — the rep's screen The screen where reps type commands to see their leads, start a campaign, or work their book. Simple text-based — type a sentence, get an answer. It holds no secret keys; all the keys live backstage in the Office.
🧪 Practice Mode Fake leads · zero risk · no sign-in needed New reps can use the full system with fake data — no badge (sign-in) required. Nothing touches a real person. Great for learning the commands before going live.
🔑 The Key Box Doppler — secret manager Holds all the passwords and API keys (secret codes for talking to outside services). Nobody types them by hand. The machine fetches them automatically.
🎥 The Video Studio Cap.so — video tool Records and edits short personal video messages we can send to leads. Live and working today on this machine — nothing goes to the cloud.
🔔 The Alert Bell Discord — notification hub Gets a ping when something important happens: a reply comes in, the system breaks, or a daily health check fires. Everyone on the team can see it.
📋 The To-Do Board GitHub Issues — task tracker + code home Where bugs and new features are tracked as open issues. Also the home of every line of code that makes the machine run.
Board 3 — The Rulebook

Every Rule the System Runs On

15 rules across 3 groups. These aren't suggestions — they're written into the code. Three groups: rules that protect the lead, rules that keep humans in charge, and rules that keep data clean.

🛡️ Group 1 — Protect the lead (machine enforces these automatically)

🛑 STOP means stop. Forever. Every channel.

Text, call, or verbal — any opt-out blocks that person on every channel instantly and permanently. Even "stop" said out loud on a call is caught from the call transcript. No override. No undo.

⏸️ Any reply freezes everything for that lead.

The moment a lead writes back, all future messages are frozen instantly. The machine doesn't guess what it means. It waits. A human reads it and makes the call.

🚫 System starts at "no" before every send.

Before every text, the Worker runs a full checklist: opted out? Business hours? Reply pending? Daily cap hit? All must pass. One fail = no send. Always.

🕘 Texts only go out during business hours.

Weekdays, 9 am–5 pm in the lead's local time zone. A message due at 7 pm waits until 9 am next morning. Checked every single send.

📊 Daily send cap — a hard circuit breaker.

Hard limit on texts per day. Once hit, the machine stops sending entirely — no override. Prevents a bug from blasting hundreds of people accidentally.

🔁 The same message can never send twice.

Every message has a unique ID. The Worker checks before sending — if it's already gone, it skips. A bug or retry can never double-text a lead.

✋ Group 2 — Keep humans in charge (machine helps, humans decide)

🚀 Enrollment = approval. Then it runs itself.

When Skylar runs /enroll (the command that adds a lead to a campaign), that act is the approval for the whole sequence. The Worker then runs each step automatically — no per-message clicking needed.

📋 /start-sales runs every morning.

Skylar runs this command daily. It surfaces every frozen lead, every unread reply, every waiting decision. If she skips it, frozen leads stay frozen safely — nothing moves without her.

🤖 Claude drafts. Humans approve what matters.

Claude writes messages and suggests next steps. Humans review anything consequential — a new campaign, a hot reply, an unusual situation. The AI does the legwork; the human makes the call.

🐛 If something breaks — stop and file a ticket.

If a rep hits a bug, they stop. Don't work around it. File a bug report in GitHub Issues (the to-do tracker) and wait for admin to fix it right.

🧪 Real owners are never test recipients.

One designated safe test number exists. All test sends go there only. A real lead's number is never used to test anything. Full stop.

🔐 The Desk never holds secret keys.

The screen reps use (the Desk) holds no passwords or API keys. All keys live backstage in the Office. The Desk is fully untrusted — by design.

🗂️ Group 3 — Keep data clean (where things live and who sees what)

🗄️ Living lead data stays in Attio.

Any info about a real lead lives in Attio (the CRM database). Don't copy it into a doc, a chat, or a spreadsheet. It will go stale. Trust the CRM.

📁 Decisions that must last go in the repo.

Rules, plans, specs — anything that needs to survive past a chat window goes in the GitHub repo (the code home). Not in a Slack message or someone's head.

👤 One rep, one book. No peeking.

Every rep sees only their own leads. The system blocks access to anyone else's book. "That's not your lead" — and it means it.

Board 4 — Capability Map

Everything This Machine Can Do

The engine is simple: a Worker that runs every 60 seconds + Attio memory + Claude brain + any provider we plug in. That unlocks a lot. Here's the full picture — what's live, what's coming, and what's possible the moment we wire it up.

● LIVE today ● CANARY — tested, not full production ● PLANNED — building soon ○ POSSIBLE — plug it in and it works
📤 Reach Out — ways to contact a lead
📱 Text Message LIVE

Write it, schedule it, send it. Personalized per lead. Delivered by SignalHouse.

🎥 Personal Video LIVE

Record a short video on this machine with Cap, send it via text link. Feels personal — because it is.

📞 Phone Call LIVE

System dials via SignalHouse. Call logged in Attio automatically.

⚠️ Autodialer (fully automated dialing without a rep clicking) still needs full end-to-end testing.

📧 Cold Email CANARY

Smartlead (our email tool) is live. Sequences are being finalized. The only thing left is completing the inbox warmup period — after that, ready to go live.

⚠️ What's left: Complete email inbox warmup. Then go live.

🎙️ Ringless Voicemail POSSIBLE

Drop a pre-recorded audio message straight into their voicemail — no ringing, no awkward silence.

✉️ Physical Mailer POSSIBLE

Trigger a printed postcard to a lead's address using a service like Lob. Stands out in a noisy inbox world.

🔁 Smart Follow-Up — the machine keeps working while you sleep
⏸️ Auto-Freeze on Reply LIVE

A reply instantly freezes all future texts to that lead. Waits for Skylar to read and decide. Never assumes what a reply means.

📅 Campaign Sequence LIVE

A multi-step plan: text day 1, video day 4, follow-up day 10. Enrolled once — the Worker runs it automatically until a reply or the last step.

📆 Date-Based Trigger LIVE

Fire a message on a specific date — seasonal check-in, "heading into peak season," or an anniversary of when they first reached out. The Worker checks every 60 seconds and sends any message whose date has arrived.

🧊 Re-Engagement POSSIBLE

Leads that went cold 60+ days ago automatically get a fresh outreach — different message, different angle. Wake up the dead list.

🔀 A/B Message Testing PARTIAL

Send version A to half a group, version B to the other half. The testing part is built. Automatic winner rollout (machine picks best and switches to it) is not yet implemented. Live end-to-end test still needed before this is production-ready.

⚠️ What's left: Build auto-winner rollout. Run a live end-to-end test across a real campaign.

📬 Auto-Book a Call POSSIBLE

Connect Calendly (scheduling tool) so when a lead says "yes" to a call, they get a booking link instantly — no manual back-and-forth.

Tasks for Humans — things the machine queues up for Skylar or a rep to do
📞 Task: Call This Lead LIVE

Machine creates a to-do: "call Sarah today." Rep clicks, system dials. Call logged automatically in Attio.

💬 Task: Text This Lead LIVE

Same as the call task — but queues a text instead. "This lead hasn't heard from us in 14 days. Text them today."

🎥 Task: Record a Video LIVE

Queue a reminder: "Record a personal Cap video for this lead today." Opens Cap pre-loaded with context on who you're recording for.

⏰ Reminder: Follow Up LIVE

"Check in with Mike in 30 days." Machine pings you on day 30. You decide what to do — text, call, or skip.

🎁 Task: Send a Gift POSSIBLE

Machine queues: "Send this lead a gift card or Amazon item." Connect a gifting service and it ships automatically on approval.

🤝 Task: Connect on LinkedIn POSSIBLE

Machine finds the lead's LinkedIn and queues a connection request task for the rep. Multi-channel without doing it manually.

🧠 Intelligence — the machine learning and getting smarter
🛑 Auto Opt-Out Detection LIVE

Claude reads every reply and auto-detects "stop," "remove me," "wrong number," or call refusals. Acts immediately — no human needed.

💬 Reply Classifier POSSIBLE

AI reads a reply and suggests what it means: "Interested," "Not now," "Wrong number," "Hot lead." Skylar sees the suggestion before deciding.

⭐ Lead Scorer POSSIBLE

AI gives each lead a score based on their profile: listing count, market, engagement history. Focus energy on the hottest prospects first.

📊 Market Report POSSIBLE

Auto-generate a "what's happening in your market" snapshot for a lead's city. Send it as a value-add before asking for a call.

💰 Revenue Estimate POSSIBLE

Calculate what Leveled could earn this specific owner based on their listings and market. Personalized proof point baked into the first message.

🏆 Best Message Picker POSSIBLE

After running A/B tests across campaigns, Claude learns which messages work best for which markets and lead types — and uses that automatically.

🔍 Opportunity Finder PLANNED

Claude reads through past conversations and flags leads you should have followed up on but didn't. "This person seemed interested 3 weeks ago and nothing happened." Surfaces hidden revenue sitting in the existing book.

⚠️ What's left: Build the conversation analysis logic. Define what "missed opportunity" looks like in code.

🎓 Sales Coach PLANNED

Claude listens to call recordings and reads outreach history, then gives specific coaching: "You always lose momentum on the 3rd follow-up — here's why and what to say instead." Gets smarter the more calls and messages it analyzes.

⚠️ What's left: Wire call recordings into the analysis pipeline. Build the coaching output format.

📈 Reporting — always know what's working
☀️ Daily Digest (/start-sales) CANARY

Skylar runs /start-sales each morning — a pre-built checklist showing every frozen lead, every reply to read, every message waiting for a decision. One screen, 60 seconds.

⚠️ What's left: Formalize the daily review flow fully. Live testing to confirm it shows everything Skylar needs.

📉 Campaign Funnel Report PLANNED

For any campaign: how many enrolled → sent → replied → booked. See exactly where leads drop off.

⚠️ What's left: Build the report renderer. The JSON data contract is already spec'd — needs the display layer built.

🗺️ Pipeline View PLANNED

See every lead and where they are: Initial Contact → Engaged → No Response → Lost. Across all campaigns at once.

⚠️ What's left: Build the pipeline report renderer. Same as campaign funnel — data contract is spec'd, display layer needed.

📊 Number Tracker PLANNED

Tracks the key numbers across the whole acquisition process — reply rate, book rate, cost per booked call, best-performing market, best-performing message type. Then surfaces the single highest-value move: "If you fix X, you get the most new clients for the least effort."

⚠️ What's left: Define which metrics matter most. Build the calculation layer. Build the "highest-value move" recommendation output.

Board 5 — Campaign Best Practices

How to Start a Campaign the Right Way

A "campaign" is a named outreach plan — a group of leads, a series of messages, a goal. Here's how to set one up so it actually works.

Before you launch — the checklist

🎯
Name your audience Who exactly are you reaching? Be specific. "STR owners in Newport Beach with 2+ listings" beats "short-term rental owners." The tighter the group, the better the message can fit them.
✍️
Write the message steps How many messages will you send? In what order? Day 1 text, Day 3 follow-up, Day 7 video? Write each one out before you launch. Use the personalization tags below to make each message feel one-on-one.
📅
Set the timing between steps How many days between each message? Don't go too fast — back-to-back texts feel spammy. 2–5 days between steps is a good starting point. The Worker respects business hours automatically.
🧪
Test on the safe number first Before it goes to real leads, send every step to the designated test phone number. Read each message out loud. Does it sound like a real person? Does the name fill in correctly? Fix it before it goes live.

Personalization — make every message feel one-on-one

Use merge tags — little placeholders that get swapped out for each lead's real info when the message sends. Write one message, send a thousand personal ones.

Name tags

{{first_name}} → "Hey Sarah, ..."
{{full_name}} → "Hi Sarah Johnson"

Market & location tags

{{market}} → "owners in Newport Beach"
{{city}} → "your place in Scottsdale"

Property tags

{{listing_count}} → "you manage 3 listings"
{{platform}} → "your Airbnb" or "your VRBO"

Conditional block — show different text per group

Example: "I work with owners in {{market}} who have {{listing_count}}+ properties" — the number and city change per lead automatically, making it feel researched and personal.

Example — what a personalized first text looks like

Message template (what Skylar writes)

Hey {{first_name}} — saw you're managing a place in {{market}}. I help STR owners there maximize their revenue without more work. Worth a quick 15-min call?

What the lead actually receives

Hey Sarah — saw you're managing a place in Newport Beach. I help STR owners there maximize their revenue without more work. Worth a quick 15-min call?
Board 6 — Staying Organized

How to Stay Organized in This System

Everything has one home. Put it in the right place and the whole machine stays clean.

Where things live

🗄️ Lead info → Attio

Every lead's name, phone, history, replies, and opt-out status. If it's about a real person, it lives here. Attio is always the source of truth.

📋 Bugs & tasks → GitHub Issues

If something is broken or needs to be built, it becomes a GitHub Issue (a to-do ticket). Not in a chat message. Not in someone's memory. In the tracker.

🔔 Alerts → Discord

When the system fires an alert — a reply came in, something failed, or the daily health check runs — it goes to Discord. That's where the team stays in the loop.

The daily rhythm (what Skylar does each morning)

1️⃣
Run /start-sales — the morning command /start-sales is a pre-built checklist Skylar runs every morning. It pulls up every frozen lead, every reply to read, and every message waiting for a decision — all in one place. This is the command that runs the day. If she doesn't run it, frozen leads stay frozen safely — nothing moves without her.
2️⃣
Read and clear held replies Any lead who replied has their texts frozen automatically (see Board 1, Step 6a). /start-sales surfaces all of them. Skylar reads each reply and decides: keep going, stop, or hand off to someone else.
3️⃣
Approve any waiting messages Messages drafted and queued are waiting for a go. Skylar reviews, edits if needed, and approves. The Worker then picks them up and sends on schedule.
4️⃣
Run /enroll for new leads If there are new people to reach, Skylar runs /enroll — the command that adds a lead to a campaign and creates all their planned messages. The machine then runs the sequence automatically until the next reply or decision point.

Golden rules for staying clean

Living lead data lives in Attio. Don't copy it into a doc, a chat, or a spreadsheet. It will go stale. Trust the CRM.
Decisions that must last go in the repo. Anything that needs to survive a chat window — rules, plans, specs — belongs in the code repo, not a Slack message.
⚠️ If something looks broken, stop and file a ticket. Don't try to patch it on the fly. Open a GitHub Issue (a bug report). The admin fixes it properly.
⚠️ One rep, one book. You only see your own leads. If a lead isn't yours, the system blocks you. Don't work around it — hand it off properly through the Desk.
Board 7 — The Words We Use

Our Vocabulary — Every Word, Plain and Simple

These are the exact words we use in this system. Use them the same way every time so nothing gets lost in translation.

People

👤 Person

Any human contact stored in the CRM. The raw record. Not yet being worked for a sale.

Don't say: contact, record, prospect

🎯 Lead

A Person we're actively trying to close. Someone being worked right now for a sale.

Don't say: prospect, deal

📚 Book

The full list of Leads a rep is allowed to work. Your assigned territory.

Don't say: assigned records, territory list

🙋 Owner

The rep who is responsible for a specific Lead. One lead, one owner at a time.

Don't say: assignee

👔 Manager

A user who can see the whole team's Book and move Leads from one rep to another.

Don't say: admin (when talking to reps)

🔖 Visitor

Someone with access to the code but no Badge (sign-in). Can only use Practice mode — no real data.

Don't say: unauthorized user

Work

📋 Activity

Any recorded interaction with a Lead — a text sent, a call made, a note logged. The history.

Don't say: touch (to reps), event

➡️ Next Step

The next approved action queued up for a Lead. "Text them on Thursday." One lead has one next step at a time.

Don't say: planned touch, task payload

🔄 Handoff

Moving a Lead from one rep to another. Logged in the Paper Trail so nothing is lost.

Don't say: share, transfer

💬 Thread

The full conversation tied to one Lead and their current Owner. One thread per lead.

Don't say: chat context, last conversation

📣 Campaign

One named outreach effort — a target group, a message shape, and a channel (text, email, etc.).

Don't say: blast, batch, run

🎭 Play

A reusable message shape — like "first contact" or "follow up after 14 days." A template you run again and again.

Don't say: module, workflow template

🎯 Audience

The defined group of People a Campaign is targeting. "All STR owners in Phoenix with 3+ listings."

Don't say: segment (to reps)

Access & System

🖥️ Desk

The terminal — the command-line tool where a rep runs the CRM. Type commands here to do anything in the system.

Don't say: CLI, client app

🏢 Office

The back-end API — the trusted server that holds keys, enforces rules, and talks to SignalHouse and Attio.

Don't say: backend, Cloudflare Worker (to reps)

🪪 Badge

Your 7-day CRM sign-in. Proves who you are. The Office checks it on every command to confirm your access.

Don't say: token, credential, API key

🧪 Practice

Fake data and safe commands. Use this to train or test. Nothing in Practice can reach a real person.

Don't say: staging, fixtures

🚂 Rail

The automation that safely moves messages. The Cloudflare Worker that runs every 60 seconds and sends due texts.

Don't say: plumbing (for a specific send path)

📜 Paper Trail

The internal log of every change and every denied action. If something happened in the system, it's here.

Don't say: audit log (to reps)