What happens to a conversion after capture. How it is stored, retried, recovered and counted, and the point at which Converly stops trying.

After detecting a conversion, deduplicating it and then normalising and hashing the data, Converly sends the conversion off to your chosen ad platforms and analytics tools.

How conversions are delivered to ad platforms and analytics tools

The two ways a conversion reaches a platform

Ad platforms accept conversions in two different ways, and they actually recommend you send a single conversion both ways to maximise the chance it makes it to the ad platform (which is what Converly does):

The whole idea is that by sending the conversion through both paths at the same time, you get a much better delivery rate (a conversion just sent through the visitor's browser won't work whenever an ad blocker, a privacy setting or a closed tab stops the tag from running).

The ad platforms then deduplicate them based on a shared identifier that Converly sends with each conversion. You can read more in the Deduplication article.

The table below breaks down how a conversion reaches each of the destinations Converly supports:

DestinationBrowserServerNotes
Google Adsyesyes
Metayesyes
GA4noyesSent server-side only, deliberately. GA4 reliably deduplicates purchases and not much else, so firing both would double count your leads.
LinkedInyesyesNeeds a conversion rule for each leg. With only one, only that leg can fire.
TikTokyesyes
Reddityesyes
ChatGPT Adsyesyes
Microsoft Adsyesyes
Snapchatyesyes
Pinterestyesyes
X Adsyesyes
AdRollyesyes
Taboolayesyes
Plausibleyesno
Fathomyesno
Pirschyesno
GoSquaredyesno
Simple Analyticsyesno

What information gets sent

Browser-side

The browser-side conversion is a call to the platform's own tag, so most of what the platform ends up recording comes from the tag itself rather than from Converly. The tag already knows the visitor, the page they're on, their browser, and any data it has stored in its own cookie (like its own click identifiers).

What Converly sends is:

The platform's tag then adds its own click identifiers, cookies and page context, and sends the conversion to its own servers.

Server-side

Conversions are sent to each server-side destination using their API (typically called the Conversions API, or CAPI for short). The API call to each destination is sent one after another, so every result is recorded before the next destination is attempted. Each call carries:

GA4 is the exception, because it matches conversions to the visitor's Google Analytics session rather than to the lead's contact details. So for GA4, we send the client and session identifiers read from the visitor's own Google Analytics cookies instead.

Exceptions

A few things work differently to the general pattern above:

How failures are handled

How we know whether a send worked

Not every platform tells you the truth in its response. Some report success for a conversion they didn't really accept, and others accept everything up front and only check it properly later. So Converly doesn't simply trust the status code that comes back. Where a platform puts the real result inside the response, Converly reads that instead.

The table below shows what Converly treats as a successful send for each destination, and what that success does and doesn't tell you.

DestinationHow success is determinedNotes
Google AdsGoogle's API returns a 200 success responseGoogle accepts the conversion but doesn't actually check the details until afterwards. If it finds anything wrong then a message appears in the Diagnostics section of Google Ads within 24 hours.
MetaMeta's API returns a 200 success responseMeta accepts the conversion but whether the conversion was matched to a Meta user is reported separately, as Event Match Quality in Events Manager.
GA4GA4's API returns a 204 success responseGA4 returns that for every event it receives, even a malformed one, so the response proves nothing on its own. So Converly checks each event against Google's rules before sending it to make sure it isn't malformed.
LinkedInLinkedIn's API returns a 201 success responseLinkedIn will accept the conversion but it only appears in your reporting if LinkedIn is able to match it back to an actual ad click.
TikTokTikTok's API returns a 200 success response with a result code of 0 inside itTikTok reports most errors inside a success response, so the status code on its own can't be trusted. Converly reads the result code in the body instead.
RedditReddit's API returns a 200 success responseReddit will accept the conversion, but it will only appear in your reports if it gets matched it to an ad click.
ChatGPT AdsThe ChatGPT Ads API returns a 200 success responseChatGPT Ads doesn't validate the data at ingestion, so you could send junk data and it would never tell you it's wrong. So Converly checks every field itself before sending
Microsoft AdsMicrosoft's API returns a 200 success response with no errorsMicrosoft accepts the conversion even if some details are invalid (like badly formatted email). It drops that detail and says so only as a warning inside the success response. So Converly reads those warnings and alerts you if a conversion arrived with less than it should have.
SnapchatSnapchat's API marks the conversion as valid
PinterestPinterest's API returns a success result for the conversionPinterest reports the outcome in the body of its response rather than in the status code, so a conversion can fail while the response itself looks fine. Converly reads that result rather than the status code.
X AdsThe X API reports the number of conversions processed and it matches the number Converly sentX doesn't return errors, so the count is the only signal it gives that the conversion was taken.

