Plenty of agencies push server-side GTM on every site that runs paid traffic, and I'm not convinced it pays off below a certain size. Take a local service business with a WordPress site, a GA4 property, and Google and Meta pixels. Ad blockers and iOS cookie limits push some conversions out of the client-side count, so the numbers drift low. Server-side fixes part of that by setting cookies from your own subdomain, but then you're running a server container on Cloud Run or a managed host, keeping it updated, and debugging a second place where data can break. For a small account the real cost is usually the setup and upkeep time, not the hosting bill. So where's the line for you: monthly spend, traffic, or whether someone on the team can actually read the server logs?
Server-side GTM for a small site: worth the hosting cost or a distraction?
I'm not sure the blocker argument holds up. Server-side tagging on your own subdomain mostly helps with Safari because of cookie lifetime. Under ITP, cookies set by JavaScript get capped at 7 days, while cookies set in an HTTP response from your own subdomain generally aren't capped that way. For a clinic where people research for three weeks before booking, that can decide whether your remarketing audience is useful or nearly empty. Before paying for a server container, check how many conversions come from Safari users whose first click was more than a week earlier. If that's a big slice, the case for it is there. If it's small, a clean client-side setup is probably enough.
I'd push back on the test more than the mechanism. The 7-day cap resets every time the cookie is written, so someone who visits on day 1, day 5 and converts on day 12 keeps the same ID. You only lose people who go quiet for more than a week between visits. A first-click cut counts everyone who clicked a week earlier, including people whose ID survived, so it'll overstate the problem. A better check is whether GA4 falls further behind your CRM bookings on Safari than on Chrome, because that gap is what actually costs you remarketing.
Fair on the reset, that's a good correction to my first-click point. I still wouldn't use the CRM gap as the test, though. Safari users in a local service funnel often differ from Chrome users in age, device and how they book, and the gap also picks up phone calls, no-shows and offline leads that never get tagged. So a bigger gap on Safari could just be audience mix. A cleaner check is to compare Safari and Chrome on the same GA4 form-submit event, then see whether the difference holds for people whose visits were more than seven days apart.
I'd drop the seven-day split. The gap between visits is measured with the same cookie you're trying to judge. If the cookie got wiped after day 1, that person's later visit shows up as a brand-new user, so they never land in the "more than seven days apart" bucket. The bucket ends up holding only people whose cookie survived, which makes the Safari gap look smaller than it really is. It's a selection problem, and it won't show up anywhere in the numbers.
A simpler measure is the share of Safari form-submits where the GA4 user first appeared in the same session as the conversion. That's the clearest sign the cookie didn't survive the research period. Compare that share with Chrome, and read it alongside your offline conversions instead of treating GA4 as ground truth. If the share is small, server-side hosting probably isn't worth it. If it's large, you've got a real case for it.
Same-session share is the cleaner read, yeah. A rule of thumb that works: if Safari's share runs more than about 10 points above Chrome's, and that gap covers a few dozen conversions a month, server-side is probably worth the upkeep. Below that, the maintenance hours usually cost more than the audience you'd recover.
Agreed on the threshold, but before you do the Safari math, look at what share of your leads are phone calls. For a local service business that can be half the volume, and neither client-side nor server-side GTM sees a call unless you run call tracking with a forwarding number. So a Safari gap that looks bad might really be a call problem.
If that's the case, I'd fix call tracking and import offline conversions back into Google Ads first. That gives the bidding system a better signal for calls and form leads together. Server-side only makes sense once web forms are most of what you're paying for. Otherwise you're tuning the smaller slice of the funnel.
I'd push back on the either-or. Call tracking and server-side tagging plug different leaks, and the form leads that do get through are what Meta's optimization learns from. If iOS users drop out of your form events, Meta keeps finding more people who look like the trackable ones, and that skews the audience. For a Meta-heavy local account, I'd test the Conversions API first. It can take form and call events straight from your CRM or call platform without a full server container, so it's a much cheaper check than standing up Cloud Run.
CAPI is the cheaper test, agreed, but I'd run one check before either option. If a lead can't be tied back to an ad click or to a hashed phone number or email, neither CAPI nor server-side GTM will recover it. So look at what share of your CRM bookings carry a phone or email you can actually send. If most do, CAPI is worth the setup. If most leads are anonymous calls with no match key, sort out call tracking first, because without a key the signal never reaches Meta at all.
Hashing only helps if the phone number is normalized the way Meta expects, and most CRM exports aren't. A number saved as 0555 123 4567 hashes to something different from +90 555 123 4567, so the event goes out with a key nobody can match. Lowercase and trim emails before hashing. For phones, strip spaces, dashes and the leading zero, and include the country code. Then check match quality in Meta's event diagnostics before you decide anything. If it's weak, the problem is your formatting, not your funnel, and neither CAPI nor server-side hosting will fix that.