Ecommerce social is where attribution matters most and gets done least: you post the product, orders happen, and the connection between a specific post and a specific order lives in your gut instead of your reports.
planpo.st connects to Shopify the proper way, OAuth from your shop domain, and subscribes to paid orders. Every order that started from a tracked link in a post gets matched back to that post, and the product photo you scheduled on Tuesday gets credit for the Thursday order it caused.
Enter your shop domain
planpo.st sends you to Shopify's own consent screen. The requested scopes are read-only: orders, customers, products. Nothing that can edit your store.
Approve the connection
Shopify hands back an access token and planpo.st registers a webhook on paid orders, signature-verified so forged calls are dropped.
Schedule posts with tracked links
Product links in your posts become tracked redirects. Orders start attributing on their own.
A paid order matches to the click that led to it, directly or through a 30-day last-click window. Orders with no traceable social click stay unattributed, which keeps the per-post numbers trustworthy: when the revenue view says the Tuesday reel sold four units, it means four orders actually walked in through that link.
A product post publishes with a tracked link
The link points at your product page through a redirect that records the post, platform and campaign behind every click before passing the shopper through.
An order gets paid in Shopify
Shopify fires the orders/paid webhook planpo.st registered during OAuth. The signature is verified (HMAC) so forged calls are dropped, then the order is parsed.
The matcher connects order to click
Direct match to the recorded click when the trail held, 30-day last-click window when it did not, honestly unattributed when neither applies.
The post shows its orders
Attributed order revenue sits next to the post that drove it, in the dashboard and over MCP for any connected agent.
The webhook fires on paid orders: one-time purchases, repeat customers, subscription apps billing through Shopify. If the order reached paid, it counts.
Amounts come from the order itself, in the currency your store charged, so the attribution view agrees with your Shopify admin.
Refunds are not automatically subtracted here: the paid event already fired. Reconcile refunds in Shopify as usual; the per-post signal stays directionally right, and we would rather tell you that than fake precision.
Each drop's posts carry their own tracked links across networks, and by the weekend the revenue view has ranked the networks by orders, not by likes.
Every special gets its own link; the attribution view becomes a menu ranked by what actually sells, which beats any poll you could run.
Read-only OAuth on the client's store, and the report shows orders per post. The retainer stops being defended with reach screenshots.
The manual alternative for stores is UTM-tagging every link and reading Shopify's own analytics next to GA4, two dashboards that rarely agree and neither of which knows which social post a tag belonged to. It produces channel-level guesses on a good week.
Post-level attribution needs the scheduler and the order stream in one system, which is the entire design here: the tool that published the post is the tool the webhook reports to, so the join is automatic and labeled by confidence rather than assembled by hand at month-end.
Where manual still wins
You schedule the same product across Instagram, Facebook and Threads for launch week, each with a tracked link to the product page.
Orders attribute per post, and by Friday you know Facebook drove eleven orders, Threads two, Instagram one directly (with the usual caveat that Instagram converts through bio and search too). Next launch gets planned from that, not from which post felt good.
Other payment sources
The rest of the loop