Skip to main content
Personalization lets you send messages that include dynamic data — such as a user’s name, cart items, account balance, booking details, or a one-time password. This guide helps you choose the right personalization method based on:
  • Where your data lives
  • Whether it should persist
  • How the message is triggered

How personalization works

Personalization in OneSignal has two parts:
  1. Liquid syntax – defines how values render in your message
  2. A data source – determines where the value comes from
At send time, OneSignal resolves your Liquid variables using the selected data source.
Liquid controls formatting and logic (variables, loops, conditionals). The data source determines what values are available.
Example:
Liquid
Hi {{ user.tags.first_name }},

Your verification code is {{ message.custom_data.otp }}.
  • user.tags.first_name is a stored property
  • message.custom_data.otp is passed via the API custom_data field

Data source comparison

If you need to…
Common mistakes to avoid
  • Using Properties (Tags) for one-time values like OTPs or verification codes
  • Expecting custom_data to be available in Journeys or future messages
  • Assuming Custom Event properties are available outside of the event triggered Journey entry or a Wait Until step
  • Using Data Feeds for static data that rarely changes

Data sources

Data feeds

Data Feeds call your API at send time and inject the response into your message. When to use Data Feeds:
  • You need the latest value at delivery
  • The data lives in your backend
  • The value may change between sends

Data feeds

Pull real-time backend data into messages at send time.

Custom Events

Custom Events can personalize messages inside Journeys using event properties. When an event starts a Journey or matches a Wait Until condition, OneSignal stores that event so its properties can be referenced in message templates using Liquid. When to use Custom Events:
  • Event triggered messages with Journeys
  • The message should reflect event-specific data
Only events that trigger Journey entry or a Wait Until step are stored for personalization. Events sent outside those moments are not available to Journey messages.

Custom Event personalization

Complete guide to using event properties to personalize Journeys.

Properties

Properties include user tags, External ID, subscription data, and app-level fields. They are: Use Properties when:
  • The value exists in OneSignal
  • The value is persistent
  • You reuse it across campaigns

Personalize with Properties

Learn how to reference stored persistent property data.

API custom_data

The custom_data field in the Create Message API lets you send message-specific values from your backend. This data:
  • Exists only for the current request
  • Is not stored in OneSignal
  • Is not available in Journeys
Use custom_data when:
  • Sending one-time or sensitive values (OTP, secure links)
  • Passing arrays (cart items, order lines, leaderboard scores)
  • Sending transactional or API-triggered messages

Personalize with API custom_data

Learn how to pass transient personalization data.

Dynamic Content CSV

Upload a CSV file into the OneSignal dashboard and reference its values using Liquid. Use CSV when:
  • Customizing differnt sections of a bulk campaign for each recipient
  • Translations or custom data for each recipient is exportable to a CSV file
  • You do not want to use the API

Dynamic Content CSV

Personalize dashboard campaigns using CSV uploads.

Detailed guides

Use the guides below for step-by-step implementation details and advanced examples.

Tutorials

These guides show how to implement personalization in practice.