Multi-touch attribution and server-side tracking for Shopify.
See which ad actually sold every order, and send those sales back to every ad platform.
- Setup in 5 minutes
- No coding required
- Strong support
Overview
Blended
Meta Ads
Attribution
The conversion is credited in full to the session it happened in, whatever brought that session — including a visitor who arrived with no referrer at all.
It is the only model in which a direct visit can hold credit. Every other model looks past it to the last session that had a source.
The conversion is credited in full to the first touchpoint on record for this customer, paid or not — a Facebook ad and an organic search both qualify.
It answers what started the relationship, and it will always over-state the channels people discover you through.
The conversion is credited in full to the last touchpoint before it, paid or not.
It answers what closed the sale, and it will always over-state whatever people come back through.
Non-paid touchpoints are ignored, and the conversion is credited in full to the earliest paid one.
A journey with no paid touchpoint at all has nothing to credit, so it lands in the No web touchpoint row rather than being dropped — the table still adds up to every order you took.
Non-paid touchpoints are ignored, and the conversion is credited in full to the most recent paid one.
A journey with no paid touchpoint at all has nothing to credit, so it lands in the No web touchpoint row rather than being dropped — the table still adds up to every order you took.
The conversion is split evenly across every touchpoint in the journey: two touchpoints take 50% each, three take 33.3% each.
It makes no claim about which position mattered, which is its strength and its limit.
Credit is spread across the journey but weighted towards both ends. Also called position-based.
With three or more touchpoints, the first and last take 40% each and the remaining 20% is split evenly between the middle ones. With two, they take 50% each.
Credit is spread across the journey but weighted towards the closing touchpoint.
With three or more touchpoints, the last takes 60%, the first 20%, and the remaining 20% is split evenly between the middle ones. With two, the last takes 75% and the first 25%.
Credit is spread across the journey but weighted towards the opening touchpoint.
With three or more touchpoints, the first takes 60%, the last 20%, and the remaining 20% is split evenly between the middle ones. With two, the first takes 75% and the last 25%.
Credit follows an exponential decay with a seven-day half-life, normalised across the journey so it still totals one conversion.
The nearer a touchpoint is to the order, the more it earns: one seven days out takes half the credit of one on the day itself.
Every touchpoint is credited with the whole conversion — two touchpoints both take 100%. Where a channel appears twice, only its last touchpoint carries it.
It answers which channels took part, not what each was worth.
A touchpoint older than this earns no credit. Shortening the window does not change how credit is shared between touches: it moves orders whose touches all fall outside it into the unattributed row.
| Channel group | Sessions | Gross revenue | Discounts | Total revenue | Taxes | Shipping charged | Net revenue | COGS | Gross profit | |
|---|---|---|---|---|---|---|---|---|---|---|
| Paid social | 40,883 | $153,425 | $3,587 | $149,839 | $24,964 | $52.50 | $124,822 | — | — | |
| Direct | 6,549 | $138,468 | $3,381 | $135,087 | $22,513 | $7.00 | $112,567 | — | — | |
| 2,522 | $127,842 | $3,357 | $124,485 | $20,741 | $38.50 | $103,705 | — | — | ||
| Referral | 10,059 | $274,860 | $6,708 | $268,152 | $44,678 | $84.00 | $223,391 | — | — | |
| Paid search | 2,078 | $53,170 | $1,156 | $52,014 | $8,666 | $17.50 | $43,330 | — | — | |
| Organic | 1,070 | $12,433 | $247 | $12,185 | $2,028 | $24.50 | $10,133 | — | — |
| Total | 63,161 | $760,198 | $18,436 | $741,762 | $123,590 | $224.00 | $617,948 | — | — |
| Channel | Sessions | Gross revenue | Discounts | Total revenue | Taxes | Shipping charged | Net revenue | COGS | Gross profit | |
|---|---|---|---|---|---|---|---|---|---|---|
| Meta Ads | 18,582 | $80,851 | $2,127 | $78,724 | $13,113 | $45.50 | $65,566 | — | — | |
| TikTok Ads | 22,301 | $72,574 | $1,460 | $71,115 | $11,851 | $7.00 | $59,256 | — | — | |
| Direct | 6,549 | $138,468 | $3,381 | $135,087 | $22,513 | $7.00 | $112,567 | — | — | |
| Newsletter | 2,522 | $127,842 | $3,357 | $124,485 | $20,741 | $38.50 | $103,705 | — | — | |
| google.com | 3,124 | $92,833 | $2,225 | $90,608 | $15,098 | $21.00 | $75,489 | — | — | |
| bing.com | 3,161 | $88,193 | $2,472 | $85,721 | $14,283 | $24.50 | $71,414 | — | — | |
| google.ai | 3,211 | $84,867 | $1,761 | $83,106 | $13,846 | $28.00 | $69,232 | — | — | |
| reddit.com | 563 | $8,967 | $249.75 | $8,717 | $1,451 | $10.50 | $7,256 | — | — | |
| Google Ads | 2,078 | $53,170 | $1,156 | $52,014 | $8,666 | $17.50 | $43,330 | — | — |
| Total | 63,161 | $760,198 | $18,436 | $741,762 | $123,590 | $224.00 | $617,948 | — | — |
| Campaign | Sessions | Gross revenue | Discounts | Total revenue | Taxes | Shipping charged | Net revenue | COGS | Gross profit | |
|---|---|---|---|---|---|---|---|---|---|---|
| Prospecting | Broad | US | 11,204 | $48,912 | $1,284 | $47,628 | $7,935 | $27.50 | $39,666 | — | — | |
| Retargeting | 30d viewers | 7,378 | $31,939 | $843 | $31,096 | $5,178 | $18.00 | $25,900 | — | — | |
| Spark ads | Creator mix | 13,948 | $44,201 | $902 | $43,299 | $7,216 | $4.50 | $36,083 | — | — | |
| TopView | Launch week | 8,353 | $28,373 | $558 | $27,816 | $4,635 | $2.50 | $23,173 | — | — | |
| Brand | Exact | 2,078 | $53,170 | $1,156 | $52,014 | $8,666 | $17.50 | $43,330 | — | — |
| Total | 42,961 | $206,595 | $4,743 | $201,853 | $33,630 | $70.00 | $168,152 | — | — |
| Ad set | Sessions | Gross revenue | Discounts | Total revenue | Taxes | Shipping charged | Net revenue | COGS | Gross profit | |
|---|---|---|---|---|---|---|---|---|---|---|
| Broad | 25-45 | Advantage+ | 6,918 | $29,347 | $771 | $28,576 | $4,762 | $16.50 | $23,813 | — | — | |
| Lookalike 3% | Purchasers | 4,286 | $19,565 | $513 | $19,052 | $3,175 | $11.00 | $15,876 | — | — | |
| Interest | Home and garden | 7,378 | $31,939 | $843 | $31,096 | $5,178 | $18.00 | $25,900 | — | — | |
| Creator whitelist | Tier 1 | 9,632 | $30,940 | $631 | $30,309 | $5,051 | $3.00 | $25,258 | — | — | |
| Broad | 18-34 | 4,316 | $13,261 | $271 | $12,990 | $2,165 | $1.50 | $10,825 | — | — |
| Total | 32,530 | $125,052 | $3,029 | $122,023 | $20,331 | $50.00 | $101,672 | — | — |
| Ad | Sessions | Gross revenue | Discounts | Total revenue | Taxes | Shipping charged | Net revenue | COGS | Gross profit | |
|---|---|---|---|---|---|---|---|---|---|---|
| UGC | Unboxing | 9x16 | 7,204 | $23,118 | $471 | $22,647 | $3,774 | $2.00 | $18,872 | — | — | |
| Static | Before and after | 5,113 | $21,764 | $572 | $21,192 | $3,532 | $12.50 | $17,659 | — | — | |
| Carousel | Bestsellers | 3,986 | $16,904 | $444 | $16,460 | $2,743 | $9.50 | $13,716 | — | — | |
| Testimonial | Founder cut | 2,428 | $7,822 | $160 | $7,662 | $1,277 | $1.00 | $6,385 | — | — |
| Total | 18,731 | $69,608 | $1,647 | $67,961 | $11,326 | $25.00 | $56,632 | — | — |
Landing Pages
The conversion is credited in full to the session it happened in, whatever brought that session — including a visitor who arrived with no referrer at all.
It is the only model in which a direct visit can hold credit. Every other model looks past it to the last session that had a source.
The conversion is credited in full to the first touchpoint on record for this customer, paid or not — a Facebook ad and an organic search both qualify.
It answers what started the relationship, and it will always over-state the channels people discover you through.
The conversion is credited in full to the last touchpoint before it, paid or not.
It answers what closed the sale, and it will always over-state whatever people come back through.
Non-paid touchpoints are ignored, and the conversion is credited in full to the earliest paid one.
A journey with no paid touchpoint at all has nothing to credit, so it lands in the No web touchpoint row rather than being dropped — the table still adds up to every order you took.
Non-paid touchpoints are ignored, and the conversion is credited in full to the most recent paid one.
A journey with no paid touchpoint at all has nothing to credit, so it lands in the No web touchpoint row rather than being dropped — the table still adds up to every order you took.
The conversion is split evenly across every touchpoint in the journey: two touchpoints take 50% each, three take 33.3% each.
It makes no claim about which position mattered, which is its strength and its limit.
Credit is spread across the journey but weighted towards both ends. Also called position-based.
With three or more touchpoints, the first and last take 40% each and the remaining 20% is split evenly between the middle ones. With two, they take 50% each.
Credit is spread across the journey but weighted towards the closing touchpoint.
With three or more touchpoints, the last takes 60%, the first 20%, and the remaining 20% is split evenly between the middle ones. With two, the last takes 75% and the first 25%.
Credit is spread across the journey but weighted towards the opening touchpoint.
With three or more touchpoints, the first takes 60%, the last 20%, and the remaining 20% is split evenly between the middle ones. With two, the first takes 75% and the last 25%.
Credit follows an exponential decay with a seven-day half-life, normalised across the journey so it still totals one conversion.
The nearer a touchpoint is to the order, the more it earns: one seven days out takes half the credit of one on the day itself.
Every touchpoint is credited with the whole conversion — two touchpoints both take 100%. Where a channel appears twice, only its last touchpoint carries it.
It answers which channels took part, not what each was worth.
A touchpoint older than this earns no credit. Shortening the window does not change how credit is shared between touches: it moves orders whose touches all fall outside it into the unattributed row.
| Sessions | Orders | CVR | Revenue | AOV | New customers | Gross profit | Ad spend | ROAS | ||
|---|---|---|---|---|---|---|---|---|---|---|
| /collections/best-sellers | 14,208 | 612 | 4.31% | $74,904 | $122.39 | 381 | $44,942 | $18,204 | 4.11 | |
| /products/everyday-tote | 9,846 | 455 | 4.62% | $52,780 | $116.00 | 268 | $31,668 | $12,940 | 4.08 | |
| / | 8,102 | 298 | 3.68% | $36,354 | $121.99 | 142 | $21,812 | $7,410 | 4.91 | |
| /pages/gift-guide | 5,461 | 204 | 3.74% | $24,684 | $121.00 | 121 | $14,810 | $6,120 | 4.03 | |
| /products/linen-shirt | 4,338 | 141 | 3.25% | $16,779 | $119.00 | 77 | $10,067 | $5,240 | 3.20 |
| Total | 41,955 | 1,710 | 4.08% | $205,501 | $120.18 | 989 | $123,299 | $49,914 | 4.12 |
Products
| Sessions | Views | Added to cart | Reached checkout | Orders | Items sold | CVR | Total revenue | Gross profit | ||
|---|---|---|---|---|---|---|---|---|---|---|
| Everyday Tote TOTE-BLK-OS | 9,846 | 12,904 | 1,842 | 706 | 455 | 512 | 4.62% | $52,780 | $31,668 | |
| Linen Shirt SHRT-LIN-M | 4,338 | 5,612 | 804 | 232 | 141 | 158 | 3.25% | $16,779 | $10,067 | |
| Merino Beanie HAT-MER-OS | 3,902 | 4,881 | 712 | 268 | 184 | 241 | 4.71% | $11,224 | $7,193 | |
| Canvas Weekender BAG-CAN-OS | 2,714 | 3,388 | 489 | 171 | 108 | 112 | 3.98% | $19,116 | $11,278 | |
| Wool Scarf SCF-WOL-OS | 1,988 | 2,402 | 301 | 104 | 62 | 71 | 3.12% | $5,022 | $3,164 |
| Total | 22,788 | 29,187 | 4,148 | 1,481 | 950 | 1,094 | 4.17% | $104,921 | $63,370 |
Destinations
Event logs
| Event | Person | URL | Device | Source | Time |
|---|---|---|---|---|---|
| purchase | ada@lovelace.dev | /checkouts/ac/9f21 | Desktop | Meta Ads | 12:04:19 |
| checkout_started | ada@lovelace.dev | /cart | Desktop | Meta Ads | 12:03:02 |
| add_to_cart | grace@hopper.dev | /products/everyday-tote | iPhone | TikTok Ads | 12:02:44 |
| product_view | grace@hopper.dev | /products/everyday-tote | iPhone | TikTok Ads | 12:02:11 |
| pageview | anonymous | /collections/best-sellers | Android | google.com | 12:01:58 |
| pageview | anonymous | / | Desktop | Direct | 12:01:20 |
Persons
| Person | Last event | Events | Sessions | First seen | Last seen |
|---|---|---|---|---|---|
| ada@lovelace.dev | purchase | 184 | 12 | 4 Mar 2026 | 9 Sep 2026 |
| grace@hopper.dev | add_to_cart | 96 | 8 | 18 Apr 2026 | 9 Sep 2026 |
| katherine@johnson.dev | purchase | 72 | 6 | 2 Jun 2026 | 8 Sep 2026 |
| anonymous | pageview | 41 | 3 | 7 Sep 2026 | 9 Sep 2026 |
Add a data source
Goals
| Name | Event | Category | Values | Counting | Created |
|---|---|---|---|---|---|
| Purchase | purchase | Purchase | Order total | Every event | 4 Mar 2026 |
| Checkout started | checkout_started | Lead | Cart total | Once per session | 4 Mar 2026 |
| Newsletter signup | signup | Lead | None | Once per person | 18 Apr 2026 |
Expenses
Shipping
| Destination | Applies | Rate |
|---|---|---|
| United States | Every order | $6.50 |
| Canada | Every order | $11.00 |
| Rest of world | Every order | $18.00 |
Payment fees
| Payment method | Rate | Fixed fee |
|---|---|---|
| Shopify Payments | 2.9% | $0.30 |
| PayPal | 3.4% | $0.30 |
| Shop Pay Installments | 5.9% | $0.30 |
Your data lives in a dozen platforms. Soran reads them all.
See all integrationsThe problem
The platforms say you sold three. Soran says one.
- Meta Ads Mon
- Google Ads Wed
- Newsletter Fri
- Order $184.00
As the platforms report it
- Meta Ads
- 1.00
- Google Ads
- 1.00
- Newsletter
- 1.00
Three sales on the report. One in the bank.
As Soran reconciles it
- Meta Ads
- 0.50
- Google Ads
- 0.20
- Newsletter
- 0.30
Split across the path that earned it. Always totals one.
Signal loss
- Shopify
- WooCommerce
- Custom store
- Meta Ads
- Google Ads
- TikTok Ads
Collected once, forwarded to every platform you run
Orders go straight from your store, so nothing can block them. Soran attaches every match key it holds and forwards them onward.
The browser drops what it is told to drop
Ad blockers, tracking prevention, a declined consent banner. The event never sends, and the platform treats what is left as the truth.
- Browser pixel
- 46%
- Soran, server-side
- 100%
Match quality stops being a guess
Coverage depends on what you collect, not on what a browser allowed. Soran shows the gaps for every destination.
Every week on the wrong numbers is budget you do not get back
The loudest ad looks cheapest, so it takes your next increase. Soran ties spend to the ad that actually earned it.
Soran AI
You should not need a query language. Ask in plain English.
Type the question the way you would say it out loud. Soran AI reads your property's own data and answers with the number, not a tutorial on how to build one.
Which ad sets can take more budget?
Three are clearing your 2.4 target with room left in delivery.
- Prospecting, UGC hook B
- 4.1x
- Lookalike 2%, static
- 3.2x
- Broad, video 9:16
- 2.8x
How hard can I push the top one?
It has sat at $380 a day for two weeks. Last time you took it past $500, ROAS held for four days and then fell.
- Current daily spend
- $380
- Best day above $500
- 3.6x
Which ads are under breakeven?
Five sit below 1.8 breakeven. They took $3,120 last week.
- Retargeting, catalogue
- 0.9x
- Interest stack, image
- 1.2x
- Brand search, exact
- 1.5x
What did that cost me?
Those five returned $940 on $3,120. The rest of the account carried them.
- Spend
- $3,120
- Revenue earned
- $940
Does Meta hold up on first touch?
Meta grows when it gets credit for the click that started the path. Brand search is the one that shrinks.
- Meta, last touch
- $41,200
- Meta, first touch
- $58,700
- Brand search, first touch
- $12,400
So which model do I buy on?
Meta ranks first under six of the seven, so the decision does not turn on the one you pick.
- Models where Meta ranks first
- 6 of 7
Which campaigns are profitable after COGS?
Two of your top five by revenue lose money once goods and shipping come off.
- Prospecting, UGC hook B
- +$6,480
- Retargeting, broad
- -$910
- Interest stack
- -$1,240
What is dragging retargeting down?
Discount codes. Half of its orders used one.
- Orders with a discount
- 51%
- Average discount
- 22%
Who it is for
Six people asking the same question. One set of numbers.
Which campaigns are actually carrying their cost?
Spend against the revenue it earned, after goods and shipping come off.
Which client is actually profitable this month?
Every store is its own property, walled off from the next, in one login.
Did the last click really earn all of that?
Seven models over the same orders, so you can see what the credit does.
What did we actually keep?
The whole ladder from revenue to profit, with costs and fees taken off.
Why is the pixel missing half the orders?
Events sent from the store itself, so a blocked browser is not a gap.
Can I just ask and get the number?
Type the question the way you would say it. Soran AI reads your own data.
Attribution models
The model you never chose is deciding your budget. See the same order ten ways.
The same order the ledger above followed. $184.00.
All credit to the session the conversion happened in.
Against last click
On this order it lands exactly where last click does. On a journey that ended in a direct visit it would not.
The same order the ledger above followed. $184.00.
All credit to the channel that opened the journey.
Against last click
The same order the ledger above followed. $184.00.
All credit to the channel that closed the sale.
Against last click
This is that default. It is the only number you get unless you go looking for another one.
The same order the ledger above followed. $184.00.
All credit to the first paid touchpoint.
Against last click
The same order the ledger above followed. $184.00.
All credit to the last paid touchpoint.
Against last click
The same order the ledger above followed. $184.00.
Every touchpoint shares the credit equally.
Against last click
The same order the ledger above followed. $184.00.
40% to the opener, 40% to the closer, 20% shared between.
Against last click
The same order the ledger above followed. $184.00.
60% to the closer, 20% to the opener, 20% shared between.
Against last click
The same order the ledger above followed. $184.00.
60% to the opener, 20% to the closer, 20% shared between.
Against last click
The same order the ledger above followed. $184.00.
Recent touchpoints earn more, halving every 7 days.
Against last click
Customers
Nobody changes their reporting for fun. Here is what made them.
Shopify against the ad platforms
“Now everything lines up.”
Stefan Prifti CEO, Orbita.al We used to drown in conflicting numbers. Shopify said one thing, Meta said another, Google said a third, and every Monday started with an argument about whose figure was right instead of what to do about it. Soran gives us one number per order and shows the whole path that led to it, so the argument is over before the meeting starts. It is clean and accurate.
Server-side postbacks
“Our channels finally get what is working.”
Once we started sending events back through server-side postbacks, campaign optimization got much easier.
Reporting without spreadsheets
“The first dashboard I actually trust.”
No spreadsheets and no guesswork. Just honest data about where our sales come from.
Stop paying for ads you cannot measure. Start seeing what works.
- No credit card to start
- Every report and all ten models from day one
- Your data exports whenever you want it
- 01
Connect your store
Shopify authorizes in a click and checkout tracking installs itself.
- 02
Pick a goal
The conversion you actually get paid for. Soran credits every touch that led to it.
- 03
Read your first report
Spend against the revenue it earned, on all ten attribution models.