Documentation

Running OTS lift

A campaign can reach people through social feeds, online video, connected TV, search and outdoor advertising. Measuring its effect means connecting that activity with changes in awareness, consideration or intent. Getting a usable exposure record for each survey respondent across that mix can be difficult.

Opportunity to see (OTS) gives you a practical way to study campaigns when those records are unavailable or incomplete. Combine the media plan with respondents' media habits to build a score: people with more opportunity to encounter the campaign score higher. An OTS Lift report uses the highest-scoring respondents as its exposed group and compares their outcomes with matched controls from the remaining respondents.

When to use OTS

OTS is useful when your measurement question covers more of the campaign than you can observe through exposure tracking:

  • Walled gardens restrict independent tracking. Platforms can limit third-party tags and make measurement available through their own approved integrations. For example, Google does not accept third-party tracking pixels for YouTube measurement. Platform reporting may be available without providing exposure records you can match to your survey respondents.
  • Pixel coverage is incomplete. A pixel needs to be implemented on supported placements, its request needs to reach the measurement service, and the resulting record needs to match the respondent. Browser protections can block tracking content; Firefox documents how its tracking protection works. Even where tracking runs, changes of device or IP address can leave gaps in respondent matching.
  • The campaign spans different environments. Connected TV may need server-side delivery of exposure records, while an outdoor poster cannot fire a browser pixel when someone passes it. Survey answers about viewing, platform use or travel can provide opportunity indicators where a common tracking method is unavailable.
  • The campaign is already running, or has finished. You may have a media plan and suitable media-habit questions but no exposure tracking from the start. OTS lets you use that evidence to construct a model for the study.

Check which records are available first. Exposure sources support pixel and server-to-server data, so a placement's lack of a browser pixel does not automatically mean exposure cannot be recorded. OTS is particularly valuable when substantial parts of the campaign still lack usable respondent-level records.

Why OTS is useful

OTS makes a campaign-wide research question practical even when exposure data is fragmented. It connects two things you often already have: where the campaign ran and how the people in your survey use those environments.

  • Bring several channels into one study. Build a common opportunity index across the campaign's measurable channels, including walled-garden media and offline placements where suitable survey questions exist. You can assess the combined campaign against one set of brand outcomes.
  • Use more of the evidence available. The media plan contributes placement and delivery information; respondents contribute their own habits and eligibility. Together, they distinguish a frequent user of the campaign's main channels from someone with little opportunity to encounter it.
  • Define opportunity independently of brand response. Media-use answers let you build the score without using campaign recall, awareness or consideration to decide who enters the exposed group. Those answers remain outcomes to compare.
  • Keep the model explainable and repeatable. Every contribution comes from an explicit rule. You can inspect why a respondent scores highly, apply the same rules to new completes, and check how alternative defensible weights or reach assumptions affect the analysis.
  • Fit into the normal Lift workflow. Once the score exists, the platform handles group assignment, matching and outcome comparisons in the same report editor used for exposed-versus-control studies.

The result is a comparison based on modelled opportunity. Its usefulness depends on how well the model represents the campaign and audience. OTS does not verify that an individual saw an ad, and the score alone does not establish exposure probability or campaign reach.

From the media plan to an OTS model

Most of the work is building the model. A media plan tells you where the campaign ran; it does not tell you how to score a respondent. You need to use judgement about what the survey measures, which placements it covers and how to combine the evidence. Once those decisions are made, a Data Prep recoding script applies them to every respondent.

The steps below work through that process for Northstar Cloud, a fictitious software brand. All campaign figures, question IDs and respondent examples are illustrative.

Before you begin

Have these available:

  • The media plan, including placements, markets, campaign dates and planned or delivered impressions.
  • The questionnaire and its reporting IDs, including media-use and eligibility questions.
  • A definition of the audience and fieldwork period you want to analyse.
  • A campaign reach estimate, if available. You can build the OTS score before this arrives.

