Outreach team

Email Sequence

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.

A/B test console — pick a segment, run a test batch
5–10 prospects per test · Logs open/reply back to /email-analytics · Scale the winner to the full list
A and B are split evenly across the prospects; only the subject changes.
Email 1 — Intro + free sample offer
Send day 0 · Volume hook · Plain text
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
Email 1 — HTML version
Same email · Clickable link + light branding
<!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>
Email 2 — Follow-up with social proof
Send day 3 · Per-vertical case study one-liner · Plain text
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."
Email 2 — HTML version
Same email · Per-vertical case study pulled via merge tag
<!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>
Email 3 — Final urgency CTA
Send day 7 · Last-chance framing · 15-min call offer
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
Email 3 — HTML version
Same email · Scarcity + dual CTA (sample OR call)
<!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>
Subject lines — per vertical, per email
12 personalized subjects · use as merge tags in your outreach tool
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
Usage: pick the row matching [Business]'s vertical before each send. All subjects are under 50 chars and avoid spam triggers (no ALL CAPS, no "free", no exclamation marks).
Warm-up checklist — 14-day ramp
Run before sending the sequence · Mandatory for cold outbound
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.
Tools that handle all of this for you: Instantly, Smartlead, Lemlist — each has built-in warm-up pools and bounce monitoring. Plain Gmail is workable for <20 sends/day but won't scale.
From-line + reply-to config
Paste into your outreach platform's sender settings
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.
Long-term nurture track — non-responders (em4–em8)
Auto-enrolls any em3_sent lead who hasn't replied or converted · Server-side
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.
This track runs automatically on the backend — do not paste these into Instantly / Smartlead; jobs/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"}.
Em4–em8 subject lines — per vertical, per email
60 personalized subjects (4 verticals × 5 emails × 3 variants)
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
Vertical mapping (from /outreach form 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 signals — converting / unsubscribing a lead
POST /api/outreach/convert — status=converted|unsubscribed
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.
Note: If you want a one-click unsubscribe link in the rendered HTML, it isn't wired here yet — em2/em3/em4…em8 all end with a "reply unsubscribe" affordance and rely on routes/outreach.js's /convert to mark the lead. The deliverability "unsub link" requirement still belongs to the SMTP platform (Instantly / etc.), not this app.