Recipe · Outbound email
Outreach touch 2
The follow-up, for rows that had touch 1 on an earlier day and have not been moved to Replied. Carries the offer again in one clause rather than repeating the first message, and says it is the last one. Never mails a row the same day touch 1 did.
What it does
Pick your mailbox and read the copy parameters. It will not mail a row the same day touch 1 did, but the spacing beyond that is how often you schedule the sequence.
The follow-up, for rows touch 1 reached on an earlier day. 68% of positive replies arrive after this one.
It runs against one profile, through that profile's own proxy and with its own cookies — so the pages load the way that account's owner would see them. It opens no page at all, which means it can be run against a profile whose session you would rather not disturb.
The 14 steps
The real tree, read out of the pack the launcher ships. Indentation is nesting: the steps under a loop run once per row, and the ones under a branch run only when the condition above them holds. Every {{…}} is a value filled in at run time — from the row being walked, from a setting on the run, or from the profile itself.
loadRowsLoad the rows ready for touch 2Load Outreach list into rowsloopEach personLoop forEachEach time
setVarStart this row with no outcomeSet outcomesetVarStart this row unsentSet sentifOnly rows touch 1 reached on an earlier dayIf {{loop.item.touch_1_day}} notEqualson failure: continueYes
setVarMark the row attemptedSet sentsetVarAssume the send did not completeSet outcomesendEmailSend touch 2Send "Re: {{loop.item.company_casual}} — quick question" to {{loop.item.email}}on failure: continuesetVarRecord what happenedSet outcomeon failure: continuesetVarRecord whether it wentSet senton failure: continueEach time
ifIf the message wentIf {{vars.sent}} equalson failure: continueYes
saveRowsAdvance the rowSave to Outreach liston failure: continueEach time
ifIf the send was refused or failedIf {{vars.sent}} equalson failure: continueYes
saveRowsRecord the refusal on the rowSave to Outreach liston failure: continueEach of those is one of the step types on the automation reference, with the same fields the editor shows and the same fields an agent is handed over the local API.
The tables it uses
These load with the recipe. A dataset is a typed table your workspace owns — the columns are named and typed up front so the steps can address them, and every one of them is yours to rename, extend or fill from a file afterwards.
Outreach list
readswritesOne row per person: their address, what you know about them, whether they opted in, and which touch of the sequence they are on.
- Email · email
- first_name
- First name · text
- company
- Company · text
- company_casual
- Company (casual) · text
- location
- Location · text
- location_local
- Location (local) · text
- icp
- Segment · text
- metric
- Metric · text
- signal
- Signal · longText
- cold_read
- Cold read · longText
- consent
- Consent · select · Cold — no consent | Opted in
- status
- Status · select · Queued | Prepared | Touch 1 sent | Touch 2 sent | Sequence finished | Replied | Booked | Unsubscribed | Bounced | Refused
- touch
- Touch · number
- deliverable
- Deliverable · select · Deliverable | Risky — catch-all | Undeliverable | Could not check
- last_sent_at
- Last sent at · datetime
- touch_1_day
- Touch 1 day · date
- outcome
- Outcome · longText
Re-running updates the row it already wrote rather than adding a second one. That is what the match column in the save step is for, and it is the difference between a status check and a table that doubles in size every pass.
What it asks you for
Settings are filled in when the run starts, and every profile can hold its own values — which is how one workflow serves a whole folder of accounts.
- credibility
- Who you are, and why this is not spam · textarea · required
- offer
- The offer · textarea · required
- ask
- The ask · textarea · required
- signoff
- Sign-off · text
- pool
- Mailbox pool · text
One or two sentences with a number in them. This is the part that answers "why is a stranger writing to me", and a number is what answers it — an adjective does not.
A quantified result, a tight window, and the risk taken off them. All three: a result with no timeframe is a hope, and a timeframe with no risk reversal is a demand.
Two concrete times, not "let me know what suits". Every extra reply a meeting needs before it exists is a place the thread dies.
Optional, and short. "sent from my phone" is a real signal that a real person typed this; a deliberate typo is not — it reads as careless far more often than it reads as human, and it cannot be taken back.
The name of a pool under Mail. The least-used mailbox in it that still has allowance today sends each message. Leave empty and pick a single mailbox on the step instead — one of the two has to be set before the first run.
Loading it
In the launcher, open Automations, choose Load a starter pack, and pick Outbound email. Untick anything you do not want. The tables land first, then the workflows, then a project called Outbound that links them together.
What arrives is an ordinary automation row. Open it in the editor, change a step, rename it, delete it — nothing in the app treats it as special afterwards, and loading the pack a second time makes a fresh copy rather than overwriting the one you edited. Tables are the opposite: an existing table of the same name is reused and keeps its rows.
The rest of the outbound email pack
They load together, share the tables above, and land in one Outbound project.
Prepare the outreach list
Each row costs one model call, and a verification check spends a credit on your own account if you have a verifier configured. Both are optional to set up; without a verifier the column simply stays empty.
One profile · Opens no page · The Outreach list table
Outreach touch 1
Pick your mailbox on the Send touch 1 step, or name a pool, and read the three copy parameters before the first run. Mail cannot be recalled.
One profile · Opens no page · The Outreach list table · 5 settings on the run