FAQ
Why dataLayer.push instead of direct fbq('track', ...)?β
Direct fbq tags only Meta in the browser. You lose:
- Forwarding to GA4 and Google Ads
- Server-side (CAPI)
- Pixel/CAPI dedup
- Routing N events to M platforms (every new platform = re-dev)
With dataLayer.push, you speak once, GTM dispatches.
The client already has fbq('track') calls in the code. Keep them?β
Remove them once the dataLayer.push equivalent is wired and validated. Otherwise:
- Double counting on Meta
- EMQ drops because the old calls lack
user_data - The agency loses control of the pixel
Should we push events on every scroll / hover?β
No. Only highβbusiness-value actions. Scroll tracking can be added later via GTM (auto-tracking, not in dataLayer).
Should we hash user_data on the front-end?β
No. Send in plain text. GTM Server hashes before sending to Meta. Hashing on both sides = double hash = broken matching.
What about Safari / iOS ITP?β
Server-side GTM (Stape) solves ~90% of the issue:
- Cookies set by your domain β full lifetime (~6 months) vs Apple's 7 days.
- CAPI sends from your server β bypasses Pixel blocking by ITP.
Apple may still truncate UTMs via Mail Privacy Protection. Handled agency-side.
How are staging vs production handled?β
The agency runs:
- Staging GTM container β tied to a Meta test dataset + a GA4 test property.
- Production GTM container β tied to production datasets.
You load the GTM snippet matching the environment (different GTM-XXXXXX).
The user denied cookies. Still push?β
Yes, always. GTM filters by Consent Mode v2:
analytics_storage: deniedβ GA4 in "consent denied" mode (modeled).ad_storage: deniedβ Pixel doesn't drop_fbp, Ads doesn't drop_gcl_au.ad_user_data: deniedβ CAPI sends a "no PII" event for aggregate measurement.
Everything goes through GTM β you push regardless.
How do we handle purchase when payment is validated by async webhook (Stripe, Klarna)?β
Two cases:
- Confirmation page arrives after webhook (e.g. 3DS redirect that returns once validated) β classic browser-side push.
- Webhook validates after the page β don't push browser-side. Configure a server-to-server push from your backend directly to GTM Server (HTTP POST to
https://analytics.biosphereskincare.com/data). Coordinate with the agency.
We have a cart that mutates without page reload. What do we push?β
Each interaction = one push:
- Quantity up β
add_to_cartwith delta - Quantity down β
remove_from_cartwith delta - Removal β
remove_from_cartwith current qty - Coupon applied β β οΈ no standard event; the
couponwill appear on the nextbegin_checkout/purchase.
Multiple brands or sites?β
- Same
ideverywhere in feeds. - Separate GTM containers per brand/site (agency-side).
- Separate Meta Pixels if Business accounts differ.
Checkout on a subdomain (checkout.biosphereskincare.com). Issue?β
No, as long as:
- The GTM snippet is on this subdomain too.
- The
_fbpcookie is set on.biosphereskincare.com(parent domain) β Pixel coordination. - Stape CNAMEs cover both (already the case with
analytics.biosphereskincare.com).
Can't expose an HTTPS product feed. Alternatives?β
Options (coordinate with the agency):
- Push a CSV / Google Sheet on a daily cron.
- Native Shopify / WooCommerce connector (if applicable).
- Private API consumed by the agency.
But ideally: HTTPS auto-generated feed is the standard.
Question not covered?β
Ping Charles: charles@agence-bb.ch or via the shared Slack.