Google Tag Manager

Forum Discussion

Nirnay's avatar
Nirnay
Expert
24 days ago

Challenges with Fetching Spam-Blocked Users from Braze

We've been working on identifying users who have marked our emails as spam, and it's proven to be significantly more complex than expected. Here's a breakdown of the key challenges we've run into:

  1. No current-state API — only raw event streams Braze doesn't expose a current-state endpoint for spam status. The only available data is a stream of raw events, which means you have to rely on a data warehouse to ingest and process potentially millions of event logs just to reconstruct user state.
  2. Spam status is reversible, requiring cross-referencing two large event tables Because a spam mark can be reversed, you can't simply collect spam events and call it done. Each spam event needs to be cross-referenced against send events to determine whether the spam status is still active — which means scanning two large tables on every run.
  3. Events arrive independently with no guaranteed ordering The spam event and the corresponding send event don't arrive together or at consistent times. A user might generate a spam event today and a related send event days later, making real-time or near-real-time processing unreliable.
  4. Certain Canvases allow sending to spam-blocked users, causing false positives Some Canvases are configured to bypass spam suppression and send to all users, including those who have marked messages as spam. This means a send event from such a Canvas can overwrite a user's spam status to false, producing false positives in any derived spam blocklist.
  5. Heavy infrastructure overhead All of the above ultimately requires building and maintaining a scheduled backend job that runs daily, pulling and processing large volumes of data from the warehouse — adding meaningful operational and compute cost.

Has anyone else run into these issues? Would love to hear how others are approaching this, or whether there are better patterns we haven't considered.

4 Replies

  • Nirnay​ 

    All very valid points you raise here! 

    Also curious how others are handling this and Braze's perspective here. Nirnay, have you tried submitting a support ticket with this information?

    Also curious what your goal is here. Are you trying to maintain a separate list or a separate database that has accurate spam status information for all users?

    • Nirnay's avatar
      Nirnay
      Expert

      Hey AllanHeoFNM​ , thanks for engaging on this!

      To answer your question on the goal: the driver is a practical support workflow. When a user stops receiving emails and contacts our customer support team, the agent needs to quickly determine whether that user is spam-blocked or hard bounced, and resolve it without pulling in a developer.

      Hard bounces are actually straightforward. Braze provides an API for that, so querying and removing users from the bounce list is simple enough. The real pain point is spam status, which is what prompted me to post here. There's no equivalent current-state API, which forces us down the Currents path with all the complexity I outlined above.

      I did raise a support ticket with Braze, but the response was essentially that there's no better native solution beyond what we're already working with i.e., raw event streams via Currents.

      I posted here specifically hoping someone in the community has found a cleaner approach to this, whether that's a pattern we haven't considered, a workaround. Would love to hear how others are tackling it.

      • TedScott's avatar
        TedScott
        Visionary

        What you can do is create a segment of users who have marked you as spam and use the segment API to pull that list, then you and query to see if they user is marked as spam (at least up to the point you last pulled the list).

        Not perfect, but it should server your purpose.