Lark
Sponsored
Our everyday running shoes just landed. Lighter foam, the same fit you already know, and it still feels good at mile ten.

lark.example
running shoes
Free shipping and 60-day returns.
Ecommerce
Find customers who are likely to come back, turn more visits into purchases, and keep buyers engaged after checkout. Apex connects every ad, message, test, and partner to the orders and profit they produced.
No credit card to start.
Find better customers
A click isn't a customer. Apex connects ads, partner links, website visits, and app installs to the people who eventually buy. You'll see which sources bring customers who keep what they buy, order again, and are worth finding more of.

Maya Okafor
maya@example.com
$390
lifetime value
$498 charged across 3 orders, minus the $45 she sent back and $63 of tax and shipping.
What survives the $210 the shoes cost. A 46% margin, taken from the store's own cost per item.
$180 kept against the $62 it cost to acquire her. This is the number that decides whether to buy more shoppers like her.
Purchase history
3 orders across 12 months
The monthly bars add up to the lifetime value and gross profit shown above.
How she got here
every event, in orderTapped a paid social ad on her phone
go.lark.example/running-shoes-launch, then the mobile website
page_view
Took the app banner
It routed through the same Apex link, so the tap kept its campaign
smart_banner_click
Installed the app
Matched to the Meta click. A best guess, 0.80 confidence
app_install
Landed on the shoe she was looking at
lark://app/product/running-shoes, not the app's home screen
deep_link_open
Added the running shoes
$145.00, size 8, then she closed the app
add_to_cart
Opened the cart reminder
Version: Urgency, sent as a phone notification
push_opened
Placed her first order
$145.00, credited to Meta, paid social
order_placed
Ordered twice more
$190.00 and $163.00 over the next ten months
order_placed
Sent one item back
$45.00 returned, so it stops counting as revenue
order_refunded
Every experiment she was in
3 assignmentsEntered 2mo ago
Last pair in your sizev2mobile_push · Opened · 2mo ago

Entered 11d ago
Convert and retain
Recover a cart by email, push, browser, or in-app. Stop the journey the moment someone buys. Test the message and product page against purchases and repeat orders, not opens or clicks. For subscriptions, Apex connects recurring orders, churn, and LTV to the source that found them.
A full email in their inbox. Authored once, with Maya's attributes resolved from your schema.
Prove the result
Apex connects every ad, message, experiment, and partner to the purchase, return, product cost, and next order. You'll know what caused more profit, what only looked good in ROAS, and where the next dollar should go. If a cost is missing, Apex leaves the margin blank instead of inventing profitability.

Maya Okafor
maya@example.com
$390
lifetime value

Maya Okafor
maya@example.com
$180
lifetime gross profit
The subtraction, one line at a time
3 ordersRevenue from one shopper, refunds already off
46% of her lifetime value
Paid social, her acquisition cost
Gross profit takes out the cost of the goods and nothing else. Ad money, card fees, staff and rent are all still in there. That's why it's called gross profit and not profit. It's still the number to judge a channel on, because it's what's left to pay for everything else.
One shopper, end to end
Maya shops at Lark. Lark is fictional, but every screen below is Apex. Follow her from the first ad to the repeat order. In nineteen steps, you'll see how Apex connects acquisition, messages, experiments, and profit.
01 · Before anything happens
Most tools you buy ask you to describe your store again, in their language. Then those descriptions drift apart. You end up with three different answers for how many orders you did last week, and a meeting to pick which number is true.
Apex starts by reading your website code and your app code together, and building a simple list of moments: someone added a shoe to a cart, someone paid, someone opened the app. You look at the list and approve it. After that, every screen in Apex uses those same names, so a sale in a message and a sale in a report are the same thing. A cart started on the site and finished in the app counts once.
Green on that list means Apex has seen the moment happen in live traffic. Grey means the name is there but it's never happened, which is usually a bug you've been treating like a real number.
Your schema
mapped to Apex Spec v1.4.0
you Set up Apex in this repo.
apex Scanning 2,418 files for analytics calls and identify traits.
Found 17 events, 22 attributes. 6 names differ from the spec.
cart.addItem() → add_to_cart
firstName → first_name
apex Opened a pull request with the plan. Nothing ships until you merge it.
You point Apex at your website code and your app code once. The rest of this story uses that list. The only other thing you connect is your store.
One integration02 · The other thing you connect
One connection to Shopify. Every confirmed order arrives with tax, shipping, and discounts split out, so the revenue Apex reports is money that actually landed, not a cart total someone might still abandon.
The cost of the goods comes with it. Apex reads the cost field on each product. When a product has no cost filled in, that cell stays blank. It never guesses, and it never writes in a zero. Revenue makes every channel look like it's working. Cost is how you find out that the channel with the biggest sales number is the one losing you money on every order it sends.
Orders, refunds and the cost of each item, straight from the store.
Health
Healthy
Last sync
8 min ago
Orders
2,940
Cost on file
388 of 412 product options have a cost. 24 don't yet.
What comes over
every syncMost tools only ever see what a shopper paid. Your store also knows what the shoe cost you. Apex reads both, so later numbers can be what you kept, not what you billed.
Cost, not only revenue03 · Tuesday, 8:41am, at a bus stop
Maya is waiting for a bus with her phone out. A Meta ad for the running shoes goes past and she taps it.
A lot of teams figure out later which ad that was, by reading leftover tags on the web address. Different tools read those tags differently, so the numbers never quite match, and some of the money you spent can't be explained.
With Apex you create the link yourself, and you attach the campaign to it before anyone taps. When she taps it, every report already knows this was paid social. The spend is accountable. The first thing she sees is a campaign you actually meant to run.
Lark
Sponsored
Our everyday running shoes just landed. Lighter foam, the same fit you already know, and it still feels good at mile ten.

