Designing high-intent abandonment in Braze is ultimately a data and orchestration problem: you need clean, mutually exclusive entry conditions, clear priority rules, and a way to keep users from bouncing between overlapping canvases.
Wunderkind Signals for Braze is designed to give you that control out of the box. Wunderkind resolves identity, evaluates high-intent behavior (cart, product, category, and catalog events), and then calls Braze’s Canvas Trigger API with a structured payload that your canvases can key off of via entry properties and segmentation logic.
Below is a practitioner-level walkthrough of how we architect these flows inside Braze so they’re scalable, debuggable, and conflict-free.
For each use case, Wunderkind sends a Signal into Braze with:
canvas_entry_properties object containing metadata like purpose, user type, and items Example entry properties (simplified):
"canvas_entry_properties": { "Origin": "wunderkind", "DataOnly": "Y", "UserType": "prospect", "WkChannel": "email", "WkPurpose": "cart abandonment", "Items": [ { "WkCopy": "Product name", "WkId": "012345", "WkImageUrl": "https://.../image.jpg", "WkUrl": "https://.../p/012345" } ] }json
We standardize campaign naming and tags across abandonment and catalog so you can filter and prioritize consistently:
Wunderkind - Cart Abandonment (tag wknd-email-cartabandonment)Wunderkind - Product Abandonment (tag wknd-email-prodabandonment)Wunderkind - Category Abandonment (tag wknd-email-categoryabandonment)wknd-email-backinstock, wknd-email-pricedrop, wknd-email-lowstock tags All campaign types share the same Items array schema in entry properties, which your Braze templates access via Content Blocks (for example, }) and Liquid loops to render dynamic product grids.
active_signal_email: enforcing cross-canvas priorityTo avoid users sitting in multiple Wunderkind-powered flows at once, we use a dedicated Braze custom attribute, active_signal_email.
Conceptually:
active_signal_email to the series key (for example, cart, product, category, back_in_stock, price_drop, low_stock) via a “Change User Attribute” step at the top of the Canvas.none or remove the attribute) in a final step, or via a separate Status Reset Canvas (described below).Each Canvas’ entry criteria then includes both:
active_signal_email either not set, or not set to a higher-priority program. You get a simple, auditable priority table:
Because this is enforced on the Braze side as a single custom attribute, it plays well with other vendors and native triggers: your cross-vendor suppression is simply “exclude users where active_signal_email is not null / not none” on any competing flows you want to keep out of the path.
We standardize entry logic via a base “Wunderkind Signal” Canvas template in Braze.
Key configuration:
/canvas/trigger/send by Canvas ID for each Signal. wknd-cartabandonment less than 1 day ago” or “Last received from wknd-prodabandonment less than 1 day ago.” Prospect vs. customer handling happens via a Decision Split immediately after entry:
UserType="prospect" or UserType="customer" via entry properties and/or use Braze segments for “Customer” based on purchase history. This gives you mirrored but independent flows:
You clone this template per campaign (cart, product, category, back-in-stock, price-drop, low-stock) and only adjust the messaging and, for catalog, the number of steps to match the shorter series.
A typical cart abandonment Canvas, built from the shared template, looks like this:
active_signal_email is null or not equal to cart.active_signal_email = "cart".active_signal_email (for example, set to none).Product and category flows are identical structurally; only the purpose and exit rules differ:
Catalog flows (back-in-stock, price drop, low stock) reuse the template but with only 2 messages per branch and with content pulled from catalog-driven Signals rather than abandonment behavior.
Over time you’ll have edge cases: users who drop out mid-flow, profiles left with stale active_signal_email values, or data backfills that need a clean slate. To handle this, we recommend a lightweight “Status Reset” Canvas that runs on a schedule or listens for a generic Wunderkind maintenance Signal.
Typical logic:
active_signal_email is not null AND they are not currently in any Wunderkind-tagged Canvas (for example, no “last received from wknd-… canvas” in the past N hours).active_signal_email to none (or remove the attribute).This keeps your priority system honest and prevents one bad attribute from blocking a user from re-entering legitimate flows later.
The architecture above isolates Wunderkind-powered flows without forcing you to replatform or retire existing programs:
bxid=} Link Template is applied to both Wunderkind and non-Wunderkind emails, so your onsite identity resolution benefits all traffic and Braze gets consistent identifiers in URLs. wknd, wknd-email-cartabandonment, etc.), making it trivial to build filters and reports like “exclude users currently active in any wknd-* Canvas” from another vendor’s journey. /users/export/ids, /email/status, subscription groups), so mailability logic stays native to Braze and applies evenly across Wunderkind and non-Wunderkind sends. active_signal_email is a Braze attribute, any vendor or native program can respect it. For example, you can add a simple entry filter “where active_signal_email is null or equals none” on batch promos or third-party cart flows to avoid collisions.The result is an architecture where Wunderkind handles identity and high-intent decisioning, while Braze remains the single source of truth for cadence, eligibility, and cross-channel orchestration. You get more send volume and revenue from abandonment and catalog programs—without duplicating flows across tools or fighting hidden conflicts.