Outreach toolkit
The outreach toolkit is an internal operator workflow that turns first-party usage evidence into targeted, personalized conversion emails for domains that are clearly over the free allowance. It is deliberately not a bulk marketing tool — it only targets domains with proven, over-threshold Vumbnail usage.
Behavior
Section titled “Behavior”The operator runs a short script-driven pipeline:
- Prepare local inputs (gitignored): an
entry-tier.csvof domains already over threshold plus contacts, and asites-meta.jsonof per-domain overrides (industry, contact role, send priority, notes). - Fetch usage evidence (
bun outreach:usage) — exports referrer, direct/ no-referrer, user-agent, and IP summaries from production analytics as NDJSON. - Build sequences (
bun outreach:build-sequences) — generates a personalized three-part email sequence per domain intodocs/sites/<domain>.md, merging evidence + templates + the policy thresholds. - Configure sender (gitignored
sender-config.json) — from/reply-to and a compliantList-Unsubscribeheader. - Export & validate —
bun outreach:export-mail-mergeproduces a Thunderbird-compatiblemail-merge.csv;bun outreach:validate-mail-mergegate-checks it before any send.
The actual send is done by a human through Thunderbird Mail Merge — the toolkit prepares and validates, it does not send.
The threshold
Section titled “The threshold”Targeting is gated on the shared policy numbers: free allowance 50,000/month,
20% grace, so outreach only fires at 60,000/month and above. These come
from @repo/core/vumbnail-pricing.ts so the toolkit, the watermark cohort, and
the docs can’t drift.
Inputs & outputs
Section titled “Inputs & outputs”Inputs: entry-tier.csv, sites-meta.json, production usage exports,
templates in docs/templates/, sender-config.json, suppression-list.json.
Outputs: per-domain sequence markdown, a validated mail-merge.csv, and a
pass/fail validation report. No outreach artifacts or contact data are committed
to git.
States & edge cases
Section titled “States & edge cases”- Under threshold — a domain below 60,000/month is not eligible; the toolkit refuses to target it.
- Suppressed recipient — validation fails if a recipient’s email or domain is
on
suppression-list.json. - Duplicate / missing recipient — validation fails on duplicate addresses or a row missing an email or domain.
- Missing compliance headers — validation fails if sender headers or
List-Unsubscribearen’t populated. - Pilot batches — a
--max-send-priorityflag restricts a run to the highest- priority contacts for a small first send.
Data shape
Section titled “Data shape”type CsvEntryRow = Record<string, string> // domain + contact columns from entry-tier.csv
type SiteMeta = { domain: string contact_name?: string contact_email?: string contact_role?: string industry?: string send_priority?: number // lower = earlier notes?: string}
type MailMergeRow = { to: string contact_name: string domain: string monthly: number // measured monthly requests monthly_requests_over_threshold: number free_tier_monthly_requests: 50000 outreach_monthly_threshold: 60000 from_email: string from_name: string list_unsubscribe: string part_1_subject: string; part_1_body: string part_2_subject: string; part_2_body: string part_3_subject: string; part_3_body: string}Open questions
Section titled “Open questions”- Send-lane automation. A pilot send lane is in progress but has been blocked on local sender configuration; how much of the send step to automate vs. keep human-in-the-loop is open.
- Contact selection. The toolkit encodes role-preference guidance (web owner → marketing ops → … → generic alias), but the right primary/backup contact per archetype is still being tuned. See the global Open questions.