Carrothost Server-Side Tracker

Node-Free Server-Side Tracking
for WordPress & WooCommerce

A WordPress plugin that delivers Google Tag Manager first-party through Nginx and posts conversions straight to the Meta Conversions API, with deduplicated events and hashed advanced matching. No Node.js container, no Docker, no paid tagging server.

0Node or Docker Servers
🎯6Deduplicated Events
🔐9Hashed Match Signals
Why Server-Side

Track What the Browser Cannot

Blocked scripts, capped cookies and abandoned page loads quietly erase conversions from your ad reporting. This plugin moves the critical events off the browser and onto your server.

No Node, No Docker

Traditional server-side tagging needs a Node.js container or a paid GTM server. This runs entirely inside WordPress and Nginx.

Zero Extra Infrastructure

Survives Blockers & ITP

Tag scripts load first-party from your own domain, and conversions are sent server-side where browser restrictions do not apply.

Signal Recovery

No Double Counting

Browser pixel and server event carry one identical event_id, so Meta merges them into a single conversion instead of two.

Clean Attribution
Core Capabilities

Everything Inside the Plugin

One lightweight plugin covering tag delivery, conversion dispatch, ecommerce events, catalog syncing and diagnostics.

The Signal Gap, and How It Closes

Client-side tags depend on conditions you do not control. Server-side dispatch removes that dependency for the events that matter most.

Where browser-only pixels lose data

  • Ad blockers and browser tracking protection strip the pixel request entirely
  • Safari ITP caps first-party cookie lifetime, breaking longer attribution windows
  • Visitors leave the thank-you page before the client-side purchase tag fires
  • Third-party script hosts are slow, blocked, or fail on weak mobile networks
  • Stacked plugins fire the same pixel twice, inflating every reported conversion

What the server-side layer fixes

  • The GTM loader is requested from your own domain, not a third-party host
  • Purchase events are dispatched by PHP on order completion, independent of the browser
  • Customer signals travel hashed with the event, raising Meta Event Match Quality
  • One event_id per action keeps browser and server reporting reconciled
  • The competing Facebook for WooCommerce pixel is disabled to stop duplicate events

First-Party Tag Delivery

Your GTM container loads from your own domain through the Nginx core, while GA4 ecommerce events arrive through a clean dataLayer.

Node-Free GTM Delivery

  • Container script injected in wp_head and loaded from /metrics/gtm.js on your own domain
  • Nginx proxies the request upstream, so no third-party tag host appears in the page
  • Works with your existing GTM container ID; no rebuilding of tags or triggers
  • No Node.js runtime, Docker container, or paid server-side GTM subscription

The /metrics/ proxy is configured on the Nginx core during setup by our team.

GA4 dataLayer Without Site Kit

  • Ecommerce dataLayer pushes for view_item, add_to_cart, begin_checkout, search and purchase
  • GA4 item payloads carry item_id, item_name, price and quantity
  • Purchase push includes transaction_id, currency and full order value
  • Each push clears the previous ecommerce object so GA4 never merges stale items

Meta Conversions API from WordPress

Events go server-to-server to Graph API v19.0, carrying hashed customer signals that lift Event Match Quality.

Direct Graph API Dispatch

  • Events posted to Meta Graph API v19.0 with your Pixel ID and CAPI access token
  • Purchase is sent blocking on woocommerce_thankyou so the order never gets missed
  • Lower-funnel events are dispatched non-blocking to keep page rendering fast
  • Test Event Code field for verifying payloads in Events Manager before going live
  • Every dispatch records its HTTP response code and Meta error message in the log

Advanced Matching Signals

  • SHA-256 hashed email, phone, first name, last name, city, state, ZIP, country and external ID
  • Values are normalized before hashing exactly as Meta specifies; raw PII never leaves the site
  • _fbp and _fbc cookies forwarded, with an fbc rebuilt from fbclid on first landing
  • Client IP and user agent attached to every server event
  • Billing details pulled from the WooCommerce order, falling back to the logged-in profile

WooCommerce Funnel & Catalog

Every step from product view to completed order is captured, and your product catalog reaches Facebook without background job pileups.

Full Funnel Coverage

  • PageView on every page, browser and server, sharing one event ID
  • ViewContent on product pages with content IDs, name, price and currency
  • AddToCart hooked server-side so AJAX and standard add-to-cart both register
  • InitiateCheckout with the complete cart contents, item count and cart value
  • Search events carrying the visitor's query string
  • Purchase seeded from the order ID, so reloads and retries stay deduplicated

Facebook Catalog Feed

  • Scheduled CSV feed endpoint that Facebook pulls on its own timetable
  • Replaces per-product API sync jobs that pile up in the WordPress queue
  • Streams output in batches of 100 products, so large catalogs never exhaust memory
  • Ships id, title, description, availability, condition, price, link, image, brand and stock
  • Skips products without an image or price, which Facebook would reject anyway

Paste the feed URL into Catalog Manager > Data Sources > Scheduled Feed.

