UTM campaign tracking

The JavaScript SDK automatically captures UTM parameters from page URLs and attaches them to events as campaign metadata under context.campaign. No additional SDK configuration is required.

Campaign parameter mapping

Standard UTM parameters are mapped to context.campaign properties as follows.

URL query parameter Property
utm_campaign context.campaign.name
utm_source context.campaign.source
utm_medium context.campaign.medium
utm_term context.campaign.term
utm_content context.campaign.content

Note that utm_campaign is mapped to context.campaign.name, not context.campaign.campaign.

Any additional query string parameter prefixed with utm_ is collected automatically and stored using the parameter name without the utm_ prefix.

For example:

URL query parameter Property
utm_platform context.campaign.platform
utm_creative context.campaign.creative
utm_channel context.campaign.channel
utm_ad_group context.campaign.ad_group

Campaign data in event payloads

When an event is generated, the SDK inspects the current page URL and extracts all query string parameters prefixed with utm_.

Example URL:

https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale

Calling:

analytics.track("Purchase Completed");

Produces an event similar to:

{
  "event": "Purchase Completed",
  "context": {
    "campaign": {
      "source": "google",
      "medium": "cpc",
      "name": "summer_sale"
    }
  }
}

If the current page URL does not contain UTM parameters, no campaign properties are added automatically.

Providing campaign values manually

Campaign properties can also be provided explicitly in the event payload.

analytics.track("Purchase Completed", {
  context: {
    campaign: {
      source: "crm",
      medium: "email",
      name: "retention_flow"
    }
  }
});

This allows campaign data to be attached even when UTM parameters are not present in the current page URL.

Precedence rules

Automatically collected and manually provided campaign values are merged.

When the same property exists in both places, the manually provided value takes precedence.

Example URL:

https://example.com/?utm_source=google&utm_medium=cpc

Event:

analytics.track("Purchase Completed", {
  context: {
    campaign: {
      source: "crm"
    }
  }
});

Result:

{
  "context": {
    "campaign": {
      "source": "crm",
      "medium": "cpc"
    }
  }
}

Examples

Standard UTM parameters

URL:

https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=spring_sale

Result:

{
  "context": {
    "campaign": {
      "source": "google",
      "medium": "cpc",
      "name": "spring_sale"
    }
  }
}

Custom UTM parameters

URL:

https://example.com/?utm_platform=facebook&utm_creative=video_a

Result:

{
  "context": {
    "campaign": {
      "platform": "facebook",
      "creative": "video_a"
    }
  }
}

Standard and custom parameters together

URL:

https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=spring_sale&utm_platform=facebook&utm_creative=video_a

Result:

{
  "context": {
    "campaign": {
      "source": "google",
      "medium": "cpc",
      "name": "spring_sale",
      "platform": "facebook",
      "creative": "video_a"
    }
  }
}

Manual override

URL:

https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=spring_sale

Event:

analytics.track("Purchase Completed", {
  context: {
    campaign: {
      source: "crm",
      name: "retention_flow"
    }
  }
});

Result:

{
  "context": {
    "campaign": {
      "source": "crm",
      "medium": "cpc",
      "name": "retention_flow"
    }
  }
}

Technical details

URL decoding

UTM values are URL-decoded before being stored.

Example:

?utm_campaign=summer%20sale

Becomes:

{
  "name": "summer sale"
}

Duplicate parameters

If the same UTM parameter appears multiple times in the URL, the last occurrence is used.

Example:

?utm_source=google&utm_source=linkedin

Becomes:

{
  "source": "linkedin"
}

Using campaign data in transformations

In transformations, access UTM campaign information through the context.campaign object:

  • context.campaign.name (string): Campaign name.
  • context.campaign.source (string): Campaign source.
  • context.campaign.medium (string): Campaign medium, such as email or social.
  • context.campaign.term (string): Campaign keyword or term.
  • context.campaign.content (string): Campaign content or variation.

Data warehouse

In your data warehouse, the events view exposes campaign data through the following columns:

  • context_campaign_name
  • context_campaign_source
  • context_campaign_medium
  • context_campaign_term
  • context_campaign_content

FAQ

Which events receive campaign data automatically?

Campaign data is attached automatically to page, screen, track, identify, and group events when UTM parameters are present in the current page URL.

Are only standard UTM parameters supported?

No. Any query string parameter prefixed with utm_ is collected automatically.

Are custom UTM parameters supported?

Yes. Any query string parameter prefixed with utm_ is collected automatically and added to context.campaign using the parameter name without the utm_ prefix. These custom UTM parameters remain available in the event payload but are not exposed as dedicated columns in the events view.

How are automatic and manually provided campaign values combined?

Campaign properties are merged. When the same property exists in both places, the manually provided value takes precedence.

What happens when no UTM parameters are present?

No campaign properties are added automatically unless campaign values are provided explicitly in the event payload.

Are UTM parameters persisted across page navigations or sessions?

No. Campaign values are extracted from the current page URL only. If a page URL does not contain UTM parameters, no campaign data is collected automatically.