Your RevOps lead opens a freshly created demo record in the CRM. Calendar event confirmed, prospect's email attached. But utm_source is blank. The campaign tag existed at first visit, was captured by the form, and available to the scheduling tool. Then the calendar adapter created the event, passed along the email and time slot, and quietly left the marketing fields behind.

According to SingleGrain's September 2026 analysis, a blank utm_source on a CRM meeting record after an agent books or reschedules is typically a data-flow and field-mapping issue. The UTMs were present at first visit but never persisted into the scheduling or CRM write. Every one of those meetings lands in your "Direct/Unknown" bucket, under-crediting the campaign that actually generated the pipeline.

The Handoff Where Attribution Dies

The failure mode follows the same sequence. Prospect arrives via a tagged campaign link, engages with content, reaches a scheduling widget. The calendar adapter (Calendly, HubSpot meetings, whatever you're running) creates the event using email and selected time. Its output omits marketing fields because it was never asked to carry them.

Calendly supports adding UTM parameters to scheduling links and records those values for filtering and reporting, with values capped at 255 characters. But "supports" doesn't mean "automatically passes them downstream." The Calendly-HubSpot integration syncs contacts and meeting activity, but successful sync doesn't guarantee UTM fields populate specific HubSpot properties unless the correct tracking-parameter and property requirements are met.

HubSpot compounds this. When a contact books through a HubSpot meeting link with tracking parameters, HubSpot populates booking-specific contact properties: Campaign of last booking, Source of last booking, Medium of last booking. Two catches. These properties only populate when tracking parameters are added to the meeting link; an agent-booked meeting via an untagged link won't populate them even if the original session had UTMs. And because they're "last booking" fields, later bookings overwrite earlier values.

Intent Gets Stripped Too

A visitor asks about pricing, selects a time, gets an invitation. The agent creates a generic "demo" meeting type. Source fields might survive, but the reason for the booking doesn't. Your demand gen team can't distinguish a pricing inquiry from a product walkthrough.

Lost UTMs and lost intent require the same fix: a lead-source contract that travels with the meeting through every handoff.

What a Lead-Source Contract Carries

Think of it as a canonical source envelope that exists independently of the calendar event. When the CRM-bound payload lacks utm_source, block the write until the captured value is restored. The contract should carry:

For Salesforce shops, there's one more joint that can fail. When a Lead converts to a Contact and Opportunity, custom Lead fields only map to corresponding fields on the converted objects if you've explicitly configured that mapping. Salesforce's own documentation (updated September 2026) confirms: if UTM and booking attribution fields aren't mapped, they vanish at conversion.

Run It This Week

Pull every meeting record created in the last 30 days by agent or BDR booking. Count the ones with blank utm_source. Segment by booking path (embedded Calendly vs. HubSpot meeting link vs. manual CRM entry). There's no credible general benchmark for what percentage of agent-booked meetings lose UTMs; your own blank rate by path is the only number that matters.

Then trace one meeting from ad click to CRM record. Find the exact handoff where the UTM disappeared.

The hypothesis: if we add a validation step between the calendar adapter and the CRM write that blocks records missing utm_source (or explicitly labels them as "absent at capture"), then the percentage of meetings attributed to Direct/Unknown will drop by the same proportion as the current blank rate, because those meetings already had UTMs at first touch.

Success = blank utm_source rate on agent-booked meetings drops below 5%. Guardrail = meeting creation latency doesn't increase by more than 30 seconds. Stop-loss = if the validation step blocks more than 15% of legitimate bookings for more than 48 hours, route to manual review instead of blocking.

The trade-off: this adds friction to the booking flow. Some meetings will hit a validation queue. That's the point. A meeting record without source evidence is analytically useless for channel ROI decisions, and every one quietly inflates Direct/Unknown while the campaign that earned the pipeline gets no credit. The fix is operational: persistence, field mapping, governance. A contract.