Ad problems we solved,
written down.
Real fixes from real ad accounts: tracking, attribution and conversion APIs. No theory, only what we built and what broke.

Track Boulevard bookings in Meta, Google & TikTok: the full guide
The complete build: click capture, Boulevard webhooks, revenue from GraphQL, and Conversions APIs for Meta, Google, TikTok, Snapchat and Nextdoor.

Why Facebook ads show 0 bookings with Boulevard
Your calendar is full but Ads Manager shows nothing. Here's why Boulevard bookings stay invisible to the pixel, and how to fix it.

The iframe problem: tracking Boulevard bookings
window.blvd has no .on(), the iframe sends no booking messages, and the widget preloads on every page. What we tried and what works.

Case study: our match-by-IP attribution bug
Perfect in solo tests, wrong on 35 of 43 real bookings. How a recency guess corrupted our ad signals, and how we fixed it.

Google Ads click conversions: gbraid errors & silent failures
HTTP 200, nothing recorded. How to catch partialFailureError, fix the BRAID counting error and stop uploading conversions Google can't use.

TikTok Events API for bookings: events, errors & hashing
SubmitForm is now Lead, CompletePayment is now Purchase, and HTTP 200 doesn't mean TikTok accepted your event. What we learned sending bookings.

Snapchat & Nextdoor conversion tracking for local businesses
RESERVE is report-only on Snapchat web campaigns, Nextdoor needs ndclid and data_source_id. How we send bookings to both, server-side.

Looker Studio ROAS dashboard: fixing Data Set Configuration Error
Blends that throw Data Set Configuration Error, new columns that break charts, rows that silently vanish. How we built a dashboard that holds.

Boulevard Admin API authentication, explained
Payload, HMAC with a base64-decoded secret, token with no separator, Basic header. The exact steps and code that work.

Verifying Boulevard webhooks in a Cloudflare Worker
x-blvd-hmac-salt, x-blvd-hmac-sha256, PING events and the seconds you have to reply. Working Worker code and the traps.

Real revenue from Boulevard GraphQL: Order, OrderSummary, cents
No total field, amounts in cents, orderId null at booking. The queries and math we use to send real revenue to ad platforms.

Custom Boulevard booking flow for exact attribution: a planning guide
In our proof of concept, the appointment ID at checkout matched the webhook exactly. Here's the plan to get 100% deterministic attribution.

TikTok campaign failing, or tracking broken? A 10-minute check
Five checks you can do yourself before deciding TikTok doesn't work for your business. Most 'failing' campaigns we audit are measurement problems.

Pixel vs Conversions API, explained for salon owners
The pixel watches your website. The Conversions API reports from your systems. Why salons with booking widgets need both, in plain language.

Platform results vs real bookings: which numbers to trust
Every platform claims credit, the total beats your calendar, and none of them is lying. How to build one number you can make decisions on.

Custom tracking or platform numbers? An honest cost/benefit
We build this for clients, and we still tell some of them not to. How to decide whether custom tracking pays off for one salon.

GA4 cross-domain tracking with a booking engine
Bookings credited to your own booking engine instead of your ads? The fix was one empty list in GA4's tag settings, plus three checks.

Meta pixel events missing for clinics: health restrictions
Your pixel fires, but Meta shows no leads or bookings? Meta may be restricting your data as health and wellness. How to check in 2 minutes.

Wix + Google Tag Manager duplicate events, fixed
Wix pushes its own events into the data layer, and tracking the same conversion twice doubles it. How to find duplicates and keep one source.

CallRail calls not showing in Google Ads: the checklist
Visitor tracking, a conversion action that must be named 'Phone Call', duplicates from call extensions. The checklist for CallRail and Google Ads.