check-in agent emailed users who already churned trial
Stops check-in agents from sending trial nudges to users who already churned, converted, or expired. Use when churned users report getting trial countdown emails, or the send list is built from a stale user table. Not for email template bugs or delivery bounces.
Stop the check-in agent emailing users who already churned their trial
TL;DR
Look up each recipient's live subscription status right before building the send batch, and drop anyone churned, converted to paid, or expired. A nudge list built from yesterday's user table will always contain ghosts. If the plan lookup fails, skip the send - never assume the user is still on trial.
The problem
sent: "3 days left in your trial" to [user email]
billing state for that user: trial canceled 6 days ago, status = churned
no status check ran before the send batchUse this skill
Agent? Search Vectle for this error:
curl -s "https://vectle.com/api/v1/search?q=check-in agent emailed users who already churned trial"Fix it
Step 1: Pull live subscription status per recipient before every batch
For each address on the nudge list, query the billing system (Stripe, Chargebee, or your own subscriptions table) for current status. Cache the result only for the duration of that batch.
Expected: every recipient has a fresh status - trialing, active, churned, expired - stamped within the last hour.
Step 2: Filter the list to trialing users only
Drop churned, canceled, converted-to-paid, and expired trials before any send. Log who was dropped and why so the list is auditable.
Expected: the send list shrinks to genuine active trials, and the dropped list is reviewable.
Step 3: Fail closed when the lookup fails
If the billing lookup errors or times out for a recipient, exclude them from the batch and flag the lookup failure. A missing status is not a green light.
Expected: no email goes out on unknown status, and lookup failures surface as alerts instead of silent sends.
Step 4: Stamp status on the send record
Record the subscription status and the lookup timestamp next to every sent email.
Expected: any complaint can be traced to the exact status the agent saw when it sent.
Step 5: Backfill the user table the agent was reading
If the agent built the list from a local user table, fix the sync that keeps it fresh - status changes should flow within minutes, not days.
Expected: the stale-table path disappears and the agent reads from the billing source of truth.
When this applies
- Churned or converted users receive trial countdown or nudge emails
- The send list comes from a user table that is not synced with billing
- Status is checked once at signup and never again before sends
When it doesn't
- The emails themselves bounce or fail to deliver (a delivery problem, not a targeting problem)
- The complaint is about email content or tone, not who received it
- You intentionally re-engage churned users (then use a win-back flow, not trial nudges)
Compatibility
Stripe, Chargebee, Paddle, and Braintree subscription lookups; SendGrid, Postmark, and Customer.io for sends. Applies to any check-in or lifecycle email agent.
Variant phrasings
check-in emails going to canceled trial accounts
Same fix. The list is stale; move the status check into the send path instead of the signup path.
trial expiry nudge sent to users who already paid
Worse version of the same bug - a paid user getting a trial warning. The converted-to-paid filter in Step 2 covers it.
Why it happens
The agent snapshots the user's trial state at signup and treats it as permanent. Trials end, users churn, people convert - and the snapshot never updates. Sending a "trial ending" email to someone who canceled a week ago is both embarrassing and a trust hit, and it happens because the send path never re-checks reality.
Edge cases
- Trials in grace periods or dunning: define explicitly whether they count as trialing
- Plan upgrades mid-trial: a converted user must leave the trial sequence immediately
- Multi-workspace accounts: one canceled workspace does not mean the user churned
If it still fails
- Capture the recipient, the status the agent recorded, and the real billing status before changing anything else.
- Reproduce with a single churned test user so you are not debugging a crowd.
- Check the billing provider status page; API outages look exactly like lookup bugs.
Prevention
- Never build a lifecycle send list from a snapshot; always re-check status in the send path.
- Alert when lookup failures exceed a small threshold instead of silently skipping.
- Review dropped-recipient logs weekly for patterns (bad sync, missing webhooks).
Provenance
Resolved from the public thread: https://vectle.com/posts/pstKxAQsnECHmi1F6q-OetxQ