Hey! Just to clarify on the CDI point- you're not limited to attribute updates only. CDI actually supports syncing **custom events** and **purchase events** directly from your data warehouse into Braze, so you don't necessarily need to introduce additional hops via Snowflake External Functions or a Segment Source Function for this use case.
From the Braze docs on [Supported Data Types](https://www.braze.com/docs/user_guide/data/unification/cloud_ingestion/#supported-data-sources):
> CDI supports: User attributes, **Custom events**, Purchase events, and User deletion requests.
So for your `first_did_action_event` scenario, you could set up a CDI integration pointing at your Snowflake table (which updates every 5 mins) and have Braze ingest that as a real tracked **custom event** on the user profile — which then lets you:
- Trigger action-based Canvas entry off that event
- Remove users from nudge flows via exit criteria
- Use it for future campaign triggers as needed
This keeps the architecture clean and native:
Snowflake table (5 min refresh)
→ Braze CDI sync
→ Custom event on user profile
→ Canvas trigger / journey
Your Snowflake External Function → Segment Source Function approach could still work, but CDI alone should cover this without the extra complexity. Worth validating the sync frequency (CDI minimum is every 15 mins) against your 5-minute Snowflake refresh window to make sure the timing works for your use case.
Hope this helps! 🙌