The default behavior for most small teams is to send the new feature push to “all users.” The next-default behavior is to send a milestone push to “active users.” Both lose people. A one-page targeting brief — segment, moment, message, silence rule — is the cheapest discipline that stops you from spraying. AI is genuinely useful here because the brief is structured and repeatable; the trap is letting AI invent segments that your data cannot actually identify.
The task
You are about to ship a notification, in-app message, lifecycle email, or paid retargeting set. You want a one-page brief that names: which users get it, at what moment in their behavior, what the message actually says, and which other users explicitly do NOT get it. The brief should fit on a screen and be reviewable by a non-PM teammate in 90 seconds.
When this is the right job for AI
- You have segments your analytics actually supports (you can query them today, not “if we had cohort analysis”).
- You can describe the trigger moment behaviorally (logged 7 days in a row, opened settings 3+ times this week).
- You will write the silence rule yourself — the list of users who must NOT receive this. AI is happy to skip this if you let it.
- The team treats “send to all” as a real cost, not a free action.
What to feed the AI
- The campaign goal in one sentence (“get users who tried premium and downgraded to retry premium with a clear different angle”)
- Segments you actually have in your tools (Mixpanel, RevenueCat, internal — name them)
- The behavioral trigger (event or state, plus the time window)
- The 2-3 user types who should explicitly NOT receive this (recently churned, paid-and-canceled-with-refund, etc.)
- Any prior message you sent these users in the last 30 days
Copy-ready prompt
You are writing a one-page targeting brief for a single in-app notification.
Campaign goal: re-engage users who tried our premium 7-day trial in the last 60 days, did not convert, but have remained active in the free tier.
Segments available in our tools:
- RevenueCat: trial_started, trial_expired, trial_converted, subscription_cancelled
- Mixpanel: daily_active, weekly_active, last_open_within_7d, free_tier_active, premium_active
- Internal: refund_issued, support_ticket_open
Behavioral trigger I am thinking of:
- trial_expired + did NOT convert + last_open_within_7d + at least 5 daily_active days in the 30 days after trial
Users who must NOT receive this:
- refund_issued in the last 90 days
- support_ticket_open right now
- received any premium-related notification in the last 14 days
- subscription_cancelled (different segment — they paid, this brief is for trial-only)
Prior messages to this segment in the last 30 days: one feature-launch push (14 days ago).
Write the brief as exactly seven sections, each 2-4 lines:
1. **Goal.** One sentence, names the metric we are moving.
2. **Segment.** The exact segment definition in the language of our tools above.
3. **Trigger moment.** The event or state that fires the send, in user-behavior terms.
4. **Message angle.** One sentence on what we are saying that is DIFFERENT from the trial-end push they already saw.
5. **Copy draft.** Title (under 50 chars), body (under 140 chars). No exclamation points. No "act now."
6. **Silence rule.** The exclusion segments. Bullet list. This is the most important section.
7. **Success and stop conditions.** What metric, what threshold to declare it worked or pull it.
Rules:
- Do not invent segments not in the tools list above.
- Do not assume CRM features we did not name.
- If the trigger cannot be expressed in the available events, flag it as [DATA GAP: ...] instead of guessing.
Sample output structure
Goal. Lift premium subscription rate from the post-trial-active segment by 1.5 points over 30 days (current baseline: 3.1% lifetime conversion after a missed trial).
Segment. Users where RevenueCat trial_expired = true AND trial_converted = false AND Mixpanel last_open_within_7d = true AND daily_active_days_in_30d_post_trial >= 5.
Trigger moment. The user has just completed their 5th daily-active day post-trial-expiry. Send within 1 hour of that 5th day boundary, between 09:00 and 20:00 local.
Message angle. Not “your trial ended.” Instead, acknowledge the user has stayed active for a month on free and offer a single specific premium capability they have demonstrably hit a friction with (top friction: hitting the export limit).
Copy draft. Title: “Export got in your way 4 times this month.” Body: “Premium removes the cap. Same price you saw last month. Tap to see a clean diff with free.”
Silence rule.
- refund_issued in last 90d — exclude.
- support_ticket_open right now — exclude.
- any premium-related push in last 14d — exclude (the feature-launch push counts).
- subscription_cancelled (paid-then-canceled) — exclude, different brief.
- notification-permission revoked — exclude (will arrive as silent).
Success and stop conditions. Lift trial-to-paid conversion of this segment by +1.5pts over 30 days. Stop the send if the 7-day window opt-out rate on this push is >2x baseline, OR if the support_ticket rate spikes >1.5x baseline within 48h.
How to refine
- Brief misses the silence rule → reject and re-prompt: “rewrite section 6 with at least 4 explicit exclusion conditions, expressed in the tools above.”
- Copy uses “act now” / exclamation / emoji → strict rule in prompt; if AI repeats, add to the bad-example list.
- Trigger expressed in events you do not have → require [DATA GAP: …] tag instead of substitution.
- Segment too broad (“all free users”) → demand “the segment must be expressible as an intersection of at least 3 events or states.”
- No stop condition → require section 7 to include a kill-switch threshold, not just a success threshold.
Common mistakes
- Sending to “all active users” because the segment was hard to define. Hard-to-define means the campaign is not ready.
- Skipping the silence rule. The people you accidentally include damage trust faster than the campaign helps anyone else.
- Reusing the same angle as the last push. If a user saw “your trial ended” three weeks ago, the new push needs a different reason for them to care.
- Sending at the wrong local time. A “20:00 UTC” send is 03:00 in Sydney. Time-of-day-local is not optional.
- No kill switch. A bad campaign that runs all weekend is a small disaster you could have stopped Friday afternoon.
FAQ
- How small should a segment be? Small enough that you can name the person archetype in one sentence. If you cannot, the brief is not done.
- What if I do not have RevenueCat-style data? Replace with your subscription source of truth; the brief structure does not change.
- Should the brief be reviewed by someone else? Yes — a 90-second review by a teammate catches silence-rule gaps almost every time.
- Can the brief cover an A/B test? Yes — add a section 8 for variant copy with the same constraints, and define the metric the test will read.
- What about quiet hours? Treat them as part of the silence rule. Send window must be local-time-bounded.
Related
- AI App Review Appeal Draft
- AI feature prioritization for indie apps
- AI retention cohort analysis
- AI user interview question generator
- AI weekly priorities reflection
Tags: #AI writing #segmentation #notifications #app-product-ops #Indie dev