Enterprise attribution looks like this: a data warehouse, an ETL pipeline, a customer data platform, a BI tool, and at least one person whose full-time job is keeping the definitions consistent. The whole apparatus exists to answer a question you can answer with three moving parts if you are a solo founder or a small team.
The question is simple. You published sixty posts last quarter. Some of them made money. Which ones? Right now you probably have engagement numbers on one screen and a Stripe dashboard on another, with no bridge between them. Building that bridge does not require a data team. It requires a link that carries a tag, a checkout that keeps the tag, and one place that adds up the money.
The three parts of a minimum attribution setup
Every attribution system, from a spreadsheet to a seven-figure enterprise stack, is doing the same three jobs. Understanding them means you can build the cheap version deliberately rather than cargo-culting the expensive one.
- A tagged entry point. One unique link per post, so a click can be traced back to the exact thing that caused it.
- A checkout that preserves the tag. The identifier has to survive from click to payment, or the chain breaks at the last step.
- A join. Something that matches payments against tags and totals the revenue by post.
That is it. Warehouses and BI tools are just industrial-strength versions of part three. If you are doing tens of sales a month rather than tens of thousands, you do not need industrial strength.
Part one: one link per post
The mistake almost everyone makes is using the same product URL in every post. When you do that, every click collapses into a single undifferentiated bucket and no amount of downstream analysis can separate them.
Instead, give each post its own link. The cheapest version is UTM parameters: append something like utm_source=x and utm_campaign=churn-thread to your product URL. Free, works everywhere, and readable by any analytics tool. The downsides are real though. Long ugly URLs look worse in a post, some platforms strip or rewrite query parameters, and people who copy your link into a DM often drop the parameters entirely.
The better version is a short branded redirect. You share a tidy link on your own domain, it records the click and forwards to the real destination instantly. You get clean URLs, they survive copy-paste, and the click is logged on infrastructure you control rather than a platform you do not.
Part two: a checkout that keeps the tag
This is where most homemade setups break. A visitor clicks your tagged link, browses for a while, then buys, and by the time they reach the payment page the tag is gone.
Stripe gives you two fields that solve this without any custom backend. Payment Links accept a client_reference_id, which you can set from the URL, and Checkout Sessions accept arbitrary metadata. Either one travels with the payment all the way through to the webhook, which means the tag arrives attached to the money.
If you are using Payment Links, appending your tracking id as client_reference_id to the link is genuinely a one-line change. If you are running a self-serve signup with a trial, you need to stash the tag in a cookie or in local storage at first touch and attach it to the Checkout Session when the user eventually converts. Slightly more work, still no data team.
Part three: the join, done by hand
Start manual. It is unglamorous and it will teach you more about your business than any dashboard.
Once a week, export your Stripe payments as CSV. The export includes the client_reference_id or metadata column. Open your click data alongside it. Match tags to payments, sum the amounts by tag, and write the totals into a spreadsheet with one row per post.
After four weeks you will have something most creators never get: a ranked list of your own posts by dollars produced. The ranking is usually surprising. Posts you were proud of will sit at zero. A throwaway reply that took ninety seconds will sit near the top. That surprise is the entire value of the exercise, and you get it before spending a cent on tooling.
When to automate the join
The manual version has a clear expiry date. It breaks down when any of these become true: you are posting more than about ten times a week, you are selling on more than one platform, refunds and failed payments start distorting your totals, or you simply stop doing the weekly export because it is tedious. That last one is the most common failure and the most predictable.
Automating the join means something watches Stripe continuously, reads the tag off every payment, and posts the revenue against the right post without you touching a CSV. This is precisely the job seenpaid does. It cross-posts to 21 networks with a tracked link per post, connects to Stripe read-only so it can see payments but never move money, and shows you dollars against each post rather than likes. The design goal is that after the initial connection you never open a spreadsheet again.
Whether you use that or build your own, the important thing is that the join stops depending on your discipline. Attribution systems that require weekly human effort have a half-life of about six weeks.
What to measure once the numbers exist
Raw revenue per post is the starting point, not the finish. Three derived numbers do more work.
- Revenue per platform. Divide your total attributed revenue by platform to see which networks are worth your time, independent of follower counts.
- Revenue per 1,000 impressions. This normalizes for audience size and regularly shows that a small platform outperforms a large one per unit of reach.
- Revenue per hour of production. Video takes far longer to make than text. Ranking formats by return per hour changes production decisions more than any engagement metric.
These are all simple division problems once you have the numerator. The hard part was never the math. It was getting revenue attached to individual posts in the first place.
The traps worth knowing about
First, attribution is not causation. A post that gets credit for a sale may have been the last of six touches. Last-click attribution systematically over-credits bottom-of-funnel content and under-credits the posts that built awareness weeks earlier. Know this and do not gut your top-of-funnel content because it shows a low number.
Second, small numbers lie. Three sales attributed to one platform is not a trend. Wait until you have a few dozen attributed payments before making a strategic call, and be especially skeptical of any comparison based on single-digit counts.
Third, some revenue will never be attributable, and that is fine. If sixty percent of your sales carry a tag, you have a usable sample. Chasing the last forty percent will cost more than the information is worth.
Start this week
Pick your five most important posts for the coming week. Give each one its own tracked link. Configure your checkout to carry the tag. Then, next Friday, export Stripe and match by hand for twenty minutes.
That is a complete attribution system, built in an afternoon, with no warehouse and no analyst. Automate it once it proves useful. Do not automate it first.