Receive lifecycle events in Braze
Each recipe sends one Braze custom event. A Canvas that starts on that event sends the message.
All lifecycle guides · Checked against AXO’s adapters in October 2026.
Before you start
Connect Braze in AXO first: see Connect Braze. The integration must be active. In the dashboard, the Install button is off for read-only members.
When AXO sends
A recipe is installed as an ordinary AXO trigger, turned off. Once you turn it on, AXO watches for the moment, waits where the recipe waits, skips people who converted or are in their cooldown, and sends the event. Every lifecycle event needs the person’s marketing consent. A holdout group gets nothing so that the trigger’s lift can be measured. Event names:
- Abandoned cart:
axo.lifecycle.abandoned_cart - Abandoned browse:
axo.lifecycle.abandoned_browse - Abandoned checkout:
axo.lifecycle.abandoned_checkout - High-intent return:
axo.lifecycle.high_intent_return - Lapsed visitor:
axo.lifecycle.lapsed_visitor
Non-retail verticals
AXO recipes work across industries beyond retail by mapping equivalent conversion stages into lifecycle events:
- Higher education: Admissions funnels emit
application_abandoned. Theitemslist carries the academic degree or certificate program name, whileresume_urlreturns the applicant directly to their authenticated form session. - Healthcare and clinical services: Scheduling funnels emit
appointment_abandoned. The payload carries the department or specialty name and booking link. Diagnostic details and health history are never included. - Financial services and SaaS: Quoting funnels emit
quote_in_progress. Theresume_urlrestores the visitor’s unfinished calculation directly in the multi-step form.
See Create a trigger for cooldowns, holdout and fire history.
Build the receiving side
AXO posts the event to Braze’s /users/track endpoint with the person’s external id. Braze users are keyed by external id, so a person without one in AXO is skipped for this destination (the fire history shows braze_no_external_id). Set Who to send to to External ID when you install, so the recipe picks the people Braze can receive. Fields with no value are left out of the event.
- In AXO, install the recipe with your Braze integration as a destination. It is installed turned off.
- On the trigger, choose Test fire, enter a test external id, choose Preview payload to check it, then Send test and Send now. The custom event shows up in Braze once the first one arrives.
- In Braze, create a Canvas with an action-based entry and choose Perform custom event with the recipe’s event name.
- Build the message steps. Read the event’s fields with
canvas_entry_properties, as in the example below. - Launch the Canvas, then turn the trigger on in AXO (Turn on right after install, or Resume on the trigger).
{# Touch 1 (1 hour delay): Cart reminder #}
<h2>Items are waiting in your cart</h2>
<p><a href="{{canvas_entry_properties.${resume_url}}}">Return to your cart</a></p>
{% for item in canvas_entry_properties.${items} %}
<div>{{ item.name }}</div>
{% endfor %}
{# Touch 2 (24 hours delay): In-app push or SMS reminder #}
Your cart is still saved: {{canvas_entry_properties.${resume_url}}}
{# Touch 3 (48 hours delay): Final reminder email #}
<h2>Final notice: your saved cart</h2>
<p><a href="{{canvas_entry_properties.${resume_url}}}">Complete your purchase</a></p>The custom event name is the event name below unless you enter a different event name when you install. To identify users by email address or user alias instead of an external id, set mapping.braze_identifier to user_alias (with braze_alias_label: 'email') when configuring the destination.
Fields
Event properties, read in a Canvas as canvas_entry_properties.${field}.
| Field | Type | Meaning |
|---|---|---|
event_name | text | The canonical event name, also when you rename the metric or event. |
recipe_id | text | The recipe that fired. |
recipe_version | number | The recipe version the trigger was installed with. |
fire_id | text | AXO’s id for this send attempt. |
delivery_id | text | The same on every attempt for one moment and one destination. Use it to drop duplicates. Test sends start with lcd_test_. |
items | list | List of line items or viewed products, each with the item fields below. |
item_count | number | Number of entries in items. |
cart_value | number | Cart value as a number, or null when unknown. |
currency | text | ISO 4217 code such as USD, or null. |
resume_url | text | A link back to the cart or page. Real sends carry a vt_token that signs the person back in; test sends carry the plain link. |
page_url | text | The page that started the moment. |
Item fields
Each entry in items has these fields.
| Field | Type | Meaning |
|---|---|---|
product_id | text | Product id (the numeric Shopify id for Shopify catalogs). |
sku | text | SKU. |
name | text | Product name. |
url | text | Product page URL. |
image_url | text | Product image URL. |
price | number | Price as a number. |
previous_price | number | Always null for now. It will hold the price before a drop once the catalog keeps price history. |
currency | text | ISO 4217 code. |
availability | text | Availability text from the catalog, such as in_stock. |
quantity | number | Quantity in the cart. Null for viewed products. |