> ## 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.

# News and media strategies

> Implementation hub for news and media messaging — user IDs, category interest Tags, reading-behavior Custom Events, segments, and Journey playbooks for audience growth, paywall conversion, and re-engagement.

A news and media messaging strategy targets sites and apps where success depends on session frequency, category-specific opt-in, paywall conversion, and subscriber retention. If you publish content across multiple verticals and your growth depends on bringing readers back daily, this guide is for you.

This page is the implementation hub: which user identifier to set, what reading and category data to capture, which segments to build, and which Journeys drive opt-in, paywall conversion, and re-engagement. Each section links to the canonical docs for deeper detail.

<Columns cols={3}>
  <Card title="Acquire" icon="bell" href="./welcome-journey-news-media">
    Convert anonymous traffic into opted-in readers with the Category Prompt and a category-aware Welcome Journey.
  </Card>

  <Card title="Convert" icon="circle-dollar-to-slot" href="./mobile-first-journeys#welcome-journeys">
    Turn repeat paywall hitters into subscribers with a graduated cadence of value reminders and offers.
  </Card>

  <Card title="Retain" icon="rotate-left" href="./mobile-first-journeys#retention-journeys">
    Bring back inactive readers on a 7 / 14 / 30 day cadence and re-engage lapsed subscribers separately.
  </Card>
</Columns>

## Implementation roadmap

Work through these steps in order. Each one links to its section below.

