Most B2B SaaS teams can tell you their cost per lead on Meta and LinkedIn. Far fewer can tell you how much qualified pipeline those channels created last quarter. That gap is where budgets get cut, usually from the channels that were quietly doing the most work.

Paid social is hard to measure for a simple reason. People see an ad on LinkedIn or Instagram, do nothing, and then search your brand on Google two weeks later. Last-click reporting gives the credit to branded search. The social channel looks expensive and the search channel looks like a hero.

Below is the setup our team uses to connect Meta and LinkedIn spend to opportunities in the CRM. None of it needs a big attribution tool. It needs clean tracking, a few CRM fields, and a weekly habit.

Step 1: Decide what "pipeline" means before you touch tracking

Before any UTM work, agree with sales on three definitions:

  • Lead: a form fill or demo request that hits the CRM.
  • Qualified opportunity: the stage where sales accepts the deal as real (often called SQL or Stage 1).
  • Pipeline value: the opportunity amount at that stage.

Write these down in one shared doc. If marketing reports "pipeline" from leads and sales reports it from Stage 2 opportunities, every conversation about paid social will turn into an argument about numbers.

We also pick one measurement window. For most SaaS deals with a 30 to 90 day cycle, we look at opportunities created within 90 days of the first paid social touch. Longer cycles need a longer window, and that is fine as long as everyone uses the same one.

Step 2: Capture the source on every lead, every time

This is where most setups break. The ad click lands on the site with UTMs, the visitor browses three pages, and by the time they submit the form the UTMs are gone.

What we set up:

  1. Consistent UTMs on every ad. For example utm_source=linkedin, utm_medium=paid_social, utm_campaign=q4_demo_cfo, utm_content=carousel_v2. Same structure on Meta with utm_source=meta. Use the platform's dynamic parameters where they exist so campaign and ad names fill themselves.
  2. First-touch and last-touch fields stored in a cookie. A small script saves the first UTM set a visitor arrives with and the most recent one. Both get passed into hidden form fields.
  3. Matching CRM fields. First Touch Source, First Touch Campaign, Last Touch Source, Last Touch Campaign, plus the click IDs (li_fat_id for LinkedIn, fbclid for Meta, gclid for Google).
  4. Fields copied from contact to opportunity. When sales converts a lead into an opportunity, those source fields should carry over automatically. If they stay on the contact only, your pipeline reports will be empty.

A quick test: submit a form yourself from a tagged LinkedIn ad URL, then check that the values show up in the CRM record and on a test opportunity. We do this every time a form or landing page changes.

Step 3: Send pipeline stages back to the ad platforms

Platforms optimize toward whatever conversion you give them. If you only send "form submitted", Meta in particular will find you lots of cheap form fills from people who will never take a call.

So we send deeper stages back:

  • LinkedIn: Conversions API (CAPI) or offline conversion uploads tied to the lead's email or li_fat_id. We send "Qualified Lead" and "Opportunity Created" as separate conversions.
  • Meta: Conversions API with a CRM integration, sending events such as Lead, QualifiedLead and Opportunity with hashed email and the fbclid where available.

You can start with a weekly CSV upload if an integration is not ready. It is manual, but it works, and it already gives the algorithm much better signal than raw leads.

A realistic example: a SaaS team selling to finance leaders runs Meta lead ads. Cost per lead looks great. After two weeks of sending "Opportunity Created" back, they see that one ad set produces most of the leads but almost none of the opportunities. They move budget to the ad set that produces fewer, better leads and switch the optimization event to Qualified Lead once there is enough volume.

Step 4: Build three core reports

We keep paid social pipeline reporting to three views in the CRM:

1. Sourced pipeline by channel. Opportunities where First Touch Source is LinkedIn or Meta, with count and value, by month. This answers "what did paid social start?"

2. Influenced pipeline by channel. Opportunities where any recorded touch, before the opportunity was created, came from paid social. This catches the buyer who first saw a LinkedIn ad and later came back through branded search or a direct visit.

3. Pipeline per dollar by campaign. Sourced and influenced pipeline divided by spend, at campaign level. This is the report we use to make budget decisions.

Report sourced and influenced side by side. Sourced alone undercounts paid social. Influenced alone can overstate it, since a buyer who clicked one ad six months ago gets counted. The truth for your account usually sits somewhere between the two, and watching both over time tells you a lot.

Step 5: Add a self-reported attribution field

Add one open text field to the demo form: "How did you hear about us?" Keep it optional and leave it as an open text box. Dropdowns push people toward the first option.

The answers are messy, but they catch things tracking never will: "saw your posts on LinkedIn", "a colleague shared your ad", "podcast". When the self-reported answers keep mentioning LinkedIn while the tracked data says branded search, that is a strong sign your paid social is driving demand that shows up under a different label.

Our team tags these answers once a week into a few buckets and adds them as a column next to the tracked source.

Step 6: Watch branded search alongside paid social

One of the most useful checks is simple. Put weekly LinkedIn and Meta spend on the same chart as branded search impressions in Google Ads and Microsoft Ads, plus direct traffic in GA4.

If branded search rises a few weeks after you increase paid social, and drops after you pause it, paid social is doing work that last-click hides. This is not proof, but combined with the influenced pipeline report and self-reported answers, it builds a case that holds up in a budget meeting.

For bigger budgets, a cleaner test is a geo holdout. Pause or reduce paid social in one region for a few weeks, keep everything else the same, and compare opportunity creation against regions where ads kept running.

Step 7: Run a weekly pipeline review with sales

A 30 minute weekly review with sales is where budget decisions actually get made. Our agenda:

  • New opportunities this week and their first and last touch.
  • Any paid social leads sales rejected, and why.
  • Campaigns with spend but no qualified opportunities in the measurement window.
  • One decision: shift, pause, or scale something.

Sales feedback is gold here. If reps say LinkedIn leads from one job title never have budget, you can exclude that title within the same day.

Common mistakes we see in audits

  • UTMs only on some campaigns. One untagged campaign is enough to make paid social look smaller than it is.
  • Source fields that do not copy to the opportunity. The lead has the data, the pipeline report does not.
  • Optimizing Meta to raw leads for months. Volume goes up, quality goes down, and the channel gets blamed.
  • Judging paid social on a 7 day window when the sales cycle is 60 days.
  • Mixing view-through conversions from the platforms into CRM pipeline. Keep platform-reported numbers and CRM numbers in separate columns.

What good looks like after 90 days

When this setup is running, you should be able to answer, for any month: how many qualified opportunities LinkedIn and Meta started, how many more they touched, what each campaign produced per dollar spent, and what buyers say brought them in. That is enough to defend a budget, cut the campaigns that only produce leads, and scale the ones that produce deals.

Want a second pair of eyes on your paid social tracking? Our team can review your UTMs, CRM fields and conversion setup and show you where pipeline is going missing.

👉 Talk to our team