diff --git a/packages/donate-button-v4/src/components/widget/types/UrlParams.ts b/packages/donate-button-v4/src/components/widget/types/UrlParams.ts index 3070fa08..f328214b 100644 --- a/packages/donate-button-v4/src/components/widget/types/UrlParams.ts +++ b/packages/donate-button-v4/src/components/widget/types/UrlParams.ts @@ -63,6 +63,7 @@ export enum DonateUrlParameters { } export enum UTM_QUERY_PARAM { + utm_id = 'utm_id', utm_source = 'utm_source', utm_medium = 'utm_medium', utm_campaign = 'utm_campaign', diff --git a/packages/donate-button-v4/src/helpers/constructDonateUrl.ts b/packages/donate-button-v4/src/helpers/constructDonateUrl.ts index 8e3995dc..c6edc0ae 100644 --- a/packages/donate-button-v4/src/helpers/constructDonateUrl.ts +++ b/packages/donate-button-v4/src/helpers/constructDonateUrl.ts @@ -70,6 +70,20 @@ function getBaseUrl({ return baseUrl; } +function getUTMParamsFromPageUrl(): Record { + const url = new URL(window.location.href); + const utmParams: Record = {}; + + Object.values(UTM_QUERY_PARAM).forEach((param) => { + const value = url.searchParams.get(param); + if (value) { + utmParams[param] = value; + } + }); + + return utmParams; +} + function getBaseParams({ methods, nonprofitSlug, @@ -94,6 +108,8 @@ function getBaseParams({ | 'designation' | 'requireShareInfo' >) { + const utmParams = getUTMParamsFromPageUrl(); + return { [DonateUrlParameters.METHOD]: methods?.join(','), [DonateUrlParameters.NO_EXIT]: noExit ?? 1, @@ -105,7 +121,8 @@ function getBaseParams({ [DonateUrlParameters.REQUIRE_SHARE_INFO]: requireShareInfo, [UTM_QUERY_PARAM.utm_campaign]: 'donate-button', [UTM_QUERY_PARAM.utm_source]: utmSource ?? nonprofitSlug, - [UTM_QUERY_PARAM.utm_medium]: UTM_MEDIUM + [UTM_QUERY_PARAM.utm_medium]: UTM_MEDIUM, + ...utmParams }; }