lark.example
running shoes
Free shipping and 60-day returns.
The link in the ad
apex / linksWhere it sends a phone with no app
Where it sends a phone that already has it
Decided now, not guessed later. Every tap on this link lands in the Paid Social row of your reports whether it ends up on the website or in the app, and the campaign stays attached to the shopper for as long as she exists.
The channel is chosen when you make the link, not guessed months later. One link covers the website and the app, so you don't reconcile two of them on Friday.
No tagging spreadsheet04 · 8:41am, on the mobile website
She lands on the product page in her phone's browser. You'd rather she had the app, because app shoppers come back more often, and a notification on a home screen gets read in a way a browser message never does.
The strip at the top offers the app. The button is a tracked link, not a raw App Store link. That one detail decides whether the install you're about to get is one you can price, or one you can only count. Send her straight to the store and the tap vanishes. Send her through the link and the campaign, the shoe, and the moment she tapped all survive the trip.
On her phone, in the browser
apex.jsWhat it's wired to
apex / mobile / settingsThe banner comes from the same snippet that already measures your website. Flip it on, write two lines of copy, and phone visitors start getting offered the app. If she closes it, that phone won't see it again for two weeks.
One switch, no app release05 · 8:43am, two minutes later
Two minutes after the ad, the app is on her phone and open on the running shoes. She never had to go looking for it. The first screen is the shoe she already wanted. A new install that lands on a home screen with a search box is where most of them go quiet.
Android hands the click straight through the Play Store, so the match is a fact and the campaign is named. Apple passes nothing, so the best anyone can do there is a careful guess from rough location, phone model, and timing. Apex prints that guess as a number instead of hiding it behind a green tick. 80% means 80%. You get to decide how much of your budget to move on the strength of it.
What she saw, two minutes apart
8:41am → 8:43amThe App Store passes nothing to the app it installs. Without the link holding on to the tap, the second screen is a home page with a search box and she has to go find the shoe again.
She tapped this link before the app existed on her phone. Apex holds on to what she wanted through the App Store trip and hands it over the first time the app opens.
A link that waits06 · The signal Apple will vouch for
Plenty of iPhone owners decline tracking. When they do, there's no location-and-timing guess left to make. Apple watches the install itself and sends back a signed note naming the network that won it. Those notes come from Apple, not from your vendor, so they read the same whoever you buy measurement from.
In Apex the receipt lands on the same person as her cart, her order, and her email. The campaign that won the install is the campaign her later orders are credited to. Elsewhere it lands in a mobile tool that has never heard of her order, and somebody spends a day a month lining the two up by hand.
These receipts carry no name and no device ID, which is why Apple keeps sending them after a shopper taps Ask App Not to Track. Apex checks Apple's signature on every one.
Still works when tracking is declined07 · Before you get invoiced
Networks claimed 4,086 installs in the last 30 days. 214 of them fail on inspection, which leaves 3,872 you can actually stand behind. Install fraud is ordinary: a rack of phones reinstalling your app all night, or a click fired one second before an install that was already going to happen so a network can put its name on it.
Apex holds those back and writes the reason on the row in words you can check. Mark a flag wrong and the install goes straight back in the count. Your paid social number stops carrying installs that were never real people, and the budget you move next month moves on the 3,872.
What the networks reported, last 30 days
Failed the rules or the scorer
What Apex charges you for
Apex bills for matched installs, so those 214 rows are revenue Apex declined. A vendor grading its own invoice is a different product.
Apex turns the money down too08 · Right now
Two rows in that stack still say Visitor #2277. One is the ad tap on the website, the other is the app opening on the shoe. Then she signs in, and the rows carry her name. Nothing from before the sign-in gets thrown away. Those anonymous rows attach to her the moment Apex learns who she is.
That's how her first order ends up credited to a Meta campaign instead of to direct. Every store has a direct bucket that's quietly full of paid traffic whose first touch got lost at the sign-in screen. That bucket is why channel budgets get argued about instead of decided. She also gets treated as a returning person the next time she opens the app, not as a stranger.
Activity
apex / web / livePeople here now
3 shopping nowOn the left, every moment as it arrives, from the app and the site in one stream. On the right, who's shopping this second and what's sitting in their cart.
Strangers and customers, one list09 · 8:52am, she closes the app
The bus comes. She closes the app with a $145 shoe still sitting in the cart.
A flowchart of follow-ups starts from that moment. An hour goes by in case she was going to come back on her own. Then, instead of sending the one reminder somebody wrote last year, it puts her into an experiment. The two exits on the right stop the messages the instant she orders or empties the cart. That's the difference between recovering a cart and emailing her about a shoe she bought twenty minutes ago, which costs you trust every time it happens.
What she left behind
8:52amEvery step on this map is one of the moments you approved at the start. There's no second list to keep in sync.
Built from events you already have10 · Inside the journey
Nobody in the room knew whether the reminder should sound calm or should say the shoe was nearly gone. So the store sent both and let shoppers settle it. Urgency won, 11.9% against 8.4%. That's counted in orders placed, not opens or clicks, using the same sale event your ads, your channel table, and your partner payouts all read.
Then it gets priced. 849 shoppers got the winning words, 3.5 more orders per hundred than the calm version, so 30 orders that wouldn't have happened. An order leaves $130 once refunds, tax, and shipping come off. The reminder runs two weeks at a time, 6 times a quarter. That's $23,400 a quarter from a wording change. You can check every step without leaving the card.
+$23,400 a quarter
What it is worth
a quarter
Urgency beat Control. 30 extra orders placed, $130 each, 6 times a quarter.
Checked against the control and against your own last 90 days. The holdout and the industry comparison sit one level up, in the workspace view.
849 shoppers got the winning version. That's 3.5 more orders placed per 100 than Control, so 30 more in total. Each one is worth $130, the average order once refunds, tax and shipping come off. The same two-week run happens 6 times a quarter.
This screen checks the winner against the version it beat and against your own last 90 days. Two more checks sit one level up: a group left alone on purpose, and the industry average if you opt in.
Four reference points, two of them here11 · 9:52am
You're not maintaining four separate campaigns. You write one message. Apex can send it as email, as a notification on her phone, as a ping in the browser, or as a row in the bell inside your own app. Maya has the app now, so it reaches her on her home screen. Had she never installed it, the same words would've gone to her inbox.
The chips in the body are filled from her real cart, so the product name and the total are whatever your store holds today. Nobody gets a reminder about a shoe she already bought, and the price in the notification is the price in the cart.
A full email in their inbox. Authored once, with Maya's attributes resolved from your schema.
{{first_name}}Maya{{product_name}}running shoes{{cart_total}}$145{{city}}PortlandSwitch the tabs above the preview. Each one is drawn the way that surface really looks.
Four channels, one message12 · Set up once
Add three DNS records and her reminder leaves as hello@lark.example. Your domain, your sending reputation, no vendor name in the from-line. Inbox providers judge you on your own history.
Underneath is her shipping notice. The warehouse scans a label, and it goes out as an email and a phone notification from one record. Most stores run those two kinds of mail in two different tools, and the receipt is always the one with the wrong logo. Here it's the same brand and the same preview.
apex1._domainkey.lark.exampleapex1.dkim.apex.incapex2._domainkey.lark.exampleapex2.dkim.apex.inclark.examplev=spf1 include:amazonses.com ~allA full email in their inbox. Authored once, with Maya's attributes resolved from your schema.
Marketing mail and order mail share one editor and one brand. A shipping notice ignores marketing consent and carries no unsubscribe link.
Same composer, both kinds of mail13 · Everyone like her
In most tools, a group of people lives in a query only an analyst can open. So it gets rebuilt a little differently every time someone needs one. Two campaigns end up targeting two different versions of the same customers.
Here the group is a sentence: app users with something in the cart. Maya joined it the moment she added the shoe, along with 901 other people. She leaves it on her own when the cart empties or 24 hours go by. Nobody has to remember to take her off a list.
Repeat buyers going quiet
3,184 peoplePeople who haveand have notin
App users with something in the cart
Maya is in this one902 peoplePeople whoin the lastand have
One order, no second
11,740 peoplePeople who havemore than
This one group can feed a message, an experiment, a flowchart of follow-ups, and the list you send to ad networks. Four teams, one definition.
Write it once, use it everywhere14 · Day 34
A first order tells you an ad worked. A second one tells you the product did. So the rule is a sentence anyone can read: order again within 60 days of your first order, or get a message asking you back.
18,420 shoppers are being watched against that rule. 6,180 got the nudge, 4,290 ordered again, and the nudged group beat the group Apex left alone by 11.6%. The last number is the honest one, because it survives the objection that those people were going to come back anyway. The churn view underneath counts 574 shoppers who left and came back. Most tools file a returning shopper as a brand new one and charge you for acquiring them twice.
The milestone, as a sentence
apex / engagement / adoptionWhen someone hasn'twithinof, send them.
18,420
Tracked
6,180
Nudged
4,290
Ordered again
+11.6%
Lift vs holdout
Pick the event. Green means Apex has seen it fire.
Change what counts as a repeat buyer and every chart here moves with it, because there's one definition rather than one per dashboard.
Your definition, not a default15 · Meanwhile, on the product page
Maya sent one item back, and she isn't unusual. So the store is trying whether size help near the top of the product page cuts returns without cutting orders. That's a trade only an experiment can settle, and she never sees the page jump while it decides.
When a version wins, Apex opens the pull request that makes it permanent and takes the experiment code back out. Finishing becomes a code review somebody approves in ten minutes, rather than a chore with no owner that quietly slows down the page every shopper has to load.
The two pages shoppers are being split between
server-sideOne page, built once, rendered twice. The only difference between these two is the sizing block under the price, which is what makes the returns number the test reports believable.
The version is chosen before the page leaves the server, so nothing jumps under her thumb on a phone at a bus stop.
Decided before the page is sent16 · The record
Every experiment she was in, which version she got, and the actual words that version sent, sit on one record. It also shows the places you left her alone on purpose. That last part is what makes the rest believable. A tool that only shows the people it messaged can claim credit for anything.
Support can open this instead of building the story from three tabs and still missing the bit that mattered. She doesn't have to retell the last ten minutes on a call.

