Three-email cold outreach sequence replacing the blocked Instagram DM channel. Paste into any SMTP tool or outreach platform (Instantly, Smartlead, Lemlist, plain Gmail, etc.) — each email is delivered as plain text + an HTML version. Includes vertical-specific subject lines, a 14-day warm-up checklist, and the from-line config for reply-driven leads.
Subject: quick idea for [Business]'s TikTok Hey [Name], Noticed [Business] isn't posting much on TikTok/Reels. Most local businesses in your space are pulling 200-500 new customers/month from short-form video right now — and almost none of them are doing it themselves. We produce everything end-to-end: script, shoot, edit, post. Done for you, on a monthly retainer. As a no-obligation intro, I'll make one custom video for [Business] so you can see exactly what you'd get. No cost, no contract, no call required. Takes 2 min to submit: https://clipcraft-9d43c3.polsia.app/free-sample — ClipCraft clipcraft@polsia.app
<!DOCTYPE html> <html> <body style="font-family: -apple-system, Helvetica, Arial, sans-serif; color: #1a1a1a; line-height: 1.6; max-width: 560px; margin: 0 auto; padding: 24px;"> <h2 style="font-size: 20px; margin: 0 0 16px;">Quick idea for [Business]'s TikTok</h2> <p>Hey [Name],</p> <p>Noticed [Business] isn't posting much on TikTok/Reels. Most local businesses in your space are pulling 200-500 new customers/month from short-form video right now — and almost none of them are doing it themselves.</p> <p>We produce everything end-to-end: script, shoot, edit, post. Done for you, on a monthly retainer.</p> <p>As a no-obligation intro, I'll make one custom video for [Business] so you can see exactly what you'd get. No cost, no contract, no call required.</p> <p><a href="https://clipcraft-9d43c3.polsia.app/free-sample" style="display:inline-block; background:#FF4D2E; color:#fff; padding:12px 22px; border-radius:8px; text-decoration:none; font-weight:600;">Get your free sample video →</a></p> <p style="color:#666; font-size: 13px;">ClipCraft · Short-form video, done for you<br><a href="mailto:clipcraft@polsia.app" style="color:#666;">clipcraft@polsia.app</a></p> </body> </html>
Subject: re: quick idea for [Business]'s TikTok Hey [Name], Following up on my last note — wanted to share one quick data point from a [vertical] client we've been working with: [Insert vertical-specific case-study one-liner here — see templates below. Pick the one matching [Business]'s vertical before sending.] If that resonates, the free sample is still on the table: https://clipcraft-9d43c3.polsia.app/free-sample → 2 min to submit, custom video delivered to your inbox within a week. — ClipCraft clipcraft@polsia.app --- Vertical one-liners (delete the other three before sending): RESTAURANT: "We took a small Italian place in [city] from 0 to 38K monthly TikTok views in 90 days — their weekend walk-ins doubled within the first month." SALON: "A single-chair hair studio hit 120K views on a 'before /after' reel we shot in 20 minutes — booked solid for three weeks straight." GYM: "A neighborhood CrossFit box pulled 47 new trial members in a single month from one short-form video series." COACH: "A solo life coach went from 800 to 11K IG followers in 6 weeks using the same content engine we run for everyone."
<!DOCTYPE html> <html> <body style="font-family: -apple-system, Helvetica, Arial, sans-serif; color: #1a1a1a; line-height: 1.6; max-width: 560px; margin: 0 auto; padding: 24px;"> <h2 style="font-size: 20px; margin: 0 0 16px;">Re: quick idea for [Business]'s TikTok</h2> <p>Hey [Name],</p> <p>Following up on my last note — wanted to share one quick data point from a [vertical] client:</p> <blockquote style="border-left: 3px solid #FF4D2E; margin: 16px 0; padding: 12px 16px; background: #fff5f2; font-size: 15px;">[Insert vertical-specific case-study one-liner — pick the one matching [Business]'s vertical.]</blockquote> <p>If that resonates, the free sample is still on the table.</p> <p><a href="https://clipcraft-9d43c3.polsia.app/free-sample" style="display:inline-block; background:#FF4D2E; color:#fff; padding:12px 22px; border-radius:8px; text-decoration:none; font-weight:600;">Claim your free sample video →</a></p> <p style="color:#666; font-size: 13px;">ClipCraft · Short-form video, done for you<br><a href="mailto:clipcraft@polsia.app" style="color:#666;">clipcraft@polsia.app</a></p> </body> </html>
Subject: last note — [Business]'s free sample Hey [Name], Last note from me — I won't keep filling your inbox. I'm capping free sample slots at 5 per week so we can actually deliver on them. If [Business] is one of the next 5, you get a custom TikTok/Reel shot for your brand — script, shoot, edit, delivered to a private link. If you'd rather just talk it through, here's 15 min on my calendar: https://cal.com/clipcraft Either way, no hard feelings. Best of luck with [Business]. — ClipCraft clipcraft@polsia.app
<!DOCTYPE html>
<html>
<body style="font-family: -apple-system, Helvetica, Arial, sans-serif; color: #1a1a1a; line-height: 1.6; max-width: 560px; margin: 0 auto; padding: 24px;">
<h2 style="font-size: 20px; margin: 0 0 16px;">Last note — [Business]'s free sample</h2>
<p>Hey [Name],</p>
<p>Last note from me — I won't keep filling your inbox.</p>
<p>I'm capping free sample slots at 5 per week so we can actually deliver on them. If [Business] is one of the next 5, you get a custom TikTok/Reel shot for your brand — script, shoot, edit, delivered to a private link.</p>
<p>Pick whichever is easier:</p>
<p>
<a href="https://clipcraft-9d43c3.polsia.app/free-sample" style="display:inline-block; background:#FF4D2E; color:#fff; padding:12px 22px; border-radius:8px; text-decoration:none; font-weight:600; margin-right: 8px;">Claim free sample →</a>
<a href="https://cal.com/clipcraft" style="display:inline-block; background:#141419; color:#fff; padding:12px 22px; border-radius:8px; text-decoration:none; font-weight:600;">Book 15 min →</a>
</p>
<p>Either way — best of luck with [Business].</p>
<p style="color:#666; font-size: 13px;">ClipCraft · Short-form video, done for you<br><a href="mailto:clipcraft@polsia.app" style="color:#666;">clipcraft@polsia.app</a></p>
</body>
</html>
RESTAURANT Subj-A: quick idea for [Business]'s TikTok Subj-B: re: quick idea for [Business]'s TikTok Subj-C: last note — [Business]'s free sample SALON Subj-A: short-form video for [Business]? Subj-B: re: short-form video for [Business] Subj-C: last note — [Business]'s free sample GYM Subj-A: member growth idea for [Business] Subj-B: re: member growth idea for [Business] Subj-C: last note — [Business]'s free sample COACH Subj-A: 11K followers in 6 weeks (here's how) Subj-B: re: 11K followers in 6 weeks Subj-C: last note — [Business]'s free sample
CLIPCRAFT COLD-OUTREACH WARM-UP — run before sending the sequence
1. DOMAIN WARMING (Mailwarm / Lemwarm)
- Add your sending subdomain to a warm-up tool for 14 days
before sending to prospects.
- Tool sends/receives realistic email traffic between pooled
inboxes to build sender reputation.
- Do NOT skip — cold-sending from a fresh domain lands in spam
within 100 sends.
2. SPF / DKIM / DMARC SETUP
- SPF: publish a TXT record authorizing your sending service.
Example: v=spf1 include:_spf.your-sender.com -all
- DKIM: generate a key in your sending platform, add the
public TXT record at mail.your-subdomain.
- DMARC: start with p=none (monitor only), after 2 weeks of
clean sending move to p=quarantine.
- Verify all three with mxtoolbox.com before sending.
3. DAILY SENDING LIMITS
- Week 1 (days 1-7): max 20 emails/day per inbox
- Week 2 (days 8-14): max 50 emails/day per inbox
- Week 3+: max 100 emails/day per inbox
- For 3 inboxes (recommended), that's 60/day W1, 150/day W2,
300/day W3+.
4. LIST-PULL-BEFORE-SEND
- Re-verify every prospect list 24 hours before send:
· bounce-test each address
· confirm company/role is still relevant
· remove anyone who has unsubscribed
- Never send to a list older than 7 days without re-pulling.
5. BOUNCE-RATE PAUSE THRESHOLD
- If bounce rate exceeds 3% on any send, PAUSE that inbox,
investigate, and re-warm before resuming.
- If spam-complaint rate exceeds 0.1%, pause ALL inboxes and
review copy + list quality.
FROM-LINE (the address that shows up in the prospect's inbox)
From: ClipCraft <clipcraft@polsia.app>
Display name: ClipCraft
Address: clipcraft@polsia.app
Note: this is the inbox already wired to clipcraft's outreach
lead pipeline — when a prospect hits Reply, the message lands
in this inbox and gets logged to the outreach_leads database
table via /api/outreach.
REPLY-TO
Reply-To: outreach@clipcraft.app
(Or, if your platform supports per-lead inboxes, set Reply-To
to a per-lead alias like outreach+[prospect-id]@clipcraft.app
so you can thread conversations.)
RECOMMENDED SENDING SUBDOMAINS
Use these dedicated subdomains so outreach reputation is
isolated from the main reply domain (clipcraft@polsia.app):
· go.clipcraft.app — cold outreach (the From behind every
cold send in this sequence)
· mail.clipcraft.app — transactional (welcome, free-sample
delivery, intake confirms — never use for cold mail)
· hello.clipcraft.app — warm leads (newsletter, monthly
recap, retention)
Each subdomain gets its own SPF/DKIM records, its own warm-up
pool, and its own bounce monitor. Mixing cold-outreach into
the same subdomain as transactional mail is the fastest way
to tank deliverability.
INFRASTRUCTURE NOTES
- No SMTP code lives in this app. The deliverable is this
page: paste the sequence + from-line into Instantly,
Smartlead, Lemlist, or even plain Gmail and send.
- Inbound replies to clipcraft@polsia.app automatically
create outreach_leads rows via routes/outreach.js — no
additional wiring needed.
- Outbound sending platform owns deliverability, warm-up,
bounce handling, and unsubscribe links.
- The 5-email em4–em8 nurture track (SECTION 5, below) is a
separate code path: it runs server-side via jobs/nurture-send.js,
not through this SMTP-flow SEQUENCE above. Sections 1–4 are the
cold outbound you paste into Instantly/Smartlead/Lemlist;
SECTION 5 is the post-outreach continuation that fires
automatically when someone fills out /outreach and doesn't
convert or unsubscribe.
Which sequence for what:
Sections 1–4 (above) are the MANUAL cold outbound code-path —
paste into Instantly / Smartlead / Lemlist / Gmail and send.
This section (em4–em8) is the AUTOMATED continuation path that
runs server-side: anyone who hits /outreach and doesn't reply
to em3 within 4 days is auto-enrolled in em4, then em5 at +7,
em6 at +14, em7 at +21, em8 at +30 (all measured from em3_sent
as the anchor into the nurture track; from form submit that's
day 11 / day 14 / day 21 / day 28 / day 37).
The daily cron in polsia.toml ([[crons]] nurture-send-daily,
0 14 * * *) catches every lead within a day of their window.
Mark a lead "converted" or "unsubscribed" via
/api/outreach/convert to halt the sequence early.
Day offsets (relative to em3_sent_at — which is day 7 from form submit):
· em4 — day 4 (day 11 from form submit) — case study
· em5 — day 7 (day 14 from form submit) — social proof / quote
· em6 — day 14 (day 21 from form submit) — urgency (intake slot)
· em7 — day 21 (day 28 from form submit) — pivot to 15-min call
· em8 — day 30 (day 37 from form submit) — breakup / close file
Per-email angle (full bodies live in lib/nurture-emails.js):
· em4 — Case study (deeper than em2): "12 booked calls in a
month from a 4-clip series" — anchors the offer with a
concrete number before the calendar CTA.
· em5 — Social proof: short quote-style block from a [vertical]
client about the cadence making posting inevitable — same
pitch, third-person voice.
· em6 — Urgency, different angle from em3: em3 was month-end
slots; em6 is a "we open 2 intake slots for [next month] 1
on Monday, first 2 replies lock them" scarcity play tied to
a near-future date instead of month-end.
· em7 — Pivot to call: "emails aren't doing it, can we just
hop on 15 min?" Drop the funnel, ask directly. The reader
either books the call or replies "pass" to opt out.
· em8 — Final breakup: "I'm closing the file on [Business]
unless you tell me not to." Classic breakup — receive a
last-chance response or confirm silence.
nurture-send.js sends them via POLSIA_API_KEY after you capture a lead on /outreach. Stop a lead with POST /api/outreach/convert → {"id": <lead_id>, "status": "unsubscribed"}.
Subject variant table for em4 through em8. Pick the row matching [Business]'s vertical, then pick variant A/B/C. These are also what lib/nurture-emails.js subjectVariantsFor() returns — the renderers use variant-A by default and the merge tag is the vertical. RESTAURANT em4-A: quick number from a restaurant client em4-B: how one restaurant booked 12 calls em4-C: re: [Business]'s content em5-A: what [Name] said after six weeks em5-B: re: what [Name] said em5-C: from a restaurant owner em6-A: 2 intake slots opening em6-B: re: [Business] + next month em6-C: still a fit for [Business]? em7-A: 15 min instead? em7-B: re: 15 min instead em7-C: skipping the back-and-forth em8-A: closing the file on [Business] em8-B: re: closing the file em8-C: last note — closing the file SALON em4-A: quick number from a salon client em4-B: how one salon booked 12 calls em4-C: re: [Business]'s content em5-A: what [Name] said after six weeks em5-B: re: what [Name] said em5-C: from a salon owner em6-A: 2 intake slots opening em6-B: re: [Business] + next month em6-C: still a fit for [Business]? em7-A: 15 min instead? em7-B: re: 15 min instead em7-C: skipping the back-and-forth em8-A: closing the file on [Business] em8-B: re: closing the file em8-C: last note — closing the file GYM em4-A: quick number from a gym client em4-B: how one gym booked 12 calls em4-C: re: [Business]'s content em5-A: what [Name] said after six weeks em5-B: re: what [Name] said em5-C: from a gym owner em6-A: 2 intake slots opening em6-B: re: [Business] + next month em6-C: still a fit for [Business]? em7-A: 15 min instead? em7-B: re: 15 min instead em7-C: skipping the back-and-forth em8-A: closing the file on [Business] em8-B: re: closing the file em8-C: last note — closing the file COACH em4-A: quick number from a coaching client em4-B: how one coach booked 12 calls em4-C: re: [Business]'s content em5-A: what [Name] said after six weeks em5-B: re: what [Name] said em5-C: from a coach em6-A: 2 intake slots opening em6-B: re: [Business] + next month em6-C: still a fit for [Business]? em7-A: 15 min instead? em7-B: re: 15 min instead em7-C: skipping the back-and-forth em8-A: closing the file on [Business] em8-B: re: closing the file em8-C: last note — closing the file
goal): More posts → GYM · Better content → SALON · Grow followers → RESTAURANT · (anything else) → COACH. The server picks variant-A by default; you can override the choice per send by re-stamping nurture_emN_sent_at after reseeding.
Stop a lead before the next step fires (e.g. they replied, booked
a call, or said "unsubscribe"). Either an id OR email works; the
secret header is required only when NURTURE_CONVERT_SECRET is set
in the deploy env.
curl -X POST https://<app>/api/outreach/convert \
-H 'Content-Type: application/json' \
-d '{"id": 42, "status": "converted"}'
curl -X POST https://<app>/api/outreach/convert \
-H 'Content-Type: application/json' \
-d '{"email": "owner@biz.com", "status": "unsubscribed"}'
When NURTURE_CONVERT_SECRET is set:
curl -X POST https://<app>/api/outreach/convert \
-H 'Content-Type: application/json' \
-H 'secret: <NURTURE_CONVERT_SECRET>' \
-d '{"id": 42, "status": "converted"}'
What flips server-side:
status=converted → nurture_status='converted',
nurture_converted_at=NOW()
status=unsubscribed → nurture_status='unsubscribed',
nurture_unsubscribed_at=NOW()
After either stop signal, findLeadsDueForStep no longer matches the
lead (status filter rejects already-terminal rows + the
nurture_unsubscribed_at IS NULL guard in markNurtureStep prevents
re-flipping), so the daily cron skips them silently.
/convert to mark the lead. The deliverability "unsub link" requirement still belongs to the SMTP platform (Instantly / etc.), not this app.