If you are still designing the survey, use the media plan to decide which media-habit questions to ask. If fieldwork is already underway, start with the answers you have. Record gaps where the survey cannot distinguish people with and without opportunity to encounter a placement.

Step 1: Work out which parts of the campaign you can model

Read the plan at placement level. A LinkedIn feed ad and a connected-TV placement bought through LinkedIn need different indicators of opportunity. Group rows according to where respondents could encounter the ad, rather than just the company selling the inventory.

For Northstar Cloud, suppose the plan contains:

PlacementPlanned impressionsProposed OTS component
Connected TV1,200,000CTV
Connected TV bought through LinkedIn800,000CTV
LinkedIn feed1,000,000LinkedIn
Facebook and Instagram1,500,000Meta
Google search300,000Search
Bing search200,000Search
YouTube5,000,000YouTube
Browser display500,000Leave out: no suitable survey measure

Check that the rows cover the market and period you are measuring. Exclude spreadsheet subtotals and grand totals when adding placements together. Use delivered impressions for the relevant period when they are available; otherwise record that the mix comes from a plan. A full-quarter allocation can describe the planned mix, but it does not establish how much had been delivered before a respondent completed the survey.

Now compare each proposed component with the questionnaire:

ComponentWhat would indicate opportunity?Judgement to make
CTVFrequency of watching ad-supported streaming on a TVDoes the question distinguish TV viewing from phone viewing, and ad-supported from ad-free plans?
LinkedInFrequency of using LinkedInIs general platform use a reasonable proxy for encountering the feed placements in this campaign?
MetaFacebook and Instagram useDoes the plan separate the platforms, or do you need one combined indicator?
SearchFrequency of using the advertised search engines for relevant searchesDoes the survey measure the kind of searching the campaign targeted?
YouTubeFrequency of using YouTubeDo you have information about ad-free subscriptions or other reasons ads could not be seen?

Use an eligibility answer when it clearly rules out opportunity. For example, an answer confirming that a respondent only uses ad-free streaming plans can make their ad-supported CTV contribution zero. An unanswered eligibility question does not establish non-use.

Be explicit about weaker proxies. If you only know that someone uses YouTube, using that answer without a subscription adjustment is a model choice. Do not invent an adjustment you cannot support from the survey.

Leave a placement out when there is no usable indicator. General internet use is weak evidence for a particular browser-display placement; living in a city is weak evidence for passing a particular outdoor site. You can add OOH when the plan's locations and the survey's travel answers support a useful measure. For this example, the model covers the five listed digital components. It does not represent every placement in the campaign.

Step 2: Decide how answers become opportunity points

Give higher-frequency answers more points. A simple ordinal mapping is easy to explain and can be calculated independently for each respondent:

Frequency answerPoints
Never0
Less often than once a week1
About once a week2
Several times a week3
About once a day or more4

These are ordered opportunity points. Four points does not mean four impressions, and it does not establish four times the chance of exposure compared with one point. Equal spacing between the categories is a modelling choice.

Decide how to combine overlapping answers. In this example, the plan gives one allocation for Facebook and Instagram, so we use the higher of the respondent's two frequency scores as the Meta score. This gives one Meta contribution without adding both platform scores. It is a simple proxy, not measured deduplication. A plan with separate platform allocations could support separate contributions instead.

For the worked example, the CTV question specifically asks about ad-supported streaming on a TV, and the search question specifically asks about work-related Google or Bing searches. Those conditions are already built into the questions. A broader question would need an additional eligibility rule or a clearly stated limitation.

Keep campaign recall, awareness, consideration and the other lift outcomes out of the score. Using them to decide who was exposed would build the result you are trying to measure into the group assignment.

Step 3: Decide how much each channel contributes

You now have an opportunity score for each channel. The next judgement is how to combine them into one campaign score.

