
To extend Braze functionality, pick the extension point by two questions: which way the data moves, and how stale it may be. Data comes in through the SDK, the Braze API, Cloud Data Ingestion or Data Transformation. It goes out through webhooks and Currents, arrives at render time through Connected Content, and runs on screen through the JavaScript bridge.
Key Takeaways
- Choose each Braze extension point by which way the data moves and how stale it may be.
- Batch /users/track updates, because each request can carry up to 75 objects across attributes, events and purchases.
- Connected Content calls your endpoint as each message renders, so size the endpoint for your largest send.
- Braze retries webhooks only for certain responses, such as 408, 429 and 5XX, so monitor the receiving system for client errors.
- Currents delivers at least once, so deduplicate on the event id field.
- In custom HTML, call the JavaScript bridge's click method explicitly, or click reporting for that message stays empty.
What does it mean to extend Braze functionality as a developer?
Braze already exposes a set of documented extension points, each with its own delivery behaviour. The developer's job is to choose the right one for each integration, then build for how that point behaves when something fails.
Frame the choice around direction and timing. Direction asks whether data is entering Braze, leaving it, being fetched into a message as it renders, or running on the user's screen. Timing asks how old the data can be by the time it's used.
Getting those two answers wrong is the expensive mistake. A render-time lookup used where a nightly sync would do adds load to your own endpoint on every send. A batch sync used where the message needs the current state sends a figure that was right yesterday.
Which extension point fits which job?
Each row below is a documented extension point. The last column is the behaviour to design around, which is where most of the build effort belongs.
| Extension point | Direction | When it runs | Design around |
|---|---|---|---|
| SDK | Into Braze | As the user acts | Unsent events are stored on the device and retried after reconnecting, with no time-based cutoff |
| REST API, /users/track | Into Braze | When your system calls | Up to 75 objects per request across attributes, events and purchases |
| Cloud Data Ingestion | Into Braze | On a schedule or on demand | The shortest dashboard interval is 15 minutes by default; an endpoint triggers a sync on demand |
| Data Transformation | Into Braze | When a third party sends a webhook | Writes through /users/track and logs data points the same way |
| Connected Content | Into a message | As the message renders | Get requests cached by default; retry not available for in-app messages or Banners |
| Webhooks | Out of Braze | When a message step sends | Retried only for certain responses; most client errors are not retried |
| Currents | Out of Braze | Continuously | At-least-once delivery, so duplicates can occur |
| JavaScript bridge | On screen | When the user interacts | Clicks in custom code need an explicit call to be logged |
The table also shows what is missing from a single integration. Plan for at least one inbound path, one outbound path and a decision about render-time data.
How should data get into Braze?
Use the SDK for anything the user does in your app, because it is closest to the action. Braze documents that the Android, Swift and Web SDKs store unsent events on the device and retry them after reconnecting, with no time-based cutoff. Late events are therefore normal, and any downstream model should accept them.
Use the Braze API when your own systems hold the truth. Each /users/track request can carry up to 75 objects combined across attributes, events and purchases. Batch updates up to that ceiling rather than sending one call per change, so the request count stays low.
Use Cloud Data Ingestion when the data already lives in a warehouse. By default the shortest dashboard interval is 15 minutes, and an endpoint lets you trigger a sync when your warehouse job finishes. Trigger on job completion where you can, because a fixed schedule can start while a table is still loading.
Use Data Transformation when a third-party platform can send webhooks and you can't change its code. It turns the webhook payload into Braze API requests with JavaScript, and the rate limit is 1,000 incoming requests per minute per workspace. Its writes log data points just as a direct /users/track call would, so budget for them.
Our guide to integrating CRM data into Braze goes deeper on choosing which fields to sync. Event naming is covered in tracking user events in Braze.
When should a message fetch data as it renders?
Fetch at render time only when a stale value would make the message wrong. Connected Content calls your endpoint as each message renders, so it suits offers, balances and stock that change between sync runs. Everything else is cheaper to sync ahead of time.
Braze documents that Connected Content supports get and post requests, and Banners support get requests only. Get requests are cached by default, and post requests are cached only when you set a cache age. The cache age can run from five minutes to four hours.
Both of these forms come straight from Braze's documentation.
{% connected_content https://api.example.com/user :save user_data %}
{% connected_content https://example.com/webservice.json :cache_max_age 900 %}
Your endpoint carries the load, and that's the part to plan. Braze applies no separate rate limit of its own to Connected Content, and messages send in parallel across your campaigns and Canvases. Size the endpoint for your largest send, not your average one.
Retries need the same care. The retry option isn't available for in-app messages or Banners. In a Canvas Message step, if every retry fails, the message is aborted and the user advances to the next step.
How should Braze send data out?
Use webhooks when a message step should cause an action in another system. Braze retries webhook delivery only for certain responses, such as 408, 429 and 5XX. Most other responses, including 401 Unauthorized, are not retried.
Design for that last detail first. An expired credential on the receiving side typically returns a 401, so those webhooks aren't retried. Monitor the receiving system's error rate, not just Braze's send count, and rotate credentials before they expire.
If most requests to one host fail, Braze temporarily defers all sends to that host and resumes after a cooldown. That protects your system, and it also means a bad deploy on your side can pause every webhook sent to that host.
Use Currents when you need Braze event data in a warehouse or analytics tool. Currents delivers at least once, so duplicates can occasionally be written. Deduplicate on the event id field that ships with every event, and process files as they arrive rather than rescanning old partitions.
Timestamps are exported in Coordinated Universal Time, and late events can arrive with no maximum window. Model both before anyone builds a daily report on the data.
What about code that runs on the user's screen?
Custom HTML in-app messages and Banners can talk to the Braze SDK through a JavaScript bridge. That's how a custom layout reports what the user does back to Braze. Landing pages gained a JavaScript bridge as well, listed as generally available in the August 20, 2026 release notes.
The catch is click tracking. In custom HTML the SDK can't attach click listeners to your elements by itself, so the bridge's click call has to be made explicitly. Treat a missing click call as a release blocker, because without it the click reporting for that message is empty.
Our post on creating engaging in-app messages covers when custom HTML is worth the extra build.
In what order should you choose an extension point?
Work through these questions in order for each integration, and stop at the first one that settles it.
- Does the data start with a user action in your app? Use the SDK.
- Does your own system hold the truth and change it on its own schedule? Use the Braze API, batched.
- Does the data already sit in a warehouse? Use Cloud Data Ingestion, triggered when the load finishes.
- Does a third party only offer webhooks? Use Data Transformation.
- Would a value synced earlier make the message wrong? Use Connected Content, sized for your largest send.
- Should a send cause an action elsewhere? Use a webhook, and monitor the receiver.
- Do you need the event history outside Braze? Use Currents, and deduplicate on the event id.
Write the answer down for each integration with an owner. The written list is what lets someone else debug a failure much later.
Where does this connect to the rest of the programme?
Render-time data is one of the patterns in seven ways to deliver dynamic content. The API-triggered sends that many integrations end in are covered in automating transactional emails.
As a Braze implementation partner, CustomerIK recommends deciding direction and staleness for every integration before choosing a tool. The tool follows from those two answers, and so does most of the error handling.
Frequently Asked Questions
1. Does Data Transformation log data points?
Braze says it does in most cases. Each transformation ends in a /users/track call, which logs data points as if you had called the endpoint directly.
2. Can Connected Content retry a failed call in an in-app message?
It can't. The retry option isn't available for in-app messages or Banners, so design those messages to read well when the call fails.
3. Which webhook failures does Braze retry?
Braze retries only certain responses, such as 408, 429 and 5XX. Most other responses, including 401 Unauthorized, are not retried.
4. Can Currents send the same event twice?
Yes, occasionally. Currents provides at-least-once delivery, so deduplicate on the id field sent with every event.
5. How many objects can one /users/track request carry?
Up to 75 objects combined across attributes, events and purchases. Each object updates one user.
Sources
- Braze, Data Transformation. Retrieved 14 Oct 2026.
- Braze, Webhooks. Retrieved 14 Oct 2026.
- Braze, Currents event delivery semantics. Retrieved 14 Oct 2026.
- Braze, Make a Connected Content call. Retrieved 14 Oct 2026.
- Braze, Cache Connected Content responses. Retrieved 14 Oct 2026.
- Braze, Connected Content retries. Retrieved 14 Oct 2026.
- Braze, Custom code and JavaScript bridge for Banners. Retrieved 14 Oct 2026.
- Braze, API limits. Retrieved 14 Oct 2026.
- Braze, Cloud Data Ingestion. Retrieved 14 Oct 2026.
- Braze, What's new in Braze. Retrieved 14 Oct 2026.
CustomerIK is a Braze implementation partner working across onboarding, technical integration, marketing operations and customer data management.
If you're planning a Braze integration and want the extension points mapped before the build, let's talk.




