Signals Docs
Concepts

sGTM hosting

One shared multitenant tagging endpoint - your own domain, CNAME'd at the PixelFox ingest origin, speaking the GA4 wire format.

PixelFox hosts one shared, multitenant tagging endpoint — not a dedicated server per store. You claim a hostname, CNAME it at our ingest origin, and point Google Tag Manager or gtag at it. Events arrive on /g/collect in the standard GA4 wire format, the hostname identifies your site, and the event runs through the exact same pipeline as the PixelFox tag: enrichment, identity stitching, fan-out to every destination you connected, and browser↔server event_id deduplication.

There is nothing to scale on your side and no per-customer infrastructure on ours — which is why this is included on every plan rather than sold as an add-on.

Set up

  1. Dashboard → your site → sGTM hosting → Create container. You get a hostname immediately: <id>.sgtm.pixelfox.app. Optionally claim your own (ss.yourstore.com) right in the create form.

  2. Add the CNAME at your DNS provider:

    ss.yourstore.com   CNAME   connect.pixelfox.app

    The TLS certificate is issued on demand the first time the name resolves — the first request after a DNS change may take a few extra seconds.

  3. Point gtag or GTM at it:

    // gtag.js
    gtag('config', 'G-XXXXXXXXXX', { server_container_url: 'https://ss.yourstore.com' });
    
    // Google Tag (GTM web container) - GA4 config tag field "Server container URL"
    https://ss.yourstore.com

    Or import our GTM container template (signals-web-sgtm.json) — it presets everything, including the shared event_id that deduplicates browser and server events.

  4. Fire a test event and watch it land in Events → Live explorer.

How tenant routing works

/v1/ingest resolves you by API key; /g/collect resolves you by hostname — the CNAME claim is the authorization. One indexed lookup (hostname → container → site), same as key resolution. This is why a stock gtag works with zero PixelFox code on the page: the domain itself is the credential.

The GA4 wire format

Any GA4 transport hit works — en, cid, dl, dt, dr, ep.* (string params), epn.* (numeric params):

GET /g/collect?v=2&tid=G-XXXXXXXXXX&en=purchase
    &cid=771234567.1712345678
    &dl=https://yourstore.com/checkout
    &epn.value=2450&ep.currency=BDT
    &ep.event_id=evt-abc123

Mapping onto PixelFox events:

GA4 paramPixelFox field
enevent (view_itemview_content, begin_checkoutinitiate_checkout; the raw name is kept as $ga_event)
ciddistinct_id
ep.event_iduuid — the dedup contract; without it one is minted server-side
dl / dt / dr$current_url / page_title / referrer
epn.value, ep.currencyconversion value + currency
everything else (ep.*, epn.*)event properties, verbatim

From there it is a PixelFox event like any other: your dashboard definitions decide which ad-platform conversion each event name represents, Meta CAPI / TikTok / GA4 / LinkedIn / Snapchat / Pinterest receive the purchase-shaped ones, and PostHog receives the full stream.

Custom domains you may already have

A site can have both a first-party tracking domain (t.yourstore.com, used by the PixelFox tag) and sGTM hostnames (ss.yourstore.com, used by gtag/GTM) — they CNAME at the same origin and are claimed separately. Vendor cookies (_fbp, _fbc, _ga) are extended with a 2-year HTTP lifetime on both surfaces, so Safari/ITP cannot truncate your attribution window.

Limits and notes

  • Hostnames are exclusive across all PixelFox customers - first claim wins.
  • Pause a container to answer 404 on its hostnames without deleting the claim.
  • /g/collect is rate-limited per hostname (200 requests / 10s / IP), on top of the per-key budgets on /v1/ingest.
  • Pausing or deleting updates the routing cache within seconds.

On this page