For Northstar Cloud, we choose the planned impression mix as the channel weights. Add together placements assigned to the same component:

ComponentIncluded impressionsShare of included impressions
CTV2,000,00020%
LinkedIn1,000,00010%
Meta1,500,00015%
Search500,0005%
YouTube5,000,00050%
Total10,000,000100%

Multiply each channel's opportunity points by its impression weight and add the contributions. You can use the impression counts directly; dividing all weights by the same total gives the same proportions.

This gives more influence to channels carrying more of the planned delivery. It is a starting assumption about relative opportunity. Impressions alone do not establish unique reach, delivery within the survey audience or an individual's exposure probability. Do not substitute budget shares without considering how buying costs differ between channels.

Check the consequence of your choice: YouTube supplies half this example's weight, so its frequency answer will strongly influence the ranking. Look at a few respondent profiles and ask whether that makes sense for the campaign. If it does not, revisit the placement mapping, the audience fit of the questions and the evidence for the weights. Keep a note of the reason for each decision, and settle the model before looking for lift in the outcomes.

Use the relevant plan for each market. A common scoring rule can use different market weights, but build market-specific rankings in separately scoped reports. A country matching variable does not make the report rank respondents separately within countries.

Step 4: Add the model in Data Prep

The recoding script turns the model you have just defined into a reporting variable. It runs for each respondent, reads their answers, applies the scoring rules and stores the result. The score does not depend on other respondents' answers.

Open Data Prep from the survey's reporting page. Keep the generated recoding script and its existing recodes. The default script already creates r, the Recoder for the current respondent. Append the calculation below, replacing the example reporting IDs and answer labels with those in your survey. See Recoding and post-field data wrangling for the editor.

