Skip to main content

Campaigns

Why this matters for your business

Most merchants think of a "campaign" as a single email going out to "the list". The reality of growing a store is more complex — your customers are on different channels, in different time zones, at different points in their lifecycle, with different fatigue postures. A flat blast wastes most of its budget on people who shouldn't have heard from you, and shouts past the people who would have bought.

Campaigns on this platform are coordinated, multi-channel, and audience-aware. You pick a segment, you pick a message, and the system handles the rest: which channel to use for whom, when to send relative to their time zone, who to skip because they're already at fatigue, who to hold out for measurement, and how to attribute the revenue afterwards.

The result is that campaigns become measurable bets instead of one-shot blasts. You learn which audiences respond to which offers, you see incrementality (not just attribution), and you stop debating "did the campaign work?" — the data tells you.

What this typically unlocks

OutcomeTypical lift
Conversion rate per campaign send+38% — tighter audiences, better channel match
Unsub rate per campaign−55% — fatigue + consent gates skip the wrong people
Time from idea → live campaign15 minutes vs. half a day across 3 disconnected tools
Campaign-attributed revenue confidence+90% — same-platform attribution beats UTM-only tracking
Campaigns rolled back / "oops" sendsnear-zero — approval gates + fatigue blocks catch most accidents

What you actually get

A campaign is a coordinated bet. Anatomy:

FieldWhat it does
AudienceA segment — static, dynamic, or AI-generated. Always live.
ChannelsOne or more of WhatsApp / email / SMS / web push / Ads. Each gets its own creative.
ScheduleSend now, future timestamp, or "9 AM in their time zone" (international-aware).
Holdout(Agency+) Hold back 5/10/20% of the audience to measure incremental lift.
Approval(Agency+) Required approver(s) sign off before send.
Fatigue checkAlways on. Skips anyone over the daily cap.
Consent checkAlways on. Skips anyone opted out of the channel.
Currency / locale matchAuto. The same campaign sends localized copy + currency to each customer.
Attribution windowDefault 14 days. Configurable per campaign.

You don't manage these; you choose them. Defaults handle 90% of sends.

How it powers every part of your store

When you'd reach for a campaignWhat it makes possible
Flash sale / promoMulti-channel orchestration ensures customers see it on the right channel without doubling up.
Product launchTier the message — VIPs first, loyal next, broad audience last — without manual list management.
NewsletterAuto-personalize: each customer sees product picks based on their lifecycle + LTV cohort.
Win-back blitzCombine with predictive churn to target only customers worth winning back.
Restock alertsTrigger only to customers who viewed/added the SKU.
Survey / NPSSend across channels at a known-quiet moment per customer.
Holiday pushFatigue cap stops you cannibalizing November's open rate by over-sending.

How it works (without the technical bits)

Multi-channel orchestration in plain English

A campaign with three channels (WhatsApp + email + SMS) sends one message per channel per qualified customer. A customer opted into all three gets three; opted into only email gets one. The fatigue cap is per-customer, not per-channel — so when the cap is tight, the channel order matters. Default order is WhatsApp first (highest engagement), then email (lowest fatigue cost), then SMS (highest urgency).

You can override the order per campaign, e.g. when sending a flash deal where SMS-first makes more sense.

The "approval workflow" — the safety net for agencies

For agencies running dozens of campaigns across client accounts, mistakes are expensive. The approval gate makes them rare:

Multiple approvers are supported; the first to approve unblocks. The audit log captures who approved, when, and the audience size at approval — so post-mortems on "who pulled the trigger?" are unambiguous.

Send-time guardrails (always on)

Even before approval, hard rules block dangerous sends:

RuleBehaviour when violated
Audience size > plan capBlock with upgrade prompt — never send 100K when the plan caps at 10K
Audience size > 100% of customer baseWarn — almost always a misconfigured segment
WhatsApp marketing send outside 24h customer-initiated windowAuto-switch to a template (if available) or skip that recipient
SMS at 2 AM localReschedule to the next allowed window
Customer in a holdout groupSkip + count in attribution baseline
Currency rate stale > 24h on a price-sensitive campaignBlock — won't quote prices with stale FX
Customer's unsubscribedAt is setSkip globally

Every skip is logged with the reason — when 1,500 of 5,000 recipients were skipped, you know whether that's because the audience was over-segmented, or because the fatigue cap is working as designed.

Holdouts — measuring incremental lift

A holdout is a randomly-selected slice of the audience that receives no message for this campaign. After the attribution window closes, the system computes:

