Template

Self‑Serve in a Weekend: Config Pack + Reply‑Router (Stripe/Paddle)

Operator template to stand up a portable self‑serve flow in a weekend: pricing switches, Stripe/Paddle toggles, churn‑save copy, webhook maps, a 15‑minute reply‑router, and default activation metrics you can ship today.

Duplicate this template, pick your pattern, and fill in the [BRACKETS]. Then:

  1. Decide trial vs freemium and your hybrid toggles, 2) set Stripe or Paddle exactly as shown, 3) paste the churn‑save copy and wire the webhooks, 4) turn on the reply‑router with a 15‑minute SLA during the sender’s local hours, and 5) track the activation event for your pattern. Expect 2–3 hours of focused work.

Notes:

  • Stripe Smart Retries timing is ML‑driven (not a fixed schedule). Keep it ON and let the emails carry your tone.
  • Paddle Retain runs an email+retry cadence inside ~30 days by default; you can adjust the window.
  • Run the QA section before you go live.

Choose your pattern (flowchart in text)

Use this text decision flow to select the fastest‑to‑ship pattern. Circle the first YES you hit.

  1. Do buyers need to use something immediately without your help? → YES → Go Micro‑SaaS.
    • NO → continue.
  2. Can buyers get value from a template, file, or mini‑system they can duplicate? → YES → Go Template + Add‑Ons.
    • NO → continue.
  3. Is the value delivered by you doing work but scheduled/packaged? → YES → Go Productized Service.

Then set your monetization switch:

  • Trial vs Freemium
    • If your “aha” requires setup or data import → choose [TRIAL_LENGTH_DAYS] day trial.
    • If value is instant and naturally limited → choose Freemium with [INCLUDED_UNITS] monthly units.
  • Hybrid toggle (optional for Micro‑SaaS)
    • Base = [BASE_PRICE]/month includes [INCLUDED_UNITS] [USAGE_UNIT]; overage = [OVERAGE_RATE] per [USAGE_UNIT].

Plan + pricing matrix (trial/freemium/hybrid)

Copy this grid into your pricing page or billing settings and fill the brackets.

  • Product Name: [PRODUCT_NAME]
  • Currency: [CURRENCY]

Plans

  • Free (optional): [FREE_PLAN_NAME] — includes [INCLUDED_UNITS_FREE] [USAGE_UNIT] per month; overage [OVERAGE_RATE_FREE] (or block when exhausted: [BLOCK_AT_FREE_LIMIT]=YES/NO)
  • Trial Plan: [TRIAL_PLAN_NAME] — [TRIAL_LENGTH_DAYS]-day trial of [PAID_PLAN_NAME]; requires card up‑front? [TRIAL_CARD_UPFRONT]=YES/NO
  • Paid Base: [PAID_PLAN_NAME] — [BASE_PRICE]/month includes [INCLUDED_UNITS] [USAGE_UNIT]
  • Usage (optional): +[OVERAGE_RATE]/[USAGE_UNIT] after included units; monthly cap [USAGE_CAP]=[VALUE or NONE]

Key Toggles

  • Cancel policy: [CANCEL_AT_PERIOD_END]=ON (recommended default) | OFF (immediate)
  • Pause option (Micro‑SaaS): [PAUSE_ALLOWED]=YES/NO; pause length [PAUSE_DAYS]
  • Customer portal: [PORTAL_URL] (show: update card, view invoices, change plan, cancel at period end)
  • Tax/VAT handling: Stripe Tax=[ON/OFF] | Paddle MoR (inherently handled)

Stripe Billing: exact toggles to set

Path: Stripe Dashboard → Billing → Subscriptions and emails.

  • Smart Retries: [ON]
  • Dunning emails: [ON]
    • Email triggers ON: failed payment, trial ending, upcoming invoice, expiring card
    • From name/email: [SENDER_NAME] <[BILLING_FROM_EMAIL]>
    • Hosted update link in all emails: [CARD_UPDATE_URL]
  • Subscription settings
    • Default trial length: [TRIAL_LENGTH_DAYS]
    • Cancel policy: cancel at period end = [ON]; immediate cancel allowed for fraud/duplicate = [CRITERIA]
    • Proration on plan change: [PRORATE_ON_UPGRADE]=ON; [PRORATE_ON_DOWNGRADE]=OFF
  • Customer Portal: [ON]
    • Allow: manage payment methods, download invoices, change plan, cancel at period end
    • Portal URL: [PORTAL_URL]
  • Webhooks (Developers → Webhooks)
    • Endpoint: [STRIPE_WEBHOOK_URL]
    • Events: checkout.session.completed, invoice.payment_failed, invoice.upcoming, customer.subscription.trial_will_end, charge.succeeded, customer.subscription.deleted
    • Signing secret: [STRIPE_WEBHOOK_SECRET]
  • Test data
    • Create test products/prices: [STRIPE_TEST_PRICE_IDS]
    • Use Stripe test cards for success/decline cases (see QA section)

