Blog
One signup event, fan-out to GA4, Meta, your CRM, and your warehouse, with consistent dedup and consent.
A newsletter signup is one of the cleanest events to test a fan-out pattern on: low frequency, high value, easy to verify in each destination. Once it works for newsletter signups, the same pattern scales to every other event type.
When the user submits the newsletter form, the page pushes one event into the data layer:
dataLayer.push({
event: 'newsletter_signup',
event_id: crypto.randomUUID(),
user_data: { email_address: emailInput.value },
source: 'footer_form'
});
In your client GTM, a single tag fires on this event and forwards to your tagging server. No fan-out happens client-side. The server container does all of it.
In your server container, four tags fire on the same event:
| Destination | Configuration |
|---|---|
| GA4 | Event name: newsletter_signup. Mark as conversion in GA4 admin. |
| Meta CAPI | Event name: Lead. Hashed email as user_data.em. |
| Klaviyo / your CRM | Webhook to subscribe endpoint with email as parameter. |
| Warehouse | Webhook to your BigQuery streaming insert. |
If the user has not granted marketing consent, the Meta tag should not fire. Use a Custom Variable that returns the consent state and add it as an exception trigger on the marketing-related tags.
GA4 (with consent mode signals) and your warehouse can usually fire regardless. The CRM signup is implicit consent for transactional emails (the user just submitted a form to receive emails) and can fire as well, but only the transactional CRM event, not the marketing-list one.
After firing a real signup, check each destination separately:
If any one fails, you know exactly which tag to look at. The fan-out pattern keeps blast radius small for any single destination's bugs.