lift = revenue-per-customer-treated − revenue-per-customer-held-out

That's incremental revenue — the revenue you would not have earned without the campaign. Configure 5/10/20% holdout depending on audience size. Holdout assignment is stable per customer: the same person in a holdout for this campaign may be in the treatment group for the next.

For incrementality more broadly, see Experiments & holdouts.

What you see after the send

The campaign detail page shows:

  • Send funnel — sent → delivered → opened → clicked → purchased
  • Revenue attributed — see Attribution
  • Lift vs holdout (Agency+) — incremental revenue from this campaign alone
  • Per-channel breakdown — same funnel for each channel
  • Skipped counts with reasonsfatigue_cap, no_opt_in, quiet_hours, out_of_window, holdout
  • Top contributors — which audience slices drove the revenue (e.g. "loyal cohort drove 64% of revenue from 18% of recipients")

Real merchant scenarios

Scenario A — Flash sale, founder-led brand

Setup. New merchant, 1,200 customers, free tier. Wants to send a 24-hour 20% flash sale on Friday morning.

Decision. Pick segment "all opted-in customers, lifecycle ≠ churned" (~720 people). Two channels: email + WhatsApp. Schedule "send now" — Friday 9 AM merchant time zone.

What happens.

StepOutcome
Campaign launchedEmail branch fires immediately, WhatsApp branch waits for the 24h window per customer
Email send720 sent, 180 skipped (already at daily cap from journey emails earlier this week)
WhatsApp send410 inside 24h window — sent. 130 outside — auto-skipped, logged. 0 templates configured.
24h later, results:540 emails opened, 89 clicks, 12 purchases ($1,840 revenue). 410 WAs read, 67 clicks, 9 purchases ($1,510 revenue).
Total$3,350 revenue from $0 paid spend

Lesson learned. Merchant adds a marketing template for next flash sale so out-of-window WhatsApp recipients can still be reached.

Scenario B — Mid-market brand, holiday push

Setup. 50K customers, Pro tier. Plans 12 campaigns across November/December.

The problem they're avoiding. Last year's Black Friday week saw a 4× spike in unsubscribes — the brand sent 11 emails in 7 days because each campaign was launched in isolation.

This year's setup. Every campaign uses a fatigue-aware audience filter: customers already at fatigue ≥ 0.6 are excluded at audience-build time. The fatigue cap (3/day global) provides backup if the filter misses anything.

Outcome (Black Friday week).

MetricLast yearThis year
Total emails sent290K235K (−19%)
Open rate13.4%22.1%
Conversion per send1.1%2.0%
Total revenue$182K$241K (+32%)
Unsubs that week4,1001,250 (−69%)

Sending less drove more revenue because every send was cleaner.

Scenario C — Agency rollout across 12 brands