Maya Okafor
maya@example.com
$390
lifetime value
$498 charged across 3 orders, minus the $45 she sent back and $63 of tax and shipping.
What survives the $210 the shoes cost. A 46% margin, taken from the store's own cost per item.
$180 kept against the $62 it cost to acquire her. This is the number that decides whether to buy more shoppers like her.
Purchase history
3 orders across 12 months
The monthly bars add up to the lifetime value and gross profit shown above.
How she got here
every event, in orderTapped a paid social ad on her phone
go.lark.example/running-shoes-launch, then the mobile website
page_view
Took the app banner
It routed through the same Apex link, so the tap kept its campaign
smart_banner_click
Installed the app
Matched to the Meta click. A best guess, 0.80 confidence
app_install
Landed on the shoe she was looking at
lark://app/product/running-shoes, not the app's home screen
deep_link_open
Added the running shoes
$145.00, size 8, then she closed the app
add_to_cart
Opened the cart reminder
Version: Urgency, sent as a phone notification
push_opened
Placed her first order
$145.00, credited to Meta, paid social
order_placed
Ordered twice more
$190.00 and $163.00 over the next ten months
order_placed
Sent one item back
$45.00 returned, so it stops counting as revenue
order_refunded
Every experiment she was in
3 assignmentsEntered 2mo ago
Last pair in your sizev2mobile_push · Opened · 2mo ago