Notes

  • Smart Retries schedule is ML‑timed; your email cadence runs in parallel.
  • Billing fee reminder (US): 2.9% + $0.30 per card charge; Billing add‑on 0.7% per paid invoice.

Paddle Billing/Retain: exact toggles to set

Path: Paddle → Retain (or Billing settings) and Developer → Webhooks.

  • Retain (payment recovery): [ON]
    • Recovery emails: [ON] (default cadence aligned to retries over ~10–12 days)
    • Recovery window: [RETAIN_WINDOW_DAYS] (default ~30)
    • Channels for high‑ACV: SMS=[ON/OFF], In‑app=[ON/OFF]
    • From name/email: [SENDER_NAME] <[BILLING_FROM_EMAIL]>
  • Trials & plans
    • Trial length: [TRIAL_LENGTH_DAYS]
    • Cancel at period end: [ON]
    • Customer portal: [ON] with update card, change plan, cancel at period end
  • Webhooks
    • Endpoint: [PADDLE_WEBHOOK_URL]
    • Events: transaction.payment_failed, subscription.canceled, subscription.updated, transaction.completed
    • Secret: [PADDLE_WEBHOOK_SECRET]

Notes

  • Paddle is Merchant of Record; confirm your tax/VAT regions are covered.
  • Retain sends up to four recovery emails aligned to retries; window adjustable.

Churn‑save sequence (copy blocks + timing)

Use this 7–14 day save sequence. Keep it short, human, and link only to the hosted card‑update or portal.

Trigger map

  • Day 0 (immediately on failure): Send Email #1; schedule Email #2 for Day 3, #3 for Day 7; optional SMS on Day 7 for high‑ACV; final notice Day 10–14.

Email #1 — Subject: “Action needed: update your card for [PRODUCT_NAME]” Body: “Hey [FIRST_NAME] — Your [PRODUCT_NAME] payment didn’t go through. It happens. Update your card here (one click): [CARD_UPDATE_URL] We’ll keep everything running while retries happen over the next few days. Need help? Reply here and I’ll sort it. — [SENDER_NAME]”

Email #2 (Day 3) — Subject: “Quick nudge before access is interrupted” Body: “Still a hiccup on your [PRODUCT_NAME] payment. Update your card here: [CARD_UPDATE_URL] If it’s a new card or bank block, this takes ~30 seconds. Questions? Just reply. — [SENDER_NAME]”

Email #3 (Day 7) — Subject: “Last attempt before we pause your account” Body: “We’ll pause [PRODUCT_NAME] on [PAUSE_DATE] if the card isn’t updated: [CARD_UPDATE_URL] If you need a few days, reply and we’ll extend the grace period. — [SENDER_NAME]”

Final (Day 10–14) — Subject: “We’ve paused your account — reactivate in one click” Body: “We paused access because payment didn’t complete. Reactivate anytime: [PORTAL_URL] We’ll keep your data for [DATA_RETAIN_DAYS] days. Need an invoice name change or help? Reply. — [SENDER_NAME]”

Optional SMS (Day 7, consented users) “[PRODUCT_NAME]: Payment failed. Fix in 1 tap: [SHORT_CARD_UPDATE_URL]. Need help? Reply.”

In‑app banner copy “Payment failed. Keep access by updating your card now: [CARD_UPDATE_URL]”

Webhook trigger map → actions

Wire these to your automation tool ([AUTOMATION_TOOL]=Make/Zapier/n8n/Lambda).

Stripe

  • invoice.payment_failed → Action: Start SaveSequence; send Email #1; tag user [TAG=Past‑Due]; schedule Email #2 (Day 3) and #3 (Day 7). If [MRR] ≥ [HIGH_ACV_THRESHOLD], create Slack alert to [SLACK_CHANNEL] and optional SMS.
  • customer.subscription.trial_will_end → Email: “Trial ends in [DAYS_LEFT]” with upgrade link [CHECKOUT_URL]; add in‑app banner.
  • checkout.session.completed → Onboard: send “Getting started” email; start Activation timer [ACTIVATION_WINDOW_HOURS].
  • charge.succeeded → Receipt email; clear [TAG=Past‑Due]; close any open tasks.
  • customer.subscription.deleted → Offboard: confirm cancellation; present downgrade/reactivate links; trigger short exit survey [SURVEY_LINK].

