This playbook implements the News and media strategies hub’s category opt-in onboarding flow as a multi-day Welcome Journey. The Journey progressively nudges readers to complete their profile, pick category preferences, and (optionally) confirm their email — without competing with editorial broadcasts that publish breaking news from the dashboard or API. This Journey is gap-driven: each step checks whether the reader has already taken the action it would otherwise prompt, and stays silent if they have. A reader who arrives fully set up gets only the welcome and final emails. A reader who never returns gets the IAMs and follow-up pushes reinforcing what’s still missing.Documentation Index
Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
Use this file to discover all available pages before exploring further.
At a glance
- Send a welcome email introducing the company, getting started in the app, and the community.
- Wait Until the reader has a profile —
account_typeexists, set only on identified users with an External ID and a completed profile. On expiration, show a Profile setup IAM. - Wait Until the reader has engaged with category preferences (any
cat_*Tag exists). On expiration, show a Category IAM. - If either gap remains, send a follow-up push reinforcing what’s missing.
- If the profile is still missing after another day, send a profile reminder push.
- Send a final email branched on
account_type(upgrade pitch, community welcome, etc.).
Onboarding goals
| Goal | Description |
|---|---|
| Complete reader profile | Log in, create an account, and collect email or SMS Subscriptions. |
| Set up category preferences | Visit the profile or preference center so cat_* Tags get set, enabling targeted broadcasts by topic. |
| (Optional) Confirm email | If running double opt-in in parallel, gate every email step on confirmed_opt_in = true. |
Prerequisites
Work through the News and media strategies implementation roadmap before building this Journey. The strategy hub defines the data foundation; this page implements one specific Journey on top of it. Required:- Familiarity with Journeys concepts — entry/exit rules, Wait Until, and Yes/No branch.
- An active OneSignal app with at least the data foundation from News and media strategies —
account_typeand thecat_*category Tags. - A Category Prompt or your own category-selection UI on the site to capture the
cat_*Tags. - A preference center page on your site for IAMs and emails to deep-link to. See Deep linking for the configuration.
- The confirmed opt-in Journey. When run in parallel, this Welcome Journey can gate every email step on
confirmed_opt_in = trueso unconfirmed addresses don’t receive marketing email. - An HTML in-app message template for the Category IAM. The HTML format lets readers change category preferences inline without leaving the app.
Journey configuration
Required data
| Type | Name | Purpose |
|---|---|---|
| Tag | account_type | Values: free / metered / paid / lapsed. Set this Tag only on identified users — readers who have an External ID and a completed profile (logged in or registered). Do not set it on anonymous visitors. Existence gates the Profile setup IAM and the profile-reminder push; the Tag’s value drives the final-email branch. |
| Tag | cat_* (one per category, e.g., cat_breaking_news, cat_sports) | Set these Tags only when the reader visits your profile or preference center page — not before. The default value at that point is your call: use 0 for an explicit opt-in model (reader must tick to receive) or 1 for an opt-out model (all categories enabled by default). The “Has selected categories” segment then matches whenever any cat_* Tag exists, regardless of value, since existence proves the reader visited the page. |
| Tag | confirmed_opt_in | Optional. true if the reader has confirmed their email via the double opt-in Journey. Used as a Yes/No gate before each email step. |
Journey segments
Define these once and reuse them across the Journey steps. Has profile:- Name: “Has profile”
- Filter:
account_typeexists
account_type is set to any value (free, metered, paid, or lapsed). This Tag should only be set on identified users with an External ID, this segment effectively means “has logged in or registered” — anonymous visitors should never match.
Has selected categories:
- Name: “Has selected categories”
- Filters:
cat_breaking_newsexists
cat_* Tag is present on their record — i.e., they’ve visited the profile or preference center page where category preferences are captured. Whether the Tag’s value is 0 or 1 doesn’t matter for this gate; the reader has already made their choice. Update this segment whenever you add a new category to your data model.
Fully onboarded:
- Name: “Fully onboarded”
- Filters:
account_typeexists ANDcat_breaking_newsexists
Journey templates
These templates are starting points — clone, edit, and re-use them in your own Journey. They use Liquid syntax for personalization againstfirst_name, account_type, favorite_section, and metered_articles_remaining.
Email templates
Two emails carry the long-form moments of the Journey — a welcome at entry and a final cross-sell at the end. Both skip automatically when the reader has no email Subscription, so the IAMs, pushes, and gap checks still drive the rest of the flow. Email 1 — Welcome (immediate) Purpose: Introduce the publication, getting started in the app, and the community, plus what to expect from the Journey. Suggested subject: Welcome to OneSignal News,{{ first_name | default: 'reader' }}
Content outline:
- A short welcome and thank-you for opting in.
- A getting started mini-section — 2–3 things the reader can do next: pick categories, follow newsletters, install the app, log in or create an account.
- A manage your topics CTA that deep-links to your preference center.
- Links to your social and community channels (Discord, X, YouTube) so they can follow along outside the app.
account_type. The closing email of the Journey.
Branch the content with Liquid (or send conditional templates from a Yes/No branch in the Journey itself):
account_type | Email 2 angle |
|---|---|
| Not set | Account creation pitch with social proof. |
free | Upgrade pitch — feature comparison, free trial offer. |
metered | Urgency-led upsell — “You’re {{ metered_articles_remaining }} articles away from your limit.” |
paid | Community welcome, app download (if web reader), advanced preference features. |
lapsed | Win-back offer with renewal-specific incentive. Consider routing to a dedicated win-back Journey instead. |
Push templates
Two pushes drive the gap-reminder steps. Pushes skip automatically for readers without a push Subscription, so email-only and SMS-only readers still progress through the rest of the flow. Push 1 — Reinforce (gap-driven) Purpose: Catch readers who haven’t completed their profile or picked categories. A single template that addresses both gaps generically. Suggested title: Finish setting up your OneSignal News experience Suggested body: You’re a few taps away from a personalized news feed. Pick your topics or finish your profile. Launch URL: Deep-link to your preference center. Push 2 — Profile reminder Purpose: Nudge readers who still haven’t created a profile a day after Push 1. Sent only whenaccount_type is still missing.
Suggested title: Save your spot, {{ first_name | default: 'reader' }}
Suggested body: Create an account to sync your reading list, get personalized news, and pick up where you left off on any device.
Launch URL: Deep-link to your auth flow (log in or create an account).
In-app message templates
Two IAMs nudge readers who arrive at a Wait Until expiration branch. IAMs are queued by the Journey step and display the next time the reader opens the app or site. Profile setup IAM Purpose: Convert anonymous readers into authenticated profiles. A standard IAM with a “Log in or create an account” CTA that deep-links to the customer’s auth flow. Keep copy short — one benefit (“personalized news, saved articles, sync across devices”) plus the CTA. Category IAM Purpose: Capture category preferences from readers who haven’t selected any. Two implementation options:- HTML IAM with inline form. Use the In-App HTML Templates checklist/survey example as a starting point. Render checkboxes for each category; on submit, set the matching
cat_*Tag to1. Highest conversion because the reader doesn’t leave the app. - Simple IAM with deep-link. A single CTA that deep-links to a preference center page that re-triggers the Category Prompt or shows your custom category UI. Easier to build but adds friction.
Journey settings
Entry rules:- Audience: All users.
- Future additions only: Checked — must stay checked so existing users aren’t bulk-enrolled when the Journey is set live.
- Default — when the reader moves through the entire Journey.
Journey steps
The Journey has 6 sequential steps. Each email step (Steps 1 and 6) is preceded by a Yes/No onconfirmed_opt_in = true if you’re running double opt-in in parallel. The push steps (Steps 4 and 5) don’t need that gate — pushes don’t require email confirmation.
Step 1. Welcome email
Yes/No: confirmed_opt_in = true (optional)
Skip this branch if you’re not running double opt-in.Setup: Yes/No branch on segment membership for “Confirmed opt-in” (filter:
confirmed_opt_in = true).- Yes → continue to the email step.
- No → skip the email and rejoin the main flow at Step 2. The parallel double-opt-in Journey continues moving the reader toward confirmation; this Journey just refuses to send marketing email until they’re confirmed.
Step 2. Wait Until profile set
Wait Until: in segment "Has profile"
Condition: the reader is in the Has profile segment (
account_type exists).Expiration: 24 hours.- Event branch (segment matched): silent. Continue to Step 3.
- Expiration branch (24h, no profile): continue to the next step.
Step 3. Wait Until categories set
Wait Until: in segment "Has selected categories"
Condition: the reader is in the Has selected categories segment (any
cat_* Tag exists).Expiration: 24 hours.- Event branch (segment matched): silent. Continue to Step 4.
- Expiration branch (24h, no categories): continue to the next step.
Step 4. Follow-up push (if data is missing)
Yes/No: in segment "Fully onboarded"
Setup: Yes/No branch on the Fully onboarded segment (has profile AND has selected categories).
- Yes (fully onboarded): skip the push and continue to Step 5.
- No (still missing profile or categories): continue to the push step.
Step 5. Profile reminder push
Wait: 1 day
A simple Wait step that gives the reader a day to act on Push 1 before the next nudge.
Yes/No: in segment "Has profile"
Setup: Yes/No branch on the Has profile segment (
account_type exists).- Yes (has profile): skip the push and continue to Step 6.
- No (profile still missing): continue to the push step.
Push: Push 2 — Profile reminder
Send the profile-reminder push deep-linked to your auth flow. Skipped automatically if the reader has no push Subscription.This step intentionally only checks for profile, not categories — readers without a profile are the highest-value gap to close, and a third push would risk fatigue.
Step 6. Final email
Email: Email 2 — Final
Send the final email. Branch content on
account_type (Liquid {% case account_type %} blocks or per-segment templates). See Email 2 — Final above for the per-status copy angle.Best practices
- Don’t compete with editorial sends. Breaking news goes out as one-time dashboard or API campaigns to category segments (
cat_breaking_news = 1), not as Journey messages. The Welcome Journey only sends meta messages — welcome, profile/category nudges, and the final upgrade pitch. If you ever feel tempted to add an editorial-style push to this Journey, route it through the Breaking news broadcasts flow instead. - Set
cat_*Tags only when the reader visits your profile or preference center page. The presence of anycat_*Tag is what the segment uses to decide “this reader has seen and made a choice” — Tags shouldn’t exist before then. The default value (0for opt-in,1for opt-out) is up to you and depends on whether you want readers to tick boxes to receive each category or untick to remove them. - Update the “Has selected categories” segment whenever you add a new category. Each
cat_*Tag has to be OR’d into the segment manually. Document the segment alongside your category list so it doesn’t drift. - Gate every email step on
confirmed_opt_in = trueif you run double opt-in. A reader who hasn’t confirmed should never get marketing email. The IAMs and gap checks still run for them — only the emails skip. - Keep IAMs short. The Profile and Category IAMs each serve one job. Don’t bundle multiple CTAs into either; readers about to convert on a single ask are derailed by a second one.
- Set a global frequency cap. Editorial sends will reach readers in the same few days as this Journey. A cap on the segment side (e.g., max one push per reader per 4 hours) prevents the editor’s send and any incidental Journey nudges from piling up.
- Lapsed subscribers can stay in the entry rule (“All users, future additions only”), but the Email 2
lapsedbranch is a stopgap. For most teams, a dedicated win-back Journey handles lapsed subscribers better than a final touch tucked inside the welcome flow.
FAQ
Why doesn’t this Journey send breaking news pushes?
Breaking news is editorially driven and time-sensitive — sent as one-time dashboard or API campaigns to category segments (cat_breaking_news = 1), not as Journey messages. Mixing editorial content into this Journey would either delay breaking news (waiting on the Journey schedule) or compete with the editor’s manual send. Keep the two responsibilities separate.
What happens to readers without an email Subscription?
The two email steps (welcome and final) skip automatically — OneSignal won’t send an email to a reader who has no email channel. The pushes, IAMs, and Wait Until steps still run, so push-only and SMS-only readers still get the gap-driven nudges.What if the reader has email but no push?
Welcome and final emails still send. The two follow-up pushes skip automatically because the reader has no push Subscription, and the IAMs never display because the reader has no app or site session for them to render in. The Journey effectively becomes an email-only flow for this reader.What is the Wait Until step actually checking?
Wait Until listens for the reader to enter the configured segment. The instant they do, the event branch fires and the Journey continues. If 24 hours pass without the segment matching, the expiration branch fires instead. A reader who already qualifies when they reach the step progresses immediately — no IAM is queued.How do I add a new category?
Three steps:- Add a new
cat_<category>Tag to your data model. The Tag is set on a reader’s record the next time they visit your profile or preference center page — match the default value (0for opt-in,1for opt-out) to your other categories so existing readers get a consistent experience. - Add the category to your Category Prompt or custom category UI.
- Update the Has selected categories and Fully onboarded segments to OR in the new Tag (
cat_<category>exists). Every step using those segments picks up the change automatically.
Should I run this alongside the double-opt-in Journey?
Yes if you collect email and want CAN-SPAM / GDPR-aligned consent. Add the confirmed opt-in Journey in parallel, gated on the same audience. This Welcome Journey then checksconfirmed_opt_in = true before each email step so unconfirmed addresses never receive marketing email.
Why is the entry rule “All users” instead of a more specific segment?
This Journey is gap-driven, not entry-segmented. Every reader is checked at each step against whether they’ve completed the corresponding action; readers who arrived already set up just pass through silently. Future additions only still prevents bulk-enrolling existing users when the Journey is set live.How long does the Journey last?
Roughly 3 days from entry. Step 1 fires immediately, Steps 2 and 3 each have a 24-hour Wait Until window, Step 4 (follow-up push) follows immediately, Step 5 waits 1 day for the profile-reminder push, and Step 6 (final email) sends right after.Related pages
News and media strategies
Strategy hub: External IDs, category Tags, Custom Events, segments, and Journey patterns for news and media.
Confirmed opt-in for email
Run the double opt-in Journey in parallel and gate this Journey’s email steps on
confirmed_opt_in = true.Permission requests
Configure the Category Prompt that captures
cat_* Tags before this Journey starts.In-App HTML templates
Build the inline category-selection form used by the Category IAM.
Preference center
The destination for emails and IAMs that need richer settings (frequency, quiet hours, newsletters).
Deep linking
Deep-link from emails and IAMs to specific pages on your site or app.