Setup. Agency manages 12 brands; runs a shared "Q4 holiday playbook" campaign template across all of them. Each brand has its own approver list (the brand's marketing lead).

The agency's bet. Standardize the campaign structure (3-step sequence per brand) but customize the creative. Use approval gates so each brand's marketing lead is in the loop.

90 days later.

OutcomeDetail
Campaigns launched36 (3 × 12 brands)
Approval cycle timeMedian 90 minutes from designer → live
Revenue per recipient (median across brands)+28% vs. brands' previous holiday seasons
Cross-client coordinationSingle dashboard shows holiday calendar + approval status
Mistakes caught at approval4 (wrong segment, wrong audience size, stale promo code, unapproved offer)

The four caught mistakes alone justified the agency tier upgrade.

Scenario D — Cart-recovery flash for a furniture brand

Setup. Furniture brand, AOV $1,400, low-frequency purchases. Standard cart-recovery emails see ~3% recovery on $200 AOV products. Higher AOV + longer consideration cycle = different playbook needed.

Decision. Build a 3-message campaign across email + WhatsApp:

  • T+24h: Email — "Still thinking it over?" with product recommendations and design service offer
  • T+72h: WhatsApp (only to opted-in) — "Quick question — is size or finish the concern?"
  • T+7d: Email — "Last chance — your item is still in stock"

Outcome over 60 days.

MetricResult
Carts in window412
Recovered (any step)89 (21.6%)
Revenue recovered$114K
WhatsApp reply rate38% (drove 32 recoveries on its own)
Cost (no paid ads)~$45 in WhatsApp send fees

The WhatsApp reply rate is the standout — at high AOV, customers want to talk before committing.

Scenario E — Re-engagement of "lapsed VIPs"

Setup. DTC brand, 30K customers. Built a segment "VIP lapsed" = lifecycleStage = 'loyal' AND lastActivityAt > 60 days. Audience: 480 customers worth ~$140 LTV each.

Decision. Personal-feeling email from the founder, no discount — just a "we miss you, here's what's new" with a hand-curated product picks block based on each customer's purchase history.

The choice they almost made. Standard 20% off discount. Math says: $140 LTV × 480 customers × 20% off × 25% redemption = ~$3,400 in margin given away.

What they did instead. Personal note, no discount. Result:

MetricOutcome
Open rate64% (vs. 22% on standard)
Reply rate18% (this is huge for email)
Conversions in 14d window87 (18%)
Avg order value$112 (no discount-driven margin loss)
Revenue$9,744
Margin preserved vs. discount approach~$2,000

The takeaway is the personalization × no-discount combo. The data made it possible: knowing exactly who was a lapsed VIP, and having the purchase history to personalize.

Best practices

Use segments, not "all customers". A campaign to your entire list almost always sends to people who shouldn't hear from you. Segment first.

Schedule WhatsApp behind email when running both. Email takes the spot in the daily cap less aggressively (it's lower fatigue cost), so by the time WhatsApp's 24h window check runs, the customer hasn't been disqualified for cap reasons.

Set a holdout on big sends. Even 5% on a 5,000-recipient campaign gives you the lift number — and that number compounds across years of campaigns when you keep it.

Approve in advance for known calendar dates. For Black Friday, get approvals on Monday. The send-time gauntlet still runs at fire time — late approvals just delay sends, they don't risk wrong sends.

Localize per-segment, not just per-language. A "free shipping" campaign should split US (already free over $50) from international (genuine offer) — different segments, different copy, same campaign object.

Don't disable the fatigue check "just for this big launch". The cap protects sender reputation. One override pattern becomes permanent and the unsub creep is invisible.

Don't run the same campaign every week to the same segment. Fatigue compounds. After 4 weeks, the segment will be silent on the channel — open rate drops, reply rate drops.

Don't measure success on revenue alone. A campaign that delivered $5K in revenue but caused 200 unsubs cost more than it made. The unsubs are next quarter's missed campaigns.

Don't pile WhatsApp into a campaign just because it's available. WhatsApp has the highest engagement and the fastest fatigue. Use it sparingly — best for transactional, flash, and personal-feel sends.

Plan tiers

CapabilityFreeStarterProAgencyEnterprise
Email + SMS campaigns
WhatsApp campaigns
Web push campaigns
Multi-channel orchestration
Time-zone-aware send
Approval workflow
Holdouts (lift measurement)
AI subject-line A/B
Custom attribution window
Per-segment localized copy
Outbound webhooks (Zapier)
Campaigns/month cap525100unlimitedunlimited
Audience size cap1,00010,000unlimitedunlimitedunlimited

Frequently asked

My audience is 0 — what's wrong? The segment is too narrow. Save the segment first, then check the live count in the segment editor before scheduling. Common cause: an AND between two conditions where no real customer satisfies both.

WhatsApp sends are way fewer than my audience — why? The 24-hour customer-initiated-conversation window is closing recipients out. To reach customers outside the window, you need a marketing template (P4 strategic). See WhatsApp engine.

The approval email never came. Check spam, then verify the approver's email in /app/sales-engine/approvers. If the email is correct and still nothing arrives, the approver can also approve from the in-app notifications panel.

Holdout looks too small to mean anything. Below ~500 recipients per group (so ~5,000-recipient audience with 10% holdout), the lift number has wide confidence intervals. Either bump the holdout %, or run multiple smaller campaigns and aggregate.

Can I cancel a campaign mid-send? Yes — pause it from the campaign detail page. Sends already queued for the current minute will go through; subsequent batches stop. The system marks remaining recipients as "cancelled" and they can be requeued in a new campaign if needed.

What happens to fatigue if my campaign sends to 50K people? Each recipient's individual fatigue counter increments by 1 (or by N if they receive on N channels). The system never "borrows" from tomorrow's cap — recipients already at the cap are skipped, not deferred.

Can I trigger a campaign from a webhook / external system? Yes — create the campaign as a draft, then call the /api/v1/campaigns/:id/launch admin endpoint. See the v1 admin API.

How accurate is campaign revenue attribution? Multi-touch by default — see Attribution & revenue for the model details. With holdouts enabled (Agency+), you also get the causal lift number, not just attributed revenue.

See also