UTM source tracking is how Off The Couch attributes each booking, transaction, gift card, or active cart back to the marketing effort that drove it. Tag your links once (Google Ads, Facebook, email newsletter, partner site), and OTC captures the source on the resulting record so you can see — at the row level — which channel actually converted. Enable it per company group, build trackable links from the in-app Link builder, paste the booking-site embed script on your marketing site, and the source travels through the iframe on its own.
Why UTM tracking matters
Most venues spend real money to bring customers in — Google Ads, Facebook ads, email blasts, partner kickbacks, influencer collaborations, sponsored events. Without UTM tracking you can see how many bookings you got in a month, but you can't tell which marketing actually paid for them. Every channel ends up looking equally important (or equally suspect), and you make spend decisions on gut feeling.
Tagged links change that. Once UTM tracking is on, every booking, transaction, and gift card carries the source it came from, so you can answer real business questions instead of guessing:
| Question | Without UTMs | With UTMs |
|---|---|---|
| Which channel is actually driving bookings? | "It was a good month, so... probably the ad we just ran?" | Filter your transactions and carts by source and see a clean count per channel |
| Was that Facebook ad worth it? | Hope it was | Pull the bookings tagged utm_source=facebook and compare revenue to ad spend — that's your ROAS |
| Which campaign converted better — June promo or July promo? | They both went out on Facebook, so they blur together | Tag each with a different utm_campaign and compare directly |
| Should we renew this partner deal? | "We get some traffic from them... I think?" | Bookings tagged with the partner's source tell you exactly how much revenue they drove |
| Did the newsletter actually work? | Look at email opens and hope clicks translate to bookings | See how many utm_source=newsletter clicks turned into completed bookings |
The real value isn't visits — it's revenue. Google Analytics and similar tools can tell you how many people clicked a tagged link. OTC's role is different: it tells you how many of those clicks turned into actual bookings. That's what matters for ROAS, partner renewals, and ad-budget decisions, and it's the piece you can't get from web analytics alone because your booking conversion happens inside OTC.
A few concrete wins venues get once UTMs are in place:
- Justify or kill ad spend. Pull last month's bookings, count how many came from each paid source, multiply by booking value, divide by ad spend. That ratio is ROAS. If it's below 1, the campaign isn't paying for itself. If it's 3+, scale it up.
- Spot the quietly profitable channel. Most venues find at least one source they were under-investing in — a Reddit thread, a local podcast, a partner with great word of mouth — that's quietly producing high-converting bookings.
- Renew partner deals with data. When a partner asks for a bigger kickback or a renewed contract, "we saw 12 bookings tagged with your source last quarter at $X each" is a much better conversation than "yeah, you've sent us... some?"
- Tell which creative is working. Same Facebook campaign, two different ad creatives, two different
utm_contentvalues. Compare booking counts to see which creative actually drives revenue, not just clicks. - Reduce wasted spend. Once you can see which sources don't convert, you stop paying for them. Most venues find at least one channel producing clicks but almost no bookings.
The compounding effect matters too: a few months of UTM data lets you spot seasonal patterns (which sources spike around holidays, which slump), compare year-over-year campaign performance, and build a real sense of which efforts deserve to be part of your standard rotation versus which were one-time experiments that didn't pay off.
What UTM is, in plain English
A UTM is a small set of tags you add to the end of a marketing URL. "UTM" stands for Urchin Tracking Module — a leftover name from Urchin, the analytics company Google bought and turned into Google Analytics. The tags don't change the page the visitor sees; they just travel along so your booking software (and your other analytics tools) can record where the visit came from.
A tagged link looks like this:
https://yoursite.com/?utm_source=facebook&utm_medium=social&utm_campaign=summer_sale
Everything after the ? is the tracking data.
There are five standard UTM parameters. The first three are the ones almost everyone uses.
| Parameter | What it tracks | Examples |
|---|---|---|
utm_source | Where the traffic comes from — the specific platform or referrer | google, facebook, newsletter, partner_site |
utm_medium | The type of channel — the category the source falls into | cpc (paid search), social, email, referral |
utm_campaign | The specific campaign or promotion this link belongs to | summer_sale, black_friday_2026, grand_opening |
utm_term | The paid keyword that triggered the ad. Mostly used in paid search | escape_room_seattle |
utm_content | Distinguishes between versions of the same campaign. Useful for A/B testing, or telling apart two links in the same email (header vs. footer) | header_button, footer_link |
The whole point is attribution — knowing which of your marketing efforts actually drives bookings (not just clicks) so you can spend time and money on what's working.
How Off The Couch supports source tracking
Off The Couch is a per-group setting and a small set of integrations:
| Piece | What it does |
|---|---|
| Enable purchase source tracking toggle | Turns the feature on for the company group. Without it, OTC ignores UTM parameters entirely |
| Link builder | A modal that builds a fully-formed trackable URL from your source / medium / campaign inputs. Works for both standalone OTC booking pages and embedded iframes |
| Booking-site embed script | The JavaScript snippet under Booking site settings reads UTM parameters from the parent page's URL, stores them in cookies for 30 days, and forwards them into the booking iframe so attribution survives the cross-origin boundary |
| Source columns and badges | Once a record is created with a UTM source attached, OTC displays it as a Source badge across the Bookings drawer, Transactions list and details, Active carts, and Gift cards |
When tracking is on and a customer arrives through a tagged link, OTC stores utm_source, utm_medium and utm_campaign, plus the website the customer came from, on the cart and then on each resulting booking, transaction, and gift card. The Source badge shows the source on records. The Transactions and Purchases reports have Source, Medium, Campaign, Referrer and Traffic attribution columns, and dashboards can break sales down by source, medium and campaign. utm_term and utm_content are not stored.
How it works end to end
| Step | What happens |
|---|---|
| 1 | A customer clicks a tagged marketing link (e.g., your Facebook ad) — the URL includes ?utm_source=facebook&utm_medium=social&utm_campaign=summer_sale |
| 2 | Your marketing page loads. If the booking site is embedded as an iframe, the OTC embed script reads the UTMs from the parent URL, drops them in cookies (otc_utm_source, otc_utm_medium, otc_utm_campaign) for 30 days, and appends them to the iframe's src. If the customer is redirected to OTC's hosted booking page, the UTMs are already in the URL — no extra work needed |
| 3 | OTC captures the UTM values into its session for the cart |
| 4 | When the cart turns into a booking (or gift card / transaction), OTC stamps the UTM source on the record |
| 5 | You see the source as a Source badge wherever that record appears |
The cookie persistence is what makes attribution work for multi-session bookings — a customer who clicks an ad today, leaves, comes back tomorrow, and books still carries the original Facebook attribution.
What if UTMs never make it into OTC?
OTC can only stamp a source on a record if the UTM values reach the booking site's URL. There are a few ways that fails silently — and the result is always the same: the record gets created with an empty source and the Source field on the row shows -. Understanding when that happens helps you set up reliably.
| Scenario | What happens to the source | How to fix it |
|---|---|---|
| Bare iframe embed with no snippet — your marketing site embeds the booking page with `` and no OTC embed script alongside it | Source is lost. Cross-origin browser rules block the iframe from reading the parent page's URL on its own, so even though the customer arrived at the parent page with ?utm_source=facebook, the iframe never sees it | Replace the bare iframe with the OTC embed snippet from Booking site settings. The snippet is what reads the parent URL, stashes cookies, and forwards the UTMs into the iframe |
Marketing link wasn't tagged at all — the link in the ad or email is https://yoursite.com/book with no UTM parameters | Source is lost — there are no UTMs to capture | Always build outbound marketing links through the Link builder, or tag them by hand. Untagged visits are unattributable, period |
| Link goes to a page that strips query parameters — some CMS plugins, redirect tools, or aggressive caching layers drop URL parameters before the page loads | Source is lost | Test by pasting your tagged URL into a browser and confirming the address bar still shows ?utm_source=... after the page loads. If not, fix the offending layer |
Embedded site, UTMs lost during internal navigation — this is the most common silent failure. A customer lands on yoursite.com/about?utm_source=facebook, browses around, and eventually clicks through to yoursite.com/book to complete their booking. By the time they hit /book, the URL is just yoursite.com/book — the UTMs were stripped the moment they navigated away from /about. The OTC embed snippet on /book reads the current page's URL, which has no UTMs to forward | Source is lost even though the OTC snippet is correctly installed on the booking page. The snippet only catches UTMs when the customer arrives at the booking page directly with UTMs in the URL — it can't recover UTMs that were on a different page earlier in the visit | Add a site-wide UTM capture script on your marketing site (see the next section). It runs on every page, captures UTMs the moment a customer lands, and persists them so they're still available when the customer eventually reaches the booking page |
| Embedded site, snippet only on the booking page — special case of the above: marketing pages have no UTM capture at all | Source is lost for any customer who lands somewhere other than the booking page | Same fix: add a site-wide capture script to your marketing site |
| Customer is in a privacy-strict browser — Brave, Safari ITP, an aggressive ad blocker, or a third-party-cookies-blocked setup | Source is flaky. UTMs in the URL still get through, but the 30-day cookie may not persist, so a multi-session customer can lose the attribution | Accept the loss for that subset of customers. It's a small percentage, and there's no clean workaround — privacy-strict browsers intentionally limit cross-session tracking |
| Hosted OTC booking page, customer arrives without UTMs — they bookmarked the booking URL, typed it directly, or found it via organic search | Source is lost — no UTMs in the URL means nothing to capture | Untagged visits are direct/organic by definition. Tag every outbound link you control |
The simple rule: if the URL of the page hosting the iframe shows the UTM parameters at the moment the iframe loads, OTC will catch them. If the UTMs were lost somewhere upstream — never tagged, stripped by a redirect, dropped during navigation between pages on your marketing site — there's nothing to attribute. The fixes are almost always one of three things: tag the source link, use the OTC embed snippet instead of a bare iframe, or persist UTMs across your marketing site so navigation doesn't lose them (covered in the next section).
Persist UTMs across your marketing site
This is the piece most venues miss. The OTC embed snippet handles the iframe boundary, but it only sees what's on the booking page's URL at the moment that page loads. If your customer landed somewhere else on your marketing site first, browsed around, and then clicked through to the booking page, the UTMs were almost certainly dropped on the way — because internal navigation between your site's pages doesn't carry query parameters by default.
Example flow that silently loses attribution:
| Step | URL in the address bar | What happens to UTMs |
|---|---|---|
| Customer clicks Facebook ad | yoursite.com/?utm_source=facebook&utm_campaign=summer | Present |
| Customer clicks "Pricing" in your nav | yoursite.com/pricing | Stripped |
| Customer clicks "About" | yoursite.com/about | Still gone |
| Customer finally clicks "Book now" | yoursite.com/book | OTC snippet runs, finds no UTMs, source is lost |
The OTC snippet on /book does its job correctly — it reads the page's current URL — but the URL no longer has the UTMs because they were dropped two clicks ago. The result is a perfectly valid booking with no source attribution.
The standard fix is a site-wide UTM capture script on your marketing site. It runs on every page, grabs UTMs the moment a customer lands on a tagged URL, and persists them to localStorage and a cookie so they're still available when the customer eventually reaches the booking page. The OTC snippet then reads them from the cookie even though the booking page's URL is bare.
This is industry-standard practice for any customer-facing marketing site that runs paid or referral traffic — most marketing-aware site builders wire this in as table stakes, alongside Google Analytics 4 and the Meta pixel. It's not part of OTC because it has to live on your marketing site, not inside the booking iframe.
A starting-point capture script
Drop this into your marketing site so it loads on every page (footer / global include / your CMS's "custom code" slot). It captures UTMs on landing and persists them for 30 days with first-touch attribution.
<script>
(function () {
var params = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gclid', 'fbclid'];
var url = new URLSearchParams(window.location.search);
var stored = JSON.parse(localStorage.getItem('mkt_attribution') || '{}');
params.forEach(function (p) {
var val = url.get(p);
if (val) {
stored[p] = val;
// Also set a cookie so the OTC embed snippet (and any server-side code) can read it
document.cookie = p + '=' + encodeURIComponent(val) + ';path=/;max-age=2592000;SameSite=Lax';
}
});
// First-touch: only overwrite when a new tagged visit arrives, otherwise keep the original
if (url.get('utm_source') || url.get('gclid') || url.get('fbclid')) {
localStorage.setItem('mkt_attribution', JSON.stringify(stored));
}
})();
</script>A few things this script does intentionally:
- Runs on every page, so a customer who lands on
/about?utm_source=facebookgets captured even though/aboutis not your booking page. - First-touch by default — once UTMs are stored, a later untagged visit won't overwrite them. So a customer who clicks your Facebook ad today and returns through a Google search next week still gets attributed to Facebook. Swap to last-touch by removing the "only overwrite when a new tagged visit arrives" check.
- 30-day cookie window (
max-age=2592000is 30 days in seconds), matching the OTC embed snippet's TTL. Make this longer if you want. - Also captures
gclidandfbclid— the ad-platform click IDs. UTMs tell you the campaign; click IDs tie back to the exact ad click for ROAS math in Google Ads and Meta. - Sets both
localStorageand a cookie. The cookie is the important part for OTC — the booking-site embed snippet reads cookies, notlocalStorage.
WordPress / Elementor
The most common stack venues run their marketing sites on. A few specifics:
- Elementor: paste the script above into Elementor > Custom Code and set it to load in the footer on all pages. Or use a code snippets plugin (e.g., Code Snippets) if you'd rather keep it out of Elementor itself.
- Elementor Pro forms with UTM hidden fields: if you also use Elementor forms for waitlists or contact, set hidden field default values to "Get value from URL parameter." That works on the current page only — it does not persist across navigation, which is the whole problem this section addresses. Pair it with the site-wide script above so the persisted values fill the form fields even when the URL is bare.
- Plugins that handle it for you: UTM Grabber, WP Fastest UTM, and the attribution features in CookieYes / Independent Analytics each capture-and-persist without writing code. Reasonable if you'd rather not maintain the script yourself.
Squarespace, Webflow, custom-built sites
Same pattern — drop the script into the site's global header/footer (Squarespace: Settings > Advanced > Code injection > Footer; Webflow: Project settings > Custom code > Footer code; custom-built: your shared layout template). The script is plain JavaScript, not tied to any CMS.
Confirming it works
Once the script is in place, test it like this:
| Step | What to do | What to look for |
|---|---|---|
| 1 | Open your site in a fresh browser (incognito so previous cookies don't pollute) at yoursite.com/?utm_source=test&utm_campaign=verify | Page loads normally |
| 2 | Click around to other pages on your marketing site | URLs in the address bar lose the UTMs (that's normal — that's what this script is fixing) |
| 3 | Open browser dev tools > Application > Cookies, look for utm_source=test, utm_campaign=verify | Cookies should be present on every page |
| 4 | Eventually navigate to your booking page | The OTC embed snippet picks up the cookies and forwards them into the iframe |
| 5 | Complete a test booking | The resulting transaction should show Source: Test in the Transactions list |
If step 3 fails, the script isn't loading on the page you tested — usually because of where it's pasted (not actually site-wide) or because some other plugin clears localStorage aggressively. If step 5 fails but step 3 worked, the OTC snippet isn't on the booking page or isn't picking up the right cookie names.
Setup
Turn on source tracking
| Step | Action |
|---|---|
| 1 | Open Settings > Company groups and click the group you want to track |
| 2 | Switch to the Integrations tab |
| 3 | In the Marketing card at the top, flip Enable purchase source tracking on. The popover help reads: "Will display where a booking, gift card, or item purchase came from." |
| 4 | The toggle saves immediately. Generate tracking link appears beneath the toggle |
Build a tracking link
Click Generate tracking link to open the Link builder modal.
| Element | Notes |
|---|---|
| Info alert | "Use this tool to create a trackable booking link for ads, emails, social media, or referral partners. Copy and paste this link wherever you're promoting your bookings or purchases." |
| My booking page is embedded | Toggle. Off = build a link to your OTC-hosted booking page. On = reveals the Parent domain name input below |
| Parent domain name | URL input (shown when My booking page is embedded is on). Placeholder: https://yourdomain.com/booking. Use this when your booking site lives inside an iframe on your own marketing site, so the tracking link points at your domain and the embed script carries the UTMs into the iframe |
| Source | Free text. Placeholder "E.g., google, facebook". Popover: "Represents the specific origin or platform where website traffic is coming from, such as Google, Facebook, or Morty." |
| Medium | Free text. Placeholder "E.g., cpc, email, social". Popover: "Identifies the marketing channel or medium used to deliver a link to a website, for example email, social, cpc." |
| Campaign | Free text. Placeholder "E.g., summer_sale". Popover: "Identifies a specific marketing campaign or promotion when tracking website traffic." |
| Generated Tracking Link | Read-only preview that updates as you type, with a copy icon at the end |
Type the source, medium, and (optionally) campaign, click the copy icon, and paste the URL into your ad, email, or social post. The link is fully formed — there's no separate "save" step.
(Embedded only) Add the booking-site embed script to your marketing site
If your booking site is embedded as an iframe on your own marketing site, you also need the embed script that forwards UTMs across the iframe boundary. Browser cross-origin rules mean the iframe can't read its parent's URL on its own — the script bridges the two sides.
| Step | Action |
|---|---|
| 1 | Open Bookings > Booking site settings and open the template you embed |
| 2 | Copy the embed snippet from the template's editor (see the Booking site settings article for the exact location) |
| 3 | Paste it into the page where the booking iframe lives on your marketing site |
| 4 | The script reads utm_source, utm_medium, utm_campaign from the parent page's URL, stores them as otc_utm_* cookies for 30 days, and appends them to the iframe's src |
That's it. After the snippet is in place, every tagged visit carries its UTM source into OTC automatically, and the 30-day cookie means a customer can come back days later to finish their booking and the attribution still sticks.
See where each booking, transaction, gift card, or cart came from
When tracking is on and a record was created with a UTM source, OTC displays a Source badge on the row.
| Surface | Where the Source badge shows |
|---|---|
| Active carts | On each cart card, "Source: " with a globe icon |
| Transactions list | A Source: row on each transaction. Also exported in CSV |
| Transaction details | A Source: line in the transaction header and on each purchase row inside the transaction |
| Gift cards | On each gift card row |
| Booking drawer | On the booking's transaction summary section |
Records created without a UTM source show a - in the same spot.
Reference
Where to turn it on
| What | Where |
|---|---|
| Enable purchase source tracking | Settings > Company groups > Integrations tab > Marketing card |
| Generate tracking link | Same card, shown when tracking is on |
| Booking-site embed script | Booking site settings > your template > embed snippet |
Marketing card on the Integrations tab
| Element | Notes |
|---|---|
| Enable purchase source tracking | Switch. Off by default for new groups. When off, OTC ignores UTM parameters entirely |
| Popover help | "Will display where a booking, gift card, or item purchase came from." |
| Generate tracking link | Link button shown when the toggle is on. Opens the Link builder modal |
Link builder modal
| Element | Notes |
|---|---|
| Title | Link builder |
| Info alert | "Use this tool to create a trackable booking link for ads, emails, social media, or referral partners. Copy and paste this link wherever you're promoting your bookings or purchases." |
| My booking page is embedded | Toggle. When on, the link is built against your Parent domain name instead of the OTC-hosted booking page |
| Parent domain name | URL input. Conditional. Placeholder: https://yourdomain.com/booking |
| Source | Free text input. Maps to utm_source |
| Medium | Free text input. Maps to utm_medium |
| Campaign | Free text input. Maps to utm_campaign |
| Generated Tracking Link | Read-only preview with a copy icon |
The five UTM parameters
| Parameter | Used for | Example |
|---|---|---|
utm_source | The specific platform or referrer | google, facebook, newsletter |
utm_medium | The channel category | cpc, social, email, referral |
utm_campaign | The specific campaign or promotion | summer_sale, black_friday_2026 |
utm_term | The paid keyword (paid search only) | escape_room_seattle |
utm_content | A/B test or link-position variant | header_button, footer_link |
Off The Couch's Link builder captures Source, Medium, and Campaign, the three that drive almost every report and the three OTC stores. You can add utm_term and utm_content to a link by hand for other analytics tools, but OTC does not record them.
Embed script behavior
The booking-site embed script handles the cross-origin problem on its own. On every page load:
| Step | What the script does |
|---|---|
| 1 | Reads utm_source, utm_medium, utm_campaign from the parent page's URL |
| 2 | If any are present, stores them as cookies (otc_utm_source, otc_utm_medium, otc_utm_campaign) on the parent domain with a 30-day expiration |
| 3 | If the current URL has no UTMs but cookies exist, reuses the cookie values — preserves first-touch attribution across return visits |
| 4 | Appends the UTMs to the iframe's src URL as query parameters |
| 5 | OTC inside the iframe reads its own URL parameters and stamps the attribution onto the cart and subsequent records |
Source attribution surfaces
| Object | Where the source shows |
|---|---|
| Cart | Active carts list — each card row shows "Source: " with a globe icon |
| Booking | Booking drawer's transaction summary section |
| Transaction | Transactions list (row badge), Transaction details (header line and per-purchase row), CSV export |
| Gift card | Gift cards list, on each card's row |
| Reports | Transactions and Purchases reports: Source, Medium, Campaign, Referrer (the referring site name) and Traffic attribution (all three combined, for example "Facebook / Cpc / Spring sale") columns, each with a filter, and summary reports grouped by any of them |
What's stamped on the record
OTC stamps the record with the UTM source values present at the moment the cart converts. If the cookies preserve a first-touch source from days earlier, the record reflects that first touch (not the most recent visit).
Good to know
- The toggle is the master switch. When Enable purchase source tracking is off for the group, OTC ignores any UTM parameters that arrive in URLs — nothing is stamped on records and no badges render. Turn it on per group, ideally before you launch a campaign so you don't miss any conversions.
- The Link builder is for outbound links, not inbound configuration. Use it any time you're about to put a marketing link somewhere — an ad, an email, a social post, a partner site. There's no separate "save" step; the modal just produces a URL.
- The embed script handles the iframe gap automatically. Cross-origin browser rules normally block an iframe from reading its parent's URL — that's why naive iframe embeds lose UTMs. The snippet from Booking site settings bridges that gap by reading the parent's URL, stashing UTMs in cookies, and appending them to the iframe URL.
- Cookies persist 30 days and preserve first-touch. A customer who clicks your ad today and books two weeks later still gets attributed to the original ad. The script never overwrites an existing cookie with new UTMs unless the new visit actually has a tagged URL — that keeps "last-touch organic visits" from clobbering "first-touch paid clicks."
- Pick a naming convention and stick to it. Lowercase everything, decide between
emailandnewsletter(not both), agree whether it'sfacebookorfb. The reports turn into a mess of near-duplicates fast if every campaign manager invents their own labels. The hardest part of UTM hygiene is consistency, not setup. - UTMs only capture what you tag. They don't track anything automatically — if a link goes out without UTMs, that traffic shows up as "direct" and the attribution is lost. Get into the habit of always building outbound marketing links through the Link builder.
- UTMs aren't PII, but the records they attach to are. Pairing UTM data with customer data (names, emails) means your privacy policy and consent flows should account for it, especially under GDPR/CCPA. If you serve a consent-required audience, make sure your cookie banner covers attribution cookies.
- UTMs are one half of the attribution story. Ad platforms also use their own click IDs (
gclidfor Google,fbclidfor Meta) for precise ad-level attribution. UTMs tell you the campaign; the click IDs tie back to the exact ad click for conversion uploads and ROAS math. Capturing both alongside one another is the gold standard for serious ad reporting. - Source attribution is at the cart level. Once a cart has a UTM source attached, every record born from that cart — the booking, the transaction, the gift card line — inherits it. You don't need to retag the link mid-flow.
- Records created before tracking was enabled have no source. Turning the toggle on doesn't retroactively attribute anything; only records created after the toggle is on can carry a UTM source.
FAQ
Q: What's the difference between Source on a transaction and a UTM source?
A: They mean different things on different surfaces. The Source column in Transactions and Purchases reports describes the channel of creation — was the record born from the public booking site, an internal staff booking, etc. The Source badge that appears when UTM tracking is on describes the marketing source (facebook, google, newsletter) recorded from the UTM parameter on the inbound URL. Both can be true at the same time — a transaction can be created from the "public booking site" channel and tagged with utm_source=facebook because the customer arrived there from a Facebook ad.
Q: My booking site is embedded as an iframe. Will UTMs still work?
A: Yes, if you've pasted the booking-site embed script onto your marketing page. The script reads UTMs from the parent page's URL, stores them in cookies, and forwards them across the iframe boundary into OTC. A naive `` embed without the script will lose UTMs because cross-origin rules block the iframe from reading the parent's URL.
Q: How long do attribution cookies last?
A: 30 days. A customer who clicks a tagged ad today and books within the next 30 days still gets attributed to the original ad. After 30 days the cookie expires and a new visit would start fresh.
Q: Is OTC's attribution first-touch or last-touch?
A: First-touch. The embed script never overwrites an existing UTM cookie unless the new visit actually has a tagged URL of its own. So if a customer clicks your Facebook ad (tagged), comes back later through an organic Google search (untagged), and then books, OTC attributes the booking to Facebook — not "direct."
Q: Can I generate a UTM link by hand instead of using the Link builder?
A: Yes. UTMs are just query parameters on the URL. The Link builder is a convenience — anything you build by hand or with a third-party tool (Google Campaign URL Builder, for example) works just as well.
Q: Where do I see a list of all bookings from a specific source?
A: OTC displays Source as a badge on each row but doesn't have a built-in "filter by source" today. The fastest way to slice attribution is to export the Transactions or Purchases data via the CSV download on the Transactions list — Source is included in the export — and group by utm_source in a spreadsheet.
Q: I turned on tracking and pasted the embed script. Why are some of my conversions still showing - for Source?
A: See the What if UTMs never make it into OTC? table above for the full list, but in rough order of likelihood:
- The customer arrived through an untagged link (direct, organic search, an unbranded referral). Untagged visits show
-— only tagged visits get a Source. - The marketing link wasn't actually tagged — paste it into a browser and confirm the URL contains
utm_source=.... - The booking site is embedded but the OTC embed script is missing (a bare `` can't see the parent's UTMs). Replace with the snippet from Booking site settings.
- The embed script isn't on every page that hosts the iframe — only on the landing page, for example.
- The customer was using a privacy tool or browser setting (Brave, Safari ITP, an ad blocker) that strips UTMs or limits cookies, breaking attribution.
- The customer's last tagged visit was more than 30 days before they finally converted, so the attribution cookie had expired.
Q: Does OTC capture more than just utm_source?
A: Yes. When a tagged URL arrives at the booking site, OTC stores every standard UTM field present — utm_source, utm_medium, utm_campaign, utm_term, and utm_content — on the cart and on each downstream booking, transaction, and gift card. The console UI today surfaces only utm_source (as the Source badge), but the other fields are saved on the records. That means historical data is preserved for when richer breakdowns ship later — there's no need to retag any links once they go live. Tag with at least source, medium, and campaign now so the future reporting has clean data to work with.
Q: Do I need separate links for each campaign?
A: Yes, that's the point. Build a different tracking link for each ad, email send, or partner placement so the reports can distinguish them. The Link builder is fast enough that this isn't a heavy lift.
Q: What if I have multiple company groups and they all run the same campaign?
A: Tracking is per group. Generate the link from each group's settings — the parent domain (and embedded vs hosted choice) is per group too, so the right destination URL gets built each time.
Q: Do tagged links keep the UTM parameters visible to the customer?
A: Yes — UTMs sit in the URL the customer's browser sees. Some campaign managers shorten links through a redirect tool (Bitly, your own URL shortener) to hide the parameters. That works fine with OTC; the redirect resolves to the tagged URL before the page loads.
Q: Should I use UTM tracking even if I only get organic traffic?
A: Yes, especially for any structured outbound effort — a newsletter, a referral partner, a one-off post in a community forum. Even without paid ads, knowing whether bookings came from your email list, a specific partner, or your social posts tells you which efforts are paying off.
Q: Can I track UTMs without enabling the toggle?
A: No. The toggle is the master switch. UTMs that arrive on URLs while the toggle is off are ignored — nothing is stamped on records and no badges render. Turn the toggle on for the group before you launch any campaign you want attributed.
Q: Why does my Source badge always show capitalized (Google) when I tagged the link with lowercase (google)?
A: OTC capitalizes the first letter of the source value for display purposes only. The underlying value stays lowercase, so your stored data is consistent with what you tagged.