Converly keeps each platform's full response against the conversion, including any trace ID the platform returned (such as Meta's fbtrace_id), which is the first thing their support teams ask for. Sites set to store no personal data don't keep the response.

Failed sends are retried automatically

A send that fails for a temporary reason (server errors, timeouts, rate limits, network failures, etc) is retried up to 3 times in total, with a short pause between attempts.

A rejection that will never succeed, such as a malformed conversion or a revoked credential, fails immediately rather than burning retries.

Some of that classification is platform specific and not obvious. Meta, for example, reports rate limiting inside an HTTP 400, which naive code treats as a permanent rejection and gives up on. Converly reads the body and retries it.

Nothing is left behind

The retries mentioned above handle the situation where an ad platform or analytics tool is down, but they do not handle a situation where Converly itself is down.

To make sure that is handled, a recovery job sweeps every 5 minutes, finds any conversion that was interrupted, and picks it up again. While a conversion is being sent it is claimed by one of our servers for 15 minutes, so two servers can never be sending the same conversion at the same time. And if one of our servers drops out after a platform has accepted a conversion but before the result was recorded, the copy that gets sent again carries the same identifier, so the platform recognises it and discards it.

Retries don't result in duplicate conversions

Every conversion is given its own identifier in our database as soon as it happens, and every attempt to send it carries that same identifier rather than a new one.

Retrying stops as soon as the conversion is delivered successfully, so in the normal case the platform only ever receives the conversion once. But in rare cases the ad platform's success message may not make it back to us, so the retry system will continue to send the conversion.

In this case, the ad platform receives the same conversion twice, but because the same identifier is sent with each retry, the ad platform recognises it's a duplicate and discards it.

Our article on Deduplication covers the full set of protections, including what happens on the few platforms that don't deduplicate this way themselves.

One platform failing does not block the others

A single conversion flow in Converly can send a conversion to several destinations. Each destination is attempted independently and recorded independently, so if a flow sends to 4 platforms and one rejects the event, the other 3 still receive it.

The conversion itself is still marked as failed when that happens, rather than partially delivered, so one destination failing is never hidden behind the three that worked. You can always see which destination did what in the logs. Reading the event log covers the per-destination detail.

When Converly gives up, it says so

Retries and recovery do not continue forever. A conversion that cannot be delivered within about an hour is marked as failed and stops.

A conversion that reaches this point stays visible in your event log with the reason it failed. The goal is to alert you of the issue (i.e. a platform needs reconnecting) so you can fix it. Our support team can replay conversions back into ad platforms and analytics tools when asked, so once you have fixed the issue you can contact us and we can resend the conversions to your chosen ad platforms and analytics tools (with the original timestamps so they appear in your reporting for the correct dates).

How long you have to do that is set by the platforms rather than by us, because each one refuses conversions past a certain age:

DestinationLimitMeasured fromNotes
Google Ads90 daysThe ad clickOr 63 days when the conversion carries the lead's contact details, which Google calls enhanced conversions for leads.
Meta7 daysThe conversion
GA472 hoursThe conversionAn older event is still accepted, but GA4 records it as having happened 72 hours ago.
LinkedIn90 daysThe conversion
ChatGPT Ads7 daysThe conversion
Microsoft Ads7 daysThe conversion
Snapchat7 daysThe conversion
PinterestNone publishedPinterest asks for conversions to be sent within an hour of happening, but doesn't publish a limit.
X AdsNone published