Deduplication Map

One Action, One Conversion

Each event carries a deterministic ID built from the product, cart or order it belongs to, so the browser copy and the server copy are recognised as the same conversion.

EventBrowser LayerServer LayerDedup Seed
PageViewMeta PixelCAPI (non-blocking)Per request
ViewContentMeta PixelCAPI (non-blocking)Product ID
AddToCartGA4 dataLayerCAPI (non-blocking)Product + cart item key
InitiateCheckoutMeta PixelCAPI (non-blocking)Cart IDs + value
SearchMeta PixelCAPI (non-blocking)Search term
PurchaseGA4 dataLayerCAPI (blocking)Order ID
Admin Dashboard

Health Checks You Can Actually Read

Two tabs inside WordPress: connection health with a live activity log, and a configuration screen for your IDs and tokens.

Connection Health

  • Live status for the Nginx GTM proxy endpoint
  • Configuration check for Pixel ID and CAPI access token
  • One-click diagnostic ping to both Google and Meta
  • Immediate confirmation that credentials are accepted

Activity Log

  • Rolling record of the last ten dispatched events
  • Timestamp, event name, destination and status for each row
  • Meta error messages surfaced verbatim for faster debugging
  • Clear-log action protected by a WordPress nonce

Safe Configuration

  • Settings stored through the WordPress Settings API
  • Credentials never exposed in page source or client scripts
  • Test Event Code kept separate from live production traffic
  • Direct file access blocked and every input sanitized
Deployment

Live in Two Steps

No container rebuild, no tag migration, no developer time on your side.

01

Install & connect the proxy

  • Upload and activate the plugin from the WordPress dashboard
  • We enable the /metrics/ first-party proxy on your Nginx server
  • Open Carrothost SST from the admin sidebar
02

Enter your IDs & verify

  • Paste the GTM container ID, Meta Pixel ID and CAPI access token
  • Optionally add a Test Event Code for a staged rollout
  • Run the diagnostic ping and confirm both channels report success
Privacy & Requirements

Hashed by Default, Light on the Server

Customer data never leaves in plain text

Email addresses, phone numbers, names and addresses are normalized and hashed with SHA-256 inside WordPress before any request is built. Only hashes travel to Meta, in the exact format the Conversions API expects.

Access tokens live in WordPress options and are never printed into page source. Lower-funnel events dispatch non-blocking, and the catalog feed streams in batches, so tracking does not slow the store down.

Nonce-protected admin actions and sanitized inputs throughout.
  • WordPress 5.8 or newer, tested up to 6.5
  • Nginx with the /metrics/ proxy location configured
  • WooCommerce optional; ecommerce events activate automatically when present
  • A Meta Pixel ID and a Conversions API access token
  • Licensed under GPL-2.0+, currently version 1.3.5
FAQ

Frequently Asked Questions

Q:Do I need a Node.js server or paid server-side GTM hosting?

No. That is the whole point of this plugin. Conventional server-side tagging requires a Node.js container or a subscription to a hosted GTM server. Here the tag script is proxied through Nginx from your own domain and conversion events are posted to Meta directly from PHP, so there is nothing extra to run or pay for.

Q:Will my conversions get counted twice when both the pixel and the server fire?

No. Every action generates one event_id that is shared by the browser pixel and the server event, which is exactly how Meta is designed to deduplicate. Purchase and ViewContent IDs are seeded from the order or product ID, so even a page reload or a retry produces the same ID. The plugin also switches off the pixel inside Facebook for WooCommerce, which is the most common cause of inflated numbers.

Q:Is customer personal data sent to Facebook in plain text?

No. Email, phone, name, city, state, ZIP, country and customer ID are normalized and hashed with SHA-256 inside WordPress before the request is built. Only the hashes leave your server, which is the format Meta requires for advanced matching.

Q:Does it work without WooCommerce?

Yes. On a non-ecommerce site you still get first-party GTM delivery, server-side PageView events, advanced matching and the diagnostics dashboard. The product, cart, checkout and purchase events simply stay dormant until WooCommerce is active.

Q:How does the product catalog feed differ from the official sync?

The official integration pushes each product through the API as a separate background job, which can leave dozens of queued tasks on the server. This plugin instead exposes a CSV feed URL that Facebook pulls on its own schedule. Output is streamed in batches of one hundred products, so even a large catalog stays light on memory.

Q:How do I confirm tracking is actually working?

The Connection Health tab shows whether the Nginx proxy responds and whether your Meta credentials are configured, and the diagnostic ping sends a live test to both. The activity log then lists the last ten dispatched events with their status codes and any error text returned by Meta. For a staged check, add a Test Event Code and watch events arrive in Events Manager before switching to live traffic.

Stop Losing Conversions to the Browser

Talk to us about installing Carrothost Server-Side Tracker on your WordPress or WooCommerce site, including the Nginx first-party proxy setup.

Request Setup

+880 1787-882277  |  hello@apptimatic.com