python
from survey import Recoder FREQUENCY_POINTS = { "Never": 0, "Less often than once a week": 1, "About once a week": 2, "Several times a week": 3, "About once a day or more": 4, } PLAN_IMPRESSIONS = { "ctv": 2_000_000, "linkedin": 1_000_000, "meta": 1_500_000, "search": 500_000, "youtube": 5_000_000, } def store_ots_index(recoder: Recoder) -> None: """Apply the example model when every required media answer is present.""" questions = { "ctv": "media-ctv", "linkedin": "media-linkedin", "facebook": "media-facebook", "instagram": "media-instagram", "search": "media-search", "youtube": "media-youtube", } answers = { channel: recoder.get_value(question) for channel, question in questions.items() } if None in answers.values(): return points = { channel: FREQUENCY_POINTS[str(answer)] for channel, answer in answers.items() } points["meta"] = max(points["facebook"], points["instagram"]) weighted_points = sum( impressions * points[channel] for channel, impressions in PLAN_IMPRESSIONS.items() ) maximum_points = 4 * sum(PLAN_IMPRESSIONS.values()) score = (32 * weighted_points + maximum_points // 2) // maximum_points recoder.store_value("OTS_Ordinal", score) store_ots_index(r)

The calculation stores OTS_Ordinal on a 0–32 integer scale. It divides the weighted total by the maximum possible total, multiplies by 32 and rounds to the nearest whole point, with halves rounded up. No use scores 0; maximum frequency in every included channel scores 32. A small positive result can also round to zero. Keep the scale fixed when updating the plan weights.

The scale is an index, not a percentage or a number of contacts. A score of 24 does not mean a 75% probability of exposure.

Every respondent in this example answers all six frequency questions, including Never where appropriate. The script leaves the score missing if an answer is absent; an unexpected answer label raises an error so you can review the mapping. If your survey skips frequency questions for confirmed non-users, add an explicit rule using that screening answer to assign zero. Do not treat every skipped or unknown answer as non-use.

You can also use Chat in Data Prep to help write the calculation. Give it the model decisions: the reporting IDs, answer-to-point mapping, eligibility rules, combined-platform rule, channel weights and output scale. Ask it to append the calculation to the existing script. Review the proposal before Apply, then Save. Chat can help implement the rules; you still need to decide whether those rules are appropriate for the campaign.

Step 5: Check the scores against the model

After saving, run recoding for the respondents you intend to analyse and check the resulting variable in reporting or a data download.

Start with a worked respondent. Suppose their channel points are:

ComponentPointsShare of included impressionsWeighted contribution
CTV220%0.4
LinkedIn310%0.3
Meta415%0.6
Search25%0.1
YouTube250%1.0
Total2.4

The maximum weighted total is 4. This respondent's index is 2.4 ÷ 4 × 32 = 19.2, stored as 19.

Then check the current respondents:

  1. Confirm that each selected respondent has one score and that missing answers have been investigated.
  2. Check some zero, low and high scores against the original answers. Confirm that eligibility and combined-platform rules do what you intended.
  3. Look at the distribution in each market. Check for an unexpected pile-up at zero, a single channel dominating the ranking, or many tied scores near the likely exposed/control split.
  4. Compare a few profiles near that split. If small, weakly supported modelling choices change their order, record that uncertainty and consider a sensitivity run with another defensible model.

Use these checks to find coding errors and assess whether the model is plausible. Keep the decisions independent of whether a particular version produces positive lift.

Step 6: Choose the reach assumption and run Lift

The OTS score ranks respondents. You also need a reach percentage to decide how many of the highest-scoring respondents should enter the exposed group.

Use a campaign reach estimate for the same audience and period where one is available. Planned impressions alone do not supply that percentage: you also need information about frequency, audience size and overlap between channels. See Campaign size and measurability for working with reach and frequency. If reach is unavailable, document an assumption and compare a few plausible percentages, such as 20%, 30% and 40%, rather than presenting one as measured reach.

For a 30% reach assumption, start at the highest-scoring end of the distribution and select 30% of the respondents:

Illustrative histogram of the ordinal OTS index from 0 to 32 for 500 respondents. Azure bars at scores 16 to 32 contain 150 respondents, the highest-scoring 30% selected as exposed. Stone bars contain the remaining 350 control candidates.

In this fictitious example, 150 respondents enter the exposed group and 350 remain as control candidates before matching. Scores 16–32 happen to contain the top 30% here; the boundary depends on the actual distribution and chosen reach. The percentage counts respondents, rather than a proportion of the index's range.

On the Reports tab:

  1. Select Create → Lift, enter the report details and save, or edit an existing Lift report.
  2. In Scope, select the respondent statuses and reporting period. Project reports also let you choose surveys.
  3. In Lift model, set Exposure method to OTS + assumed reach.
  4. Choose OTS_Ordinal as the OTS score.
  5. Enter Expected campaign reach (%). Entering 30 assigns the highest-scoring 30% of the selected population to the exposed group.
  6. Choose matching questions and outcomes, then complete Reporting, Relabelling and Significance as for a normal Lift report.

The report ranks by respondent count, rounds the exposed count to the nearest whole respondent with halves rounded up, and breaks tied scores by ascending respondent ID. Tied scores can therefore fall into different groups; zero is not an automatic control flag. Every selected respondent needs a score, and the percentage must leave at least one respondent in each group.

The initial assignment stays fixed across outcomes and matching iterations. Outcome eligibility and matching can reduce the displayed bases. Rerun the report after changing the score, reach assumption or reporting population.

Describe what you measured

Read the results as a comparison between the high-OTS group and matched controls. For example:

Respondents assigned to the top 30% of the OTS index had awareness six percentage points higher than the matched control group. The index used media habits weighted by the planned impression mix; 30% campaign reach was an analysis assumption.

Record the model's inputs, judgement calls, exclusions, plan period and reach assumption alongside the result. These respondents were assigned through a model; they are not verified campaign viewers. Matching and a statistically significant result do not validate the exposure model. See Lift measurement methodology for interpreting the comparison.