Server-side conversion tracking for Meta CAPI and GA4 without a developer
ClickBeagle sends every website lead to Meta Conversions API (as a Lead event) and to GA4 Measurement Protocol (as generate_lead) from its own server, every 15 minutes. You paste a Meta pixel id and access token, or a GA4 measurement id and API secret, in the dashboard; there is no code to write. Match keys such as email and phone are normalized and SHA-256 hashed before they leave ClickBeagle.
Why pixel-only tracking misses leads
A browser pixel only reports a conversion if the pixel loads, the browser lets it send, and the thank-you event fires. Ad blockers, browser tracking protection, slow mobile connections and forms that redirect or live inside an iframe all break that chain. The ad platform then optimizes on fewer conversions than really happened. Server-side delivery sends the same lead from a server, which is not affected by blockers in the visitor's browser.
How it works in ClickBeagle
- The lead is captured. The ClickBeagle counter picks up contact forms automatically, without marking up fields, and detects completed submissions in many embedded form and booking widgets (their fields stay out of reach). Passwords, card numbers and hidden fields are never collected.
- Match data is saved at the moment of the lead. Along with the form values, ClickBeagle keeps the Meta
_fbpand_fbccookies, the GA4 client id and session id, the IP address and the user agent of that visit. - Delivery runs every 15 minutes. Each lead goes to each connected destination once. Errors that may pass later are retried up to 5 times; every delivery keeps its status, the match keys it carried and the platform's response.
- Recent leads are not lost. When you connect a destination, you can also send the leads it can still accept: up to 7 days back for Meta, 72 hours for GA4.
Match keys: what is sent where
| Data | Meta Conversions API | GA4 Measurement Protocol | How it is prepared |
|---|---|---|---|
em | Not sent | Trimmed, lower-cased, SHA-256 | |
| Phone | ph | Not sent | Converted to international format using the visit's country, SHA-256 |
| First and last name | fn, ln | Not sent | Lower-cased, SHA-256 |
| Country | country | Not sent | SHA-256 |
| Visitor id | external_id | Not sent | SHA-256 of the ${N} profile id |
| Click and browser ids | fbc, fbp | client_id, session_id | As set by the Meta pixel and the GA4 tag |
| IP and user agent | client_ip_address, client_user_agent | Not sent | As seen on the visit |
Every Meta event carries the lead's id as event_id and the page URL as event_source_url. GA4 needs the site's own GA4 client id: if a visitor had no _ga cookie, the lead is skipped for GA4 with the reason shown, rather than sent with an invented id.
Setup without a developer
- Meta: paste the pixel id and a Conversions API access token from Events Manager. An optional test event code lets you watch events arrive in Meta's Test Events tab first.
- GA4: paste the measurement id (
G-…) and a Measurement Protocol API secret from the data stream settings.
ClickBeagle checks the settings with Meta or Google before saving them, so a typo shows up immediately instead of as silent missing conversions.
Consent and privacy
In US notice mode the counter shows a notice at collection with an opt-out, and it treats Global Privacy Control as an automatic opt-out. In opt-in (banner) mode nothing is collected before the visitor accepts. When a visitor opts out, the choice is also passed to Google tags (consent mode) and the Meta pixel on the page, and ClickBeagle stops collecting for that browser, so there is no lead record to send.
Events from your CRM or backend carry their own consent fields (analytics, advertising, ad_user_data, ad_personalization). Unknown consent is treated as not granted, and test events never reach production destinations.
CRM events and Google Ads
Your CRM or backend can report later stages, such as lead qualified, appointment booked, sale completed or payment received, through a signed server events API. ClickBeagle links them to the original visit and shows their status in the dashboard and through the MCP tool server_events_status. For these events, delivery to Google Ads and Meta is currently a dry run: ClickBeagle validates and previews the payload without sending it.
Google Ads offline conversions from the CRM are uploaded by Ads Connector, the product ClickBeagle is part of. ClickBeagle deliberately does not send the same leads to Google Ads, because sending them twice would double-count.
Avoiding double counting with the pixel
If your Meta pixel already fires a Lead event on the thank-you page, decide which source is primary in Events Manager, or make sure both use the same event name and id, so Meta can deduplicate. In GA4, mark one event, either generate_lead from ClickBeagle or your existing tag event, as the key event.
Want to check whether your ad clicks are real before you feed them back to the platforms? See click fraud detection, or start with the 3-step setup.
FAQ
Do I need a developer to set up Meta CAPI with ClickBeagle?
No. Paste your pixel id and access token in the dashboard; ClickBeagle checks them with Meta and starts sending leads within 15 minutes.
Are emails and phone numbers sent in plain text?
No. Email, phone, name, country and visitor id are normalized and SHA-256 hashed before they are sent to Meta. GA4 receives no contact data.
Why was a lead skipped for GA4?
GA4 Measurement Protocol needs the site's own GA4 client id. If the visitor had no _ga cookie, ClickBeagle skips the lead and shows the reason instead of inventing an id.
Does ClickBeagle send conversions to Google Ads?
Not directly. Google Ads offline conversions are uploaded by Ads Connector, so the same lead is not counted twice.
What happens when a visitor opts out?
Collection stops for that browser, Google consent mode and the Meta pixel are told about the opt-out, and no lead is sent. Global Privacy Control counts as an opt-out.
See which ads bring real customers
Leads with their source, session replay, click checks and bot analytics. Set up in 2 minutes, free while in beta.
Start free