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
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
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):
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)
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.
Email: Email 1 — Welcome
Step 2. Wait Until profile set
Wait Until: in segment "Has profile"
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.
In-App Message: Profile setup IAM (expiration branch only)
Step 3. Wait Until categories set
Wait Until: in segment "Has selected categories"
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.
In-App Message: Category IAM (expiration branch only)
Step 4. Follow-up push (if data is missing)
Yes/No: in segment "Fully onboarded"
- Yes (fully onboarded): skip the push and continue to Step 5.
- No (still missing profile or categories): continue to the push step.
Push: Push 1 — Reinforce
confirmed_opt_in gate is needed — that gate is for marketing email only.Step 5. Profile reminder push
Wait: 1 day
Yes/No: in segment "Has profile"
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
Step 6. Final email
Yes/No: confirmed_opt_in = true (optional)
Email: Email 2 — Final
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
Confirmed opt-in for email
confirmed_opt_in = true.Permission requests
cat_* Tags before this Journey starts.