<Steps>
  <Step title="Assign External IDs">
    Set a stable, app-side identifier on every authenticated reader so push, email, and SMS tie to one profile across reinstalls and devices. [Jump to section](#identify-your-readers-with-external-ids).
  </Step>

  <Step title="Add reader properties as Tags">
    Start with `account_type`, category-interest Tags (`cat_breaking_news`, `cat_sports`, etc.), and `last_visit_date`. These power your category routing and re-engagement segments. [Jump to section](#tags).
  </Step>

  <Step title="Send reader actions as Custom Events">
    Fire `article_read`, `paywall_hit`, `newsletter_subscribed`, and `subscription_started` from your site or app. [Jump to section](#custom-events).
  </Step>

  <Step title="Build lifecycle Segments">
    Audience groups such as Active readers, Paywall hitters, Subscribers, and Inactive readers (7 / 14 / 30 days). [Jump to section](#segments).
  </Step>

  <Step title="Create lifecycle Journeys">
    Category opt-in, paywall conversion, breaking news alerts, and re-engagement. [Jump to section](#journey-examples).
  </Step>
</Steps>

<Frame caption="Video: Prompting best practices for news and media">
  <iframe width="560" height="315" src="https://www.youtube.com/embed/R56m4ynqMtA?si=RWIQ8m9MZBrR77yK" title="Prompting best practices for news and media sites" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

## Identify your readers with External IDs

External IDs preserve identity across installs and tie push, email, and SMS to one reader profile. Use the unique identifier from your CMS, account, or auth platform — for example, your site's `user_id`, an Auth0 `uid`, or your subscription-platform `customer_id`.

Set the External ID at signup, on every login, and on session resume. The OneSignal SDK does not assign it for you, and assigning it late or sporadically breaks attribution between category opt-in, paywall hits, and downstream subscription conversion.

For anonymous readers (the majority of news traffic), the OneSignal-assigned anonymous user ID still ties Tags and behavior to a Subscription. Promote anonymous profiles to authenticated profiles by setting the External ID the moment a reader logs in or subscribes — that single call merges the anonymous activity with the new identity.

<Card title="External ID setup" icon="id-card" href="./users#external-id">
  Assign a unique reader identifier so category preferences, reading history, and notifications follow the reader across devices.
</Card>

## Recommended data

Tags persist on the reader profile (current state); Custom Events record discrete moments (what just happened). Use both — Tags drive category routing and segmentation, Custom Events trigger Journey entry and Wait Until conditions.

News and media leans heavily on Tags for category opt-in (one Tag per topic) so you can target exactly the readers who care about a given story, and on Custom Events for reading behavior (`article_read`, `paywall_hit`) so retention and conversion Journeys react to what readers actually do.

### Tags

Tags persist on the reader profile and are used for segmentation and personalization. Two conventions apply depending on the Tag's role:

* **Toggle Tags** (single binary signal — newsletters, `subscription_auto_renew`): set the Tag to `1` when true and **remove it** when false. Segment with "tag exists" rather than storing `0`/`false`.
* **Checklist Tags** (state of every option matters — categories): set Tags only when the reader actively engages with category preferences — for example, when the [Category Prompt](./permission-requests) is dismissed or when the reader visits your preference center page. Don't set them up front for every reader. Choose the default value to match the model you want: `0` for explicit opt-in (reader ticks to receive each category) or `1` for opt-out (categories are enabled by default; reader unticks to remove). Use `tag exists` to find readers who have engaged with preferences at all, and `tag = 1` to target the opted-in followers of a specific category.

<Tip>
  If you only set up four kinds of Tags, start with `account_type`, your category-interest Tags, `last_visit_date`, and `first_name`. They power most starter Journeys.
</Tip>

#### Subscription and lifecycle state

| Tag                         | Values                                                    | Use                                                                                                                                                                                 |
| :-------------------------- | :-------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `account_type`              | `free` / `metered` / `paid` / `lapsed`                    | Paywall and lifecycle state — drives Journey entry, exit, and audience filters. Set only on identified users (External ID + completed profile); leave unset for anonymous visitors. |
| `subscription_tier`         | `digital` / `print_plus_digital` / `premium` (your tiers) | Tailor offers and disclosures by subscription tier.                                                                                                                                 |
| `subscription_start_date`   | Unix timestamp (seconds)                                  | Drive anniversary and tenure-based messaging. Use OneSignal [time operators](./time-operators) to compare against the current time.                                                 |
| `subscription_renewal_date` | Unix timestamp (seconds)                                  | Drive renewal-window messaging (e.g., "renews in 7 days") and post-expiration win-back. Pair with [time operators](./time-operators).                                               |
| `subscription_auto_renew`   | `1` (set when auto-renew is on)                           | Suppress renewal-prompt messaging for subscribers who will auto-renew. Remove the Tag when the reader turns auto-renew off — that is your highest-priority retention moment.        |

#### Category interests

One Tag per category lets you target precisely the readers who opted in to a topic. Set each `cat_*` Tag the moment the reader engages with category preferences — when the [Category Prompt](./permission-requests) is dismissed, or when they first visit your preference center page. Pick the default value to match your model: `0` for explicit opt-in (reader must tick to receive) or `1` for opt-out (all enabled by default, reader unticks to remove). Update the Tag whenever the reader changes their choice. Segment with `tag exists` to find readers who have made a choice at all, or with `tag = 1` to target the opted-in followers of a category. See [Auto-segment users by page visit](./auto-segment-users-by-page-visit) for adding category Tags automatically based on which sections a reader browses.

| Tag                                              | Values    | Use                           |
| :----------------------------------------------- | :-------- | :---------------------------- |
| `cat_breaking_news`                              | `0` / `1` | Target breaking news alerts.  |
| `cat_world` / `cat_local` / `cat_politics`       | `0` / `1` | Per-vertical opt-in segments. |
| `cat_business` / `cat_technology` / `cat_sports` | `0` / `1` | Per-vertical opt-in segments. |
| `cat_culture` / `cat_lifestyle` / `cat_opinion`  | `0` / `1` | Per-vertical opt-in segments. |

#### Newsletter subscriptions

One Tag per newsletter, separate from on-site category Tags. A reader can opt in to the *Morning Briefing* newsletter without opting in to the broader `cat_breaking_news` push category — keep the two namespaces distinct so Journeys target the right channel and product. Set the Tag from your `newsletter_subscribed` event handler and remove it on `newsletter_unsubscribed`.

| Tag                                      | Values                    | Use                                                                                      |
| :--------------------------------------- | :------------------------ | :--------------------------------------------------------------------------------------- |
| `nl_morning_briefing`                    | `1` (set when subscribed) | Target morning newsletter subscribers; gate exit from the newsletter-onboarding Journey. |
| `nl_breaking_daily` / `nl_evening_recap` | `1` (set when subscribed) | Per-newsletter opt-in segments for cross-promotion and re-engagement.                    |
| `nl_weekly_<vertical>`                   | `1` (set when subscribed) | Vertical-specific weekly newsletters (e.g., `nl_weekly_politics`, `nl_weekly_business`). |

#### Engagement and behavior

| Tag                          | Values                              | Use                                                                                                                                                                                                 |
| :--------------------------- | :---------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `last_visit_date`            | Unix timestamp (seconds)            | Drive recency-based re-engagement at 7 / 14 / 30 days.                                                                                                                                              |
| `total_articles_read`        | integer (as string)                 | Power active-reader segments and habit-strength signals.                                                                                                                                            |
| `favorite_section`           | string (e.g., `politics`, `sports`) | Personalize subject lines and push copy with the reader's most-read section.                                                                                                                        |
| `metered_articles_remaining` | integer (as string)                 | Articles left in the reader's metered allowance this period. Drives proactive paywall-approach messaging (e.g., "1 free article left this month") — a higher-converting moment than after the wall. |
| `paywall_hits_30d`           | integer (as string)                 | Identify readers who repeatedly hit the paywall — high-intent conversion targets.                                                                                                                   |

#### Personalization

| Tag                 | Values | Use                                                                                                                                                                                                         |
| :------------------ | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `first_name`        | string | Personalize message content (e.g., `Hi {{ first_name }}`).                                                                                                                                                  |
| `subscription_page` | string | Tag the page the reader subscribed from — see [Tag with subscription page](./auto-segment-users-by-page-visit#tag-at-subscription-one-time-web-only). Useful for routing source-specific welcome messaging. |

<Card title="Add user data tags" icon="tags" href="./add-user-data-tags">
  Add key-value pairs to reader profiles for category routing, segmentation, and personalization.
</Card>

### Custom Events

Send a Custom Event for each reader action you want to react to. Events are stored shorter-term than Tags but can carry properties (article ID, category, author, paywall threshold), making them ideal for Journey entry triggers and Liquid personalization. Use lowercase `snake_case` for event names and keep them consistent across your site and apps.

| Event                                               | Use case                                                                                                              |
| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `signup_completed`                                  | Welcome Journey entry.                                                                                                |
| `article_read`                                      | Engagement signal. Carries `article_id`, `category`, and `author` as properties for personalization and segmentation. |
| `paywall_hit`                                       | Paywall conversion Journey entry. Carries the article that triggered the wall as a property.                          |
| `subscription_started`                              | Exit paywall conversion Journey; thank-you and onboarding message.                                                    |
| `subscription_cancelled`                            | Win-back Journey entry.                                                                                               |
| `newsletter_subscribed` / `newsletter_unsubscribed` | Manage per-newsletter Tags and exit/reentry of newsletter-specific Journeys.                                          |
| `comment_posted` / `share_clicked`                  | Engagement signals — useful for power-reader and viral-loop Journeys.                                                 |
| `breaking_news_published`                           | Backend-fired event that triggers a category-targeted broadcast Journey.                                              |

<Card title="Custom Events" icon="bolt" href="./custom-events">
  Capture reader actions and use them to trigger Journeys or Wait Until steps.
</Card>

### Segments

Combine Tags and Custom Events into segments. Start with these eight:

| Segment                   | Definition                                                                                         |
| ------------------------- | -------------------------------------------------------------------------------------------------- |
| New visitors              | `First Session < 7 days ago`. Onboarding and category opt-in target.                               |
| Active readers            | `article_read` in the last 7 days, with N+ events. Daily or near-daily core.                       |
| Casual readers            | `Last Session < 14 days ago` AND fewer than N `article_read` events. Habit-formation target.       |
| Paywall hitters           | `paywall_hit` in the last 30 days AND `account_type = "free"`. Highest-intent conversion segment.  |
| Subscribers               | `account_type = "paid"`. Retention and engagement target.                                          |
| Lapsed subscribers        | `account_type = "lapsed"`. Win-back audience — keep separate from general re-engagement.           |
| Inactive 7 / 14 / 30 days | `Last Session > 7 / 14 / 30 days ago`. Three re-engagement tiers with progressively stronger asks. |
| Category followers        | `cat_<category> = "1"`. One segment per opted-in category for breaking news targeting.             |

<Note>
  Mature news setups run 30+ segments split by section, geography, subscription tier, device, and source channel. Start with the eight above plus a segment per top-level category, then add depth (paywall threshold, newsletter cohort, time-of-day reader) as your Journeys grow.
</Note>

<Card title="Segmentation" icon="users" href="./segmentation">
  Group readers by shared characteristics to target Journeys and category broadcasts.
</Card>

## Journey examples

With Tags, Custom Events, and segments in place, build Journeys against them. News and media Journeys mix channels by intent — push for breaking news and time-sensitive nudges, in-app for category opt-in and paywall messaging, email for newsletters and longer-form re-engagement, and SMS sparingly for critical subscriber communications. The lifecycle has five core flows:

<Columns cols={2}>
  <Card title="Category opt-in onboarding" icon="newspaper" href="./welcome-journey-news-media">
    Welcome Journey that nudges readers to complete their profile and pick categories using Yes/No branches and Wait Until steps.
  </Card>

  <Card title="Breaking news broadcasts" icon="bolt" href="./event-driven-journeys">
    Backend-fired `breaking_news_published` events targeted to readers with the matching `cat_*` Tag.
  </Card>

  <Card title="Paywall conversion" icon="circle-dollar-to-slot" href="./mobile-first-journeys#welcome-journeys">
    Convert repeat `paywall_hit` readers with a graduated cadence of value reminders and offers.
  </Card>

  <Card title="Re-engagement (7 / 14 / 30 day)" icon="rotate-left" href="./mobile-first-journeys#retention-journeys">
    Bring back inactive readers with category-aware content and offers calibrated to inactivity tier.
  </Card>

  <Card title="Subscriber win-back" icon="arrow-rotate-right" href="./mobile-first-journeys#retention-journeys">
    Re-engage `lapsed` readers with renewal offers separate from general re-engagement.
  </Card>
</Columns>

<Frame caption="Video: Sending news updates based on reader interests">
  <iframe width="560" height="315" src="https://www.youtube.com/embed/r6GeyiYxiN4?si=5Tl4DgUxWxE3LM2c" title="Sending news updates based on reader interests" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

### Common news and media patterns

* **Capture category interests at first prompt.** Use the [Category Prompt](./permission-requests) to combine push opt-in with category selection in a single moment. Every category presented gets a `cat_*` Tag at prompt time — `1` for the categories the reader ticks, `0` for the rest — exactly the data you need for targeted broadcasts. Apps that segment broadcasts by interest typically see materially higher click-through rates than apps that send to all opt-ins.
* **Auto-tag readers based on what they read.** For web, [Tag page visits](./auto-segment-users-by-page-visit) automatically applies a `cat_*` Tag the first time (or N-th time) a reader visits a section. This builds an interest profile even for readers who never explicitly opt in, and turns passive browsing into actionable segmentation.
* **Tag with subscription source.** [Tag with subscription page](./auto-segment-users-by-page-visit#tag-at-subscription-one-time-web-only) records where a reader subscribed from. Source-aware welcome messaging materially outperforms generic copy — a reader who opted in from a sports article responds to different copy than one who opted in from politics.
* **Three-tier re-engagement cadence.** Set up three inactivity segments at **7, 14, and 30 days** and run a separate Journey for each. The 7-day Journey leads with category-aware content; the 14-day Journey adds a value reminder or paywall promo; the 30-day Journey is the last call before treating the reader as churned. See [Retention Journeys](./mobile-first-journeys#retention-journeys) for the Journey shape.
* **Use the Custom Link Prompt for less intrusive opt-in.** Place a [Custom Link Prompt](./permission-requests) inline with content (e.g., "Get notified when we publish new pieces in this section") instead of a modal. This converts higher on long-form content where the reader is already invested.

<Frame caption="Video: Re-engaging readers with push and in-app messages">
  <iframe width="560" height="315" src="https://www.youtube.com/embed/uh66akjYclI?si=XjmTa69ZGScwwZA7" title="Re-engaging readers with push and in-app messages" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

Effective re-engagement copy includes:

<Columns cols={2}>
  <Card icon="newspaper">
    **Recent breaking news** in the reader's opted-in categories
  </Card>

  <Card icon="list">
    **Top stories** from one of their tracked categories of interest
  </Card>

  <Card icon="gift">
    **Limited-time offers** for paywalled content access
  </Card>

  <Card icon="tags">
    **Discounts** on paid memberships or annual upgrades
  </Card>
</Columns>

Measure success by category opt-in rate, push CTR by category, paywall-to-subscription conversion rate, and inactive-reader return rate at 7 / 14 / 30 days — not just opens or total volume.

## FAQ

### How is this different from the Mobile-first strategy?

[Mobile-first](./mobile-first) targets subscription, freemium, and trial-driven apps where success is measured by trial-to-paid conversion. News and media overlaps on the data foundation (External IDs, Tags, Custom Events, segments) but adds category interest as a first-class concept and treats paywall conversion as the primary monetization moment. Most news traffic is also web-first and largely anonymous, which shifts the channel mix toward web push and category-aware broadcasts.

### Should I use a Tag or a Custom Event for category interest?

Use a **Tag** (`cat_breaking_news = "1"`). Category opt-in is a persistent state — the reader either wants breaking news alerts or doesn't — and Tags are designed for state-based segmentation. Custom Events represent discrete moments (the act of reading an article in that category, the act of opting in), which you may also want to send for analytics and funnel tracking.

### How many categories should I expose at first prompt?

Three to seven top-level categories work best. Fewer than three feels like too narrow a choice; more than seven overwhelms the prompt and depresses opt-in. Use the categories that match your top-level navigation. Sub-categories can be added later via in-app settings or auto-tagged from page visits.

### How do I avoid over-messaging readers who opt in to many categories?

Apply a Journey-level **frequency cap** on broadcast Journeys (e.g., at most one push per reader per 4 hours), and use a `Last Push Sent` filter to suppress sends to readers who received a recent push in the same or related category. Alternatively, set a daily cap on the segment side. Over-messaging is the fastest way to lose hard-won opt-ins.

### Do I need data integrations to use these Journeys?

No. You can build basic re-engagement and category-aware breaking news using the [Category Prompt](./permission-requests) and dashboard-only segments like "First Session" and "Last Session." Custom Events and the auto-tagging integrations give you precise reading-behavior triggers, but they are not required to ship the first version.

### What about apps that mix news with other formats (e.g., video, podcasts)?

The data foundation extends naturally. Add format Tags (`format_video = "1"`, `format_podcast = "1"`) alongside category Tags and use them as filters on top of the base segments. Each format typically gets its own Custom Events (`video_played`, `podcast_episode_completed`) that feed into the same lifecycle Journeys with format-specific copy.

## Related pages

<Columns cols={2}>
  <Card title="Permission requests" icon="bell" href="./permission-requests">
    Configure the Category Prompt and Custom Link Prompt referenced throughout this guide.
  </Card>

  <Card title="Auto-segment by page visit" icon="file-lines" href="./auto-segment-users-by-page-visit">
    Tag readers with `cat_*` based on the sections they actually browse.
  </Card>

  <Card title="Mobile-first lifecycle Journeys" icon="route" href="./mobile-first-journeys">
    Welcome and retention Journey patterns adaptable to news onboarding and re-engagement.
  </Card>

  <Card title="Event-driven Journeys" icon="bolt" href="./event-driven-journeys">
    Trigger broadcasts from `breaking_news_published` and other backend-fired events.
  </Card>

  <Card title="Email confirmed opt-in" icon="envelope" href="./double-opt-in-email">
    Reduce bounces and improve deliverability with a double opt-in flow for newsletter signups.
  </Card>

  <Card title="Preference center" icon="sliders" href="./preference-center">
    Let readers manage which categories, newsletters, and channels they receive.
  </Card>
</Columns>
