How to Properly Track Blackbaud Donations in GA4 for Accurate Attribution

Blackbaud (iframe) donation form submissions on site are misattributed in GA4 as all direct

What’s happening: Client uses Blackbaud to integrate a donation form on their website. The form is embedded in an iframe from a host.nxt.blackbaud.com domain. Donations are coming in as direct, instead of being attributed to the proper channels. 

Here’s what we tried: We’ve entered the GA4 measurement ID into Blackbaud using their official integration. We’ve tried adding the host.nxt.blackbaud.com domain to the domain configuration in GA4. We’ve also tried adding said domain to the referral exclusion list. We have also tried have both the domain config and the referral exclusion active at the same time. However, no combination of these potential solutions has resulted in donations being attributed to test sources nor live, real sources, e.g. organic search. Donations are instead coming in as direct or from the client’s hostname.

The short answer is:

Blackbaud (iFrame) donation form submissions on site are misattributed in GA4 as all direct

Your issue is a classic cross-domain tracking problem compounded by the use of an iframe, which the GA4 integration or standard cross-domain setup often fails to handle correctly because the _gl linker parameter isn’t being passed into the iframe itself.

The most robust, long-term solution is to bypass front-end tracking issues entirely by using the Blackbaud SKY API’s webhooks to send server-side data about the successful donation, and then use that data along with the Google Analytics Data API to correctly attribute the conversion in your reports, potentially with a server-side tagging solution like Stape or Google Cloud Platform.

The long answer is:

What you’re experiencing is a very common issue when a third-party form is embedded in an iframe, even if you’ve configured GA4’s domain settings and referral exclusions for the host.nxt.blackbaud.com domain.

The iframe creates a separate browsing context, and if the GA4 script inside the iframe (if it’s there, which Blackbaud’s integration suggests) can’t communicate with the GA4 script on the parent page, the session data is lost.

The standard cross-domain linking mechanism relies on appending the _gl linker parameter to the URL as the user navigates between domains, but this often fails for content loaded within an iframe.

When the donation key event occurs inside the iframe, the GA4 tag there either doesn’t have the original session information or, if it does, the successful conversion event (purchase or a custom donation event) is sent to GA4 without the user’s initial traffic source/medium data, which defaults the attribution to Direct or your main hostname (a self-referral).

A much better approach is to leverage server-side tracking using the Blackbaud SKY API’s webhooks.

Webhooks allow Blackbaud to send a notification (a data payload) directly to a server you control the moment a donation is successfully processed, which is a highly reliable source of truth for the conversion.

You can configure the Blackbaud SKY API to send a webhook for the relevant donation event.

This webhook will contain the donation details, but critically, it won’t have the GA4 attribution data.

This is where Google Tag Manager (GTM) and a server-side tagging environment like Stape or Google Cloud Platform (GCP) come in.

You’d set up an endpoint on Stape/GCP to receive the Blackbaud webhook.

Crucially, before the user hits the iframe, your main website tracking would have already captured their GA4 Client ID and Session ID.

You need to find a way to pass these IDs, perhaps as a custom field, into the Blackbaud form before submission, so they are then included in the Blackbaud SKY API webhook when the donation is complete.

When your Stape/GCP endpoint receives the Blackbaud webhook containing the donation details and the GA4 Client ID/Session ID, it can then use the Google Analytics Data API to look up the complete user session data for that Client ID and Session ID.

The Data API lets you programmatically fetch historical session details, including the original source, medium, and campaign.

You can then use this original attribution data to override or enrich your donation record, correcting the attribution.

You could even use this information to send a clean, correctly attributed server-side event (like a custom blackbaud_donation event) to GA4 via your GTM server container, ensuring the conversion is accurately credited to Organic Search, Paid Search, or whatever the initial channel was, bypassing the entire front-end iframe issue.

This solution is exceptionally powerful, reliable, and cheap, as Stape/GCP costs are often minimal for this level of traffic, offering enterprise-level data fidelity for a fraction of the cost of premium marketing solutions.

About The Author