Entered 11d ago
Her ad tap, her install, her groups, her messages, her experiments, and her orders were never in separate systems to begin with.
Assembled, not stitched together17 · The money question
Her card has been charged $498 across three orders. Take off the $45 item she sent back, because a refund reverses a sale on the day it happens. Take off $63 of tax and shipping too. Tax was never yours, and shipping isn't money the product earned. What's left is $390.
Now subtract $210, what those shoes cost to buy and get to her. You keep $180. Set that against the $62 it cost to find her and you've got a shopper who pays back nearly three times over. That's the sentence a budget meeting can actually end on, and every step of the working is printed on the screen.

Maya Okafor
maya@example.com
$390
lifetime value

Maya Okafor
maya@example.com
$180
lifetime gross profit
The subtraction, one line at a time
3 ordersRevenue from one shopper, refunds already off
46% of her lifetime value
Paid social, her acquisition cost
Gross profit takes out the cost of the goods and nothing else. Ad money, card fees, staff and rent are all still in there. That's why it's called gross profit and not profit. It's still the number to judge a channel on, because it's what's left to pay for everything else.
Lifetime value is what she brought in. Lifetime gross profit is what survives paying for the goods. A $390 shopper who costs $210 to supply and a $390 shopper who costs $40 are two different businesses.
Two numbers, not one18 · Where the cost half comes from
Gross profit is only as good as the cost behind it, so Apex never invents one. Costs arrive from the store you connected, come attached to the order, or get added later through the API. When a cost is missing the cell stays blank rather than going to zero. Two products here are in that state, which is 6% of revenue. A zero would report those items as pure profit and quietly lift your whole company margin.
Gross profit removes the cost of the goods and nothing else. Ad money, card fees, staff, and rent are all still in there. It's the right number for judging a channel, because it's what's left to pay for all of that.
$36,750 of revenue has no cost on it. Apex works out the margin on the 94% it can see, then applies that margin to all of it.
Cost per item, as it came in
apex / products| Product | Units | Unit price | Unit cost | Cost | Revenue |
|---|---|---|---|---|---|
| running shoes | 2,140 | $145.00 | $61.30 | Reported | $310,300 |
| Vomero 18 | 1,010 | $160.00 | $68.75 | Reported | $161,600 |
| Metcon 9 | 690 | $150.00 | $64.20 | Reported | $103,500 |
| Everyday Plus socks, 6 pack | 900 | $28.00 | — | Not reported | $25,200 |
| Club Fleece hoodie | 165 | $70.00 | — | Not reported | $11,550 |
Two products have no cost on file, so their rows are blank instead of zero. Fill the cost in on the store platform and the next sync picks it up. You can also send a cost with each order, or add it later through the API.
94% of revenue has a real cost behind it. Apex works out the margin on that 94% and applies it to the rest, and it says so on the screen every time.
The gap is shown, not filled19 · Multiply by every shopper
Maya is one shopper. Do the same work across all of them and you stop asking which channel deserves credit. You ask what to buy more of.
Read the table in what you kept, not what you billed. TikTok returns 58 cents for every dollar it costs to find a customer, so it's burning money on every order it sends you. Partner links return $3.80. The same number goes back to the ads, so they look for people who buy shoes and keep them, not people who install and vanish. When the next shopper arrives through a running coach's link, the coach's cut comes off that same sale, on the same day.
Meta
268 / dayFacebook and Instagram. Server-side conversions with real order value, not a pixel estimate.

Google Ads
268 / dayEnhanced conversions plus lifetime value, so Smart Bidding sees profit.

Conversions matched back to the campaign that earned them.
Lark Run Club
Lark
A cut of every order a partner sends, plus a bonus at their tenth sale. One partner identity across every program they join.
The channel table, the orders sent back to the ads, and the creator's cut are all worked out from the same sale.
One order event, four things paid from itKeep what worked
The winning reminder, product page, and channel decision shouldn't disappear when the campaign ends. Apex keeps each result with the evidence attached, so the next test starts from what your store already learned.
Shoppers who install the app on day one are worth about twice a website-only shopper.
last moved by App banner placement test
Saying a size is nearly gone recovers more carts than a plain reminder.
last moved by Cart reminder wording
A phone notification beats email for the first two hours after a cart is left, and loses after that.
last moved by Channel timing test
Size help near the top of the page cuts returns without cutting orders.
last moved by Product page size help
Your move
Find better customers. Help more of them buy. Give them a reason to return. Prove what increased profit.