---
title: "How I Track My Own Site Server-Side (and the Conversions I Lost)"
description: "How I track my WordPress site server-side, how a redesign silently broke my conversion tracking for months, and the checklist I run after every redesign."
featured_image: "https://phillipstemann.com/wp-content/uploads/2026/04/traculo-app.png"
url: "https://phillipstemann.com/server-side-tracking-my-setup/"
language: "en"
date_published: "2026-10-15T07:57:32+02:00"
date_modified: "2026-10-15T11:05:45+02:00"
---

# How I Track My Own Site Server-Side (and the Conversions I Lost)

I was auditing my own website this week, the way I’d audit a client’s. And I found something embarrassing: my most important conversion, the contact form, had recorded nothing for months.

Not because nobody wrote to me. Because my own tracking was broken, and nothing told me.

So here’s the full story: how I track phillipstemann.com, what broke, how I fixed it, and the checklist I now run after every redesign. If you run a [WordPress site](/wordpress-seo/) with forms, there’s a decent chance the same thing is happening to you.

## My setup in one paragraph

No Google Analytics, no Google Tag Manager, and no ad pixels in the browser. Instead I use Traculo, a server-side tracking plugin for WordPress. Full disclosure: I built it. Events go from the browser to an endpoint on my own domain, and from my server to wherever they need to go. iubenda handles cookie consent. Page views, scroll depth, outbound clicks, file downloads and form submissions are tracked automatically. On top of that I define named conversions: the actions that actually matter to my business.

## Why server-side, and not just GA4?

Client-side tracking, where every script runs in the visitor’s browser, under-counts. Ad blockers block it. Safari limits it. Visitors decline the cookie banner. On a technical audience like mine (SEO people, developers, marketers), ad blocker usage is high, so a browser-only setup would miss a big share of my visitors.

Server-side tracking sends events to my own domain first. That’s first-party, so far less gets blocked, and the page loads fewer third-party scripts, which helps [Core Web Vitals](/services/wordpress/). Consent still applies: marketing data only goes anywhere if the visitor said yes.

## What broke

Traculo lets you define a conversion by pointing at an element on the page, for example “a form submission inside the element with ID `b4d8d1f`“. That’s exactly how I’d set up my contact form and my booking button.

Then in April I redesigned the site. I rebuilt the forms as reusable Elementor templates, so they could appear on several pages. Elementor gave every rebuilt element a new ID. My conversion rules kept pointing at the old IDs, which no longer existed anywhere on the site.

The result:

- **Contact form:** the conversion matched nothing, so every real enquiry since the redesign was recorded as zero conversions.
- **Booking button:** same problem, zero clicks recorded.
- **Newsletter vs. downloads:** the newsletter and all three of my free guides sent people to the same `CODE_OPEN`/thank-you/`CODE_CLOSE` page, and that page was the conversion. So every checklist download was counted as a newsletter signup.
- **Danish site:** the Danish forms used `CODE_OPEN`/da/tak/`CODE_CLOSE`, which wasn’t tracked at all.
- **Bonus bug:** my contact form has a “keep me posted” newsletter checkbox. It wasn’t connected to anything, so people who ticked it never reached my email list.

None of this produced an error. The site worked, the forms sent me emails, and the dashboard just showed fewer conversions. That’s the thing about tracking: **it fails silently**.

## How I fixed it

I rewrote the conversions so each goal has its own event, anchored to something that won’t change on the next redesign:

| Event | What triggers it | How it’s detected |
| --- | --- | --- |
| contact\_form | Contact form sent (EN and DA) | The form widget’s ID inside the reusable template |
| newsletter\_signup | Any of the three newsletter forms | Form IDs, not the thank-you page |
| download\_technical\_seo\_checklist | Technical SEO checklist form | The popup template’s ID |
| download\_geo\_readiness\_checklist | GEO checklist form | The popup template’s ID |
| download\_wordpress\_speed\_playbook | WordPress speed playbook form | The popup template’s ID |
| book\_call\_click | Any “Book a call” button | Buttons that link to the contact page |

````````````

Two details that matter more than they look:

- **Count successful submissions, not clicks on Send.** Traculo listens for Elementor’s own “submitted successfully” event, so a form that fails validation isn’t counted.
- **Popups are matched by template.** All three download popups use a copy of the same form, so the form ID alone can’t tell them apart. The popup template’s ID can.

And the newsletter checkbox now forwards the signup to my email platform, but only when it’s ticked.

## The checklist I now run after every redesign

1. Submit every form once, in every language, and check the event arrives.
2. Look at each conversion’s count for the last 7 days. Zero isn’t a quiet week, it’s a broken setup until proven otherwise.
3. One event per goal. Never let two goals share a thank-you page.
4. Check the cookie banner still blocks marketing tags until consent.
5. Keep the measurement plan written down: event name, what triggers it, how it’s detected. When something changes on the site, you know what to re-test.

## What I’d add on a client site

My own site is simple: I don’t run ads. On a client site I’d usually add conversion APIs for Meta and Google Ads, so the ad platforms get the conversions the browser misses, plus GA4 if the team uses it for analysis, and a Looker Studio dashboard that puts SEO, GEO and paid traffic next to the leads they bring. I’d also split out traffic from ChatGPT, Perplexity and other AI assistants as its own channel, so GEO work shows up in leads and not just in screenshots.

If you want me to look at yours, that’s now one of my services: [tracking and analytics](/services/tracking/).

## The short version

Your tracking is only as good as the last time you tested it. Mine was broken for months, and I literally build tracking software. Test your forms after every redesign, give every goal its own event, and treat a zero as an alarm, not a slow week.
