Reporting and Analytics
45 TopicsStrategy to Identify Duplicate Profiles
We needed to identify and merge duplicate Braze profiles (same email, different user IDs) across our entire user base. We evaluated two solutions. Solution 1: Identify duplicate profiles via /users/export/ids and attach a custom attribute for segmentation Export each profile, identify duplicates externally, then update profiles with a custom attribute is_duplicated=true and capture them via a segment. {% connected_content https://rest.au-01.braze.com/users/export/ids :method post :headers { "Authorization": "Bearer XXXX" } :body {"email_address":"{{${email_address}}}"} :content_type application/json :no_cache :save result %} {% if result.users.size == 1 %} {% abort_message('User is unique.') %} {% endif %} { "attributes" : [ { "braze_id" : "{{${braze_id}}}", "is_duplicated": true, "_update_existing_only" : true } ] } One caveat with this solution is that we need to export the entire user base, and it will take a couple of days to identify the duplicates. Solution 2: Identify the duplicate profiles via a Segment extension Key Assumptions: Every profile in Braze has at least one entry in USERS_BEHAVIORS_SUBSCRIPTION_GLOBALSTATECHANGE_SHARED (i.e., all profiles have a subscription state change event) Every deleted profile appears in USERS_USERDELETEREQUEST_SHARED Here's the query we're using: -- Purpose: Identify duplicate Braze profiles (same email, different user IDs) for merging via /users/merge endpoint -- Excludes deleted/orphaned users and only returns duplicates where 2+ active profiles remain WITH active_users AS ( -- Get unique user/email pairs, excluding deleted/orphaned users SELECT u.USER_ID, u.EMAIL_ADDRESS FROM USERS_BEHAVIORS_SUBSCRIPTION_GLOBALSTATECHANGE_SHARED u LEFT JOIN USERS_USERDELETEREQUEST_SHARED d ON u.USER_ID = d.USER_ID WHERE u.EMAIL_ADDRESS IS NOT NULL AND d.USER_ID IS NULL -- Exclude deleted/orphaned users GROUP BY u.USER_ID, u.EMAIL_ADDRESS -- Dedupe since source table contains multiple events per user ) SELECT DISTINCT a.USER_ID FROM active_users a INNER JOIN ( -- Find emails with more than one active user profile SELECT EMAIL_ADDRESS FROM active_users GROUP BY EMAIL_ADDRESS HAVING COUNT(*) > 1 ) dup ON a.EMAIL_ADDRESS = dup.EMAIL_ADDRESS; Key findings: This query only takes a couple of minutes to identify duplicates USERS_USERDELETEREQUEST_SHARED contains both explicitly deleted users AND users orphaned via /users/merge - this means the query automatically excludes already-merged profiles. Looks like Braze prunes orphaned profiles after /users/merge is performed. Has anyone else taken this approach? Curious if there are edge cases we should watch out for.62Views0likes2CommentsBraze MCP Server - Prompts and Use Cases
Hey all, I was very excited to see the release of the Braze MCP server and set it up with Claude this morning. It's very impressive, so far I've gotten nice analytics reports for overall Canvas performance, but limited to 14 days at a time with the canvas data series analytics API, or to ask for the 'top performing Push campaigns for July 2025'. I wanted to hear some other prompts people were using to get reporting value quickly from Braze. I also was interested to pull in messaging templates (Email, IAM) and see how well it could add/edit liquid. Disclaimer: Of course don't give the MCP API key more than read access while we play around with the functionality as we don't want it to go and edit anything in Prod!160Views4likes4CommentsHow to tell a recipient's bounce status in an export?
I am using the Braze export API to pull down recently added users, and want to check if any of them are marked as hard bounce, or have already accumulated any soft bounces (and if so, in what time period). Similarly, I'd like to be able to tell if a user has marked as spam. Is there an attribute capturing this information that I'm overlooking? Or is the best/only solution to create segments for those attributes and make multiple requests. Thanks!42Views0likes3CommentsSegment Users with Generalized Interactions
I can see how to segment for Users who have opened an email from or clicked a link in a specific campaign. Is there a way to see Users who have received / clicked for any campaigns, either in general or within a given date range? Thanks!Solved22Views0likes2CommentsAbandoned Cart Journey and Revenue Calculation
We have launched an Abandoned Cart Journey (Canvas) for an eCommerce site and we are setting it up with this configuration "Cart Updated" event as entry criteria "Cart Updated" event as exit criteria to support moving the "Abandoned Cart" email delay to start at the last time the user updates the cart "Make Purchase" event as exit criteria to not email folks who made a purchase and "Purchase" as the conversion event and Two Abandon Cart emails with a X and Y duration delay After we launched this journey, we are finding that the revenue reported in canvas reflects the full revenue of the site and not just the revenue from folks who have received an abandoned cart email. This is because all e-commerce buyers will have "Cart Updated" events and hence will be added to this journeys. Customers who finish making the purchase will be removed from this journey due to the exit criteria but are still considered as part of the conversion event and revenue calculation. Is there a way around this? Is the roadmap feature for "Deeper Conversion Attribution" in the Planned Set aimed at solving this?107Views1like4CommentsHelp with Query around custom event properties
Hey all! Trying to run a query to output volume of a specific custom event (with a specific property) performed by users who entered a specific canvas. I'm using the USERS_BEHAVIORS_CUSTOMEVENT_SHARED table, which includes event "name" and "properties" (according to the documentation --- Custom properties of the event stored as a JSON encoded string). I managed to output the total event occurrences but got stuck when it came to filtering by event property and pretty sure it's a syntax issue... Query - Total Voucher Redemptions: This looks at total "Voucher Redeem" events from users who entered the specified canvas. WITH canvas_users AS ( SELECT DISTINCT user_id FROM USERS_CANVAS_ENTRY_SHARED WHERE canvas_api_id = 'XXXXXXXXXXXXXXXXXXXXXXXX' ), voucher_redeems AS ( SELECT DISTINCT user_id FROM USERS_BEHAVIORS_CUSTOMEVENT_SHARED WHERE name = 'Voucher Redeem' ) SELECT COUNT(DISTINCT cr.user_id) AS users_redeemed_voucher FROM canvas_users cr JOIN voucher_redeems vr ON cr.user_id = vr.user_id; Query - Filter by specific property: I need to basically filter above to only include event occurrences where the "Voucher Redeem" property "campaign_name" matches a specific string. Just can't figure out how to do it. Chat GPT advised me the following, but I get zero results. WITH canvas_users AS ( SELECT DISTINCT user_id FROM USERS_CANVAS_ENTRY_SHARED WHERE canvas_api_id = 'XXXXXXXXXXXXXXXXXXXXXXXX' ), voucher_redeems AS ( SELECT DISTINCT user_id FROM USERS_BEHAVIORS_CUSTOMEVENT_SHARED WHERE name = 'Voucher Redeem' AND REGEXP_LIKE( PARSE_JSON(properties):campaign_name::STRING, '[XXXX]' ) ) SELECT COUNT(DISTINCT cr.user_id) AS users_redeemed_voucher FROM canvas_users cr JOIN voucher_redeems vr ON cr.user_id = vr.user_id; Has anyone successfully queried event properties and can shed some light on the solution here? Much appreciated!159Views1like3CommentsTracking Comms Cadence Across Manual and Automated Messages
I'm looking to get a sense of the average comms cadence our members typically receive. It’s a bit tricky to assess since our messaging is highly targeted and includes a mix of automated and manual communications. Just wanted to see if anyone else has successfully tackled this—I’d love to hear what’s worked for you!78Views1like3CommentsReporting for Canvas steps
Hi all, We’re currently exploring how to build a reporting pipeline from Braze to our data warehouse and would like your input. Specifically, we’re trying to track the journey a contact takes through a Braze Canvas: from entry to any conversion or exit, and export this data for analysis. Our objectives: Understand which steps a contact entered, converted on, or exited from. Capture timestamped events (ie. entry, conversion, exit, etc.) in a way that allows us to reconstruct the user’s path. Push this data into our data warehouse for reporting. We believe the following Currents event tables might be useful: USERS_CANVAS_ENTRY_SHARED USERS_CANVAS_CONVERSION_SHARED USERS_CANVAS_EXIT_MATCHEDAUDIENCE_SHARED USERS_CANVAS_EXIT_PERFORMEDEVENT_SHARED Possibly: USERS_CANVAS_EXPERIMENTSTEP_* for A/B paths We’d like to confirm: Are these the correct tables for capturing the step-by-step journey through a Canvas? Are there best practices for joining or correlating this data in our data warehouse? Should we stream this via Braze Currents, or is there a better approach for deeper Canvas-level reporting? Any advice, sample schemas, or learnings from similar setups would be hugely appreciated! Thanks, Coralie89Views0likes1CommentUser Data Export with callback endpoint
Hey hey! Hope y'all doing well. Has anyone ever exported User Data using not currents but a callback endpoint? I'm currently trying to automate exporting user data from a given segment using a callback endpoint. I'm using a Pub/Sub topic in GCP to do this. The problem is that I don't fully understand the mechanisms on how Braze publishes the URL to download the folder containing the user data in the payload response, after the API call. For example, if I'm exporting a big segment (10k+), the response from Braze is immediate: { "message": "success", "object_prefix": "812ad47c-451b-4d0a-b158-6d33713ba07b-1734705464", "url": null } But the URL is still not available (probably due to the size of the segment). My idea was to set a Pub/Sub topic which would be populated with the URL once it is ready, but I don't know what is the mechanism that Braze uses to update the URL in the payload response. I know it's a narrow specific problem, but any ideas, suggestions, or provocations would be of amazing enlightenment to me. Thank you!130Views0likes2Comments