
Real-time personalization in Braze comes down to when each value reaches a message: Liquid renders as the message is prepared for delivery, Connected Content calls your endpoint then, and context variables are set at Canvas entry. This guide maps each source to its moment and shows how to plan for values that arrive late or not at all.
Key Takeaways
- Braze renders Liquid when a message is prepared for delivery, so each value has its own age by then.
- Connected Content has a two-second response requirement, and GET responses are cached by default for up to five minutes.
- Context variables hold data for one Canvas entry and don't persist across Canvases.
- If an endpoint fails, Braze renders an empty string, so write the fallback before the personalised layer.
- Aborted messages don't count toward the send count, so review Messaging Observability after launch.
- Composer preview doesn't supply event-property values from a past event, so trigger the event or use a customised test send.
What does real-time personalization in Braze actually mean?
A message can carry a profile attribute, a context variable and a Connected Content response in the same sentence. Each reached the message by a different route, so each can be a different age. Calling the whole message real-time hides that.
We suggest setting a freshness budget for each value instead of for each campaign. Ask how old a value can be before it makes the message wrong, then pick the source that meets that budget.
Which personalization sources resolve at which moment?
The Braze documentation describes several routes for getting data into a message. The table below reads them side by side, using the pages for Connected Content, context variables and catalogs.
| Source | When it resolves | What the documentation says | Our suggested use |
|---|---|---|---|
| Profile attribute in Liquid | When the message is rendered | A background worker renders the Liquid template when the message is prepared to be delivered | Names, preferences and anything you already store |
| Context variable | At Canvas entry or in a Context step | Data from the event or API trigger can automatically populate context variables | Values that must stay tied to the event that started the journey |
| Connected Content | At render, from your endpoint | Braze calls the endpoint when the message is sent | Values that change faster than your profile updates |
| Catalog item | At render, through the items Liquid tag | Reference catalog items in your messages using the items Liquid tag | Reference data shared by many users, such as product details |
| Content Card | At first impression or display time | Rendered content can be generated at first impression or display time | Content that is read later than it is sent |
The pages describe when rendering happens. They don't say how quickly an update reaches the profile, so this post states no latency.
When does Braze render the Liquid in a message?
According to the Braze caching documentation, a background worker renders the Liquid template when the message is prepared to be delivered. Connected Content tags are evaluated during that rendering. For SDK-delivered channels such as Content Cards, the content can be generated at first impression or display time.
Rendered content for Content Cards is stored in a Braze database until the card expires. After delivery, the rendered message can persist on a user's device for an unknown amount of time.
Our reading is that freshness is fixed at render, not at read. A value that was correct at render can be old by the time someone opens the message. Write copy that stays true for as long as the message may sit on a device.
What limits how fresh Connected Content can be?
Connected Content pulls data from your own servers into a message at send time. The REST API page says Braze requires the server to respond within two seconds, so design the endpoint for low latency. Because Braze delivers messages at high volume, it also says your server must handle thousands of concurrent connections.
Some live values sit in a legacy system or a warehouse that can't answer that quickly. Our product engineering service covers bespoke middleware that connects systems of that kind.
Caching sets the other limit. GET requests are cached by default and POST requests are not.
The cache age is up to five minutes by default. The cache time runs from a minimum of five minutes to a maximum of four hours.
Cache settings aren't guaranteed. The documentation describes the durations as suggestions, so you may see more calls than the cache time implies. A cached response can also serve other users and campaigns in a workspace when the URL, content type and request body are the same.
You can prevent caching by adding the no_cache parameter, which means Braze makes a Connected Content request for every single message. The documentation advises checking that the endpoint can take large bursts of traffic first, or you will likely see increased sending latency.
How do context variables and catalogs differ from a live call?
Context variables are temporary pieces of data used within a user's journey through one Canvas. They can be populated at entry from the event or API trigger, or defined in a Context step. They don't persist across different Canvases, and each entry keeps its own independent context.
That makes a context variable the right home for a value that must stay as it was at entry, like a booking time. Fetching it again later would risk showing a newer value than the one the journey was built around.
Catalogs hold reference data that you load by file upload or through the API, and read with the items Liquid tag. They also power catalog triggers, such as back-in-stock and price drop notifications.
Our suggestion is to put data shared by many users in a catalog rather than behind your own endpoint. Your server then answers fewer calls, and the two-second response requirement matters for fewer messages.
What should the message do when live data is missing?
If the endpoint returns an error or times out, Braze renders an empty string in place of the Connected Content response. You can check whether the saved variable is null and then abort the message or show fallback content. For profile data, the Add Personalization tool inserts Liquid with optional default values so empty data doesn't break your copy.
Aborting is a documented option, and the abort documentation says the reason must be a string that cannot contain Liquid. An aborted send appears in Messaging Observability with the outcome Liquid abort. Braze doesn't count aborted messages toward the send count in your Braze account or in Currents.
We recommend writing the fallback first and aborting only when no acceptable fallback exists. Because aborted messages leave the send count, review Messaging Observability after launch, or a drop in reach will look like a smaller audience.
How would a hypothetical ticketing app choose its sources?
This section is illustrative. Take a hypothetical ticketing app for live events, which describes no client, no result and no real data. The sequence is our suggestion, not a documented Braze procedure.
The app sends a reminder the day before an event. The purchase event starts the Canvas, and the event name and start time are stored as context variables at entry. Each entry keeps its own independent context.
A customer who enters for two events gets two reminders, each naming the right booking.
Venue details come from a catalog, because they are shared by everyone attending that event.
Seat upgrade availability changes quickly. That one line comes from the app's own endpoint through Connected Content at send time, and the team accepts that it can be as old as the cache allows.
If the endpoint fails, the upgrade line renders empty, so the message checks for that and sends a plain reminder instead. The reminder never aborts, because a plain reminder is still useful. The team reviews the abort outcomes in Messaging Observability anyway, in case another message in the programme does abort.
How do you test personalization that depends on live data?
Use the same routine for every message that depends on live data, drawing on the Braze preview documentation:
- Preview as a custom user for each branch, including a user with empty values.
- Trigger the event or use a customised test send for event-property personalization, because composer preview does not automatically supply event-property values from a past event.
- Add default values before running Inbox Vision, because Braze templates an empty user when running it.
- Run a Canvas path preview with an existing user close to your scenario, because custom user isn't available for Canvas path preview.
- Send a test to a real device, since composer preview is one step in a quality assurance workflow, not the only check.
Two preview behaviours are easy to miss.
Time-based Liquid may evaluate against the current time in a preview, not the time the user would reach that step in production. Connected Content also executes during Canvas path previews. Calls that update external systems or user data can have side effects outside the test run.
Which mistakes undermine real-time personalization?
The first is trusting the word live. A value that arrives through a cache can be minutes old, and a rendered message can be read much later. Name the age you can tolerate for each value, then check the source meets it.
The second is what goes into the request URL.
Braze logs the fully rendered request URL and response status code for Connected Content calls, and keeps those logs for up to 30 days. We suggest choosing what the URL contains with that in mind. This post doesn't settle whether any identifier counts as personal data where you operate.
The third is calling an endpoint that changes data while previewing a Canvas. Remove or guard Connected Content that alters production data before you preview.
How does this connect to the rest of the programme?
Connected Content has several moving parts, so start with using Braze Connected Content for personalized campaigns. For the Liquid side, read how Braze Liquid tags drive personalization. For a wider view of what personalised messaging can do, see how to unlock hyper-personalization in Braze campaigns.
Push has its own personalization constraints, covered in personalizing push notifications in Braze. Event properties feed context variables, so tracking user events for better campaigns in Braze comes first. The journey that carries all of this is covered in how to automate mobile campaigns in Braze Canvas.
Our case study on a rewards platform migration covers a marketing automation rollout that included live Connected Content. As a Braze implementation partner, CustomerIK recommends writing down each personalised value's source, freshness budget and fallback before the copy is written.
Frequently Asked Questions
1. Does Braze render personalization when a message is sent?
According to the Braze documentation, a background worker renders the Liquid template when the message is prepared to be delivered. Content Cards differ, because their content can be generated at first impression or display time.
2. How fresh is Connected Content?
It depends on caching. GET requests are cached by default for up to five minutes, and the cache time can run from five minutes to four hours. The documentation says cache settings aren't guaranteed.
3. What happens if my Connected Content endpoint fails?
Braze renders an empty string in place of the response if the endpoint returns an error or times out. You can check for a null variable and then abort the message or show fallback content.
4. Do context variables persist after a Canvas?
They don't. They exist only within the Canvas session and do not persist across different Canvases or outside the session.
5. Can I test event-property personalization in the composer preview?
Not on its own. Composer preview does not automatically supply event-property values from a past event, so trigger the event or use a customised test send.
Sources
- Braze, REST API as a personalization source. Retrieved 19 Oct 2026.
- Braze, Cache Connected Content responses. Retrieved 19 Oct 2026.
- Braze, Abort Connected Content. Retrieved 19 Oct 2026.
- Braze, Context variables. Retrieved 19 Oct 2026.
- Braze, Preview personalization. Retrieved 19 Oct 2026.
- Braze, Catalog as a personalization source. Retrieved 19 Oct 2026.
- Braze, Dashboard tools for personalization. Retrieved 19 Oct 2026.
- This post rests on Braze documentation only. Behaviour and limits were read from the pages above on 19 Oct 2026, so check the current pages before you rely on them.
- Written by CustomerIK, a Braze implementation partner.
CustomerIK is a Braze implementation partner working across onboarding, technical integration, marketing operations and customer data management.
If your personalised messages depend on live data and you want the sources and fallbacks planned first, let's talk.




