Skip to main content

cmeta for perk pages

Carry your own tracking values — UTM parameters and your internal ids — from your perk page all the way through to the conversions in your reports.

A cmeta attribute is a key-value pair you attach to a Paylode surface: any parameter prefixed cmeta_ (your own ids — a user, a plan, a placement), plus the five standard utm_* marketing parameters. See Custom attribute for the general rules. On perk pages the values ride onto the outbound redemption links a customer clicks, and come back attached to the resulting conversion — that's how you answer "which of my campaigns, pages, or user segments actually drove redemptions" using ids you already understand.

There are three levels to pass them at, depending on how you serve the page.

Embed level — data-* attributes

When you embed a perks page, put the values on the container as data-utm_* / data-cmeta_* attributes:

<div
id="paylode-iframe-container"
data-slug="example-rewards"
data-utm_source="newsletter"
data-utm_campaign="spring-2026"
data-cmeta_user_id="a1b2c3"
data-cmeta_plan="pro"
></div>

The widget also picks up any utm_* or cmeta_* parameter already on the host page's URL automatically and merges the two sources — so a customer landing on ?utm_source=newsletter forwards that with no attributes needed. Use data-* for values the host URL doesn't carry.

Hosted-page level — URL parameters

When you link customers to your Paylode-hosted page, append the parameters to the address you share:

https://example-rewards.perkspulse.com/?utm_campaign=member-email&cmeta_segment=vip

Every channel gets its own tagged link — that's how a newsletter, a QR code, and an in-app link stay distinguishable in your reports.

Double check this, I thought when we provide cmeta to collection get, we attached it to click url. check this and answer in chat.

When you render perks yourself, the collection API doesn't take attribution parameters — the perk's click_url does. Append your cmeta_* / utm_* parameters to the click_url you place behind the Redeem button (URL-encoded, without altering anything already on the link):

const redeem = new URL(perk.click_url);
redeem.searchParams.set("cmeta_user_id", "a1b2c3");
redeem.searchParams.set("utm_source", "checkout");
// use redeem.toString() as the Redeem button's href

The click records the attributes, then forwards the customer to the offer as usual.

Where the values come back

Attributes are captured at click time and attached to what follows:

  • Click activity — the perk-page click views in your analytics (the perk_page_clicks_of_* views for each section type, and the unified click views) carry a cmeta dimension you can group and filter by.
  • Conversions — every conversion view carries the same cmeta dimension, with the platform's read-back rule applied: cmeta_ prefixes are stripped (cmeta_user_iduser_id), utm_* names come back unchanged.

Query both through AnalyticsQuery your metrics shows the query shape.

Worked example

You run an email campaign and want to know which conversions came from it and tie each one back to the specific customer. On the dashboard page where your perks center is embedded:

<link
rel="stylesheet"
href="https://www.paylode.com/paylodePerkIframe.css"
/>

<div
id="paylode-iframe-container"
data-slug="example-rewards"
data-utm_source="newsletter"
data-utm_campaign="spring-2026"
data-cmeta_user_id="a1b2c3"
></div>

<script src="https://www.paylode.com/paylodePerkIframe.js"></script>

A customer browses, redeems a perk, and later that becomes a conversion. In your reports that conversion carries utm_source = newsletter, utm_campaign = spring-2026, and user_id = a1b2c3 — so you can attribute it to the campaign and to the exact customer who converted.

Troubleshooting

caution

URL-encode your values. The widget joins parameters onto the redemption URL as-is — it does not encode them for you. A value containing &, =, spaces, or other reserved characters will break the query string. Encode any value that isn't plain alphanumeric before you set it.

caution

Keep custom-attribute values short and clean. Custom-attribute names accept letters, numbers, hyphens, and underscores; values must be 255 characters or fewer. A value longer than that is dropped before it reaches your report — it isn't truncated, it simply doesn't arrive.

note

Container attribute names are normalized to snake_case, so data-utm_source and data-utm-source both forward as utm_source. Browsers lowercase HTML attribute names before the widget ever sees them, so don't rely on camelCase like data-utmSource — write the key with underscores or hyphens.