ZapBounce and Braze

Braze orchestrates email, push, SMS and in-app messaging from a single user profile. That makes an email verdict a channel-routing input rather than a list filter.

A user whose email address cannot be confirmed is still reachable by push if they have the app installed, which is information the campaign should act on.

Treating email failure as user failure wastes other channels

In an email-only tool, an unusable address means the user is unreachable. In Braze it means one channel of several is unavailable.

Campaigns built as email-first with no fallback silently lose those users, and the reporting shows it as low email engagement rather than as a channel-availability problem.

Braze's Canvas supports exactly this branching, which makes the failure avoidable rather than inherent.

How the data moves

  1. Send the verdict as a custom user attribute

    Through the users track endpoint, so segments and Canvas branches can read it.

  2. Branch the Canvas on channel availability

    Email for confirmed addresses, push or SMS for users whose email cannot be confirmed.

  3. Verify at identification, not at campaign time

    The attribute should already be there when a campaign is built, rather than triggering a lookup.

  4. Re-verify on a schedule

    Addresses decay, and a Canvas built on a year-old attribute is routing on stale information.

Setting it up

  1. Create a custom attribute for the verdict and one for the check date.
  2. Verify addresses at user identification and send the attribute through the track endpoint.
  3. Build Canvas branches that route on the verdict rather than filtering.
  4. Send push or SMS to users whose email cannot be confirmed, where those channels are available.
  5. Backfill existing users in batches through the API.
  6. Schedule a quarterly re-verification and update the attribute.

Braze: common questions

Should an unusable address exclude a user from a campaign?

No. Route them to push or SMS. Braze exists to make that branching easy.

Where does the verdict live?

A custom user attribute, so segments and Canvas branches can both read it.

How often should it refresh?

Quarterly. A Canvas routing on a year-old attribute is making decisions on stale data.

Forty thousand app users and one decision step

Say your fitness app has 40,000 identified users in Braze and a win-back Canvas that opens with an email. You backfill a verdict attribute and the split looks like this: 29,600 valid, 3,100 invalid, 5,900 catch-all and 1,400 unknown. Before the backfill, all 40,000 entered the email step, and the 3,100 dead addresses fell out of the funnel as bounces.

Now put a decision step ahead of the email. Users with a valid result get the message. For the 3,100 invalid rows, you check who has a push token, and suppose 1,900 of them do. Those 1,900 get the win-back as a push notification where before they got nothing. The other 1,200 have no working channel at all, and now you know the number.

Catch-all and unknown users still get the email, with push as the follow-up if nothing is opened in three days. Nobody can confirm those mailboxes, so try them and watch what bounces.

Sizing the backfill, and one attribute to leave alone

Braze's users track endpoint takes attribute objects in batches, 75 per request at the time of writing, so check their docs before you size the job. A 40,000-user backfill is about 534 requests. That still counts against your API rate limit, so run it off-peak.

Send two attributes per user: the result as a string and the check date as a real date. A typed date lets you build a segment such as "checked more than 90 days ago", which is how the re-verification job finds its own work.

Don't let the verdict change a user's email subscription state. Subscription state records consent, and a verdict says nothing about consent. If you flip invalid users to unsubscribed, you lose the difference between a person who opted out and an address that stopped working, and you'll want that difference the day the user corrects their email in the app. Braze already stops mailing addresses that hard bounce, so the attribute's job is routing.

Check a Braze export today

100 free checks a month, no card. Unknown results and duplicates are never billed.