Skip to content

Braze

Fromenance is a communication provenance platform, and the Braze adapter turns Currents users.messages.email.Send and users.messages.email.Delivery events into registrations. Braze does not expose the rendered body, so the adapter uses the reserve flow: Connected Content reserves a code during rendering, stores it on the user, and Liquid places it in the footer.

By the end you will have a Braze source, a Currents connector or webhook posting email events to it with the bearer token, the Connected Content call in your template, and events showing on the source’s health panel.

Terminal window
curl -X POST https://api.fromenance.com/v1/sending-sources \
-H "Authorization: Bearer fr_live_..." \
-H "Content-Type: application/json" \
-d '{"name":"Braze campaigns","kind":"braze","expected_daily_volume":120000}'

The response includes webhook_url and a secret. Braze authenticates outbound HTTP with a header you configure, so set Authorization: Bearer <secret> on the connector.

Currents (HTTP connector)

  1. Braze, Partner Integrations, Data Export, Currents, Create new Current, HTTP.
  2. Endpoint URL: the webhook_url from step 1.
  3. Headers: Authorization with value Bearer whsec_... (the source secret).
  4. Events: Email Send and Email Delivery. Other events are ignored.
  5. Save. Currents batches events, so expect a delay of up to a few minutes rather than seconds.

Webhook campaign step (when Currents is not on your plan)

Use a webhook message step after the email step that posts the event fields listed below to the webhook_url with the same Authorization header. The body must be one JSON event or { "events": [...] } with event_type set to users.messages.email.Send.

Every request must carry Authorization: Bearer <source secret>; Fromenance compares it in constant time and rejects anything else with 401, incrementing signature_failures. Bodies may be a single event or { "events": [...] }. Events whose type does not match email.Send or email.Delivery are ignored.

From each event’s properties:

Registration field Braze field
message_id dispatch_id, else send_id
recipient (hashed immediately, never stored) email_address
sent_at time (Unix seconds)
verify code fromenance_code
template_id message_variation_id
campaign_id campaign_id, else canvas_id
content fingerprint not available from Braze

3. Reserve with Connected Content and place the code with Liquid

Section titled “3. Reserve with Connected Content and place the code with Liquid”

Call the reserve endpoint from the template with Connected Content, save the code as a custom attribute so the event can carry it, and print it in the footer:

{% connected_content https://api.fromenance.com/v1/communications/reserve
:method post
:headers {"Authorization": "Bearer {{ 'FROMENANCE_API_KEY' | secret }}", "Content-Type": "application/json"}
:body {"template_id": "{{campaign.${name}}}", "provider": "braze"}
:content_type application/json
:save fromenance %}
Not sure this email is from Northfield Bank? Forward it to verify@northfieldbank.example
or enter code {{fromenance.verify_code}} at northfieldbank.example/verify. Reference: {{fromenance.verify_code}}

Store the key with Braze’s secret management rather than inline. Because Liquid renders before the recipient is known to Fromenance, the reservation is made without recipient_hash; the Send event binds the recipient when it completes the reservation. To carry the code on the event, set the custom attribute fromenance_code on the user in the same campaign (a User Update step, or the /users/track API from your side) so it appears in properties.fromenance_code. Where that is not possible, the Send event still registers the message with a fresh code and the customer’s forward matches by recipient plus fingerprint only.

  • Send test event on the source runs a synthetic Email Send event through the adapter.
  • Send a test message from the campaign to yourself. Because Currents batches, allow a few minutes, then check health.completed.

Set silence_alert_minutes above the Currents batching interval and your quietest sending window. reserve_to_complete_ratio well below 1 means Connected Content is reserving but the event does not carry fromenance_code; check the custom attribute. Rotate the secret with POST /v1/sending-sources/{id}/rotate-secret and update the connector header.