Measure a campaign
Find the campaign that brought the people who sign up, buy or activate. Group the conversions by first touch in Events, or break a funnel down by first campaign.
On this page
Why "Campaign name" shows (not set) for sign-ups
Each event gets its campaign values from its own page address. For example:
- A person opens
https://example.com/?utm_campaign=spring. The page view has the campaign namespring. - The person goes to
/signupand creates an account. The sign-up event has the page address/signup, with noutm_campaign.
In Events, with the filter Event Name = your sign-up event and grouped by Campaign name, the sign-up is in "(not set)". An event that your server sends has no page address, so its campaign fields are always "(not set)".
To credit the sign-up to the campaign of the first visit, use a First touch (person) field. See Credit each person to a first touch.
Choose what to count
In Events, the grouped by menu has four groups with campaign fields:
| Group | Fields | Each count is | The value comes from |
|---|---|---|---|
| Campaign & release | Campaign source, Campaign medium, Campaign name and more | events | the page address of each event |
| Sessions | First campaign source in session, Last campaign source in session, and the same for medium and name | sessions | the events of that session only |
| First touch (person) | First campaign source, First campaign medium, First campaign name, Last campaign before converting, First visit source, Landing page | people | the person's visits before the conversion |
| First touch (account) | the same six fields, each with Account at the start | accounts | the visits of all the people of the account, before the account's conversion |
- A campaign field in Sessions shows only for a campaign key that your project has. See Events explorer.
- A session field counts the campaign of the session itself. If a person clicks an ad, leaves, and signs up on a later visit, the sign-up session does not have the campaign. Use a First touch (person) field for that.
- then by must count the same thing: a First touch (person) field pairs only with another First touch (person) field, and a First touch (account) field only with another account field.
Credit each person to a first touch
- Open Events.
- Set the dates. The conversions in these dates count.
- Click + condition, pick the Field Event Name and pick your sign-up event, or another conversion event.
- In grouped by, choose a field under First touch (person), for example First campaign name.
- Click Run.
The table shows one row for each value. The count column reads People.
Tip: run the same question again, grouped by Last campaign before converting. If the two tables are different, some people came from more than one campaign.
How Sequential credits a person:
- The filter and the dates select the conversions. Each person counts one time, at the first matching event in the dates.
- Then Sequential reads the person's visits before that event, in all the data that it keeps for the project. This includes the days before the dates that you set. A visit after the conversion never gets the credit.
- An event that your server sends with the user id counts as a conversion. It is never a touch, because it has no page address.
- The visits that a person made before
identify()count, because Sequential links them to the person. See Identify users and Limits.
The fields:
| Field | The value |
|---|---|
| First campaign source, First campaign medium, First campaign name | The earliest value in the person's visits that is not empty and not (withheld). (withheld) shows only when the person has no other value. |
| Last campaign before converting | The latest campaign name before the conversion, with the same rules. |
| First visit source | The site that the first visit of the person came from, for example google.com. |
| Landing page | The first page that the person viewed, as a route template, for example /blog/:id. |
Special rows:
| The row reads | It counts |
|---|---|
| (none) | People who have visits before the conversion, but no value for this field. |
| (no browser visit) | People who have no visit before the conversion: only events from your server. |
| Direct / internal | First visit source only: a first visit with no referrer, or from a page of the same site. Another domain of your project counts as a different site. |
| (withheld) | Campaign values that Sequential removed when it stored the event. See What Sequential keeps from page URLs. |
A person row has no % of total, no Filter to this and no Watch sessions. A table shows at most 1,000 groups.
The lines above the table
- "Credited to each person's first touch since 15 Oct 2026." The date is the first day of data that Sequential still keeps for the project. It shows in the date format of your browser. A touch before that day is not in the data.
- "Earlier visits may be missing from the data, so some first touches can be later visits." This line shows when Sequential cannot confirm that it still keeps every day of the project's data. See Data retention and deletion.
- "Includes your team's visits." The Events table and the funnel table always count your team. See Agents for a way to leave the team out.
Credit each account
Use the same steps, and choose a field under First touch (account), for example Account first campaign name. The count column reads Accounts.
- Only events that carry an account id count as conversions. Each account counts one time, at its first matching event in the dates. An event that your server sends with the account id counts.
- The people of an account are the people whose browser events carry the account id. Sequential reads all of their visits before the account's conversion. The earliest touch of any of them gets the credit.
- An account that only your server sends has no people. It is in "(no browser visit)".
- The table also shows "Only events that carry an account id count."
See Users and accounts for how to send an account id.
Break a funnel down by campaign
- Open Funnels and add the steps, for example a page view, your sign-up event and your activation event.
- In Break down by, choose a field. Or click Break down by first campaign: this chooses First campaign name.
- Optional: in Conversion window (days), type a whole number from 1 to 90.
- Click Run.
Break down by has No breakdown and the six First touch (person) fields. When a result shows, a change of Break down by or of the window runs the funnel again.
The table under the funnel has the name of the field, for example By first campaign name:
- One row for each group: the 20 largest groups by the people at step 1, then (other) for the rest. So the groups add up to the funnel.
- A column for each step, with the people and the rate from step 1, and the column Step 1 to N. It shows — when no person did step 1.
- Each person is in one group: the touch at or before the person's step-1 event.
- The table shows counts only. It has no list of people.
- The lines under the table say what the count credits, for example "People, credited to their first touch since 15 Oct 2026.", and the same gap line and team line as in Events.
Conversion window (days)
- A later step counts only when the person does it within this number of days after step 1. All steps must also be in the dates.
- Empty means no window.
- Who dropped uses the same window, so its people match the funnel.
- A value that is not a whole number from 1 to 90 shows "Conversion window: a whole number of days from 1 to 90, or empty for none." The funnel does not run.
If Sequential cannot read the breakdown, the page shows "Couldn't read the breakdown. The funnel above is not affected."
Limits
- The data that Sequential keeps. A first touch comes only from the data that Sequential still keeps. When old data is deleted, a later visit can look like the first. The line "Earlier visits may be missing from the data…" warns about this. See Data retention and deletion.
- A new sign-up. Sequential links the earlier anonymous visits to a person a few minutes after
identify(). Until then, a new person can be in another row, for example (none) or (no browser visit). - A shared device. When two people sign in on the same browser, the visits before the first sign-in stay with the first person.
reset(). It starts a new anonymous id. The visits afterreset()are not linked to the person from before.- Your server's user id. A server event never links a visitor to a person. Only
identify()in the browser does. So use the same user id on your server as inidentify(). See Backend SDK. - Another origin. The browser SDK keeps one anonymous id for each origin. For example,
example.comandapp.example.comare two origins. A visit on one origin links to the person only ifidentify()also runs on that origin. - Mobile apps. App events have no page address, so they have no campaign values. Install attribution is not available.
Tag your links
An example link: https://example.com/pricing?utm_source=reddit&utm_medium=cpc&utm_campaign=spring_launch
One pattern that works:
utm_source: where the click came from, for examplereddit,googleornewsletter.utm_medium: the type of traffic, for examplecpc,emailorsocial.utm_campaign: a short name for the campaign, for examplespring_launch.
Rules:
- Use the parameter names in lower case:
utm_source,utm_medium,utm_campaign,utm_term,utm_content. Sequential does not readUTM_SOURCE. - Values keep their case:
Redditandredditare two rows. Use one rule for all your links, for example lower case only. - Put the parameters before a
#. Autm_parameter after#is not read. - Sequential keeps the first 128 characters of a value.
See Campaign values for how Sequential reads them.
Agents
An agent with the scope analytics:read can ask the same questions:
get_breakdowntakesuser:first:<key>,user:first_visit:<key>anduser:last_before:<key>, with the key$utm_source,$utm_medium,$utm_campaignor$page. Each count is people.get_breakdownalso takessession:first:<key>andsession:last:<key>with the same four keys. Each count is sessions.session:first:$pageis the entry page.funnel_analysistakesbreakdownwith theuser:fields, andconversion_window_daysfrom 1 to 90.- The conversions are in the agent's window: at most the last 30 days, ending now. The first touch comes from all the data that Sequential keeps.
- In the filters of these tools, an agent can also test a person's first touch: the first or the first-visit value of
$utm_source,$utm_medium,$utm_campaignor$page, with text operators only. The filters in the app cannot. exclude_internal: trueleaves out the people that the project marks as internal. The app has no such option.- Agents cannot use the First touch (account) fields, First visit source, the release pair of Sessions,
$utm_termor$utm_content. They cannot filter by a session value.