---
title: "Server side tracking"
description: "How to setup server side tracking in Multifeeds"
url: https://docs.woolytech.com/en/articles/238-server-side-tracking
collection: "Tracking"
updated: 2026-11-06
language: en
---

# Server side tracking

How to setup server side tracking in Multifeeds

Server-side tracking sends your store's analytics and ad events through your own tagging server before they reach platforms like Google Analytics 4, Meta, and Google Ads. That improves data accuracy, privacy control, and resilience against ad blockers.

**New to SST?** Read [The Power of Server-Side Tracking](https://docs.woolytech.com/en/articles/218-server-side-tracking-benefits.md) for why it matters.

### Before you begin

Complete **client tracking setup** first. Server-side tracking builds on the same GTM web container and custom pixel.

1.  In the app, go to **Pixel & Tags → Client tracking** (`/pixels/trackers/client`).
    
2.  Finish both onboarding steps:
    
    -   **Step 1 — Initialize tracking and generate pixel script** (creates your GTM web container and tracking loader).
        
    -   **Step 2 — Create a Custom pixel from the above script** (install the script in **Shopify Admin → Settings → Customer events**).
        

If either step is incomplete, the Server tracking screen shows **Client setup required** and blocks **Turn on Server side tracking**.

For detailed client pixel instructions, see [How to set up Pixel and Tags](https://docs.woolytech.com/en/articles/202-how-to-set-up-pixel-and-tags-with-the-multifeed-google-shopping-feed-app-2.md).

### Billing

Server-side tracking is a **subscription add-on**:

-   **5 monthly credits** on your Multifeeds plan (includes **500,000 server-side tracking requests** per billing period).
    
-   **Usage charges** beyond included volume: **$1 USD per 100,000 requests** (billed on your Shopify subscription).
    

When you first turn on SST, Shopify may ask you to approve the add-on charge. After approval, return to the app — the configuration modal opens automatically.

## Where to configure SST

1.  Open **Pixel & Tags → Server tracking** (`/pixels/trackers/server`).
    
2.  Click **Turn on Server side tracking** (or **Configure** if already enabled).
    
3.  Complete the **Server side tracking** modal and save.
    

## Configuration options

### Tracking domain (recommended: First party)

<table data-id="dac13427-38e1-419a-b87c-e5af4fe2e0db" style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="width: 22%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="ab59a8a8-95c5-4f1e-a508-aada75ab7905"><strong>Option</strong></p></td><td colspan="1" rowspan="1" style="width: 28%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="1d949ae2-02e8-419a-82f1-ee0faa053f08"><strong>When to use</strong></p></td><td colspan="1" rowspan="1" style="width: 22%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="b0ee9488-a677-452c-ab46-5af8d3d96b32"><strong>DNS required?</strong></p></td><td colspan="1" rowspan="1" style="width: 28%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="4209ca62-62f3-499b-8cf7-3383414dda5a"><strong>Server region</strong></p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="6ed0e59e-c692-45e2-90e1-f26c558b0454"><strong>First party domain (recommended)</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="e17776e2-3876-4793-9e9d-518fda5d908a">Production stores; best for cookie longevity and trust</p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="05185f8f-7d2f-4543-a505-70c407736a50">Yes — CNAME at your DNS provider</p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="8bca8325-eead-4c66-aca4-e47834865c51">You choose (see regions below)</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="9cd62118-83bb-4225-b07d-562495e2a5ce"><strong>Use WoolyTech domain</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="327edd1f-2e60-4422-b57a-8467a6c27a8c">Quick testing; managed hostname per store</p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="5df65f51-7f13-460f-adae-8c97a6e867ef">No</p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="6786b395-6045-437b-97fb-6f0394b2a6e6">Fixed to <strong>EU</strong></p></td></tr></tbody></table>

#### First party domain checklist

**Why first-party?** See [What is first party domain (for server side tracking)](https://docs.woolytech.com/en/articles/239-what-is-first-party-domain-for-server-side-tracking.md).

-   Use a **subdomain of your store domain** (example: `track.yourstore.com`).
    
-   Create a **CNAME** record:  
    `your-subdomain.yourstore.com` → `sgtm-yourstore.woolytrack.org`  
    (The app shows the exact hostname and target for your shop — use the **Copy** buttons.)
    
-   **Cloudflare users:** set the CNAME to **DNS only (gray cloud)**, not **Proxied (orange cloud)**. Orange-cloud proxying can block CNAME verification.
    

#### WoolyTech managed domain

-   Uses a hostname like `sgtm-yourstore.woolytrack.org`.
    
-   No DNS setup; server is always provisioned in **EU**.
    
-   Useful for evaluation; first-party domain is recommended for live stores.
    

### Server location

At launch, choose **EU** or **US-east** for new provisioning. The modal may show latency hints to help you pick a region close to most customers.

### GA4 Measurement ID (server-side)

-   Required format: `G-XXXXXXXXXX` (10 characters after `G-`).
    
-   You can pick an ID from existing **client-side GA4 trackers** in the dropdown, or type one manually.
    
-   If a **client-side GA4 tracker already uses the same Measurement ID**, pause or remove it to avoid **duplicate events**. The app warns you when this happens.
    

Multifeeds creates a dedicated **Multifeeds | Server-side routing** GA4 configuration in your web GTM container that points `server_container_url` to your tagging server.

## Setup walkthrough

### Step 1 — Turn on and save configuration

1.  Open **Server tracking** and click **Turn on Server side tracking**.
    
2.  Approve billing if prompted.
    
3.  In the modal:
    
    -   Choose **First party domain** or **WoolyTech domain**.
        
    -   Enter subdomain (if first-party).
        
    -   Select **server region** (first-party only).
        
    -   Enter **GA4 Measurement ID**.
        
4.  Click **Save**.
    

### Step 2 — DNS (first-party domain only)

After saving, a **Waiting for DNS** banner appears with your CNAME details.

1.  Add the CNAME at your domain registrar or DNS host.
    
2.  Wait for propagation (often minutes; can take up to 24–48 hours).
    
3.  The app **checks DNS automatically** and shows a countdown until the next check — no manual refresh required.
    

Until DNS verifies, the **tagging server is not provisioned** (by design). This avoids failed server deployments.

### Step 3 — Server provisioning

Once DNS is verified (or immediately for WoolyTech managed domain), you'll see **Setting up your tracking server** / **Creating tagging server**.

Provisioning usually takes **a few minutes**. During this time:

-   **Domain** widget: moves from _Waiting for DNS_ / _Verifying_ toward _Connected_.
    
-   **Server container** widget: _Provisioning_ → _Active_ when healthy.
    
-   **Traffic** widget: starts showing request counts when events flow.
    

### Step 4 — Update the custom pixel (first-party domain)

After the tagging server is **Active** and Domain is **Connected**, the Shopify custom pixel still loads from the shared WoolyTech host until you update it. The first-party domain only applies to storefront events after this step.

You'll see a yellow banner: **Update your Shopify custom pixel to keep tracking active**.

1.  Click **Update pixel** (or open **Client tracking**).
    
2.  Copy the new custom pixel script. The loader URL now uses your first-party domain (for example `https://track.yourstore.com/0/yourstore.js`) instead of `tl.woolytrack.org`.
    
3.  In **Shopify Admin → Settings → Customer events**, open the existing Multifeeds custom pixel and replace its code with the new script.
    
4.  Return to the app and **Verify** the pixel.
    

Until the pixel is updated and verified, storefront events may not use the first-party loader even though the tagging server is online. Installing server trackers stays blocked while the pixel is out of date.

**WoolyTech managed domain:** skip this step — the loader host does not change.

See also [Why use a first-party domain](https://docs.woolytech.com/en/articles/239-what-is-first-party-domain-for-server-side-tracking.md) (first-party tracking loader).

### Step 5 — Install server-side trackers (optional but typical)

After the server container is **Active** and the custom pixel is current, install trackers on **Server tracking → Installed trackers**:

-   Examples: GA4 (server), Meta CAPI, Google Ads conversions — each installs into your **server GTM container**.
    
-   Client trackers and server trackers are separate; server trackers require SST to be on and the server container ready.
    

See the Trackers section of the knowledge base for platform-specific guides.

## Understanding the status widgets

<table data-id="47626e54-a2d8-4030-9d97-60fb994be54e" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="width: 35%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="620593cc-1792-4fbb-a3af-9e2ef6b15ce7"><strong>Widget</strong></p></td><td colspan="1" rowspan="1" style="width: 65%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="e9003cce-7639-4fb5-933a-132b417cbe32"><strong>What it means</strong></p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="86c4f5f6-7a27-488a-adad-e9cb528f18b2"><strong>Domain</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="e71577c5-220f-475b-9af6-880c16c6b4ee">DNS/CNAME health and whether your tracking hostname resolves correctly</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="ebdd4186-f790-4edf-b1a7-6066aa4e3fed"><strong>Server container</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="f8b57084-d81f-410d-aef2-625c64aa99b2">Whether the tagging server pod is provisioned and responding</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="57bd4159-240c-4bcb-8cc8-238dd91c76d6"><strong>Traffic</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="67e85ba5-8e42-4660-b925-5bfc757c4633">Recent server-side request volume (updates every few seconds when live)</p></td></tr></tbody></table>

**Badge states you may see**

-   _Waiting for DNS_ — add or fix your CNAME.
    
-   _Provisioning_ / _Updating_ — infrastructure or GTM server container work in progress.
    
-   _Active_ — server is operational.
    
-   _Unreachable_ — hostname resolves but health check failed; recheck DNS (especially Cloudflare proxy) or contact support.
    

## Reconfigure or change settings

Click **Configure** on the Server tracking card to change:

-   Custom domain or switch between first-party and Wooly managed domain
    
-   Server region (subject to launch availability)
    
-   GA4 Measurement ID
    

Major domain or region changes may trigger **re-provisioning**; expect brief _Updating_ states.

## Turn off server-side tracking

Click **Remove server side tracking** (destructive).

This **permanently removes**:

-   Your tagging server infrastructure
    
-   Server GTM container configuration
    
-   Server-side trackers (including **Multifeeds | Server-side routing**)
    

Client pixel and web GTM container remain unless you remove them separately.

## Troubleshooting

<table data-id="53d3da9a-995c-4591-ba64-5dbb58ae4fda" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1" style="width: 35%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="013c2cb0-990a-4ebf-8f50-21192ee9f0b0"><strong>Symptom</strong></p></td><td colspan="1" rowspan="1" style="width: 65%; font-weight: bold; background: #f6f6f7; vertical-align: top; border: 1px solid #ddd;"><p data-id="a640a050-48c2-48e8-bd7c-b02acce2e6ef"><strong>What to try</strong></p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="6f2c5c2c-e9c6-445b-86b4-e9c9b3264172"><strong>Client setup required</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="ab4b785b-6824-410f-aa58-e976a1285e72">Finish client steps 1–2 on <code>/pixels/trackers/client</code></p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="6327ec6d-669c-4fda-b42e-b783e21120a9"><strong>Client container not ready</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="7c44768c-124d-4438-9a79-1b98bfef045e">Wait for GTM web container initialization to complete (step 1)</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="bc61be1d-2511-408b-983b-2f35437caef6"><strong>Waiting for DNS stuck</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="c4fb7d94-cb40-450f-b683-8514d7dea7c8">Confirm CNAME host/target match the app exactly; disable Cloudflare proxy on the CNAME</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="9578a75f-e3e3-4865-b2a3-73c2ee40473c"><strong>Server not available / unknown tagging server URL</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="b8b2ac80-1018-4191-b070-4b210150964d">Click <strong>Reconfigure</strong> and save again with the correct domain</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="7cc128b3-8071-47ef-b74c-7cf440f298ac"><strong>Duplicate GA4 events</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="38ab3be5-342d-4068-bf44-36d9ba3a9b90">Pause client GA4 tracker using the same Measurement ID</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="5502859d-f026-4c3b-9923-8d0f1ca97e89"><strong>Pixel script "Outdated" / yellow update banner after the server is Active</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="b2098312-c1de-48ba-bb95-f85393ee2373">Expected for <strong>first-party domain</strong>. Complete Step 4 so the custom pixel loads from your domain. During DNS or provisioning the same badge can appear temporarily and clears when SST is fully active.</p></td></tr><tr><td colspan="1" rowspan="1" style="font-weight: bold; background: #fafafa; vertical-align: top; border: 1px solid #ddd;"><p data-id="d4a876c2-888f-4388-95af-1410f5dc6f88"><strong>Billing / credits</strong></p></td><td colspan="1" rowspan="1" style="vertical-align: top; border: 1px solid #ddd;"><p data-id="e5a3c767-23a4-40de-8578-e5777c5d3d43">Confirm SST add-on is active under your Multifeeds subscription</p></td></tr></tbody></table>

Still stuck? Contact Multifeeds support with your shop domain, tracking subdomain, and a screenshot of the Domain + Server container widgets.

## Related articles

-   [Server-Side Tracking benefits](https://docs.woolytech.com/en/articles/218-server-side-tracking-benefits.md)
    
-   [Pixel and Tags setup (client)](https://docs.woolytech.com/en/articles/202-how-to-set-up-pixel-and-tags-with-the-multifeed-google-shopping-feed-app-2.md)
    
-   [What is first party domain (for server side tracking)](https://docs.woolytech.com/en/articles/239-what-is-first-party-domain-for-server-side-tracking.md)
