Hi everyone,
I’d love to hear how you are handling Connected Content/API enrichment at larger scale, particularly when product data is not stored directly in Braze.
In our setup, product catalogs currently live outside Braze. We receive user/event data from Snowflake, including specific product IDs, and then need to enrich those products with the latest market-specific information before sending a message:
- Product name
- Image
- Current price
- Discount percentage/value
- Availability and other product attributes
We currently retrieve much of this through Connected Content/API calls during message rendering.
On top of the main product enrichment, some of our reusable Content Blocks also make additional API calls, for example to retrieve categories, best-selling products, recommendations, etc.
As a result, some templates can contain up to ~4 API calls per user.
At our scale, with millions of users going through Canvases, this can translate into tens of millions of API requests per day, since the enrichment is evaluated as users are processed.
We’re now looking at how we could redesign this more efficiently.
A few approaches we are considering:
1. Moving enrichment earlier into a Canvas Context step
Instead of making the calls inside the message template, retrieve the necessary data earlier and store it as Context variables that can then be reused by subsequent message steps.
This would make the message templates much cleaner, but I’m wondering how much it actually reduces API load if the Context step is still processing the Connected Content call per user.
2. Making better use of Connected Content caching
Many users can reference the same product and market combination, so theoretically identical requests could benefit significantly from Braze caching.
I’m particularly interested in how others structure endpoints/request URLs to maximize cache reuse and what cache_max_age strategies you use when product information needs to remain relatively fresh.
3. Consolidating multiple calls into one enrichment endpoint
Instead of having multiple Content Blocks independently call different services, we could potentially have one API call return all the information required for the message — product data, category information, recommendations, etc.
4. Enriching the data before it reaches Braze
Another option would be doing more of this enrichment upstream, for example in Snowflake, and passing the enriched object into Braze with the triggering event rather than retrieving everything at send time.
The trade-off here is obviously freshness vs scalability especially for price and discount information, where we want the data as close as possible to send time.
I’d be very interested to hear from anyone operating a similar architecture:
- How do you handle product enrichment when the product catalog itself isn't in Braze?
- Do you perform Connected Content calls directly inside message templates or earlier in the Canvas?
- Have Context variables helped you reduce repeated enrichment calls across a journey?
- How aggressively do you use Connected Content caching at scale?
- Have you built an aggregation/BFF-style endpoint specifically for Braze so that one request replaces multiple Connected Content calls?
- Or did you eventually move toward Braze Catalogs / pre-enrichment instead?
Especially interested in experiences from teams handling high-volume product-driven messaging.
Thanks!