Paddle

  • transaction.payment_failed → Start SaveSequence as above; Retain continues handling emails/retries in parallel.
  • subscription.updated → If plan change downwards, check proration rules; if upwards, confirm feature gating.
  • subscription.canceled → Offboard flow as above.
  • transaction.completed → Receipt + success tracking.

Implementation placeholders

  • Webhook receiver URL: [WEBHOOK_RECEIVER_URL]
  • Secrets: [STRIPE_WEBHOOK_SECRET], [PADDLE_WEBHOOK_SECRET]
  • Slack Webhook/Channel: [SLACK_WEBHOOK_URL] / #[SLACK_CHANNEL]
  • SMS Provider + From: [SMS_PROVIDER_NAME], [SMS_FROM_NUMBER]
  • CRM/Event sink: [CRM_NAME] / [EVENT_TABLE_NAME]

Reply‑router (15‑minute SLA during sender’s hours)

Goal: a human replies to high‑intent messages within 15 minutes during the sender’s local business hours.

Inputs

  • Inbound sources: [GMAIL_ALIAS] and/or [HELPDESK_ADDRESS]; positive billing replies forwarded to [ROUTER_INBOX].
  • Classifier: [LLM_CLASSIFIER]=ON routes intents: BUYING, EXPANSION, BILLING_BLOCK, SUPPORT, OTHER.

Routing rules

  • If intent ∈ {BUYING, EXPANSION, BILLING_BLOCK} and sender_local_time ∈ [WORKING_HOURS_START]–[WORKING_HOURS_END] → page on‑call via Slack/SMS.
  • Else → auto‑acknowledge with SLA: “We reply within 15 minutes during your business hours ([SENDER_TZ]).” Queue to next window.

On‑call

  • Roster: [ON_CALL_PRIMARY], [ON_CALL_BACKUP]; rotation: [ROTATION_RULE] (e.g., weekly UTC).
  • Escalation: if no reply in 10 minutes, notify backup; at 20 minutes, alert channel #[MANAGER_CHANNEL].

Message macros

  • Fast schedule: “Grab a slot here: [BOOKING_LINK] (we’ll hold it for 20 minutes).”
  • Upgrade path: “You’ll get [FEATURE_X] on [PLAN_Y]. Upgrade link: [CHECKOUT_URL].”
  • Billing unblock: “Card‑update link: [CARD_UPDATE_URL]. I’ll watch for it.”

Plumbing

  • Slack alert format: “High‑intent: [INTENT] — [SENDER_EMAIL] — Local time [SENDER_TZ_NOW]. Thread back with status.”
  • SMS alert (for BUYING/EXPANSION): “[PRODUCT_NAME]: [SENDER_EMAIL] wants to [INTENT]. Reply ‘ACK’ to claim.”
  • Logging: create [CRM_NAME] task with SLA timer; status moves: NEW → ACK’d → REPLIED → CLOSED.

Safety

  • Quiet hours by sender’s timezone; override with subject contains [URGENT_TOKEN].
  • Never include full card details in tickets; link only to [PORTAL_URL].

Activation metric (per pattern) — definitions + tracking

Define a single “aha” event per pattern and measure it inside a fixed window.

  • Metric formula: Activation Rate = activated_users / signups in [WINDOW_HOURS] hours.

Defaults

  • Template + Add‑Ons → Event: “[TEMPLATE_NAME] duplicated AND first checklist item completed.” Window: [24] hours.
  • Micro‑SaaS → Event: “First successful job completed” (e.g., file processed, task executed). Window: [24–48] hours.
  • Productized Service → Event: “Kickoff self‑scheduled AND deposit paid.” Window: [24] hours.

Instrumentation

  • Analytics tool: [ANALYTICS_TOOL] (Amplitude/Mixpanel/GA4)
  • Event names: [EVT_SIGNUP], [EVT_ACTIVATION], [EVT_JOB_SUCCEEDED], [EVT_TEMPLATE_COMPLETED]
  • Dashboard segment: by plan (free/trial/paid), by geo, by source UTM

Guardrails

  • Review weekly. If Activation < [ACTIVATION_ALERT_THRESHOLD]% for 2 weeks, run a first‑session teardown and add one guided step or sample data.

