Revenue trigger inventory
The churn / upsell / expansion brain. 29 detection points, the four action layers, and where each trigger routes.
SideShift Churn & Upsell Trigger Inventory
One organized source of truth for what SideShift can detect, what it can act on now, what needs deployment, and what still needs product work.
Table Of Contents
- Page changelog: what was added when
- Jul 7: Money Model deltas (Managed $3K, Scale-velocity trigger, Intercom wiring), pricing verdict table, Growth play table, repeat-hire loop (T18 to T21), 3-bucket churn sort, brand-alive check, Era C flow moved next to the wallet gate.
- Jul 6: survey coverage ceiling, lever-table numbers, weekly noise gate.
- Jul 5: flow-spec lineage, wallet gate eras, aggregated-views correction.
- Jul 3: threshold calibration folded in (C1/C2 invalidated, T16/T17 proposed).
Executive read
The brain is ahead of the mouth.
SideShift can already detect many revenue moments:
- Churn-save moments from cancellation rows.
- Upgrade pressure from product usage, Boost spend, and billing state.
- Boost pain moments at the role level.
- Newsletter engagement and coldness.
- Conversation-level buying or churn signals in Intercom.
- Batch fit scores that help reps decide who matters most.
That is 29 detection points today: 15 trigger-engine moments (T1 to T15), 6 Boost pain moments (C1 to C6), and 8 Intercom conversation signals.
The main gap is not detection. The main gap is turning detected moments into the right customer-facing action.
That means the system should be thought through in four layers:
- Signal: what happened?
- Truth check: is the data live and safe enough to act on?
- Action path: email, Intercom, GHL, Slack, rep, in-app banner, modal, card, or paywall.
- Measurement: did the action produce recovery, upgrade, top-up, annual conversion, or activation?
Operating rule:
Do not build or ship a trigger unless the team knows who acts, what they say, where it appears, and how the outcome is measured.
Start here by role
Customer journey map
One picture of the journey, the trigger that watches each moment, and the lane it routes to.
flowchart TD
A["Signup (#1 to #3)<br>T14 agency fast lane clock starts"] --> B["Trial started (#4)<br>T5 trial clock starts"]
B --> C{"Activated?<br>1+ job and 1+ applicant"}
C -->|No| R1["RESCUE<br>T5 trial expiring, never activated<br>T15 activation gap<br>Never upsell the stuck"]
C -->|Yes| D["Campaign live, applicants in (#5 to #7)"]
D --> E{"Engaged?<br>DMs sent, interviews moving<br>wallet only reads under Era B"}
E -->|Silent| R2["RESCUE<br>T3 live 37% cliff<br>T16 DM silence (proposed)<br>C3 no-hire Boost rescue"]
E -->|Yes| F["First hire (#8)"]
F --> W["Wallet funding gate (Era B)<br>top-up required AFTER first hire<br>Era A: $500 before first DM<br>Era C: funding modal, dev build"]
W --> G["Success loop (#9 to #12)<br>posts, views, milestones"]
G -->|Winning| U["UPSELL<br>T11 annual at first hire<br>T13 loop-closed annual<br>T12 Boost cadence + usage upgrades<br>C5 engagement Boost, wallet top-ups, viral rerun"]
G -->|Cooling| R3["PRE-CANCEL<br>T1 usage collapse, T2 paying but cold<br>T6 viral cool-off, T4 renewal silence<br>T7 Scale not succeeding"]
B --> BILL["Billing events (#13 to #15)<br>T5 trial close<br>T8 dunning ladder"]
R1 --> X["Cancel row (#16)"]
R2 --> X
R3 --> X
BILL --> X
X --> Y{"Live Stripe check<br>phantom plan? upgrade not churn?"}
Y -->|Suppress| Z1["No outreach, fail closed"]
Y -->|Real churn| GVMCK{"GVM active last 30d?<br>check contractsv2 / program_stats<br>until DBβWhop bridge exists"}
GVMCK -->|GVM still active| Z1
GVMCK -->|GVM also dead| Z2["Churn Intel groups 1 to 10<br>T9 matched save"]
Z2 --> Z3["Confirmed churn<br>T10 win-back at 30, 60, 90 days"]
How to read it:
- Numbers in parentheses are lifecycle webhooks. T numbers are trigger-engine jobs. C numbers are Boost surfaces.
- Rescue outranks upsell at every branch. Spend intent without activation routes to help, never a pitch.
- Nothing customer-facing sends without the live Stripe check. Suppression checks fail closed.
- Intercom signals and Beehiiv tags run alongside every stage and catch the same moments in chat and email before product events exist.
- The wallet gate node is drawn at its Era B position (post-hire). On Era A history (~early to mid June) it sat between applicants-in and the first DM. Era C moves it into the funding modal. Split any historical read at the change dates. The modal's full flow spec (Era C: the new flow to think through) sits directly under the wallet funding gate section, next to the era table.
π§ͺ Parked idea from Jul 7 call notes: campaign-intel scraper
Journey by plan
Pricing, stated exactly (Jul 7): two ladders exist in the docs. Each source is internally consistent, so this is a conflict between documents, not a typo. Who says what:
| Source | Anchor date | Starter | Growth | Scale | Above Scale |
|---|---|---|---|---|---|
| SideShift Pricing β Copy & Design Reference (pricing-page mocks) | Pre-call | $299 mo / $209 annual | $499 mo / $349 annual (featured) | $999 mo / $699 annual | Managed = custom, book a call |
| v6 flow spec annual fix (30% off, $139/$209/$699) | Jun 22 additions | Implies $199 base | Implies $299 base | $999 base | n/a |
| SideShift Money Model (Drew call) | Jul 7 | $199 | $299 (anchor tier) | $999, now includes Slack community + weekly webinars | Managed $3,000/mo, sales-call only, publicly absorbed by Enterprise. $3,000 setup fee waived on a 6-month commit. |
Verdict this page runs on: $199 / $299 / $999 / $3,000 Managed. Three independent reasons: it is the newest source, the v6 annual math ($139/$209/$699 is exactly 30% off) only works against the $199/$299/$999 base, and prod has a pinned June 10 price-change marker (Task #91). The $299/$499 numbers describe the pricing-page mocks, which lag the decision. Final confirmation is one check: open live Stripe products or the live /plans page. Until that check happens, no customer-facing trigger copy quotes a dollar amount.
Constants no source disputes: annual saves 30%, trials are 7 days, agencies pay flat $999/mo or $150 per client. One more unpinned number: the pricing mocks now say the creator pool is 1M+ everywhere (changed from 700K in July), while the Money Model still lists 500K vs 700K as an open decision. Quote no pool number in customer copy until it is pinned (Money Model open decision 5).
The fit fork comes from Front-End Marketing Strategy: about 80% of churned dollars were wrong-fit accounts that should have been routed to education, not a trial.
Account to trial to paid: the fit fork
flowchart TD
V[Visitor] --> A[Account created<br/>signup events 1-3]
A --> F{Fit signals at signup}
F -->|Just getting started| EDU[Education track<br/>content + newsletter<br/>80% of churned $ was wrong-fit]
F -->|Operating brand or agency| T{Starts the 7-day trial?}
T -->|No| N[Nurture lane<br/>Beehiiv + GHL warm close<br/>T2 no-trial play]
T -->|Yes| ACT{Activated in trial?<br/>1 job + 1 applicant}
ACT -->|No| T5[T5 unactivated-trial rescue]
ACT -->|Yes| PAID[Converts to paid]
PAID --> C1{Cycle 1: day 0 to 31}
C1 -->|First hire, Era B wallet gate, creator paid| SUC[SUCCESSOR TRACK<br/>upsell, annual, advocacy]
C1 -->|No hire by day 31| CHU[CHURNER TRACK<br/>T3 cliff play, C3 save offer, matched save]
EDU -.->|Graduates later| T
N -.->|Warms up| T
Three rules that shape every chart below:
- Day 31 is the event horizon. An account that has not hired by then behaves like a churner regardless of plan.
- One DM is the biggest single lever. Brands that message a creator convert about 4.2x better, and only about 37% ever send one.
- The no-trial lane is not dead. T2 plus the newsletter-engaged play keep working that pool until they warm up.
- Matured stage rates behind these charts (Jul 6 pull): D1 signup-to-trial 29% > D2 trial-to-first-job 82.2% > D3 job-to-applicant 99.9% (dead stage) > D4 applicants-to-hire 11% (THE CLIFF: 2,208 brands got applicants, 244 hired) > D5 hire-to-creator-paid 32.5% (floor; off-platform invisible) > D6 hire-to-repeat 74% > D7 month-1-to-month-2 61.9%. Overall paid churn 61.7%, churned median 31 paid days β one-cycle churn dominates.
Stage coverage at the fit fork:
| Stage | Webhook today | Gap to fill | Trigger |
|---|---|---|---|
| Account created | #1-#3 signup events | account_created in PostHog | T14 agency clock |
| Trial started | #4 trial_started | checkout_completed | T5 clock |
| First campaign | #5 campaign_created, #6 first_job_post | onboarding milestones | T15 activation gap |
Starter: $199/mo, $139 annual (mocks still show $299/$209)
flowchart TD
S[Starter paid] --> B{Billing interval}
B -->|Annual, locked 12 months| AW[Watch activation<br/>churn risk is deferred, not gone]
B -->|Monthly| M{First hire by day 31?}
M -->|No| R[Churn cliff<br/>T3 hire-stall play + T15 onboarding rescue]
M -->|Yes| T11[T11 first-hire annual pitch<br/>lock the year, save 30 percent]
T11 -->|Converts| LOCK[Annual Starter<br/>revenue locked]
T11 -->|Declines| U{2+ jobs or 3+ hires in 30 days?}
U -->|Yes| G[Growth pitch<br/>usage-based upgrade]
U -->|No| D180[Day 180+ and MRR $99+<br/>batch annual conversion list]
One honesty note on the monthly-to-annual timing: a fixed "month 3" nudge is not a calibrated moment yet. The calibrated moments today are T11 at first hire, T13 at second campaign, and the 180-day batch list. If you want a month-3 rule, backtest it against real accounts first, the way Threshold Calibration: Task #70 Results (July 3) did for the other thresholds.
Stage coverage on the Starter path:
| Stage | Webhook today | Gap to fill | Trigger |
|---|---|---|---|
| Trial close | #13 trial_ending | close sequence events | T5 |
| Payment fails | #14/#15 payment failed/recovered | dunning_sent | T8 |
| Annual moment | first hire or loop close | annual_offer_shown | T11 |
| Cap hit | none | plan_cap_hit β BUILD #2 | Cap modal |
| Cancel save | #16 subscription_cancelled | cancel_initiated β BUILD #1 | T9 |
Growth: $299/mo, $209 annual, the featured tier (mocks still show $499/$349)
This is where the success loop lives, and it is the shallow spot you flagged: only lifecycle event #12 and the T13 watch cover it today, so the chart below is mostly future state that the loop events unlock.
flowchart TD
G[Growth paid] --> L{Success loop<br/>9 first post, 10 first views,<br/>11 creator paid, 12 loop closed}
L -->|Loop closes| T13[T13 loop-closed annual pitch<br/>the strongest annual moment]
L -->|50K+ views, aggregated across posts| VIR[Viral rerun play + Boost top-up<br/>annual pitch at 100K+]
L -->|3+ wallet top-ups in 30 days<br/>count Era B rows only| T12[T12 plan-pressure upgrade]
L -->|3+ jobs or 5+ hires in 30 days| SC[Scale pitch]
L -->|Loop stalls| COOL{Cooling signals}
COOL -->|Momentum collapse| T1[T1 momentum play]
COOL -->|Silent by day 21 of cycle| T4[T4 renewal-silence play]
The play at Growth, stated plainly. Growth is the anchor tier, and the money question is binary: did the success loop close or did it stall. Five branches, each with an owner-ready spec:
| Branch | Exact rule | Offer | Surface + copy | Outcome that proves it |
|---|---|---|---|---|
| Loop closes | Webhook #12 loop-closed fires, account on monthly | T13 annual, 30% off, one ask only | Email + Intercom. Draft line lives in the Money Model trigger map. | Annual conversion |
| Velocity | 3+ jobs or 5+ hires in 30d | Scale pitch with the new frame: unlimited volume, experts one message away (Slack + webinars now included in Scale) | Intercom draft exists: "you're running at Scale pace already..." | Plan upgrade |
| Plan pressure | 3+ wallet top-ups in 30d, Era B rows only | T12 upgrade: the next tier includes what they keep buying a la carte | Email + Intercom, math frame | Plan upgrade |
| Views milestone | 50K+ aggregated views across posts (never claim one video crossed it) | Viral rerun + top-up. Pair the annual ask at 100K+. | Email + Intercom now, in-app card later | Boost or rerun purchase |
| Stall | Momentum collapse (T1) or silent by day 21 of cycle (T4) | Rescue only: value recap, help, pause if pre-cancel. Never a pitch. | Email + rep | Reactivated activity, cancel avoided |
If only one thing gets wired this week, wire T13 at loop close. It is the strongest annual moment on the page, the Money Model keeps it unchanged, and webhook #12 already exists on Drew's lifecycle branch.
Stage coverage on the Growth path:
| Stage | Webhook today | Gap to fill | Trigger |
|---|---|---|---|
| Success loop events | #8-#12 (first post, views, loop close) | marketing mirror events | T1, T6, T11, T13 |
| Wallet top-up | #18/#19 wallet funded/reloaded | funding_topup_abandoned | T12 |
| Annual at loop close | #17 plan_changed | annual_offer_shown | T13 |
| Cap hit | none | plan_cap_hit β BUILD #2 | Scale pitch |
Scale: $999/mo or $699/mo annual
Scale accounts are operators. The journey question is not "will they activate," it is "is the volume paying off."
flowchart TD
SCP[Scale paid] --> HV{What does usage say?}
HV -->|Sustained high job and hire volume| REP[Scale-to-Premium conversation<br/>rep-led, not automated]
HV -->|Asks for deeper numbers| DATA[Data gate, BUILD priority 5<br/>per-creator performance, CPM by format]
HV -->|0 hires in 30 days, renewal inside 30| T7[T7 help-first play<br/>fix hiring before touching price]
Stage coverage on the Scale path:
| Stage | Webhook today | Gap to fill | Trigger |
|---|---|---|---|
| 0 hires near renewal | none (polling job) | usage-drop event | T7 |
| Cancel | #16 subscription_cancelled | cancel_initiated β BUILD #1 | T9 matched save |
Agency: flat $999/mo or $150 per client
Agencies are a different animal: 6% ever-cancelled vs 61% for brands, so the play is fast activation and expansion, not churn defense.
flowchart TD
AG[Agency DNA detected<br/>isAgency flag, multi-brand tells, third-party money] --> A14{Activated within 14 days?}
A14 -->|Yes| T14[T14 fast lane<br/>Growth pitch]
A14 -->|Strategy call happens| LINK[Custom Stripe link<br/>sent within the hour]
T14 --> CC{Client count over time}
LINK --> CC
CC -->|Reaches 6+| FLAT[Flat $999 crossover pitch<br/>at 7 clients per-client costs more]
CC -->|Drops to 1-2 at renewal| PCS[Per-client downsell save<br/>$150 per client keeps the relationship]
CC -->|Reaches 10+| ENT[Enterprise rep motion<br/>custom terms]
Stage coverage on the Agency path:
| Stage | Webhook today | Gap to fill | Trigger |
|---|---|---|---|
| Agency signup | #1-#3 + isAgency flag | agency-detection timing event | T14 clock start |
| First campaign | #5 campaign_created | fast-lane clock start | T14 fast lane |
| Client count 6+ | none | subaccount count event | Per-client crossover |
Support routing: about 60% AI, the rest human
Your own Intercom data backs the split you guessed. Last ~90 days: 10,802 conversations, the chatbot replied in 70% and closed 43% on its own, Fin resolution is 63.4% with 64.2% deflection, and Fin CSAT (56.4%) beats teammate CSAT (33.6%). The human lane is the weak point: median teammate first response is 1 day 2 hours. So the goal is not more AI, it is protecting the human lane for revenue and save moments only.
flowchart TD
MSG[Brand message in Intercom] --> FIN[Fin AI first touch<br/>~64% deflection today]
FIN --> TAG{8-signal tagger fires?}
TAG -->|FRUSTRATION_CHURN_RISK or PRICE_OBJECTION| HUM[Same-day human save<br/>feeds T9 matched save]
TAG -->|PLAN_CAP, MULTI_BRAND, VIRAL_PROOF, PAYING_CREATORS| REV[Revenue route<br/>upsell owner picks it up]
TAG -->|No signal| RES{Fin resolves it?}
RES -->|Yes, about 60% of volume| AICLOSE[Closed by AI<br/>keep it here]
RES -->|No| QUEUE[Teammate queue<br/>1d 2h median first response today]
Two reads from that data:
- The 8-signal prompt is what turns Fin from a deflection tool into a revenue router. Paste it before touching anything else in support.
- The top negative-CSAT topic is payment structures for video views and pay periods. That confirms the payments-pain lead angle for save and win-back copy.
Flow-spec lineage and product-state timeline
Added July 5. Every threshold in this doc was calibrated against a specific product state, and the product has changed at least three times since May. This section pins which spec is current and which moving parts invalidate trigger reads.
One funnel, three spec generations
| Doc | Time anchor | Status | Scope | What it changed |
|---|---|---|---|---|
| Signup Flow Rebuild β Sprint Build Spec | ~Early May, pre May 11 audit | Done, superseded | Signup, pricing, Stripe | Killed the 8-step pre-trial onboarding: hero CTA to pricing to signup to Stripe, trial live before questions. 8 Stripe products, CTA tagging (plan/billing/segment), flagged annual math 50% to 30%, said "kill the paywall, no free users exist." |
| SideShift Activation Rebuild β Dev Spec v4 | ~May 13, post May 11 audit (18.8% activation) | Done, superseded | Post-signup activation | Introduced Fix numbering 1 to 11: wizard Step 1 captures ugc_experience, business_type, niche (+ conditional clients_managed), dashboard strip, attribution interstitial (Fix 11), auto-publish Job (Fix 10), combined success page (Fix 4). |
| 08 Β· Onboarding Flow Optimization (v6) | May 21 live-test call, Q3 additions Jun 22 | In progress, SOURCE OF TRUTH | Full brand flow end to end | Supersedes v4 and v5. Keeps Fixes 1-3/7/8/11, adds 12-25: /pricing/select, /signup/creator, book-call BEFORE tour (Jaden's Cal.com), mobile hard gate, staged real-data tour, paywall-everywhere RESTORED, Stripe back-button fix, account-deletion cleanup, cancel-flow data-quality fix. Pauses Fixes 4/6/10 on Drew's recommendation engine. |
Conflict rule: v6 wins. The sprint spec and v4 are historical context only.
Deltas between generations that touch triggers
| Moving part | Sprint spec | v4 | v6 (current) | Trigger impact |
|---|---|---|---|---|
| Paywall for non-paid | Kill it, no free users | n/a | Restored everywhere (Fix 17): Stripe bail is real | The bail pool exists again. T5 and trial-close plays must segment paid-trial vs bailed-non-paid. Bail users also get the book-call modal (Fix 14). |
| Onboarding questions | Move all 8 post-trial | 3 + conditional in wizard Step 1, 5 deleted | Same as v4 (Fix 2); old 8-step confirmed deleted (Fix 21) | With onboarding_survey_data dark May 24 to Jul 3 (no backfill), wizard Step 1 is the ONLY forward source of business_type / niche / ugc_experience for Churn Intel groups 3/6/7 and fit scoring. |
| Attribution | Referral field on Stripe success | how_did_you_hear interstitial post-Launch (Fix 11) | Same (Fix 11) | T10 win-back segmentation and fit models get attribution only from the interstitial going forward. |
| Annual math | Flagged 50% to 30% | n/a | Fixed at 30% ($139/$209/$699) + label bug fix | All T11/T13 annual copy says 30%, matching card 01. |
| Success page | n/a | Fix 4 creators-inline success page | Paused; Fix 22 interim: land on campaign view with one unmistakable Add Creators CTA | C4/C5 and the invite-first-creator activation milestone fire from the campaign view, not the paused success page. |
| Tour | n/a | n/a | Fix 16: staged, ~3 min, REAL persisting data, book-call first | Tour stage completions are new pre-activation signals; stage 1 complete = campaign created. |
Wallet funding gate: the moving part this inventory had not factored in
Full card: Wallet Top Up. The gate moved twice, shipped untested, and it sits directly under several triggers' wallet reads.
| Era | Window | Gate placement |
|---|---|---|
| A | ~Early June to mid/late June | $500 top-up forced BEFORE messaging an applicant |
| B | Mid/late June to now | Top-up required AFTER the first hire |
| C | Dev build, not shipped | Post-activation funding modal (shortfall pre-filled, pending deposits count, withdrawable copy, video explainer) |
Exact change dates: Drew is pulling them. Placement authority: Preclose (Drew, on record: "it's a data decision, not a product decision"). Governing principle: messages and interviews stay free in any order, the hire is the gate, never gate before content delivery.
Adjacent product-timeline markers, now pinned (Task #91, verified against prod): May 25 /pricing to /plans page cutover and June 10 price change. These are the real dates behind the "~May 7 / June 22" references. They are pricing-timeline anchors, NOT confirmed wallet-gate change dates; Drew still owes those. Keep the two timelines separate: wallet-over-time views split at both sets of markers, but era classification of top-ups waits on the gate dates.
Era-aware trigger reads:
- "Wallet still at seed" as engagement silence (T3 gate, C1/C2 re-spec, the calibration's $25-seed separator): valid only on Era B rows. In Era A the wallet was force-funded before the first DM, so seed-wallet reads on Era A accounts are meaningless. The July 3 calibration ran on mixed-era data; re-verify the wallet separator on Era B rows only.
- T12 Boost cadence + Boost upgrade: an Era A top-up is compliance, not plan pressure. Window top-up cadence by era before pitching.
- T15 activation gap ($250+ spend, no activation): Era A mechanically manufactured spend-intent-without-activation accounts. Exclude forced top-ups or the rescue queue is polluted.
- Wallet top-up at win moments (#18/#19) and X3 headroom: sound under Era B. Under Era C the funding modal becomes the surface, and it must ship with
funding_modal_shown/funding_topup_abandoned(open decision 9) so the next placement change is measured from day one. - Managed/Discover moment (wallet funded + 0 hires in 30d): by definition a rare state under Era B for pre-hire accounts; meaningful mainly post-hire or on Era A history.
Chart note (Jul 5): none of the three spec flow diagrams carry the wallet gate. The sprint spec's FigJam boards, v4's embedded flow images, and v6's complete user flow all end at the invite-first-creator activation milestone, each frozen at its own product state. The journey charts on this page are the era-annotated versions: the gate node is drawn at Era B, and it re-pins when Drew delivers the exact change dates or when Era C ships.
Era C: the new flow to think through
Placed here on purpose: this is the future state of the gate described in the era table directly above.
The dev build already moves the gate into a post-activation funding modal. Spec it as a flow, not a popup:
flowchart TD
H[First hire confirmed] --> M["Funding modal<br/>need / ready / add shortfall pre-filled<br/>pending deposits count<br/>withdrawable copy + video explainer"]
M -->|Funds| RUN["Meter runs<br/>posts + views draw down wallet<br/>#18/#19 fire"]
M -->|Abandons| AB["funding_topup_abandoned<br/>recovery play within 24h<br/>billing-architecture copy, not upsell"]
AB -->|Recovers| RUN
AB -->|Still unfunded 7d+| RESC["Rescue lane<br/>hire made but meter never started<br/>rep touch, not discount"]
Ship-with list:
- All four funding events on day one:
funding_modal_shown,funding_method_added,funding_topup_completed,funding_topup_abandoned. This resolves open decision 9 toward all four, not abandonment-only. - The abandoned-top-up recovery play (Lane 3 build #4) goes live the same week the events exist.
- T12, X3, and the win-moment top-up plays re-point at the modal as their surface.
- Placement stays post-hire unless the Era A vs B experiment says otherwise. Decision rule: brands reaching hire x funding completion at the gate x average spend x take rate. Preclose holds the call.
- Hard guardrail carried over: the modal never fires pre-activation and never before content delivery.
Wallet top-up analysis: the pull list
Inputs: wallet ledger export (internal dashboard, export all), the two gate change dates from Drew, Stripe "Wallet Top Up" one-time charges, contractsv2 / program_stats for hire and spend joins.
Cut everything by era (A vs B), per account:
- Top-up count and amount distribution. Expect a $500 spike in Era A: that is the forced minimum, not willingness to pay.
- First top-up timestamp vs first DM and vs first hire. This classifies every top-up as forced (Era A compliance) or voluntary.
- Funding completion at the gate. The ledger only knows completions, so the denominator is gate hits: first-DM attempts in Era A, first hires in Era B.
- Downstream rates per era: DM rate, interview rate, hire rate, time-to-first-hire.
- Repeat cadence: share of accounts with 3+ top-ups in 30 days, per era. This re-calibrates T12's threshold before it flips on.
Economics pulls alongside:
- Blended take rate = platform fee revenue last 30d / creator payout volume last 30d.
- Wallet utilization = total wallet spend / total deposits, lifetime and last 90d.
Verify before trusting any read:
- Exact change dates. The era split is meaningless without them.
- Which rail each top-up rides: Stripe one-time charge vs Whop wallet. No DBβWhop bridge exists (G18), so the two ledgers must be reconciled manually.
- #18/#19 webhook definitions (wallet funded / reloaded) match ledger rows one to one.
- Withdrawals and pending deposits: does the ledger net them out of deposits? Era C copy promises withdrawable funds, so withdrawal rows will grow.
- The $25-seed separator from the July 3 calibration, re-run on Era B rows only.
Known blind spot: no funding-modal view or abandon events exist. Everything above measures completions; intent and abandonment stay invisible until Era C instrumentation ships.
Execution home: Task #91 (Segmented Funnel + Wallet Over Time) builds the wallet-over-time layer. Top-up dollars pull live from Stripe charges via stripe_wallet.py (NOT frozen, unlike the subscriptions mirror dead since Feb 5), bucketed at the change-date markers with era labels and honesty banners, button-gated because the scan is slow. Brand filter for every cut: type='Employer' AND not isAgency AND email not @sideshift.%. Where a Stripe customer maps to a brand with a known survey segment, top-ups also roll up by segment. Out of #91's scope: Whop/GVM spend (Tasks #61/#89), brand-vs-agency split (Task #76), new PostHog events.
Survey coverage: the segmentation ceiling (pinned Jul 6, Task #91)
Onboarding-response segmentation (onboarding_survey_data.ugcExperience: Just getting started / Tried it, mixed results / In-house team / Working with an agency) has a hard coverage ceiling, verified against prod:
| Signup month (2026) | Jan | Feb | Mar | Apr | May | Jun | Jul |
|---|---|---|---|---|---|---|---|
| Survey coverage | 57% | 80% | 87% | 89% | 20% | 0.1% | 7% |
Rules this sets:
- Segment-level reads are trustworthy for Feb-Apr 2026 cohorts only. The outage window is May 24 to Jul 3, 2026, and there is no backfill: the Firestore mirror is empty for the window too. Accounts signed up in that window are permanently un-segmentable by survey.
- Every segmented view shows an explicit Unknown / no answer bucket next to the four real segments, never hidden.
- Everything that leans on these fields inherits the ceiling: Churn Intel groups 3/6/7, fit scoring, T10 win-back segmentation, and #91's per-segment vertical funnels (Onboarded > Created Program > Posted Job > Received Applicants > Sent Interview/DM > Made a Hire, with stage conversion plus posts/views/spend).
- Forward source is wizard Step 1 (Fix 2) once live; July's 7% suggests the pipe is trickling again post-Jul 3, but treat post-outage coverage as unproven until a fresh month clears ~80%.
The two-phase lens: pre-activation vs post-activation
The cleanest cut across all 29+ detection points. Phase = has the account crossed 1+ job and 1+ applicant, with the hire as the wallet gate under Era B.
| Phase | Allowed motion | Triggers | Owning spec |
|---|---|---|---|
| Pre-activation | Rescue and onboarding only. Never pitch. | T5, T15, T16 (proposed), C1-C4 (re-specced around engagement silence), book-call modal, mobile hard gate, tour stages, bail-path paywall prompts | v6 onboarding fixes + card 06 (time-to-first-hire) |
| Post-activation | Upsell and expansion, gated on live Stripe + health. | T11, T13, T12, usage upgrades, X1/X3/X4, C5, viral rerun, wallet top-up at win moments, agency plays | This page + card 09 (plan upgrade flow) |
| Cross-phase (billing + save) | Recovery, save, win-back. | T1, T2, T4, T6, T7, T8, T9, T10 | This page + cards 00/07 |
This formalizes "never upsell the stuck": phase is the first gate, checked before any other rule. Every new trigger spec declares its phase.
SideShift AI: forward dependency, flag now
The signup-era specs keep AI as a 2-node plug-in: an optional website-URL field on /signup, and background analysis that pre-populates the first campaign draft during Stripe checkout. If it ships:
- Wizard Step 1 answers may be inferred instead of asked, changing Fix 2's schema contract and the pre-activation clocks on T5/T15.
- Time-to-first-campaign compresses, so tour stage 1 and every pre-activation threshold need recalibration.
- No trigger may hard-code the wizard as the only path to a campaign record.
Operating rule: any trigger whose logic references wizard steps, tour stages, or wallet-gate placement carries a product-state note in its spec, so the engine knows which product it was calibrated against.
Action lanes
Every trigger belongs in one of three lanes.
| Lane | Meaning | Owner | Timing | Examples |
|---|---|---|---|---|
| FLIP ON | Built or paste-ready. Needs webhook secrets, copy, flags, GHL hooks, Intercom instructions, or SOP. | Nikolai + Shash | This week | Dunning, annual at win moments, usage upgrades, Boost cadence, matched saves, Intercom signal tagging, agency custom links. |
| DEPLOY | Built on a branch or behind a flag. Needs Drew to deploy or flip. | Drew | One deploy / one flag | Lifecycle webhooks #6 to #19, Boost C1 to C6 + D1 SKU modal. |
| BUILD | New product work. Needs a new event, UI surface, or product flow. | Drew's queue | Prioritized backlog | cancel_initiated, plan_cap_hit, funding_topup_abandoned, in-app save, cap modal, viral rerun card, data gate. |
Operating rule:
Do not wait on BUILD work to start FLIP ON work. Many revenue moves can run through email, Intercom, GHL, Slack, or rep follow-up before new in-app surfaces exist.
Build-status ledger
| System | Status | What turns it on | Why it matters |
|---|---|---|---|
| Trigger engine T1 to T15 | Built, dry-run tested, not live. Zero webhooks configured. | One TRIGGER_HOOK_T# secret per trigger plus scheduled runs enabled. T8 must be throttled first. | This is the main pre-cancel, cancel-save, and upsell engine. |
| Lifecycle webhooks #1 to #5 | Live. Includes signups, trial_started, campaign_created. | Nothing. Usable today. | Can feed early nurture and activation paths now. |
| Lifecycle webhooks #6 to #19 | Built on feat/lifecycle-loop-webhooks, pending deploy. | Drew deploys the branch. | Unlocks first job, first applicant, first hire, first post, views milestone, trial ending, payment failed/recovered, cancelled, plan changed, wallet funded/reloaded. |
| Boost C1 to C6 + D1 SKU modal | Built on feat/boost-pain-triggered-placement, flag-gated. | Drew flips the feature flag. Copy is mapped in BOOST_JOURNEY_COPY_MAP. | Turns role-level pain and engagement moments into Boost revenue. |
| Intercom 8-signal tagger | Paste-ready prompt exists. | Paste into Intercom AI instructions. | Catches buying signals and churn signals before product events exist. |
| Net-new events | Not built. | Drew's team builds cancel_initiated, plan_cap_hit, and funding_topup_abandoned. | These are the missing high-leverage moments inside the app. |
| In-app surfaces outside Boost modal | Not built. | Drew's queue. Reuse Boost modal pattern where possible. | Needed for banners, modals, paywall gates, and dashboard cards. |
Trigger quick-reference
Nothing in this table is live or sending to customers today. Zero webhook secrets are configured β the trigger engine runs in dry-run / Slack-only mode. Status codes below describe what it takes to turn each trigger on, not what's currently active.
- π’ FLIP ON β detection code exists; turn on by adding
TRIGGER_HOOK_T#webhook secret + Shash mints GHL catch hook + copy written. Still requires Shash + Nikolai action. - π‘ DEPLOY β code exists on a branch or behind a flag; Drew must deploy or flip first, then FLIP ON steps apply.
- π΄ BUILD β net-new product or event work required before anything else.
Full rules in each trigger family section below.
| ID | Name | Fires when | Action | Status |
|---|---|---|---|---|
| T1 | Usage momentum collapse | 0 activity last 30d, had it 31-60d | Email + rep | π’ |
| T2 | Paying but cold | Active + Beehiiv cold | Re-engagement | π’ |
| T3 | Live 37% cliff | Jobs + applicants, no hire, DM silence | Help email + rep | π’ |
| T4 | Renewal silence | Renewal <14d, inactive 21d+ | Value recap email | π’ |
| T5 | Trial expiring, not activated | Trial ends 3d, 0 jobs | Activation email | π‘ |
| T6 | Viral cool-off | 5M+ views, no post 21d | Rep call | π‘ |
| T7 | Scale not succeeding | Scale, 0 hires/30d, renewal soon | Rep help call | π’ |
| T8 | Dunning ladder | payment_failed day 0/3/7 | Card-fix email | π’ throttle first |
| T9 | Matched save | Cancel passes Stripe check | Matched save email | π’ |
| T10 | Cohort win-back | Confirmed churn 30/60/90d | Win-back email | π’ |
| T11 | Post-first-hire annual | First hire, monthly plan | Annual pitch | π‘ |
| T12 | Boost cadence ceiling | $1,000 / 30 days. 3+ top-ups/30d | Upgrade email | π’ |
| T13 | Loop-closed annual | Second campaign, monthly | Annual pitch | π‘ |
| T14 | Agency fast lane | Agency DNA + activated <14d | Growth pitch + rep | π’ |
| T15 | Activation gap rescue | $250+ Boost, no activation | Onboarding rescue | π’ |
| T16 | DM silence (proposed) | Job live, applicants in, no DM by day 5 | Message nudge | π΄ |
| T17 | First Boost charge (proposed) | First-ever Boost purchase | Human rep | π΄ |
| T18 | Contract-expiry rescue | Contract within 5d of expiry, no deliverable | Extend-or-swap banner + email | π΄ |
| T19 | No-second-hire | First hire, no 2nd hire 30 days later | Resurface applicants + rep task | π΄ |
| T20 | Posting-cadence decay | 45+ days no new job post, sub active | Rep/GHL nudge + in-app prompt | π΄ |
| T21 | Winner-creator resurfacing | Past top creator available | One-click re-book card | π΄ |
| T22 | Scale velocity (proposed Jul 7) | Scale, 6+ jobs or 8+ hires in 30d | Managed sales call | π΄ same pattern as usage upgrades |
| T23 | Post-hire DM-again nudge (proposed) | Hire made, no new DM after | Message-next-creator nudge | π΄ |
| C1-C6 | Boost pain + engagement | Role-level pain or win moments | In-app + email | π‘ flag |
| X1 | Views-milestone upsell | Cumulative views crosses a band (50k/100k/1M) | Scale / data tier pitch | π‘ backlog sweep now; live needs X-G1 |
| X2 | Winning-format packaging | Top creative beats brand median views-per-post | Messaging brief back to brand | π΄ blocked β no per-creative data |
| X3 | Ads-flow nudge | Winner + wallet headroom + not boosted 60d | Boost / paid-amplification pitch | π‘ proxy version now |
| X4 | Volume-tier / cheap-CPM fit | β₯500k views + CPM β€$2 + sub-Scale monthly | Scale plan-fit pitch | π’ all inputs live |
Numbering note (Jul 7): the lever table's proposed post-hire DM-again nudge was originally also labeled T18. The repeat-hire loop section owns T18 to T21, so the DM-again nudge is T23 going forward, and the Money Model's Scale-velocity trigger is T22.
Trigger families
The trigger system has six families:
- Churn Intel: post-cancel classification, save routing, and safety checks.
- Pre-cancel prevention: usage drop, cold payer, 37% cliff, renewal silence, trial ending, dunning, viral cool-off.
- Upgrade predictor: plan-pressure, annual, expansion, activation gap.
- Boost triggers: role-level pain and engagement moments that sell more reach.
- Newsletter and conversation signals: Beehiiv engagement/cold tags and Intercom signal routing.
- Batch fit scoring: ranking layer for rep prioritization.
The important distinction:
- Triggers detect moments.
- Plays decide what to do with those moments.
- Surfaces decide where the customer sees the play.
1. Churn Intel
This system runs on cancellation rows in prod cancellations.
It sorts every cancel into one group. The order matters because the first matching rule wins.
The normal job runs every 6 hours. There is also an urgent mode, but it is not scheduled right now.
| # | Trigger | Simple rule | Data used | Main ID | Current action | Best next action | Why it matters |
|---|---|---|---|---|---|---|---|
| 1 | Viral cancel | Account had 5M total post views or 1M views on one post, and is not a personal email. | contract_posts live | user_id, email | Dashboard only | Route to rep save with value proof. Future: T6 viral cool-off before cancel. | Big-value customers should not be hidden in a dashboard. Some may not realize content kept compounding. |
| 2 | Urgent save: Scale/Premium | High plan, business email. | cancellations live, plan data from old mirror | user_id | Slack + dashboard | Send only after live Stripe verification. Rep follow-up first. | This is the best first save trigger. High-value customers need fast follow-up. |
| 3 | Urgent save: Successor | Growth+ plan, 7+ days old, survey says agency or in-house team. | cancellations live + survey (verify freshness) | user_id | Slack + dashboard | Use as fit context, not sole routing logic. | Useful, but the survey sync gap means newer accounts may be missed until backfill is confirmed. |
| 4 | Urgent save: Engaged | Growth+ plan, 7+ days old, posted jobs and got applicants. | jobs, applicants live | user_id | Slack + dashboard | Route to help-first save. Use usage proof. | They used the product. A save message can be real and useful. |
| 5 | Downgrade-worthy: Price | Paid plan and cancel reason says price, cost, budget, or similar. | cancellations live | user_id | Slack + dashboard | Matched save: downgrade or 20 to 30% for 2 to 3 months max. | Good fit for downgrade or lighter-plan offer. |
| 6 | Downgrade-worthy: Agency | Growth+ plan and survey says Agency. | Survey (verify freshness) | user_id | Slack + dashboard | Validate with live behavior, Intercom, reload patterns, or agency keywords. | Useful, but validate survey freshness for newer accounts before routing on it. |
| 7 | Starter upsell | Starter, less than 7 days old, survey says Consumer App or App Studio. | cancellations β’ survey (verify freshness) | user_id | Slack + dashboard | Could become win-back plus upsell flow after confirmed churn. | May indicate early fit, but not enough for immediate pitch. |
| 8 | Data Gold / 37% cliff | Posted a job, got 10+ applicants, hired nobody. | jobs, applicants, contractsv2 live | user_id | High-signal Slack subset + dashboard | Pre-cancel rescue, not upsell. Offer shortlist, concierge, or hiring help. | They had supply but did not reach the win. |
| 9 | Let go: Never activated | No jobs, no applicants, no hires, and tenure is 1 day or less. | Prod live | user_id | Dashboard only | Low-touch education only. | Not worth rep time. |
| 10 | Let go: Phantom plan | Cancel row claims paid plan, but no real subscription row exists. | cancellations vs old subscriptions mirror | user_id | Dashboard only | Suppress paid-customer outreach. | Prevents messaging trial bouncers like paid customers. |
Why Stripe must be checked before sending
The churn group is only a first guess. It reads SQL fields.
Before anything goes to Slack, GHL, Intercom, email, or a rep, the scheduler must check live Stripe. It skips the person if Stripe says:
- subscription is still active,
- the person upgraded,
- there is no real billing history.
Any CRM or GHL webhook must happen after this live Stripe check, not right after the first SQL group match.
Enrichment attached to churn dossiers
Light enrichment:
- survey answers,
- plan facts,
- job/applicant/hire counts,
- email domain.
Deep enrichment should run only for urgent save and downgrade-worthy groups. It may scrape the company website and create a short company brief.
Why this matters:
- Good reps need context.
- Low-value groups should not waste expensive enrichment.
- Personal emails need different treatment than business domains.
2. Pre-cancel prevention triggers
Today, too much churn action happens after the cancel. These triggers move action earlier.
Delivery chain for all triggers in this section: trigger engine detects β TRIGGER_HOOK_T# webhook fires β Zapier receives β GHL contact tag written β GHL workflow fires email/iMessage/rep task. Until webhook secrets are configured, the trigger engine posts to Slack only. See Zap Inventory for Zap IDs and the GHL tag-to-workflow map.
| ID | Trigger | Simple rule | Action | Surface | Lane | Why it matters |
|---|---|---|---|---|---|---|
| T1 | Usage momentum collapse | Active account had jobs or hires in days 31 to 60, then 0 jobs and 0 hires in days 0 to 30. | Email, plus rep task for higher-value accounts. | Email + rep | FLIP ON after hook setup | Catches cooling accounts before they leave. |
| T2 | Paying but cold | Active Stripe subscriber is Beehiiv cold. | Re-engagement track. | Email / Beehiiv / GHL | FLIP ON after newsletter sync | Combines billing and attention signal. |
| T3 | Live 37% cliff | Active account has jobs and applicants but no hires, plus engagement silence: no DMs sent or wallet still at seed. Calibration verdict: applicant-count gates do not filter, engagement silence does. | Help-me-hire intervention. | Email + rep + future in-app card | FLIP ON for rep/email, BUILD for in-app | They got supply but did not reach the win. |
| T4 | Renewal silence | Renewal within 14 days and 21+ days inactive. Calibration moved this earlier so it fires before the common churn point, not after it. | Value recap, then rep call for high plans. | Email + rep | FLIP ON after hook setup | Turns renewal date into save timing. |
| T5 | Trial expiring, never activated | Trial ends in 3 days and 0 jobs. | Activation help. | DEPLOY for #13, then FLIP ON | No reason to discount before they try the product. | |
| T6 | Viral cool-off | 5M+ views and no new post in 21 days. | Rep call with value proof. | Rep + email | DEPLOY / FLIP ON depending on views event | Big value may be invisible to the customer. |
| T7 | Scale not succeeding | Scale plan, 0 hires in 30 days, 1 or fewer jobs in 30 days, renewal soon. | Help call first, downsell second. | Rep | FLIP ON | Help should come before discounting. |
| T8 | Dunning ladder | Payment failed event, day 0/3/7 (Data Pack extends a final touch at day 14). Must not fire on the whole past-due queue: needs an MRR floor and an age window first, per the calibration runbook. | Card-fix email. Human escalation for high-value accounts. | Email + iMessage | FLIP ON first, but throttle before live | Stops involuntary churn. |
| T9 | Matched save at cancel | Cancel event passes safety checks. | Offer based on reason and archetype. | Email + rep now, in-flow save later | FLIP ON now, BUILD for cancel_initiated | Saves should match the real reason. |
| T10 | Cohort win-back | Confirmed churn at 30/60/90 days. | Segmented win-back. | Email + Meta custom audience | FLIP ON | Win-back should ignore phantom and bad-fit accounts. |
Trigger IDs continue into the upsell family: T11 post-first-hire expansion, T12 Boost cadence ceiling, T13 loop-closed annual lane (second campaign launched on a monthly plan), T14 ICP-1 fast activation lane, T15 activation-gap rescue. Their rules live in the upgrade predictor section below.
Calibration also proposed two new triggers, pending build: T16 DM silence (job live, applicants in, no DM by day 5), the strongest controllable lever the system does not watch today, and T17 first-ever Boost charge routed to a human, a rare and high-intent buying signal. Both are specced in Threshold Calibration: Task #70 Results (July 3).
The lever table behind them (Jul 6 export) adds hard numbers and one new proposal:
- Boost spend (any, 60d window) is the biggest single hire lift measured: 56.8% vs 10.8% (5.3x, directional at n=37), and only ~9% of brands ever boost (240 of 2,676 scanned). That is why T17 routes to a human.
- T18 (proposed): post-hire DM-again nudge. Brands that DM again after a hire reach creator-paid at 39.3% vs 14.9% (2.6x). 72% of hirers qualify, and nothing watches the hire-to-creator-paid stage today.
- Interview scheduling (66.4% vs 25.0% signup-to-trial, 2.7x) stays a positive qualifier for upsell timing, not an absence alert β the 10% base rate is too low to alert on.
- First job posted fast: passers post a median 4.5h after signup; stalled accounts take months or never. That is an onboarding-flow fix (v6 territory), not a trigger.
3. Upgrade predictor
This system scans active subscribers. It looks for people who may be ready to upgrade.
Before any pitch, it checks live Stripe so it does not pitch the wrong plan or pitch someone who is churning.
Quiet hours:
- 9am to 8pm ET.
- Monday to Friday.
Repeat control:
- Alert groups can show once per user per week.
- Batch groups can show once per user per month.
Gates before any upgrade trigger
A customer must pass these checks:
- Status is
active. - They are activated: at least 1 job and at least 1 applicant.
- They are healthy: activity within 45 days, or activity date is unknown.
If someone spends on Boost but is not activated, they become an activation-gap case. That means help them onboard. Do not upsell them yet.
| Trigger | Simple rule | Data used | Main ID | Action | Surface | Lane | Why it matters |
|---|---|---|---|---|---|---|---|
| Usage upgrade | Starter with 2+ jobs or 3+ hires in last 30 days, or Growth with 3+ jobs or 5+ hires in last 30 days. | jobs, contractsv2, live Stripe | user_id, stripeCustomerId | Plan upgrade pitch. | Slack now, email + Intercom next | FLIP ON | Clean upsell trigger. It uses recent use, not lifetime totals. |
| Boost upgrade | More than $250 Boost spend in last 60 days, activated, and below Scale/Premium. | Live Stripe charges | stripeCustomerId | Plan upgrade or Boost cadence pitch. | Slack now, email + Intercom next | FLIP ON | Strong buying-intent signal. |
| Annual convert | Monthly, 180+ days old, MRR $99+, activated, healthy. | Prod + live Stripe | stripeCustomerId | Annual offer. | Weekly Slack list, email, Intercom | FLIP ON | Better as a weekly CRM list, not a single event. |
| Expansion | 60+ days old, activated, healthy. | Prod + live Stripe | stripeCustomerId | Rep-prioritized expansion after scoring. | Weekly list | FLIP ON only if scored | Too broad unless filtered by fit. |
| Activation gap | $250+ Boost spend but no job or no applicant. | Live Stripe + prod | stripeCustomerId | Onboarding rescue, not upgrade pitch. | Rep / email / support | FLIP ON | Money intent exists, but value has not landed. |
Upsell and expansion ideas
| Idea | Simple rule | Best action | Surface | Why it matters |
|---|---|---|---|---|
| Post-first-hire expansion | First hire happens on Starter or Growth. | Congrats plus annual or upgrade offer inside a 30-day window. Calibration widened this from 7 days to match real repeat behavior. | Email + Intercom now, in-app later | Best time to talk about more value is right after a win. |
| Boost cadence | 3+ top-ups in 30 days. | Plan upgrade pitch. | Email + Intercom | Repeat top-ups show plan pressure. |
| Repeat-hire annual lane | Second job leads to hire and account is monthly. | Priority annual offer. | Email + Intercom | Repeat success is a strong retention signal. |
| Scale to Premium pressure | Scale account has high job or hire volume in 30 days. | Premium / custom plan conversation. | Rep | Extends upgrade logic beyond Growth. |
| Newsletter-engaged trial | Engaged Beehiiv subscriber is trialing. | Warm close sequence. | Beehiiv / GHL | Warm leads should get different treatment. |
| Fit-score-gated expansion | Expansion list is filtered by Product-Fit score. | Ranked rep list. | CRM / Slack | Keeps broad lists from becoming noise. |
| ICP-1 fast lane | Agency-DNA account activates within 14 days. | Growth pitch. | Email + Intercom + rep | Fast-activating agencies are high-value. |
4. Boost triggers
Source: 05 Β· Boost upsell β pain-triggered placement + SKU ladder.
Plain-English read:
- Boost should be treated as a separate trigger family, not just an upsell modal.
- The Boost work is not shipped revenue infrastructure yet. Treat it as code exists / branch or flag exists.
- C1 to C4 pain triggers appear implemented behind a feature flag, but still need deployment, Cloud migration readiness, production verification, and outcome logging.
- D1 to D3 conversion events appear implemented behind a feature flag, but still need deployment, production verification, and clean outcome logging.
- C5 engagement trigger is not built yet.
- Funding-modal events are not built yet, and they are the main blind money step.
- Anything depending on Replit crons, local state, local Postgres, or old schedulers is transitional. The durable version belongs in Google Cloud / Cloud Scheduler with migrated dedup and outcome tables.
Built or specified Boost moments
| ID | Trigger / surface | Simple rule | What fires | Status | Surface | Why it matters |
|---|---|---|---|---|---|---|
| C1 | Launch nudge | Job live less than 24h, 0 applicants, no boost. | Quiet in-app nudge | Code exists, flag-gated; not production-complete | In-app nudge | Keeps Boost discoverable at launch without forcing the full upsell before pain exists. |
| C2 | Slow applicants | Live 48h+ and applicants less than 5, with floor above 0. | Banner + one-time email + Boost modal | Code exists, flag-gated; not production-complete | Banner + email + modal | Core pain-triggered Boost play. |
| C3 | No hire | Live 7d+ and hire count = 0. | Stronger banner + one-time email + Boost modal | Code exists, flag-gated; not production-complete | Banner + email + modal | Rescues roles that got stuck before frustration becomes churn. |
| C4 | Empty pipeline | Brand clicks Add Creators / database, then saves 0 creators. | Discover + Boost side-by-side card | Code exists, flag-gated; not production-complete | Card | Catches the moment when the brand tries to solve supply manually and fails. |
| C5 | Engagement trigger | High applicants or post-hire moment. | Prompt to get more reach while things are working. | Not built | Banner + prompt | Likely converts better than rescue triggers because it sells from success. |
| C6 | Self-initiated Boost | Brand opens the Boost modal itself. | Full Boost modal | Code exists, flag-gated; not production-complete | Modal | Highest-intent demand and control group for triggered placements. |
| D1 | Boost modal | Opened by C1 to C4, C6, or later C5. | SKU ladder, recommended defaults, running total | Code exists, flag-gated; not production-complete | Modal | Turns the trigger into revenue. |
| D2 | Boost checkout | Brand confirms selected SKUs. | Credits or Stripe checkout | Code exists, flag-gated; not production-complete | Checkout | Completes the purchase path. |
| D3 | Boost applied / receipt | Payment succeeds. | Success state, banner clears, receipt | Code exists, flag-gated; not production-complete | Receipt / state change | Closes the loop and should feed outcome measurement. |
Boost guardrails claimed in the branch
- 7-day dismiss suppression.
- No double-fire while a boost is active.
- One email per trigger per job, ever.
no_hireoutranksslow_applicants.- One banner at a time, never a stack.
- Trigger and cohort properties attach to Boost events.
Boost SKU ladder
| SKU | Price | Status | Simple meaning |
|---|---|---|---|
| Staff Pick | $150 | Specified / configured | Badge or editorial lift for 1 week. |
| Top of Feed | $250 | Specified / configured | Premium placement for 1 week. |
| Priority Push | $500 | Built in ladder, needs real slot counts | Matched creator push, capped so it does not become spam. |
| Maximum Visibility | About $800 | Built / price confirmed under $900 sum | Bundle anchor: Top of Feed + Staff Pick + Priority Push, extended. |
| Newsletter Feature | $1,500 pilot proposed | Prepped behind flag, not rendered | Creator newsletter distribution. Standalone pilot, not part of the bundle yet. |
Boost next moves
Best near-term read:
- Verify first: confirm what is merged, what is only branch code, what depends on Replit, and what must move to Google Cloud / Cloud Scheduler.
- Then ship / flip: C1 to C4 + D1 to D3 only after deploy, flag, production smoke test, dedup safety, and outcome logging are clean.
- Build next: C5 engagement trigger.
- Instrument next: funding modal events.
- Place next: visible Boost button on job card + applicants page.
5. Newsletter and Intercom signals
Newsletter engagement tagging
This system tags Beehiiv subscribers.
| Trigger | Simple rule | Data used | Main ID | Action | Why it matters |
|---|---|---|---|---|---|
| Engaged | 3+ opens or 1+ click in last 5 editions. | Beehiiv events in local Postgres | Beehiiv tag. Can feed warm sales or upsell flows. | Can identify warm prospects, trials, and paying accounts. | |
| Cold | No opens and no clicks in the same window. | Beehiiv events | Beehiiv tag. Can feed re-engagement. | Cold paying customers may be churn risk. | |
| Lifecycle tag sync | Nightly lifecycle tags to Beehiiv. | local PG + Beehiiv | Tags + Slack summary. | Good pattern for batch syncs. | |
| Subscriber created ping | Beehiiv subscriber webhook. | Beehiiv webhook | Slack + local table. | Proves inbound webhook plumbing already works. |
Important caveat:
- The 6-hour newsletter sync is currently not scheduled.
- Freshness depends on turning it back on.
Intercom 8-signal tagger
The Intercom prompt is paste-ready. It should detect conversation signals and route them without making promises.
| Signal | What it catches | Route | Why it matters |
|---|---|---|---|
| PRICE_OBJECTION | Expensive, cost, budget, cheaper, afford, competitor price. | Matched-offer flow. Human confirms any discount. | Feeds T9-style save logic before cancel. |
| MORE_APPLICANTS | Needs more creators or says the job is quiet. | Boost education and Boost offer. | Manual version of C2/C3 before or outside product surfaces. |
| MULTI_BRAND_OR_TEAM | Teammate, multiple brands, another account, client. | Scale-plan pitch. If client is mentioned, also tag AGENCY_DNA. | Detects agency or team expansion. |
| PAYING_CREATORS | Wallet, top-up, payouts, paying creators. | Wallet or campaign-manager help. If wire or $5K+, tag THIRD_PARTY_MONEY. | Can indicate Discover or Managed need. |
| PLAN_CAP | Limit hit or cannot post another role. | Upgrade-at-cap flow. | Manual version of future plan_cap_hit event. |
| FRUSTRATION_CHURN_RISK | Cancel, not working, waste, strong frustration. | Same-day human churn-save with last 3 message summaries. | Earlier warning than a cancel row. |
| HIRING_STUCK | Applicants but no good hires or cannot decide. | 37%-cliff help. Tag DATA_GOLD_LIVE. | Rescue, not upsell. |
| VIRAL_PROOF | Big views, viral results, screenshots. | Annual or case-study ask only if active. Tag for T6 watch. | Manual version of viral rerun or viral cool-off logic. |
Hard rules:
- No discount promises.
- No billing-state claims.
- Billing truth lives in Stripe.
- If two signals fit, emit both with medium confidence.
- If the user is a creator, tag CREATOR_SIDE and stop. Creator flows are out of scope.
Paste-ready Intercom prompt
Paste this into Intercom AI assistant instructions.
-
The full prompt: expand and copy
You are SideShift's conversation-signal tagger. On every brand-side conversation, detect these signals. When one fires, tag the conversation and emit a signal event with: signal name, email, company name if known, verbatim quote, and confidence. Never promise a discount, plan change, or refund yourself. You only route. SIGNALS AND ROUTES 1. PRICE_OBJECTION Words like expensive, cost, budget, cheaper, afford, or competitor price. Route to matched-offer flow. A human confirms any discount. 2. MORE_APPLICANTS They need more creators or say the job is quiet. Route to Boost education and Boost offer. 3. MULTI_BRAND_OR_TEAM They mention teammate, multiple brands, another account, or client. Route to Scale-plan pitch. If they mention client, also tag AGENCY_DNA. 4. PAYING_CREATORS They ask about wallet, top-up, payouts, or paying creators. Route to wallet or campaign-manager help. If they mention wires or $5K+, tag THIRD_PARTY_MONEY. 5. PLAN_CAP They hit a limit or cannot post another role. Route to upgrade-at-cap flow. 6. FRUSTRATION_CHURN_RISK They say cancel, not working, waste, or show strong frustration. Route to same-day human churn-save. Include the last 3 message summaries. 7. HIRING_STUCK They have applicants but no good hires or cannot decide. Route to 37%-cliff help. Tag DATA_GOLD_LIVE. 8. VIRAL_PROOF They mention big views, viral results, or share screenshots. Route to annual or case-study ask only if active. Tag for T6 watch. If the user is a creator, tag CREATOR_SIDE and stop. Creator flows are out of scope. Hard rules: - No discount promises. - No billing-state claims. - Billing truth lives in Stripe. - If two signals fit, emit both with medium confidence.
6. Customer-facing revenue plays
This section connects triggers to actual customer-facing plays.
Lane 1: FLIP ON this week
These do not need product code.
| Play | Trigger | Surface | Sells / saves | Simple line | Notes |
|---|---|---|---|---|---|
| Dunning ladder | T8 payment_failed, day 0/3/7 | Email + iMessage | Payment recovery | "Your card didn't go through. Fix it in one tap to keep your roles live." | Throttle first. |
| Tier upgrade, usage | Usage upgrade rules + T14 agency fast lane | Email + Intercom | Growth / Scale | "You're hiring faster than Starter's built for. Growth gives you 15 creators a month. Want me to switch you?" | Only for activated, healthy, live-Stripe-confirmed accounts. |
| Boost cadence ceiling | T12, 3+ top-ups in 30 days | Email + Intercom | Plan upgrade | "You've topped up 3 times this month. The next tier includes what you keep buying a la carte. The math favors switching." | Do not use if activation is missing. |
| Annual at win moments | T11 first hire + T13 loop closed | Email + Intercom | Annual, 30% off | "First hire's in. Lock the year and save 30%." | Best after actual success, not after vanity activity. |
| Matched save | T9 at cancel | Email + rep for Scale / fit 7+ | Downgrade, pause, shortlist, roadmap note | Price gets downgrade or 20 to 30% for 2 to 3 months max. Non-usage gets 60-day pause + activation help, not a discount. | Must fail closed if Stripe verification fails. |
| Scale help-or-downsell | T7 Scale, 0 hires in 30d, renewal inside 30d | Rep call first | Help, then downgrade only if help refused | "What's blocking hiring?" | Do not lead with discount. |
| Cohort win-back | T10, 30/60/90 days post confirmed churn | Email + Meta custom audience | Re-entry by archetype | "{n} new creators joined since you left." | Exclude phantom and bad-fit accounts (use the fit classifier from Front-End Marketing Strategy). The live Churned Win-Back email flow is the current T10 surface, and it fires on the churned tag alone today: no live Stripe verification, no phantom guard, no upgrade-not-churn filter. Bring it under the safeguards before scaling. Its proven strongest angle is payment/ops pain: lead win-back and save copy with that, not features. |
| Intercom signals | 8-signal prompt | Chat | Boost, Scale, annual, save, Discover | PLAN_CAP and VIRAL_PROOF give manual versions of later product plays now. | Paste prompt now. |
| Agency custom link | Agency strategy call | Rep follow-up + Stripe payment link | Agency plan / custom terms | "Here is the exact setup we discussed." | No agency strategy call ends without the custom link sent within the hour. |
Lane 2: DEPLOY
These unlock when Drew deploys the lifecycle branch or flips the Boost flag.
| Play | Trigger | Surface | Sells / saves | Simple line | Notes |
|---|---|---|---|---|---|
| Boost pain placement | C1 to C4 | In-app banner + email to D1 SKU modal | Boost SKUs | Copy already mapped by entry point. | Needs production smoke test, dedup, outcome logging. |
| Boost engagement trigger | C5 high applicants or post-hire | In-app banner + prompt | Boost | "It's working. Get even more creators applying." | Build after C1 to C4 are verified. |
| Wallet top-up at win moments | #8 first_hire, #9 first_post, #12 views_milestone | Email now, in-app card later | Top-up + annual pair at #12 | "First hire's in. Fund the next round while this compounds." | Gate on recent activity. |
| Viral rerun | #12 views_milestone | Email + Intercom now, in-app card later | Boost or rerun pack | "Your content crossed 50K combined views. Rerun what's working with 5 more creators." | Do not congratulate cooled-off accounts. |
| Trial close | #13 trial_ending, day 5 to 7 | Paid conversion | "3 hires in already. Lock your team in before the trial ends." | Unactivated trials get activation help, not discount. | |
| Managed / Discover moment | Wallet funded + 2+ open roles + 0 hires in 30d + 14 days since funding | Rep touch | Managed $3K / Discover | "Budget's live but nothing's shipped. Want a vetted operator to run this for you?" | Especially relevant with third-party-money signal. |
Lane 3: BUILD
Priority order for Drew's queue.
| Priority | Play | What to build | Why this order |
|---|---|---|---|
| 1 | Cancel initiated + in-flow save | Event fires when reason picker opens, before confirm. T9 matched save renders inside cancel flow. | Highest-leverage event. Today saves arrive after the cancel is final. |
| 2 | Plan cap hit + upgrade-at-cap modal | Event when user hits listing/invite cap. Modal shows current tier, next tier, one-click upgrade. | Purest upgrade moment. The user is trying to do the thing right now. |
| 3 | Viral rerun in-app card | Dashboard card after #12 views_milestone. | Email version ships first. Card makes it feel like product, not marketing. |
| 4 | Funding top-up abandoned | Event when top-up intent stops before payment. | Money is walking out with no trace. |
| 5 | Data gate | Deep analytics gated behind Scale. | Real money, but riskier than cap and cancel plays. |
| 6 | Post-purchase "run it yourself?" screen | Screen after checkout routing to Managed VSL. | Waits on VSL anyway. |
7. New product-surface plays
Viral rerun
Moment:
- Webhook #12
views_milestonefires at assumed 50K / 100K / 1M thresholds. - The bands are AGGREGATED views across posts, not one post's total (corrected Jul 5). Until per-creative data exists (the X2 bridge), no copy may claim a specific video crossed the line.
Plain-English insight:
- When a video pops, the customer should not just celebrate.
- They should run the same format with more creators while the proof is fresh.
Message structure:
- Proof: "Your content just crossed 50K combined views."
- Reframe: "That's not a fluke. It's a format."
- Ask: "Rerun it with 5 more creators this week."
Packaging options:
| Option | What it is | Build cost | Recommendation |
|---|---|---|---|
| A. Boost it | Route to existing D1 SKU modal with new winning_format entry point. | Low. No new billing. | Ship now. |
| B. Rerun pack | Cheap recurring add-on, roughly $200/mo: same brief, 5 more creators monthly. | Higher. New SKU eventually. | Test with Stripe payment link first. Productize only if it pulls. |
Guardrails:
- Gate on
days_since_activity <= 14. - At 100K / 1M, pair annual ask.
- Do not congratulate cooled-off accounts. That is a T6 save problem.
In-app card copy:
- Headline: Your content crossed 50K combined views
- Body: Same format, more creators, more of this. Your brief and your creators are already here.
- CTA: Rerun the winning format
- Dismiss: Not now
Data gate
Idea:
- Show basic analytics to Growth.
- Gate deep analytics behind Scale.
What Scale unlocks:
- Per-creator performance.
- Views per post.
- CPM by format.
- Winning-format breakdowns.
Caveat:
- Acquisition positioning should not lead with analytics because it makes SideShift feel like a cheap tool.
- In-product gating is different because the user already has value and wants deeper visibility.
Rules:
- Gate deep cuts, not basics.
- Growth users must still see whether the campaign worked.
- Do not say "5x the data" unless the gated feature set truly supports that claim.
- Safer line: "see the full picture."
Gate copy:
- Headline: You're seeing the surface
- Body: Scale unlocks per-creator performance, CPM by format, and which hooks are actually driving your views.
- CTA: Unlock the full picture
Status:
- BUILD, priority 5.
Plan-cap moment
Moment:
- User tries to do something the current plan does not allow.
- Example: user tries to post role #3 on a 2-role plan.
Why it matters:
- This is the cleanest upgrade second in the product.
- The customer is not debating value. They are trying to do the thing right now.
Build needed:
plan_cap_hitevent.- Upgrade-at-cap modal.
- One-click move to tier that allows the blocked action.
Interim catch:
- Intercom signal PLAN_CAP catches users who complain about hitting a limit in chat.
8. Agency upsell map
Agency-DNA accounts are high-value because they can run multiple programs, use third-party budget, and concentrate spend. One nuance from calibration: agencies retain far better than brands, but the raw businessType=Agency flag over-scores in fit models. Treat agency DNA as a retention segment and a routing signal, not an automatic quality score.
They can be detected through:
users.isAgency,- agency keywords,
- Intercom
MULTI_BRAND_OR_TEAM, - third-party-money patterns: bank transfer rails, $1,500+ reloads, round-number reloads, repeated reloads.
| Play | Trigger | Lane | Sells / saves | Simple line | Notes |
|---|---|---|---|---|---|
| ICP-1 fast lane | T14 agency DNA + activated within 14 days | FLIP ON | Growth | "Agencies run multiple programs here. Growth is where that starts making sense." | Needs activation and live Stripe check. |
| Chat: multi-brand tell | Intercom signal MULTI_BRAND_OR_TEAM | FLIP ON | Scale + AGENCY_DNA tag | "Client" is the tell. | Useful before a formal product event exists. |
| Per-client to flat crossover | Client/subaccount count reaches 6 | BUILD | Flat $999 | "You're at 6 clients. At 7, per-client costs more than flat." | Needs client-count source confirmed. |
| Flat to per-client save | Flat-rate agency down to 1 to 2 active clients at renewal | BUILD | Per-client downsell | "Flat rate stopped making sense. Per-client cuts your bill until you're back at scale." | Downsell saves the relationship. |
| Third-party money to Discover | Wallet/webhook signal | DEPLOY | Discover / campaign help | "Looks like you're running this for a client. Want vetted execution help on it?" | Best when wallet is funded but campaigns are stuck. |
| Agency enterprise | Flat-rate agency at 10+ client programs | Rep motion | Custom agency terms | Anchor with Tim Vu / VO Creations-style use case. | Human-led motion. |
Agency custom-link SOP
Plain-English idea:
- Agencies do not want to self-serve a generic pricing page after a strategy call.
- They want the call's conclusion made clickable.
Mechanic now:
- Use Stripe payment links or existing per-client plan payment links.
- After every agency strategy call, send one custom checkout link with:
- their client count,
- their rate,
- monthly or annual choice,
- name at the top,
- the exact configuration discussed.
Why it converts:
- Removes re-decision.
- Avoids forcing them back to public pricing.
- Allows call-only terms without showing a public discount.
Rep SOP:
No agency strategy call ends without the custom link sent within the hour. Speed is the offer.
Later build:
/for/{agency-name}page with their numbers, projected hours saved, and relevant proof.- Build after plain links prove the motion.
9. CRO Compass and batch scoring
CRO Compass funnel health
This is not per customer. It is an overall funnel dashboard.
| Metric | Red below | Yellow at | Green at |
|---|---|---|---|
| Visitor to signup | 1.0% | 2.0% | 5.0% |
| Signup to trial | 5.0% | 12.0% | 25.0% |
| Trial to paid | 15.0% | 30.0% | 50.0% |
| Signup to activation | 20.0% | 40.0% | 65.0% |
Why this matters:
- It can show which funnel stage is weak.
- It is not enough for account-level outreach.
- It could still alert the team when a funnel stage turns red.
Sources:
- Clarity: manual weekly paste.
- PostHog: live read-only query.
- Prod DB.
Batch fit scoring
These are not live triggers, but the scores can help rank who matters most.
Revenue Champion score:
- Revenue paid: 60 points.
- Tenure: 20 points.
- Plan tier: 20 points.
Product-Fit score:
- 16+ hires: 30 points.
- Hire-to-DM ratio 0.7+: 20 points.
- Revenue $5,000+: 15 points.
- Business type Consumer App: 15 points.
ICP fit:
- ICP 1: agency-DNA or agency keywords.
- ICP 2: creator-at-scale or D2C.
Why this matters:
- Broad lists need ranking.
- Reps should start with the best accounts.
- Scores are useful only if the data behind them is fresh enough.
10. Safeguards around every trigger and play
These safety checks keep the system from spamming people or sending wrong messages.
| Safeguard | Simple logic | Applies to | Why it matters |
|---|---|---|---|
| Live Stripe pre-send verification | Check live Stripe before any churn, billing, upgrade, or win-back message. | All billing-sensitive plays | SQL alone is not send-safe. |
| Phantom-plan guard | If cancel row claims a paid tier but no matching subscription exists, suppress paid-customer outreach. | Cancel and win-back | Prevents emailing trial bouncers like paid customers. |
| Upgrade-not-churn filter | If a new subscription appears within 30 minutes of cancel, skip churn messaging. | Cancel and win-back | Stops "sorry to see you go" messages to people who upgraded. |
| Dedup / idempotency | Keep a record of what already posted or sent. | All triggers | Stops double sends. |
| Quiet hours | Post only 9am to 8pm ET, Monday to Friday for human-action triggers. | Slack, rep, human-touch flows | Keeps rep workflows sane. |
| Dead-man's switch | Alert if no fresh churn or trigger run happens within the expected window. | Scheduled jobs | Makes broken pipelines visible. |
| Outcome logging | Log send, skip, surface, trigger, account, and outcome. | All plays | Shows whether the system worked. |
| Never upsell the stuck | If account has spend intent but no activation, route to help, not pitch. | Activation gap, 37% cliff, Managed / Discover | Protects trust and improves conversion quality. |
| Weekly noise gate | Total sends across ALL triggers must not exceed ~207/wk (10% of the ~2,071 live sub base). X-series steady-state adds ~10β28/wk. First-run X1 backlog (up to 271 brands) must be throttled/dedup-seeded β never a single flush. | All triggers combined | Prevents burning the list before outcomes are measured. |
Fail rules:
- Fail closed for suppression checks: live Stripe verification, phantom guard, upgrade-not-churn.
- Fail open for enrichment: send with unavailable context only when the suppression checks passed.
subscription_cancelledmust fail closed because verification is mandatory.
11. What does not wait on Drew
Start now:
- Paste the Intercom signal prompt.
- X4 volume-tier / cheap-CPM (shippable now, no new data needed): all inputs live (program_stats + Stripe). Reuse the trigger_rules scan + CPM math in
build_enrichment_fields. Target: β₯500k cumulative views + CPM β€$2 + sub-Scale monthly plan. Steady-state queue ~2β5/wk. - Shash mints GHL catch hooks and fills
TRIGGER_HOOKsecrets in this order:- T8 throttled dunning.
- T11 / T13 annual.
- Usage upgrades.
- T12 Boost cadence.
- T9 matched saves.
- T10 win-back.
- Write GHL sends for each.
- Launch agency custom-link SOP on the next strategy call.
- Confirm every play has:
- trigger,
- audience,
- suppression rules,
- message,
- surface,
- owner,
- outcome metric.
12. Drew's queue
- Deploy
feat/lifecycle-loop-webhooks. - Flip Boost flag for C1 to C6 + D1.
- Build net-new events:
cancel_initiated,plan_cap_hit,funding_topup_abandoned.
- Build Lane 3 surfaces in priority order:
- cancel save,
- cap modal,
- viral rerun card,
- top-up abandoned recovery,
- data gate,
- post-purchase Managed screen.
- Move durable scheduling, dedup, and outcome tables away from transitional Replit dependencies where needed.
- X1 views-milestone backlog sweep: fire the lifetime-band version once (throttled, dedup-seeded same way as backfill_churn_dedup.py), then flip to the
views_milestonePostHog event (X-G1) when it ships. Do NOT flush all 271 brands at once. - X3 ads-flow nudge (proxy version): wallet + boost data are live; winner gate is brand-level proxy until X-G1 lands. Shippable now at lower confidence.
13. Measurement rule
Every play must log:
- send,
- skip,
- surface,
- trigger,
- account,
- outcome.
The Boost trigger property is the join key for Boost plays.
The ranked churn-driver input (recoverable vs true churn, wrong-fit vs right-fit) comes from the Churn Analysis Data Pack β top-spender churn diagnosis + LLM prompt. Run its sequenced pull and prompt before re-prioritizing the build queue.
Rule:
No play ships without its before/after number defined. Otherwise it is development, not CRO.
Suggested outcome examples:
- Dunning: payment recovered.
- Matched save: active subscription after 30 days.
- Annual: annual conversion.
- Usage upgrade: plan upgrade.
- Boost pain: Boost purchase.
- Activation gap: first job + first applicant.
- 37% cliff: first hire.
- Viral rerun: Boost purchase, rerun purchase, or next campaign created.
- Agency custom link: payment link clicked and paid.
- Win-back: reactivated subscription.
14. Workshop lens
Score every trigger idea on six questions:
- Is the data live today?
- Is it one event or a batch list?
- Is the identity key clean?
- Who acts: rep, automation, product, or customer?
- What surface carries the action?
- What outcome proves it worked?
Best near-term candidates:
- T8 dunning ladder.
- T11 / T13 annual at win moments.
- Usage upgrade.
- T12 Boost cadence.
- T9 matched save with live Stripe check.
- T10 confirmed-churn win-back.
- T3 Live 37% cliff.
- T15 activation gap.
- Intercom signal tagging.
- Agency custom-link SOP.
Do not build a trigger if nobody knows what action should happen after it fires.
How to use this doc
This page is the plain-English operating map for churn, upsell, Boost, billing, agency, and in-app revenue triggers.
Use it to answer:
- What does the system already watch?
- Which data can be trusted?
- Which plays can turn on now?
- Which plays need Drew to deploy existing work?
- Which plays require net-new product work?
- Which triggers should route to rescue instead of upsell?
- Which open questions block action?
This page is organized triggers first, reference last:
- Executive read: the why.
- Customer journey map and journey by plan: where every trigger fires, what each plan's path looks like, plus current build status.
- Action lanes and build-status ledger: what turns on now, what waits on a deploy, what needs building.
- Trigger families: Churn Intel, pre-cancel prevention, upgrade predictor, Boost, newsletter and Intercom signals.
- Customer-facing plays, product-surface plays, and the agency map.
- CRO Compass, safeguards, immediate actions, Drew's queue, measurement, workshop lens.
- Reference: this section, big rules, whale / CPM evidence, open decisions. The backend plumbing (data freshness, identity keys, Zapier migration, webhook spec, trigger SOP) lives in the technical reference sub-page.
This page absorbed the former SideShift In-App Upsell System and Revenue Trigger & Webhook Enrichment Spec pages. Both are archived. Related pages that stay separate:
- Revenue Context Memory β SideShift North Star: source-of-truth context for any data claim, metric, ICP claim, billing truth, or source conflict.
- SideShift Revenue System: Team Brief: decision layer for alignment, ownership, decision history, and the current operating plan.
- Threshold Calibration: Task #70 Results (July 3): data calibration layer for which thresholds are valid, which changed, and which ideas are dead.
- Front-End Marketing Strategy: acquisition-side fit thesis. Most churned revenue comes from wrong-fit accounts, so save and win-back plays must exclude wrong-fit before spending effort on them.
- Churn Analysis Data Pack β top-spender churn diagnosis + LLM prompt: the sequenced data pull and prompt that produce the ranked churn-driver input this system's measurement layer still lacks.
- Churned Win-Back: the live win-back email flow. It is the de facto T10 surface today and must run under this page's safeguards.
- Zap Inventory β SideShift Automation: per-Zap inventory plus the Zapier issues spec (what is broken and why).
- π¬ Upsell & Expansion Messaging β the Mouth: the message layer. This page detects the moment; that page is the copy that converts it.
- SideShift Money Model: the offer layer. The tier ladder, the new Managed $3K tier, and the trigger-to-offer map every play routes into.
Big rules to remember
- The
subscriptionstable in prod is old. It stopped updating on Feb 5, 2026. Do not use it to decide if someone is still paying today. - Live Stripe is the billing source of truth.
- Prod tables like
users,jobs,applicants,contractsv2,cancellations,contract_posts,program_stats, andprogramsare live. onboarding_survey_datawent dark May 24 to Jul 3, 2026 (pinned Jul 6 by Task #91's prod pull). Month-by-month coverage: Jan 57%, Feb 80%, Mar 87%, Apr 89%, May 20%, Jun 0.1%, Jul 7%. There is no backfill β the Firestore mirror is empty for the window. Survey-based segmentation is trustworthy for Feb-Apr 2026 cohorts only.- A cancel row does not always mean the customer is gone. Some people cancel because they upgraded or changed plans.
- Any customer message must be checked against live Stripe before it sends.
- Never upsell the stuck. If the account has spend intent but no activation, route to rescue, onboarding, shortlist, concierge, Managed, or Discover help.
- Frozen or stale data can support prioritization. It cannot be the only basis for a live billing or churn message.
- The churn decision happens inside the first billing cycle. Saves and rescues must land before day 31. Win-back is the fallback, not the plan. Calibration evidence lives in Threshold Calibration: Task #70 Results (July 3).
- Applicant supply is never the leak. First applicants arrive almost immediately, so never alert on missing applicants. Alert on engagement silence instead: no DMs, no interviews, wallet still at seed.
- Exclude wrong-fit accounts before any save or win-back spend. Most churned revenue is wrong-fit (see Front-End Marketing Strategy). Saving wrong-fit just reschedules the same churn.
- A cancelled Stripe subscription is not account death. A brand can have zero active Stripe sub and still be doing significant GVM through Whop wallet. Before any churn, win-back, or silence trigger fires, check whether the account has recent job or hire activity as a proxy. T1 (momentum collapse), T4 (renewal silence), and T10 (win-back) can all misfire on an account that churned SaaS but is still actively spending GVM. Until the DBβWhop bridge (G18) exists, the proxy check is: recent rows in
contractsv2or movement inprogram_stats. Treat GVM track and SaaS track as two independent signals β never collapse them. program_stats.total_spendis a lifetime cumulative total, not a windowed number. T12 (Boost cadence ceiling) and the Boost upgrade trigger both reason from wallet/Boost spend. Do not usetotal_spendto infer spend in the last 30 or 60 days β it contains all spend since account creation with no date dimension, so dormant accounts that spent heavily at launch will falsely qualify. Windowed Boost spend requires the Whop connector. Until that exists, use Stripe "Wallet Top Up" one-time charges as the proxy, knowing they reflect top-ups (not Boost drawdowns). A trial account doing heavy Boost spend before converting is also a high-intent signal with no trigger watching it today.- The wallet funding gate is era-dependent. Era A (~early June): $500 forced before the first DM. Era B (mid/late June onward): gate after the first hire. Era C (dev build): post-activation funding modal. Any signal reading wallet balance, seed state, or top-up cadence must split analysis windows at the two change dates (Drew is pulling exact dates) and never mix eras in one calibration. See the flow-spec lineage section above and Wallet Top Up.
onboarding_survey_datafields (businessType, userRole, ugcExperience) are missing for the May 24 - Jul 3, 2026 outage window, with no backfill possible. Churn Intel groups 3 (Successor) and 6 (Agency) rely on these survey fields for routing, so accounts created in that window are permanently unclassifiable via survey and need behavioral or Intercom-signal routing instead. Post-Jul 3 accounts: verify the pipe recovered before trusting the fields.
Technical reference
This page stays strategy: triggers, plays, journeys, safeguards. The backend plumbing moved to one sub-page: Technical Reference: Data, Identity, Zapier & Webhook Spec. It holds:
- Data freshness and the source-of-truth table.
- Identity keys and join rules.
- Zapier today and the migration map.
- The enriched webhook spec: field dictionary, field-to-event matrix, journey gap map, engine build rules.
- The trigger creation SOP.
Decision history and ownership stay in SideShift Revenue System: Team Brief. One level of nesting only: sub-pages of sub-pages hide content.
Whale / CPM evidence and wallet timing
Live-data analysis from July 2, 2026.
Headline findings
- 307 companies have paid creators. Total realized GMV is about $2.06M.
- Agencies and brands have similar total GMV but very different churn: agencies are 110 accounts, $1.05M payout, 6% ever-cancelled; brands are 197 accounts, $1.02M payout, 61% ever-cancelled.
- Median CPM is $2.00 per 1,000 views among companies with 10K+ views.
- Lower CPM is tied to better retention, but agencies may be driving part of that.
Viral cancel pattern
- 35 accounts crossed 1M+ views and also have a cancel row. Many cancel reasons say "Not using it enough" despite huge views and many hires.
- The customer may stop logging in while the content keeps working. The save message should show the value that kept compounding.
- T6 should watch posting cadence, not just login activity.
Live Stripe check finding
- Among the top 20 cancelled-payout accounts, 10 of 20 are still active in live Stripe.
- A cancel row is not current truth. Win-back must use live-Stripe-confirmed churn.
Low CPM vs high CPM save logic
- Low-CPM churner: product likely worked. Show value proof and fix friction. Do not lead with a discount.
- High-CPM churner: economics may not have worked. Discount or downgrade can be honest.
Wallet top-up timing
Top-up prompts should happen near a clear win:
- First hire: the product just worked.
- First content in: they can see output.
- Views milestone: pair the top-up with an annual or case-study ask.
Do not prompt on view spikes alone. Views can keep rising after the account cools off. Gate win prompts on days_since_activity <= 14.
Discover hire-help escalation
Trigger idea: wallet funded, 2+ open roles, 0 hires in 30 days, and 14+ days since funding. Money is committed, hiring is stuck, and the account may need execution help, not more software prompts.
Escalate to a rep when:
- plan rank is Growth or higher,
- applicants are piling up with no hires,
- the third-party-money signal appears,
- the account acts like an operator but is not marked as agency.
Action: route to manual Discover matchmaking. Log offers and outcomes.
Open decisions
- Viral rerun packaging: confirm Boost entry point now, $200/mo pack as payment-link test.
- Data gate feature list: confirm exactly what is gated before any "5x" style claim.
- Agency client-count source: confirm where subaccount/client count lives in prod.
- Views milestone thresholds: bands read AGGREGATED views across posts, not a single post's total (corrected Jul 5). Confirm the band values (50K / 100K / 1M) and whether the counter is lifetime cumulative or windowed.
- Managed rep capacity: decide who handles Discover moments once wallet webhooks deploy.
- Newsletter sync: decide whether Beehiiv engagement/cold tags are reliable enough to route T2.
- Replit to Cloud migration: identify which trigger jobs depend on transitional Replit state.
- C5 threshold: define high-applicant threshold X for the Boost engagement trigger.
- Funding modal events: confirm whether
funding_modal_shown,funding_method_added,funding_topup_completed, andfunding_topup_abandonedshould all be implemented or only the abandonment event first. - Intercom ownership: decide who owns prompt paste, QA, and routing maintenance.
- Hub organization: decide whether the Revenue Triggers hub is organized as Read first / Build specs / Data calibration / Customer-facing plays, or by churn / upsell / billing / agency.
- Intercom's role: decide whether Intercom is a temporary surface only or a permanent routing layer alongside GHL.
- Agency custom-link SOP owner: decide whether Nikolai, Shash, or the rep running strategy calls owns it.
- X-G1 β views_milestone server event: confirm this is in posthog_instrumentation_handoff.md Phase 5 and scoped in the next dev sprint. This single event converts X1 from a one-time backlog into a live weekly trigger and sharpens X3's winner gate.
- X2 (winning-format packaging): blocked on per-creative performance data. Sequenced behind the DBβWhop bridge (same pipe as existing G10/G18). Do not scope until that bridge exists.
- Wallet gate placement (Era B vs Era C modal): decide from the natural experiment in Wallet Top Up (Era A vs Era B on DM rate, interview rate, hire rate, funding completion, time-to-first-hire, plus blended take rate and wallet utilization). Preclose holds placement authority. Era C must ship with funding-modal view and abandon events.
- SideShift AI plug-in timing: if the 2-node AI ships (signup URL field + pre-filled first campaign draft), re-spec wizard-dependent triggers (T5/T15 clocks, tour stages, Fix 2 schema inputs) before flipping anything new.
Technical Reference: Data, Identity, Zapier & Webhook Spec
π Repeat-Hire Loop β proposed triggers + rehire mechanics (from Jul 7 2026 churn dissection)
Why this section exists. The dissection of the top 40 churned spenders found the churn mechanism is not activation and not price. It is the repeat-hire loop never forming. Thriving whales run 56 repeat creators and 7% contract expiry. Churners who left averaged 2.4 repeat creators and 55% expired contracts, and they stopped posting new jobs 1 to 8 months before they canceled. The cancel is a lagging indicator. The real churn moment is when they don't post job #2. The existing engine watches activation (T5, T15) and confirmed churn (T10) but has a blind spot in the middle: the post-first-hire retention loop. These triggers fill it.
Proposed new triggers
| ID | Signal (what fires it) | Truth check | Action path | Measures |
|---|---|---|---|---|
| T18 Contract-expiry rescue | A signed/active contract is within 5 days of expiring without a completed deliverable, OR just expired. (55% of churner contracts died this way.) | contractsv2 status=active/expired, no submission; wallet funded | In-app banner + email to brand: "your contract with @creator expires in 5 days, extend or swap" + one-click extend | contract completion rate, expiry rate down |
| T19 No-second-hire (wind-down predictor) | Brand made a first hire but has no 2nd hire 30 days later, or a 2nd campaign not started 30d after first hire ends. This is the single most predictive wind-down signal. | firstHire set, hireCount=1, sub active | Lifecycle email + rep task: resurface top applicants from last job, "ready to run round 2?" | % reaching 2nd hire, 90-day retention |
| T20 Posting-cadence decay | Brand posted jobs regularly then went >45 days with no new job post while still subscribed. (Churners went silent 181-385d before cancel.) | last job createdAt vs now, sub active | Rep/GHL nudge + in-app "start from your last campaign" prompt | reactivated posting, cancels avoided |
| T21 Winner-creator resurfacing | A past creator drove above-median views/deliverables and is available. | contract completed, views data | In-app card: "@creator performed well for you, re-book in 1 click" | rehire rate, GMV per brand |
How to make rehiring dead simple (product, not just triggers)
The reason rehiring doesn't happen is friction: every campaign is a cold re-source. Fixes, cheapest first:
- One-click re-book from a brand's past roster (name, handle, past deliverable). No re-posting, no re-vetting.
- Saved / favorite roster β a persistent "my creators" list so the roster survives between campaigns.
- Auto-renew or extend contracts before they expire (kills the 55% expiry leak) instead of letting them silently lapse.
- "Repeat last campaign" button β clone the prior job + auto-invite the creators who performed.
- Top-performer digest β monthly "here are the 3 creators who drove your best results, they're available" email. Turns a cold decision into a warm yes.
- Countersign reminder β many contracts expire unsigned; a 48h nudge to countersign recovers them.
The north-star metric this whole section should move: repeat-creator rate (target: pull churn-risk cohort from ~2 toward the whale benchmark of ~50+).
Win-back targets: who they are + how to reach them
34 of the 40 churned are reachable by direct LinkedIn/email (corporate domains, named founders). Only 6 need ads/retargeting. You do not need paid media to win these back. Top 13 win-back picks (paid real money to creators, know the value, directly reachable):
-
The 13 accounts with emails and GMV: expand when running outreach
Company Founder email GMV paid to creators Niche Canceled Quittr / SuperHealth connor@superhealth.xyz $18,758 Health 2026-03-02 Flower Computer sam@flowercomputer.com $17,166 Entertainment 2026-02-01 Magnum Studio benoit@magnumstudio.ai $14,744 Social 2026-02-04 Digitally Imported matei.banfi@di.fm $14,510 Music/media 2026-02-25 Cerca Dating william@cercadating.com $12,560 Dating 2026-03-02 Teleprompter.com mate@teleprompter.com $11,821 Creator tools 2026-01-09 Neon alex@neonmobile.com $10,166 Social 2026-04-26 Perch mike@perch.app $6,406 Education 2026-02-10 The Beam beamgroupllc@thebeam.com $5,745 Transport 2026-06-16 ShareWell hello@sharewellnow.com $4,970 Health 2026-04-16 Golden Egg Media zac@goldenegg.media $4,605 Agency 2025-12-23 peau.ai (Muno) tim@muno.ai $4,563 Health 2026-02-19 TwinTone AI james@twintone.ai $4,340 Entertainment 2026-02-07
Best-fit ICP (who to attract more of): seed / pre-seed consumer app founders (AI, health, dating, education, social) that need UGC at volume and run creators in-house, not through an agency. That is the shape of every whale and every high-GMV win-back target. They live on LinkedIn/X and answer founder-to-founder email. Ads are only needed for the ~15% on generic/masked emails.
Other insights worth grabbing
- Stop wasting win-back budget on 15 accounts. 15 of the 40 "churned" are still active or used the product within 3 weeks ($366K of LTV). Suppress them from win-back sends (they are plan-switchers, not churned). Ties directly to the safeguards section: verify live Stripe + last-active before any churn send.
- GMV, not subscription revenue, predicts a whale. Olive collected $168K via Stripe but paid $563K to creators. Score accounts by GMV-to-creators, not MRR.
- Payment status "disabled" is everywhere (35-79% of contracts across churn cohorts). Worth a data/product look: are contracts being disabled by a system rule that blocks payout and kills the loop?
- companyNiche is now garbage for new signups (survey-flow change; many show "Remote" or blank). Enrich niche from email domain + web instead of relying on the field.
π§ Why they wound down: full root-cause framework (Jul 7 2026)
"Contract expired + no rehire" is the mechanism. The real question is what upstream cause produced it. It is not one thing. Sort every churned brand into three buckets, because only one of them is winnable-back and only one is our fault:
Bucket A β SideShift didn't turn the loop (our fault, fixable): weak creator matching, contracts expiring unpaid (payment "disabled" on 35-79%), no rehire nudge, no results dashboard so the brand can't see it worked. β build the T18-T21 loop + attribution.
Bucket B β the brand's own business failed (not our fault, not winnable): no PMF, ran out of runway, pivoted, or shut down. A large share of seed/pre-seed consumer AI apps in 2025-2026 die within 6-12 months. If the company is dead, the SideShift churn was never about SideShift. The Outbound Hub already asserts 84% of churn = first-timers/pre-PMF; this bucket is why.
Bucket C β founder moved on (excitement decayed, partly winnable): ran one UGC experiment because it was hot, got distracted, chased the next channel. The "one-and-done" cohort (0 repeat, 0 expiry: Perch, di.fm, peau) fits this.
Per-factor read
- Results (highest weight, mostly unverified): did the videos actually get views and drive installs? If a brand paid $12k and the content flopped, they rationally quit. Splits into reach results we CAN measure (views, in
video-views) and business results only the brand knows (installs/revenue). Low views = matching problem we own. High views but no conversions = their funnel. - CPM / cost efficiency (computable): SideShift campaigns literally run CPM pay structures (
$1/1k views capped at 500k viewsseen in campaign names). Effective CPM = $ paid / (views/1000). If that came out worse than Meta/TikTok ads (~$5-15), the brand leaves on math. We can compute this once we join payouts to views. - Their funnel (high weight, invisible to us): UGC drives attention; a weak landing page / app-store listing / onboarding wastes it. Seed startups with rough funnels get views, no installs, blame the channel.
- Their product / PMF (high weight, the "it's them not us" factor): if the company died or pivoted, churn is 100% not ours and not winnable. Must be verified per brand (web/status check).
- Excitement / founder attention (medium): shiny-object founders run one campaign, move on. Fixable with the right habit-forming trigger + CS touch.
- Market timing (macro): flood of AI consumer apps with short lifespans; UGC was peak-hype so brands piled in without the ops; and SideShift's own product was less mature (more payment friction, fewer rehire features) when this cohort signed, so some of this churn is already-fixed product debt.
- Attribution blindness (sneaky, big, fixable): early-stage brands often can't measure whether UGC drove installs, so even when it worked they couldn't see it and killed it. Giving brands a results dashboard may be the single highest-leverage retention fix.
What we need to allocate churn across the buckets (the "more data first")
- Content results per brand (views delivered, approval/deliverable rate, effective CPM) β tells us if we delivered reach. β Replit/Postgres pull below.
- Brand-still-alive status (operating, funded, last active) β tells us how much churn is customer death vs our failure. β web/status check, can run separately.
Replit / Postgres data-pull prompt (copy-paste)
See the code block delivered in Slack (Jul 7). Goal: per-brand export with identity, loop metrics, RESULTS (views, approvals, effective CPM, any install/UTM data), and brand-health signals, flagging "high views but churned" (their funnel) vs "low views" (our matching).
β Brand-alive check + 3-bucket sort of all 40 churned (Jul 7 2026)
Ran a live web/status check on all 40 top-spender "churned" brands and merged it with their in-product behavior (jobs, signed contracts, GMV paid to creators, last-active). Headline: 39 of 40 are still alive and operating. Only Perch's site is fully down. That kills the "their business died" story for the high-spender cohort. The 84%-pre-PMF churn thesis holds for the long tail, but the top spenders didn't die. They wound down while alive, which means this money is fixable and winnable, not dead weight.
Two distinct failure modes fall out, and they need different fixes:
Bucket A β Activated then wound down, company still alive (14) = WIN-BACK GOLD
Paid real money to creators, got value, then the loop didn't turn. These validate the T18-T21 rehire triggers. Fix = win them back + build the rehire loop.
| Company | GMV to creators | Signed | Last active | |
|---|---|---|---|---|
| Quittr | $18,758 | 17 | 108d | connor@superhealth.xyz |
| Flower Computer | $17,167 | 41 | 122d | sam@flowercomputer.com |
| Digitally Imported | $14,510 | 20 | 123d | matei.banfi@di.fm |
| Cerca Dating | $12,560 | 24 | 108d | william@cercadating.com |
| Teleprompter | $11,822 | 54 | 172d | mate@teleprompter.com |
| Neon | $10,167 | 5 | 52d | alex@neonmobile.com |
| Momo AI | $9,021 | 5 | 43d | copabesart@gmail.com |
| The Beam | $5,745 | 3 | 54d | beamgroupllc@thebeam.com |
| ShareWell | $4,970 | 35 | 73d | hello@sharewellnow.com |
| Golden Egg Media | $4,605 | 23 | 166d | zac@goldenegg.media |
| peau.ai | $4,564 | 4 | 137d | tim@muno.ai |
| TwinTone AI | $4,340 | 24 | 152d | james@twintone.ai |
| Open Planner | $1,899 | 6 | 122d | info@vizi-lab.com |
| Loyalty Test | $1,226 | 3 | 24d | briannam@loyalty-test.com |
+ Magnum Studio (data anomaly, treat as win-back): shows $14,745 paid to creators but 0 signed contracts / 0 jobs. Contradictory. GMV likely flowed through wallet/direct campaign not logged as a signed contract. Alive (spytok.com). Flag for the Replit pull to explain. benoit@magnumstudio.ai.
Bucket C β Never activated, mostly still alive (10) = ACTIVATION problem, not rehire
Pulled applicants but signed ~0 and paid ~$0. They hit friction BEFORE getting value. Different fix: first-hire onboarding + remove payment-disabled friction (T5/T15), not the rehire loop. Lower win-back priority (never saw value, harder sell). shoppin, Ditto, Yorby AI, Digital Goldmine ($0); Speak4Me ($25); Recify ($550); Flite ($600); Pepper ($900); Vipul/youe ($1,312). Most are alive.
Bucket B β Company likely gone (1)
Perch (mike@perch.app): root site + App Store both 404. Site down. Skip.
NOT actually churned (15) β SUPPRESS from all win-back
Still active or used the product within ~3 weeks. Current customers misread as churn (plan switches / wallet spenders): Knowt, SakuraSpeak, Relief, Gamma, Cincy Labs, IVY APPS, starryai, Artec App, PixelBrew, kscale (note: SideShift-active 2d ago but website expired, ambiguous), iconAI, BinBuddy, Samyang America, GuideLinked, Mindflow AI.
Strategic takeaways
- Your best churned accounts didn't die. Churn here is a loop problem (A) or an activation problem (C), both fixable, not "the market killed them."
- Split the fix: A = rehire loop (T18-T21) + win-back outreach; C = first-hire activation + payment friction.
- Clean win-back list = the 14 Bucket A + Magnum = 15 alive brands that paid real money. Suppress the 15 not-churned. Skip Perch.
- Magnum's $14.7k-with-0-contracts anomaly is exactly what the Replit pull should explain.
π° Money Model deltas (Jul 7 2026)
The SideShift Money Model (built from the Jul 7 call with Drew) is now the offer layer this inventory routes into. Detection stays here. The offer each trigger fires lives there. What changes on this page:
- New top rung: Managed, $3,000/mo, sales-call only. Publicly absorbed by Enterprise, never a fourth pricing card. Every "Scale-to-Premium conversation" reference on this page now resolves to a Managed conversation. It attacks non-usage churn (35% of paid churn, the #1 top-spender exit reason) by driving effort to near zero, so it is a churn play, not just an upsell.
- New trigger to spec: Scale velocity. 6+ jobs or 8+ hires in 30 days on Scale routes to a Managed call. Same env-tunable pattern as the usage upgrades. Post-activation phase, live-Stripe gated, quiet hours apply.
- T15 activation gap gains a second touch. Touch 1 stays rescue (concierge onboarding). Touch 2, 7 days later if still stuck: "want someone to just run this for you?" Never-upsell-the-stuck holds; Managed fires only after rescue was offered, framed as help.
- T3 37% cliff play upgraded. Curated 3-creator shortlist plus one soft Managed line: "if picking is the bottleneck, a campaign manager does this part for you."
- Downsell rule ratified: the save must match the reason. Price gets downgrade or a time-boxed discount (unchanged). Non-usage gets a 30 to 60 day pause, never a discount. The pause is now the named non-usage save offer.
- Intercom confirmed as a customer-facing destination. Week 1 move: point the three already-built triggers (both usage upgrades and downgrade-price) at Intercom/GHL as a second destination alongside Slack. Safeguards unchanged: live Stripe pre-send, dedup, quiet hours.
- Two new surfaces: the weekly webinar (all paid tiers, every session ends with one ask) and the Scale-only Slack community. The webinar doubles as the standing Managed pitch stage.
- Annual asks unchanged. First hire (T11) and loop closed (T13) stay the two calibrated annual moments, one ask each. The Money Model confirms this page's spec.
- Pricing conflict to pin before any copy ships. This page's plan headers say Starter $299 / Growth $499. The Money Model and the v6 annual math ($139/$209/$699) imply $199/$299/$999. One set is stale. Pin the ladder and refresh T11/T13/T12 copy inputs before webhooks flip on.