Table of Contents
- Introduction
- Choose Your Track
- Stack + Where You Verify
- Foundation: The Only 4 Things That Must Be True
- Definitions
- The Scope of the Specialist
- Shared SOP: Build the Recovery System (0–7)
- Data Map (Required Fields)
- Track A SOP: B2B SaaS Demo Form Abandonment
- Track B SOP: Shopify Apparel Checkout Abandonment
- Testing Ladder
- How to Calculate the Value of This Work (Incremental)
- Compliance & Privacy-First Guardrails
- Common Failure Modes (and Fixes)
- Appendix: Getting Your First 3 Practice Builds (Optional)
- Conclusion
Introduction
- For: operators and copywriters who want to recover conversions from people who started a demo request or checkout but did not finish.
- Build in 7 days:
- A working trigger + suppression system (emails fire once, stop on conversion)
- A 3-email recovery sequence map using reusable copy frameworks
- A baseline + lift reporting loop tied to bookings or revenue (not vanity metrics)
- You need before starting:
- A sending platform (SaaS: Customer.io/HubSpot; Shopify: Klaviyo/Shopify Flow)
- Event tracking you can verify (Segment/GTM for SaaS; Shopify/Klaviyo events for ecommerce)
- A way to identify the user (email captured, or identity resolved from prior sessions)
Choose Your Track
- Track A: B2B SaaS demo form abandonment
- Track B: Shopify apparel checkout abandonment
- Read only your track + the shared foundation.
Stack + Where You Verify
- Track A (SaaS) examples:
- Event triggering: Segment.io or Google Tag Manager (GTM)
- Sending sequence: Customer.io or HubSpot
- Track B (Shopify) examples:
- Sending + triggers: Klaviyo (standard) or Shopify Flow
- Where you verify (minimum):
- Chrome DevTools → Network → enable Preserve log
- Filter to Fetch/XHR
- Confirm payload contains: event name + IDs (Track A: anonymous_id; Track B: session_id/cart_id)
Level Up (reliability rule): Client-side triggers (browser/GTM) can be blocked by ad blockers and privacy extensions. Pros move toward server-side tracking where possible (Shopify: server-side/CAPI-style approaches; SaaS: direct API calls/server events). If events don’t match platform logs, suspect blocking first.
Foundation: The Only 4 Things That Must Be True
- Capture the right event
- Have identity/contact (email)
- Suppression works in real time
- Measurement is baseline + lift
Definitions
- Abandonment: an action is started but not finished (start event exists, conversion event does not).
- Identity capture vs identity resolution: capture = email is collected now; resolution = link anonymous/session ID to a known contact from earlier data.
- Suppression segment: a real-time “stop-rule container” that prevents Email 2/3 on conversion, unsubscribe, bounce, or (SaaS) reply.
- Consent state: tracking allowed vs declined; triggers must respect this state.
The Scope of the Specialist
- Includes (so outcomes stay measurable):
- Event + identity verification
- Suppression segment (conversion, unsubscribe, hard bounce; SaaS: reply routing)
- Minimal segmentation (only when message changes)
- Sequence map + copy frameworks
- QA (links, rendering, tracking) + baseline/lift reporting
- Excludes (to avoid scope drift):
- Newsletters and brand campaigns
- Broad lifecycle automation
- Paid ads management
- General site redesign
Shared SOP: Build the Recovery System (0–7)
- Sandbox environment (Shopify dev store or SaaS staging subdomain). Never debug start events on a high-traffic production page. Output: sandbox URL + event test plan.
- Baseline the funnel for a fixed window (last 7–14 days). Split by device (mobile vs desktop) and note anomalies (promos, outages, launches). Output: baseline snapshot by device (started, completed, rate).
- Write the event spec (names, trigger conditions, required fields, optional fields). Output: event spec document.
- Verify events in browser and platform logs (DevTools + Segment/Klaviyo/HubSpot logs). Output: proof record per required event.
- 48-hour “Ghost Data” check. If start fires but conversion almost never does, fix plumbing before email. Output: ghost-data pass/fail report + suspected failure point.
- Suppression segment (real-time). Suppress immediately on conversion; suppress on unsubscribe + hard bounce; (SaaS only) suppress on reply (route to sales/support). Output: suppression segment + cross-device conversion test record.
- Sequence map (Email 1/2/3 goals + timing), then write copy. Output: one-page sequence map.
- QA + launch + report baseline vs lift. Output: launch checklist + weekly baseline/lift update template.
Data Map (Required Fields)
| Event | Must include | Where it comes from | How you verify |
|---|---|---|---|
| form_start | timestamp, page_url, form_id, anonymous_id, email (yes/no) | Track A: GTM/Segment + form DOM | DevTools XHR payload + GTM/Segment debug + platform event log |
| form_submit | timestamp, page_url, form_id, anonymous_id (or “inherits via join”), email/contact_id (yes), submit_success=true | Track A: server response + form handler + CRM | DevTools submit request + platform log + CRM contact record |
| checkout_started | timestamp, page_url (or checkout step), session_id/cart_id, email (yes/no) | Track B: Shopify/Klaviyo integration | Platform event log + DevTools (if client-side) |
| purchase | timestamp, order_id, email (yes), revenue | Track B: Shopify order system | Shopify/Klaviyo event log + order record |
Track A SOP: B2B SaaS Demo Form Abandonment
Setup prerequisites
- Demo form has a consistent submit action (page refresh or reliable AJAX success signal)
- Sending platform connected to contacts (Customer.io/HubSpot)
- Event tracking visible in logs (Segment or GTM + destination)
Event & data spec
| Event Name | Trigger Condition | Required Fields | Pro/Optional Fields |
|---|---|---|---|
| form_start | First meaningful interaction with the form (first blur/change) | timestamp, page_url, form_id, anonymous_id, email (yes/no) | role, industry, company size, UTM source/medium, pricing_visited flag, completion_depth |
| form_submit | Successful submit acknowledged by server (or verified AJAX success) | timestamp, form_id, email/contact_id (yes), submit_success=true | use_case, team_size, plan_interest, calendar_booked (yes/no) |
Edge cases
- Autofill can skip blur; use “first change” fallback.
- Multi-step forms need step_index and completion_depth.
- AJAX forms can “submit” without page load; URL-based triggers can fail.
- SPA routing can mask page_url changes; rely on event payloads.
Identity capture + identity resolution
- Identity capture: email is collected (best: early; minimum: at submit).
- Identity resolution: anonymous_id links to a known contact from prior sessions (email click history, logged-in state, CRM match).
- Identity linking rule (required):
- Join mechanism: anonymous_id → email/contact_id mapping created when email becomes known (capture or resolution).
- Fail condition: if you cannot join form_start → known contact for abandoned users, you cannot target abandonment recovery.
PRO INSIGHT + AJAX trigger checklist
PRO INSIGHT (identity resolution): AJAX forms often break “Thank You page” triggers because there is no page refresh. Use Element Visibility (success message appears) or a DataLayer push as the submit signal. Cookied identity can identify a user before they touch the form, which expands who can be recovered.
- AJAX trigger checklist:
- Which success element becomes visible (exact selector/name)
- Which DataLayer key/value indicates success (exact key + expected value)
- Where you confirm it (console, network payload, platform event log)
Can you even do this?
Pass only if: form_start fires reliably, form_submit fires reliably, start→identity joins for abandoned users work, and suppression stops follow-ups in real time (including cross-device).
Fail rule: if email is not captured or resolved, do not build abandonment recovery for this flow (use a post-demo no-show recovery sequence instead).
Segments (only if the message changes)
- Role/industry
- Completion depth (first field vs nearly done)
- Pricing-visited vs not
- If a segment does not change the objection, delete it.
Sequence map (defaults)
- Email 1: 15–60 minutes after abandon
- Email 2: +24 hours
- Email 3: +48–72 hours
- SaaS timing can space Email 2/3 slightly more, but Email 1 must land while intent is warm.
Copy frameworks
Email 1 — Low Cognitive Load (Resume)
- Trigger: Zeigarnik Effect (unfinished task tension makes “resume” compelling).
- Do: one link, one CTA. Don’t: add options or a second goal.
- Inputs needed: form name, resume link, what they started, sender identity
- Template skeleton: Subject / First line / 1 clarifier / CTA / Optional PS
Email 2 — Objection Deconstruction
- Trigger: Risk Mitigation (removes “will I be sold to?” friction).
- Do: answer one objection. Don’t: dump features or long explanations.
- Inputs needed: top objection for the segment, what they’ll leave with, what won’t happen, one proof point
- Template skeleton: Subject / First line / 1 clarifier / CTA / Optional PS
Email 3 — Pivot to Human (Reply Path)
- Trigger: Micro-commitment (replying is easier than booking).
- Do: ask for two small details. Don’t: ask for a long explanation.
- Inputs needed: reply inbox owner, 2 routing questions, fallback resource
- Template skeleton: Subject / First line / 1 clarifier / CTA / Optional PS
Build checklist
- Mobile-first layout; readable in dark mode
- One CTA per email; no competing links above main CTA
- Suppression tested: conversion, unsubscribe, hard bounce, reply routing
- Link QA: resume link correct; tracking consistent across emails
- Cross-device test: convert elsewhere → Email 2/3 must not send
Reporting template
- Baseline (7–14 days): started → submitted rate by device
- Post-launch: incremental lift in submissions + quality metrics stable
- Next test: one variable only (timing, then objection choice)
Track B SOP: Shopify Apparel Checkout Abandonment
Setup prerequisites
- Checkout events available (Shopify/Klaviyo/Flow)
- Email identity captured or resolvable (popup, account, checkout step)
- Suppression can stop immediately on purchase (including cross-device)
Event & data spec
| Event Name | Trigger Condition | Required Fields | Pro/Optional Fields |
|---|---|---|---|
| checkout_started | User initiates checkout / reaches checkout step | timestamp, session_id/cart_id, email (yes/no), page_url (or checkout step) | new_vs_returning, fit_sensitive_flag, cart_value_band, device_type, category |
| purchase | Order completes successfully | timestamp, order_id, email (yes), revenue | items/categories, discount_used (yes/no), shipping_method |
Edge cases
- Email may not exist at checkout_started; identity can arrive later.
- Returning customers can purchase on a different device; suppression must still work.
- URL-based assumptions fail on modern checkout flows; prefer platform-native events.
- Hard rule: if email is captured after checkout_started, send Email 1 only once identity is known; if identity never resolves, do not send.
Identity capture + identity resolution
- Identity capture: popup/email signup, account login, or checkout step email.
- Identity resolution: session/cart IDs connect to a known profile in Klaviyo/Shopify customer records.
PRO INSIGHT
Platform-native events are more reliable than URL-based triggers. Earlier identity (popup or previous email clicks) expands the recoverable set only when consent state allows tracking.
Can you even do this?
Pass only if: checkout_started fires reliably, purchase fires reliably, abandoned sessions resolve to email for the audience you target, and suppression stops follow-ups immediately on purchase/unsubscribe/bounce.
Fail rule: if identity never resolves to email, do not send checkout abandonment recovery (use post-purchase flows for known buyers, or browse abandonment only when identity exists).
Segments (only if the message changes)
- New vs returning
- Fit-sensitive categories vs not
- High vs low intent cart
- If a segment does not change the objection, delete it.
Sequence map (defaults)
- Email 1: 15–60 minutes after abandon (or after identity becomes known)
- Email 2: +24 hours
- Email 3: +48–72 hours
- Ecommerce intent decays fast; Email 1 matters most, Email 2/3 should reduce uncertainty.
Copy frameworks
Email 1 — Low Cognitive Load (Resume)
- Trigger: Zeigarnik Effect (unfinished checkout creates “just finish it” tension).
- Do: make the checkout link unmistakable. Don’t: send to a generic homepage.
- Inputs needed: checkout link, brand name, support contact (optional)
- Template skeleton: Subject / First line / 1 clarifier / CTA / Optional PS
Email 2 — Objection Deconstruction (Fit/Returns/Shipping)
- Trigger: Risk Mitigation (reduces “will this fit / what if I return it?” friction).
- Do: answer one uncertainty with a short rule. Don’t: bury the answer in paragraphs.
- Inputs needed: top objection by segment, size guide link, returns rule, shipping rule
- Template skeleton: Subject / First line / 1 clarifier / CTA / Optional PS
Email 3 — Pivot to Human (Reply Path)
- Trigger: Micro-commitment (a reply is easier than a checkout decision).
- Do: ask for three small inputs. Don’t: ask for a long explanation.
- Inputs needed: reply inbox owner, 2–3 sizing questions, recommendation rule
- Template skeleton: Subject / First line / 1 clarifier / CTA / Optional PS
Build checklist
- Mobile-first layout; dark-mode readable
- One CTA per email; avoid competing links
- Suppression tested: purchase, unsubscribe, hard bounce
- Checkout link QA: resolves correctly; attribution consistent
- Cross-device test: purchase elsewhere → Email 2/3 must not send
Reporting template
- Baseline (7–14 days): checkout_started → purchase rate by device
- Post-launch: incremental lift in purchases + revenue attributable to the flow
- Next test: one variable only (timing, then objection choice)
Testing Ladder
- Email 1 timing + resume link clarity
- Email 2 objection choice (one at a time)
- Email 3 reply path vs repeat-link fallback (choose winners by submits/purchases, not opens)
How to Calculate the Value of This Work (Incremental)
- Formula:
Value Created ≈ Abandoned Starts × (Post Recovery Rate − Baseline Recovery Rate) × Customer Value - Use incremental lift to avoid double counting.
Compliance & Privacy-First Guardrails
- Respect consent state: if user declines tracking cookies, do not trigger the flow even if you have email.
- Gate triggers behind consent signals (GTM/OneTrust or equivalent) before firing form_start/checkout_started.
- Minimize data: collect only fields that change messaging or measurement.
- Honor suppression immediately (conversion/unsubscribe/bounce; SaaS: reply routing).
- Document what fires, what data is used, and where it’s stored.
Common Failure Modes (and Fixes)
- Missing events in platform but seen in browser → blockers/client-side fragility → move toward server-side events or direct API tracking
- Events seen in platform but not in browser → server-side-only instrumentation → verify in platform logs + confirm ID joins
- Converted users still get Email 2/3 → suppression not real-time/cross-device → suppression segment keyed on contact + conversion timestamp
- Start events high, conversion near-zero → tracking/flow broken → ghost-data check + fix plumbing before copy
- Too many segments, no lift → segments don’t change objections → delete non-objection-changing segments
- Strong opens, weak outcomes → vanity optimization → choose winners by submits/purchases only
Appendix: Getting Your First 3 Practice Builds (Optional)
- Run baseline + event verification on a sandbox and record proof logs.
- Implement suppression first, then launch Email 1 only and verify it stops on conversion.
- Add Email 2/3 after joins and suppression are proven in logs.
Conclusion
- Build on a sandbox, then prove events in logs before writing copy.
- Fail fast if identity cannot resolve (no email = no abandonment recovery).
- Suppress in real time (conversion/unsubscribe/bounce; SaaS: reply routing), including cross-device.
- Choose winners by incremental lift on submits/purchases, not opens.
