How to Track Which Marketing Channel Books Your Sales Calls
How to Track Which Marketing Channel Books Your Sales Calls
You're spending money on LinkedIn campaigns, Google Search ads, email sequences, and maybe some retargeting. Your calendar shows 15 sales calls booked this month. Your CFO asks: "Great — which campaigns booked those calls?"
If you can't answer that with specific data, you're making budget decisions based on gut feel. This guide gives you the exact setup to answer that question with data.
TL;DR
- Every ad, email, and social link needs UTM parameters — no exceptions
- UTMs must survive through your booking tool into your CRM contact record
- Calendly, Chili Piper, and HubSpot Meetings all support UTM capture with explicit setup
- The final test: book a call with known UTMs and trace them to the CRM deal record
- Cogny automates the weekly report so you're not manually joining tables in spreadsheets
The Data Flow You're Building
Before touching any tool, understand what you're trying to accomplish:
LinkedIn Ad (utm_campaign=q3-cto-retargeting)
→ Landing Page (UTMs in URL)
→ Booking Form / Calendly (UTMs captured as hidden fields)
→ CRM Contact (UTM fields populated on contact record)
→ CRM Deal (UTM source copied to deal on conversion)
→ Attribution Report (pipeline grouped by utm_campaign)
Every link in that chain must hold. If UTMs disappear at any step, you lose attribution for every lead that came through that path.
Step 1: Set Up UTM Parameters on Every Campaign
A UTM parameter is a tag you append to any URL that links to your site. Google Analytics and your CRM tracking scripts read these tags and store them on the visitor's record.
The five standard UTM parameters:
| Parameter | Purpose | Example values |
|---|---|---|
utm_source | The platform or publisher | linkedin, google, klaviyo, newsletter |
utm_medium | The channel type | paid-social, cpc, email, organic-social |
utm_campaign | The specific campaign | q3-2026-cto-awareness, demo-retargeting-v2 |
utm_content | Ad creative or link variant | video-ad-b, cta-button-top |
utm_term | Keyword (Google Ads) | b2b-marketing-attribution |
Example UTM-tagged URL for a LinkedIn ad:
https://cogny.com/ai-agency?utm_source=linkedin&utm_medium=paid-social&utm_campaign=q3-2026-cmo-retargeting&utm_content=video-attribution-problem
Naming convention rules that prevent reporting headaches:
- Use lowercase always (
linkedinnotLinkedIn) - Use hyphens, not spaces or underscores (
paid-socialnotpaid socialorpaid_social) - Include the quarter and year in campaign names (
q3-2026-cto-awarenessnot justcto-awareness) - Be specific enough that you'll know what the campaign was in six months
Where to add UTMs:
- All LinkedIn Sponsored Content and Message Ads
- All Google Search and Display Ads
- All email CTAs (every link in every email campaign)
- LinkedIn organic posts that link to your site (so you can separate organic vs paid traffic)
- Any partner or affiliate links that send traffic to your booking page
Step 2: Verify UTMs Survive Through Redirects
The most common UTM leak point is redirect chains. Many marketing tools add their own redirect layer between the ad click and your landing page.
Test procedure:
- Copy the destination URL from your LinkedIn ad (the URL you entered in the ad setup)
- Paste it into a browser and click through
- Look at the final URL in your browser's address bar
- Confirm your UTM parameters are present in the final URL
If they're missing, either:
- Your ad destination URL is a redirect that strips query parameters
- Your ad platform (LinkedIn, Google) is using a tracking redirect that doesn't forward UTMs
Fix: Link directly to your landing page with UTMs in the URL, avoiding intermediate redirects where possible.
Step 3: Configure UTM Capture in Your Booking Tool
Most booking tools don't capture UTM parameters by default. Here's how to configure the most common ones:
Calendly
Calendly supports UTM capture via custom hidden fields.
Setup steps:
- Open Calendly → Your event type → "Invitee Questions"
- Add a new question for each UTM parameter:
- Question label: "utm_source" (this is the field name)
- Answer type: "One line"
- Enabled: Yes (but mark it hidden if Calendly allows, or just name it clearly)
- In your booking page URL, include the UTM parameters:
calendly.com/yourname/demo?utm_source=linkedin&utm_campaign=q3-retargeting - Calendly will pre-fill the hidden fields from the URL parameters
HubSpot-Calendly integration:
- In Calendly: Settings → Integrations → HubSpot
- Enable the integration and map Calendly custom fields to HubSpot contact properties
- Map
utm_source(Calendly) →Original Source Drill-Down 1or a custom UTM property in HubSpot - Map
utm_campaign(Calendly) → your customCampaign Sourcecontact property
HubSpot Meetings
If you use HubSpot Meetings (native), UTM capture is simpler because HubSpot's tracking script on your site captures UTMs automatically for any known contact.
For net-new contacts booking through HubSpot Meetings:
- Ensure the HubSpot tracking script is on the page hosting your meeting scheduler
- HubSpot will create the contact and populate
Original Source,Original Source Drill-Down 1, andOriginal Source Drill-Down 2from the UTMs in the URL
Important limitation: HubSpot's automatic UTM capture only works if the visitor first lands on a page with the HubSpot tracking script, then navigates to the booking page. If they go directly to a Meetings URL without first touching your tracked site, UTMs won't be captured automatically.
Chili Piper
Chili Piper supports UTM pass-through via URL parameters. Configure routing forms to capture UTM fields as hidden form inputs, then map them to CRM fields in the Chili Piper → CRM integration settings.
Step 4: Map UTM Data to CRM Deal Records
Even if UTMs are captured on the contact record, they often don't automatically appear on the deal/opportunity record. Deals are where your attribution report will run.
In HubSpot:
Create a workflow:
- Trigger: Deal is created
- Action: Copy property value from Associated Contact's
UTM Campaign Sourceto the Deal'sCampaign Sourceproperty
This ensures that when a contact converts to a deal, the campaign data travels with it.
In Salesforce:
The Campaign influence model does this natively if Campaigns are set up. Alternatively, create a Process Builder / Flow:
- Trigger: Opportunity Created
- Action: Look up the Primary Contact, copy
UTM_Campaign__cfield toOpportunity.Campaign_Source__c
Step 5: Build the Attribution Report
Once data is flowing, create the report that answers the original question.
HubSpot Attribution Report:
- Go to Reports → Create Report → Attribution Report
- Choose "Contact Create" or "Deal Create" as the conversion event
- Select attribution model (Last-touch, First-touch, or Linear)
- Group by "Original Source Drill-Down 2" (captures UTM campaign) or your custom Campaign property
- Metrics: number of deals, deal value
Salesforce Campaign Influence:
- Reports → New Report → Campaign with Influenced Opportunities
- Group by Campaign Name
- Columns: Total Influenced Revenue, Number of Opportunities, Won Opportunities
Manual BigQuery / Looker approach:
If your CRM data is in BigQuery (common if you export HubSpot or Salesforce data to BQ):
SELECT
c.utm_campaign as campaign,
COUNT(DISTINCT d.id) as deals_created,
SUM(d.amount) as pipeline_value,
SUM(CASE WHEN d.is_closed_won THEN d.amount ELSE 0 END) as closed_won_value,
SUM(d.amount) / NULLIF(COUNT(DISTINCT d.id), 0) as avg_deal_size
FROM deals d
JOIN contacts c ON d.primary_contact_id = c.id
WHERE d.created_at >= DATE_SUB(CURRENT_DATE, INTERVAL 90 DAY)
AND c.utm_campaign IS NOT NULL
GROUP BY c.utm_campaign
ORDER BY closed_won_value DESC
Step 6: The Verification Test
Before trusting your attribution setup, run a full end-to-end test:
- Create a test booking URL with known, distinctive UTMs:
https://your-booking-page?utm_source=test&utm_medium=test&utm_campaign=attribution-verification-test&utm_content=manual-test-sept-2026 - Open that URL in an incognito browser (to simulate a new visitor)
- Complete the booking form
- Wait 5 minutes for the CRM to sync
- Find the new contact/lead in your CRM
- Verify: does the contact have
utm_campaign = attribution-verification-test? - If a deal was created, verify: does the deal also have the campaign value?
If step 6 or 7 fails, the chain is broken at some point. Debug by checking: did the booking tool capture the UTM? Did it send it to the CRM? Did the workflow copy it to the deal?
Automating This With Cogny
Running this analysis manually — pulling the pipeline report, comparing it to ad spend, calculating cost per booked call by campaign — takes 2-3 hours if you're doing it yourself, or requires a BI analyst.
Cogny's Growth Ticket system automates it. Once you connect your HubSpot or Salesforce CRM and your LinkedIn/Google Ads accounts, Cogny runs weekly:
- Pulls all new deals created in the last 7 days and their UTM campaign source
- Cross-references against ad platform spend data for each campaign
- Calculates cost per booked call, cost per opportunity, and pipeline generated per campaign
- Surfaces anomalies — campaigns that changed significantly week-over-week
The output is a Growth Ticket that tells you exactly which campaigns are performing and which have degraded, with recommended budget allocation changes. No analyst, no manual joins, no forgetting to run the report this week.
Part of the B2B Attribution Series
This is one article in a series on B2B marketing attribution:
- Marketing Attribution for B2B: Which Campaigns Actually Drive Sales Calls — The pillar guide (start here)
- Does LinkedIn Ad Warm-Up Increase Call Booking Rates? Data & Framework
- B2B Marketing Attribution Models Explained: First-Touch, Multi-Touch, CRM-Linked
- Connecting Ad Spend to Closed Deals: A Practical Attribution Playbook
Want to see this setup for your own stack? Book a call with Tom — we typically get B2B teams fully tracked in under two weeks.