You publish an article, share it on LinkedIn, put it in the newsletter, and maybe send it to a partner. A few weeks later someone asks which of those actually did anything, and you don't have a good answer. This guide is for marketing leads who want to measure content distribution across several channels without building a big attribution project. By the end you'll have a tagging habit and a simple scorecard that shows which pushes brought visits and leads, so you can decide which channels deserve more of your time.
It helps to know what this covers and what it leaves out. We're looking at links you send out to channels like a newsletter, an organic LinkedIn post, a partner email, or a community placement, and at what happens once people land on your site. We're not covering how well an article does in search overall, how to prove pipeline and revenue, how to plan your distribution, or the likes and impressions that social platforms report on their own.
What you'll need: an analytics property that collects visits to your site (we'll use Google Analytics 4, or GA4), permission to look at its reports, control over your links before they go out, and a place to write down link names and dates. If you want to count leads, you'll also need a real action on your site to count, like a completed form.
Step 1: List your pushes and pick what counts as a result
Start with a simple sheet with one row for every planned link placement. For each one, write down the destination page, the channel, the account or partner sending it, the placement (for example the top of the newsletter or a founder's post), the publish date, who owns it, and roughly how much effort it took to produce or place.
Then choose your main outcome before you look at any numbers. If you mostly care about getting the right people to the site, use sessions. If you care about leads, use a specific action on your site that you can record, like a completed demo form. Engaged sessions are a useful extra check on visit quality, but they aren't a stand-in for leads, so keep them in a separate column. You also want to decide whether you're comparing per article, per campaign, or across a recurring set of pushes, and then keep that unit the same.
You're done with this step when every push has a destination, its own placement label, a planned reporting window, and an outcome your site is able to record.
Where this goes wrong is comparing pushes that aren't really alike. An email offering a downloadable resource and a social post pointing to an unrelated article will differ in offer, page, audience, and date, so the channel alone can't explain the gap between them. Also, a post that doesn't link to your site at all can't be measured this way, so leave it out of the comparison.
If you're preparing the versions of an article for each channel, DeepSmith's Repurpose and Apps Library can draft LinkedIn and newsletter versions from a finished article, which is a handy way to fill in your list of variants. It doesn't assign UTM tags or report visits and leads by channel, so the links and the results still go through the steps below. If you'd like more on that side of the work, our guide to AI content repurposing workflows covers it.
Step 2: Give every outside link a consistent campaign label
Content promotion attribution starts with one habit: add campaign parameters to the destination link before you publish it. Google recommends setting utm_source, utm_medium, and utm_campaign together, and using utm_content to tell apart placements or versions inside the same source, medium, and campaign. The four fields answer different questions:
| Field | Question it answers | Example value (illustrative only) |
|---|---|---|
utm_source | Who sent the visit? | linkedin, mailchimp, partner_acme |
utm_medium | Which channel was used? | social, email, paid_social |
utm_campaign | Which promotion is being compared? | distribution_measurement_guide |
utm_content | Which placement or version was clicked? | founder_post_01, newsletter_top, partner_blurb |
Here's how that looks with two pushes of the same guide. Both share utm_campaign=distribution_measurement_guide. The LinkedIn post uses utm_source=linkedin&utm_medium=social&utm_content=founder_post_01, and the newsletter uses utm_source=mailchimp&utm_medium=email&utm_content=newsletter_top. Those are made-up labels to show the pattern, not results from a real campaign.
Consistent labels are what let you measure content distribution across channels later, so keep a small naming register, even if it's just a tab in your sheet, so the next person reuses the same spellings. Google points out that parameter values are case-sensitive, so LinkedIn and linkedin show up as two different values. It suggests one consistent source per platform, one medium per channel, and one campaign name for a campaign. That's why you share the campaign value across the pushes you want to compare instead of inventing a new one for each post.
GA4 also sorts traffic into its default channel groups using its own rules on source and medium. Its Email group picks up email-related values, Organic Social picks up social sources with social-related mediums, and Paid Social picks up social sources with paid-related mediums. Check where your traffic actually lands instead of assuming a custom medium name will be classified the way you meant. Default channel groups can't be edited, though you can build a custom channel group with your own rules if you need one, and it's a good idea to keep the source and medium detail even when the grouped channel looks right.
You're done when every outside link carries the expected source, medium, and shared campaign, and each push has a placement label you can find again.
Where this goes wrong is mixed spelling or capitalization, a new campaign name for every channel, missing parameters, or leaning on a broad channel group when you needed to know the individual push. Use these tags on links that send people to your site from a distribution placement. They aren't meant for labeling clicks between pages on your own site.
Pro tip: if your email tool can add Google Analytics campaign parameters on its own, look at what it adds before you also tag links by hand. Mailchimp warns that combining its Google Analytics link tracking with custom UTM tracking can skew your reports, and recommends picking one approach.
Step 3: Test the link and the tracking before you send
Before anything goes out, open a tagged link the way a visitor would. Check that it reaches the page you meant, that the campaign information survives any redirect, and that the page has analytics installed. Then look for your own test visit in the analytics property and confirm that the source, medium, and campaign show up as expected. Test the link that will actually be distributed or the output from your sending tool, not only the version you put together in a spreadsheet. If an email has several links, check the ones that matter one by one.
You're done when a test click lands on the right page and you can find the expected labels in analytics.
Here's where people tend to get caught. A redirect or link shortener drops the parameters, a link goes straight to a PDF instead of a page that has analytics on it, or the analytics setup only starts after the email has already gone out. Google lists missing UTMs, redirects, shorteners, and blockers among the reasons traffic ends up as (direct) / (none). Mailchimp says Google Analytics can't track an email retroactively if it was sent before the account was set up, and that direct links to files can need a different tracking method.
Common mistake: reading a big Direct bucket as proof that distribution did nothing. Direct only means GA4 doesn't have a clear referral source, and it can include visits whose campaign information got lost along the way. In the same way, Unassigned means the traffic data didn't match any rule in the channel group you're looking at. Check your links and setup before you move any effort around.
Step 4: Set up one real lead action to count
If you want to count leads, you need an event on your site that stands for a real lead, and you need to mark it as a key event in GA4. A generic form_submit event can include forms that aren't leads at all. Google's worked example creates a lead_form_submit event from form_submit, limited to one specific form_name, and then marks the new event as a key event. Another Google tutorial uses a view of a specific confirmation page as the trigger for a generate_lead key event. Pick whichever matches the action your site really treats as complete, and use Google's recommended generate_lead name where it fits.
In the interface, you'll find event creation under Admin, then Data display, then Events. Google's flows also show marking an event as a key event there, or adding its name under Key events in the same area. If you need to create the event, the property-level permission you need is Marketer or above, and Google's guide to setting up a key event walks through the screens.
You're done when a completed test action fires the event you meant and that event is a key event. Write the event name in your measurement sheet so nobody quietly changes the definition later.
The usual slip is counting every form submission as a qualified lead, assuming a button click proves a form was submitted, or treating key-event counts as if they were unique people. A key-event count is a count of events, while a session key-event rate tells you whether a session included the event. Neither one gives you sales pipeline attribution on its own. If your site doesn't have a reliably tracked lead action yet, report visits and engagement honestly and don't claim measured leads.
Step 5: Pull the same session view for every channel
In GA4, open Reports, then Acquisition, then Traffic acquisition, and look at session source, session medium, session source / medium, and session campaign. For links you tagged by hand, Google also has a Manual report. You reach it from Acquisition, then Overview, then the "Sessions by Session manual source" card, and then "View Manual campaigns," where it's available. It shows the manual source, medium, campaign name, and ad-content dimensions, which is where your utm_content placement labels appear. If the report isn't there, Google notes it might have been removed from the property's reports or left out of the default set, so this is one place where your menus might not match what's described here.
For every row you compare, record the same things over the same date window: sessions, engaged sessions or engagement rate, and your chosen key event. To see which sources brought people to one specific page, open Reports, then Engagement, then Landing page, and add Session source / medium as a secondary dimension.
You're done when you can trace any number in your sheet back to its campaign, source and medium, destination, and placement, with the time window written next to it.
The mistake to avoid here is mixing dimensions. If you use a First user acquisition dimension for one channel and a Session traffic-source dimension for another, you're comparing different things, and Google warns against mixing user-scoped traffic dimensions with session-scoped measures. The question you're asking is which push brought this visit, not which channel first won the person over. Also, GA4 leaves UTM information out of the Landing page + query string and Page path + query string dimensions, so use the campaign or source dimensions when you want the labels. If you also want to see visits arriving from AI tools, our walkthrough on measuring AI search traffic in GA4 uses the same reports.
Step 6: Fill in a small scorecard
Keep one row per push, then roll comparable pushes up by channel. A workable sheet has these columns: article or campaign, destination, date sent, channel, source, medium, campaign, placement, observation window, sessions, engaged sessions, engagement rate, lead key-event count, the session rate for that key event if you have it, approximate hours and any placement cost, a note on tracking quality, and a decision with the next test. It looks like a lot, but most cells fill themselves in once the tagging is consistent, and this is the heart of how you'll track content distribution metrics over time.
Three calculations are enough to start, and it's worth labeling each one clearly:
- Engagement rate is engaged sessions divided by sessions. GA4 counts a session as engaged when it lasts longer than 10 seconds, has at least two page or screen views, or triggers a key event. Because a key event alone can make a session engaged, treat this as a loose check on visit quality.
- Lead-action session rate is the number of sessions containing your chosen lead key event divided by sessions. Don't swap in the raw count of event occurrences without checking whether the event can fire more than once in a session.
- Effort-normalized result is the relevant outcomes divided by the hours spent on that push. If placement fees matter, show them in their own column or agree on one total-cost figure. This one is a management aid we're suggesting, not a published benchmark.
Use sessions as your common denominator for site traffic, and not the clicks that a platform reports. A platform click is something that platform recorded, and a GA4 session is a visit to your instrumented site, so the two don't have to match. When they differ, write it down as a tracking-quality question and don't try to smooth it into an invented number. That habit is what makes multi-channel content performance readable, because each channel's numbers come from the same place.
You're done when you can point to a channel and see both what it produced in total and what each push cost you to get there.
The common ways this goes wrong are ranking channels only by raw visits, treating engagement as a lead, or suggesting that one visit proves the channel caused a later deal. Be careful, too, about putting a full week of one push next to a few hours of another without saying the exposure was different. If any numbers in your own sheet are placeholders while you set it up, label them as hypothetical so nobody reads them as results. If some of your wins show up as AI referrals and not clicks, calculating content ROI for AI referrals covers that side.
If you want a wider look at reporting beyond distribution, our guide to measuring SaaS content performance beyond traffic picks up where this one stops, and the metrics that matter when you publish four posts a month is useful for a smaller team.
Step 7: Compare like with like, then look into the misses
Compare pushes of the same article or offer over a set interval after each one goes live. Look at volume and at quality. Sessions tell you whether tagged distribution brought visits, engaged sessions tell you whether those visits met GA4's engagement rules, and your lead action tells you whether the visit turned into the thing you wanted. Check source, medium, and placement before you roll numbers up into a channel total, and look at Direct, Unassigned, and (not set) next to your tagged rows as possible measurement problems, without dividing their visits up among campaigns on a guess.
Some examples of how to read what you see, and none of these are benchmarks. High sessions with few lead actions can point to a mismatch between the audience, the message, the destination, or the offer. Very few sessions might mean a weak placement, limited exposure, or a broken link. An email push with no GA4 sessions at all should send you to check the tracking and the destination before you call the channel a failure. All of these are things to investigate, not conclusions about cause, because GA4 on its own can't tell you why. When you change a post after a weak result, measuring the impact of a content refresh shows how to read the change.
You're done when each channel has a written interpretation, a note on how much you trust the tracking, and one specific question to test next.
People get this wrong by declaring a winner after one unusually strong post, by assuming Direct means people found you on their own, or by comparing different offers without saying so. There's no source-backed number for what a good session count or lead rate looks like across these channels. Pick a baseline from your own past pushes, and be plain about how small your sample is.
Step 8: Keep, change, or pause a channel and run it again
Look at the scorecard on a regular rhythm that fits how often you publish. Keep a channel going when comparable pushes keep producing useful visits or lead actions for a reasonable amount of effort. If a push is weak, change its placement, message, or destination, and put that change in utm_content so the next result stays separate from the last. Pause or cut back a channel when a real run of properly tracked, comparable pushes does worse than what you could do with the same effort elsewhere. Write the decision down before the next run, and keep the earlier results.
You're done when the next round of distribution has a keep, change, or pause decision for each channel, a named owner, and one test that could settle whatever you're unsure about.
The mistake here is looking for a universal stop rule, or crediting a channel for an improvement after you changed the offer, the article, the audience, and the message all at once. Change one thing at a time when you can.

Once you know which article and channel combinations deserve another try, DeepSmith's Repurpose and Apps Library can generate the channel versions, like a LinkedIn post or newsletter material. Keep judging the result with your tagged links and your scorecard. DeepSmith's AI Visibility answers a different question, which is how often AI answers mention and cite your brand, so it can't show that an email or a social post drove a visit to your site. If LinkedIn is one of your channels, read why LinkedIn is a top-cited source for B2B AI answers.
What to do next
Pick the next three or four pushes that are reasonably alike, tag them with the shared campaign and their own source, medium, and placement, and test each link before it goes out. Capture their session results in the same sheet, then sit down after a couple of weeks and decide which channel gets another round. That single loop is enough to move you off guessing. If you'd like the finished articles turned into channel-ready versions so there's more to measure, you can try DeepSmith free for 7 days and see how Repurpose and Apps Library handle it.