Go‑live QA (sandbox + staging checklist)

Before turning on live payments, complete each test and check it off.

Payments (Stripe Test Mode)

  • Success: complete checkout with a valid test card; confirm charge.succeeded, receipt, and onboarding email.
  • Failures: run at least 3 decline reasons (insufficient_funds, expired_card, do_not_honor); confirm invoice.payment_failed fires; Email #1 sent; Slack alert for ≥[HIGH_ACV_THRESHOLD].
  • Trial: create a trial signup; verify customer.subscription.trial_will_end email fires with [DAYS_BEFORE_TRIAL_END] lead.

Payments (Paddle Sandbox)

  • Trigger a failed payment; confirm transaction.payment_failed webhook and Retain email.
  • Trigger a successful payment; confirm transaction.completed and receipt.

Reply‑router

  • Send a BUYING‑intent email from a timezone 6–12 hours ahead; verify quiet hours and next‑window page.
  • Live sender hours: send again; confirm page within 15 minutes and claim workflow.

Data & Security

  • Webhook signatures validated; unknown events ignored.
  • PII redaction turned on in logs; invoices accessible only via [PORTAL_URL].

Minimal dashboard (copy‑paste fields)

Copy these rows into a sheet/Notion database.

  • Daily

    • New signups [COUNT]
    • Activation rate [%]
    • Trials starting/ending [COUNT]
    • Payment failures [COUNT] (by decline_reason)
    • Recovery rate [%] = recovered_failures / total_failures
  • Weekly

    • Trial→Paid conversion [%]
    • Involuntary churn [% of MRR]
    • Expansion MRR [$]
    • Time‑to‑first‑response (median, P90) [MINUTES]
  • Alerts (conditional formatting)

    • Activation < [ACTIVATION_ALERT_THRESHOLD]% for 14 days → RED
    • Recovery rate by decline_reason ‘insufficient_funds’ < [RECOVERY_ALERT_THRESHOLD]% → Investigate copy/cadence
    • Median reply time > 15 minutes during sender hours → Fix on‑call
  • Sources

    • Events feed: [EVENT_TABLE_NAME]
    • Billing: Stripe/Paddle exports (weekly pull)
    • Router: [HELPDESK]/[CRM_NAME]

Cancellation & pause policy (defaults you can use)

Defaults that reduce friction while preserving relationships.

  • Cancel at period end (default): [ON]
  • Grace period after failure before pause: [GRACE_DAYS]=7 (match Email #3)
  • Data retention after pause/cancel: [DATA_RETAIN_DAYS]=30
  • Refunds: [REFUND_POLICY_SUMMARY] (e.g., prorated on annual within 14 days; none on monthly renewals)
  • Pausing (Micro‑SaaS): allow [1] pause per [12] months for up to [PAUSE_DAYS]=14
  • Productized Service deposit: [DEPOSIT_PERCENT]% non‑refundable once work window confirmed
  • Portal copy (cancel): “Cancel at period end keeps access until [NEXT_RENEWAL_DATE]. You can reactivate anytime in one click.”

One‑page control panel (fill this first)

Use this single section to collect your working values for quick reference.

  • Product & pricing: [PRODUCT_NAME] • [BASE_PRICE]/mo • [USAGE_UNIT]=[INCLUDED_UNITS] incl. + [OVERAGE_RATE]/unit
  • Key URLs: Checkout [CHECKOUT_URL] • Portal [PORTAL_URL] • Card‑update [CARD_UPDATE_URL]
  • Support: [SUPPORT_EMAIL] • [STATUSPAGE_URL]
  • Webhooks: Stripe [STRIPE_WEBHOOK_URL] • Paddle [PADDLE_WEBHOOK_URL] • Receiver [WEBHOOK_RECEIVER_URL]
  • Secrets: [STRIPE_WEBHOOK_SECRET] • [PADDLE_WEBHOOK_SECRET]
  • Slack/SMS: #[SLACK_CHANNEL] • [SLACK_WEBHOOK_URL] • [SMS_FROM_NUMBER]
  • On‑call: Primary [ON_CALL_PRIMARY] • Backup [ON_CALL_BACKUP] • Hours [WORKING_HOURS_START]–[WORKING_HOURS_END] in sender’s TZ
  • Activation: Pattern [PATTERN] • Event [ACTIVATION_EVENT_NAME] • Window [WINDOW_HOURS]h • Threshold alert [ACTIVATION_ALERT_THRESHOLD]%