How to tell which social posts actually drove signups
8 min readPublished
How do I know which social media posts drove signups?
To know which social media posts drove signups, give every post its own tracked link, send a conversion event from your signup step back to that link, and ask new users one open-text question about how they heard of you. Platform engagement numbers cannot answer this, because they record reactions to a post, not what happened on your site afterward. Even with all three in place the result is attribution, which shows a post came before a signup, not that it caused one.
Key takeaways
- A platform reports what happened to the post. Your own site reports what happened after the click. A signup is only tied to a post when you build the link between those two records.
- A link you own and generate per post is a stronger record than a UTM tag, because it does not depend on anyone typing a value the same way twice.
- A conversion event is what turns a click into a signup. Without it you have click attribution, which is still a real outcome and still better than engagement.
- Ask new users how they heard of you in an open text box. It catches the word of mouth and private shares that no link can see.
- Attributed is not incremental. Only a holdout shows whether a post caused a signup, and most small programs cannot run one, so label the number attributed.
Most teams answer this question with whatever the social dashboard shows. The post with the most reactions gets called the winner, and the next batch is written to look like it. The dashboard was never built to say which post produced a customer, so the answer it gives is a guess with a chart attached.
There is a workable alternative, and it needs no special software. It is four small pieces of plumbing and one honest label.
Why platform numbers cannot answer this
A social platform records what happened to a post, and your website records what happened on your site. Neither record contains the other, so no number inside either one says that this post produced that signup. The platform sees impressions, reactions and clicks. Your site sees sessions and signups. Something you build has to connect them.
Conversions that a platform does report come with their own rules. Each platform decides what counts as its conversion, using its own matching and its own time window, so two platforms can each claim the same signup and the totals can add up to more than you actually got. Treat a platform-reported conversion as that platform's claim, not as your record.
- 1
A conversion event on the post's own link
Your site recorded a signup from a visitor who arrived on that exact post's link. The closest thing to a per-post result.
- 2
A new user's own answer
An open-text reply to how they heard of you. Catches what no link can, and is noisy.
- 3
A click on the post's own link
A real behavior change that you counted yourself, with no changes to your product.
- 4
A UTM-tagged session in analytics
Ties a visit to a campaign, but only as cleanly as the tags were typed.
- 5
Platform engagement and reach
Someone saw it and reacted. Useful for debugging a hook, silent on whether anyone signed up.
Tag every link, and keep the tags boring
UTM parameters are the standard way to label a link so that analytics can say where a visit came from, and they fail mostly through inconsistency. Google's documentation says parameter values are case sensitive, so utm_source=google and utm_source=Google are different values, and that SpringSale and Spring_Sale count as distinct campaigns. One person capitalizing a value differently splits one channel into two rows. (Google Analytics Help (accessed 2026))
Google also says to always include utm_source, utm_medium and utm_campaign when you add parameters. A link missing the campaign is a link whose results cannot be grouped later. Pick a convention once, write it down, and generate the tagged links from it instead of typing them by hand. (Google Analytics Help (accessed 2026))
| Parameter | What goes in it | The rule that prevents a split |
|---|---|---|
| utm_source | Where the visit came from, such as the platform name | One lowercase value per platform, from a fixed list |
| utm_medium | The kind of traffic, such as social or email | Use the channel names your analytics tool already recognizes |
| utm_campaign | Which effort the post belongs to | One naming pattern, decided in advance |
| utm_content | Which variant of the post or creative | Only when you are comparing two versions on purpose |
A tag also only travels with the link that carries it. When someone copies your bare address into a message instead of sharing the post, the visit arrives with no tag and lands in direct traffic. Tags are a good floor and a poor ceiling, which is why the next two pieces exist.
Give each post its own link and count the clicks
A link you own, generated fresh for each post, records the click on your side, so the count does not depend on the platform's reporting or on anyone typing a tag correctly. Each post links to its own address, which redirects to your page, and every visit through that address is attributable to that one post. It needs no engineering ticket and no change to your product.
The granularity is the point. A UTM campaign usually covers a whole effort, while an owned link covers one post, so you can compare two posts from the same week. Sheevook wraps the outbound links in each post it publishes in an owned short link for this reason, so clicks attribute to the exact post without setup on your side.
Send a conversion event back from signup
A conversion event is a small message your site sends when something that matters happens, and it is what turns a click into a signup. When a visitor arrives through a post's link, store that link's identifier. When they sign up, send the identifier back along with the event. The event now says that this signup came from that post.
Keep the event small: the identifier, what happened, and a value if you have one. Collect nothing about the person that you do not need. Until the event exists, you have click attribution only, and Sheevook reports it as exactly that rather than guessing at signups.
Ask new users how they heard about you
A one-line question on the thank-you page or in the first onboarding step catches the signups that no link can see. A person who heard about you from a friend, a group chat or a podcast arrives with no tag and no post. Only they know where it started, and asking costs one field.
Make it open text, not a dropdown. A88Lab's guide to self-reported attribution says plainly that drop-downs are the enemy of the method, because the options you list decide what people answer, and that open text is messier but is where the specific and unexpected answers live. Read the answers by hand at first, and group them later. (A88Lab, 2026)
Treat the answers as a second witness, not a replacement for the first. People forget and people simplify, so a reply that says a podcast may be the end of a path that began on a post. When the link data and the self-reported data agree, trust them more. When they disagree, you have found something worth investigating.
Attributed is not the same as caused
Everything above measures attribution, which means a visitor touched a post before they signed up. It does not show that the post caused the signup, because some of those people would have found you anyway. Telling the two apart needs an experiment that compares people who saw your marketing with a comparable group who did not.
That experiment is called an incrementality test. Measured, a measurement vendor, describes it as comparing a test group with a control group to find the causal impact of media, and gives the example of withholding one campaign from five representative states for 30 days and comparing their transactions with the rest of the country. Small content programs rarely have the audience size to run that credibly. (Measured (accessed 2026))
A setup you can finish this week
Do the cheap pieces first and stop at the tier your data can support. The order matters because each step makes the next one useful, and you can rank posts on whichever tier you have reached as long as you say which one it is.
- 1
Write down the tagging convention
Fix the allowed values for source and medium and the pattern for campaign names. Lowercase everything. Generate links from the convention instead of typing them.
- 2
Put an owned link on every post
One address per post, redirecting to the page you want. This gives you per-post click counts without touching your product.
- 3
Store the link identifier at arrival
When a visitor lands through a post's link, keep its identifier until they sign up, so it is available at the moment of conversion.
- 4
Send one conversion event at signup
Post the identifier, what happened and a value if you have it. Keep personal details out of it.
- 5
Add an open-text question to onboarding
Ask how they heard about you in one line, and read the first fifty answers yourself before grouping them.
- 6
Label the tier on every report
Say whether a number is clicks, attributed signups or attributed revenue, and never call any of them incremental without a holdout.
Can I use UTM parameters alone to track which posts drive signups?
You can, but it is the weakest of the link-based methods. A UTM tag is only as clean as the person who typed it, it usually labels a campaign rather than a single post, and it disappears when someone shares your bare address instead of the post. Use it as a floor alongside an owned link per post, and generate the tags from a written convention.
Why does my analytics tool show so much direct traffic?
Visits land in direct traffic when nothing tells analytics where they came from. A link shared without its tag, an address typed from memory and an inconsistent tag value all produce it. A self-reported question and an owned link per post both recover part of what ends up there, though neither recovers all of it.
Is a click on my post's link the same as a conversion?
No. A click is a real behavior change that you counted yourself, so it is a stronger result than a like or an impression. A conversion is a later event, such as a signup, that you can only count if your site reports it back. Rank on clicks until conversions are connected, and label which one you are using.
Do I need an incrementality test before I trust any of this?
Not before you use it, but before you describe it as lift. Attributed signups are real observed events and are good enough to compare one post against another. They do not show that marketing caused them, because only a comparison against a group that never saw it can show that. Call the number attributed and leave it there.
Sources
- Google Analytics Help, Collect campaign data with custom URLs (UTM parameters, case sensitivity, required fields)
- A88Lab, Self-Reported Attribution for B2B SaaS (25 March 2026), on open-text versus drop-down questions
- Measured, the pros and cons of incrementality testing versus MMM or MTA, on test and control groups
- Sheevook's analytics and measurement doctrine, on where a per-post outcome can come from