Skip to content

Ecommerce

Make your e-commerce company more profitable.

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

Bring in customers who are worth more than their first order.

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.

Apexapex / customers / maya-okafor

Maya Okafor

maya@example.com

$390

lifetime value

Lifetime value
$390

$498 charged across 3 orders, minus the $45 she sent back and $63 of tax and shipping.

Lifetime gross profit
$180

What survives the $210 the shoes cost. A 46% margin, taken from the store's own cost per item.

Payback
2.9x

$180 kept against the $62 it cost to acquire her. This is the number that decides whether to buy more shoppers like her.

First seen
Paid social, on iOS
Orders
3 over 12 months
App installed
Yes, on day 0
Consent
Marketing opted in

Purchase history

3 orders across 12 months

Lifetime valueGross profit
Lifetime value$390
Gross profit$180

The monthly bars add up to the lifetime value and gross profit shown above.

How she got here

every event, in order
  1. Tapped a paid social ad on her phone

    go.lark.example/running-shoes-launch, then the mobile website

    page_view

  2. Took the app banner

    It routed through the same Apex link, so the tap kept its campaign

    smart_banner_click

  3. Installed the app

    Matched to the Meta click. A best guess, 0.80 confidence

    app_install

  4. Landed on the shoe she was looking at

    lark://app/product/running-shoes, not the app's home screen

    deep_link_open

  5. Added the running shoes

    $145.00, size 8, then she closed the app

    add_to_cart

  6. Opened the cart reminder

    Version: Urgency, sent as a phone notification

    push_opened

  7. Placed her first order

    $145.00, credited to Meta, paid social

    order_placed

  8. Ordered twice more

    $190.00 and $163.00 over the next ten months

    order_placed

  9. Sent one item back

    $45.00 returned, so it stops counting as revenue

    order_refunded

Every experiment she was in

3 assignments

Convert and retain

Help more shoppers buy, then give them a reason to come back.

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.

Apexapex / journeys / cart recovery
Apexapex / experiments / cart reminder wording
Draft
Live
3Decision
4Promote
Apexapex / communications / composer

A full email in their inbox. Authored once, with Maya's attributes resolved from your schema.

Prove the result

Know what increased profit, not just what got a click.

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.

Apexapex / customers / value

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 orders
  1. What she paid, across 3 orders$498Every charge the store confirmed. Not what her cart said, what she was actually charged.
  2. Minus the item she sent back-$45A refund reverses the sale. Apex takes it off the day it happens, not at the end of the quarter.
  3. Minus tax and shipping-$63Tax was never your money. Shipping isn't money the product earned.
  4. Lifetime value$390The revenue one shopper has brought in so far. Discounts are already gone, because a discount lowers what she was charged.
  5. Minus what the shoes cost-$210The cost of the goods themselves, per item, sent in on the order or pulled from the store platform.
  6. Lifetime gross profit$180What one shopper actually leaves you. This is the number to compare against what she cost to get.
Lifetime value
$390

Revenue from one shopper, refunds already off

Lifetime gross profit
$180

46% of her lifetime value

What she cost to get
$62

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.

Apexapex / channels / economics

One shopper, end to end

See the whole system work with one shopper.

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

Apex learns what a sale is, on the website and in the app

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.

Apexapex / spec

Your schema

mapped to Apex Spec v1.4.0

Page viewlive · 18.4K / daytrackPageview() → page_viewsrc/lib/analytics.ts
Product viewlive · 6.1K / daylogProductDetail() → product_viewsrc/app/products/[slug]/page.tsx
Add to cartlive · 940 / daycart.addItem() → add_to_cartsrc/features/cart/actions.ts
Remove from cartlive · 310 / daycart.removeItem() → remove_from_cartsrc/features/cart/actions.ts
Checkout startedlive · 402 / daybeginCheckout() → checkout_startedsrc/features/checkout/start.ts
Order placedlive · 2.9K / dayorders.create() webhook → order_placedsrc/server/webhooks/orders.ts
Signed uplive · 121 / dayauth.register() → user_signed_upsrc/server/auth/register.ts
First orderlive · 74 / dayfirst_sale_completedderived from order_placed
Subscription startedbilling.subscribe() → subscription_startedsrc/server/billing/subscribe.tsSet up
Review request duereview_request_duenot found in your codeSet up
8 of 10 verified against live traffic
your editor

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 integration

02 · The other thing you connect

Your store already knows what the shoe cost you. Apex asks for that too.

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.

Apexapex / integrations / shopify
Connected to lark-walkthrough.myshopify.com

Shopify

Store platform

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 sync
  • Orders and refunds. Every confirmed order, with its tax, shipping and discount lines.
  • Cost per item. The cost field on each product option, which is the missing half of gross profit.
  • Selling price per item. Read in the same pass, so a product with no cost still has a price.
  • The product list. So a product on a chart has a name instead of a code.

A missing cost stays missing

When a product has no cost filled in, Apex counts it as a gap and says so. It never fills the hole with a zero, because a zero would quietly report that item as pure profit.

Most 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 revenue

03 · Tuesday, 8:41am, at a bus stop

She taps an ad, and every report already knows which campaign it was

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.

Grey running shoes on wet pavement at sunrise

lark.example

running shoes

Free shipping and 60-day returns.

Shop now
3.8K214 comments96 shares
LikeCommentShare
Apexapex / links

The link in the ad

apex / links
go.lark.example/running-shoes-launch

Where it sends a phone with no app

https://lark.example/t/running-shoes?utm_source=meta&utm_medium=paid_social&utm_campaign=running_shoes_launch&utm_content=reel_a

Where it sends a phone that already has it

lark://app/product/running-shoes
Reports as Paid Social

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 spreadsheet

04 · 8:41am, on the mobile website

The site can offer her the app, and the ad she tapped comes with her

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.

Apexapex / mobile / smart banner

On her phone, in the browser

apex.js
lark.example/t/running-shoes

What it's wired to

apex / mobile / settings
Shows on
Phones only, mobile web
Routes through
https://lark.links.apex.inc/get-app
Respects dismissal
14 days, per device
Position
bottom

The button is a tracked link, not an App Store link

Send someone straight to the App Store and the tap disappears, because the store tells you nothing about who arrived. This link remembers the campaign, the product she was looking at and the moment she tapped, which is the only reason the install that follows can be tied back to this ad.

The 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 release

05 · 8:43am, two minutes later

She installs, and the app opens on the shoe she was looking at

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:43am
She taps Get8:41am
The app opens here8:43am

The 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.

Apexapex / mobile / attribution

Android

deterministic100% confidence

Play Install Referrer

utm_source=meta&utm_medium=paid_social&utm_campaign=running_shoes_launch&fbclid=IwAR2fQ8x1mKp

Campaign
running_shoes_launch
Click ID
fbclid=IwAR2fQ8x1mKp
Tap to install
214s
Opens on
lark://app/product/running-shoes

Deterministic fbclid match from install referrer/deep link

iOS

probabilistic80% confidence

No referrer, because Apple doesn't pass one

ip 24.17.44.0/24 · iPhone16,2 · iOS 19.1 · Portland, OR

Campaign
running_shoes_launch
Click ID
none passed
Tap to install
331s
Opens on
lark://app/product/running-shoes

Probabilistic fingerprint match (confidence 0.80)

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 waits

06 · The signal Apple will vouch for

Apple can vouch for the installs your ads caused, even when she turns tracking off

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.

Apexapex / mobile / skadnetwork

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 declined

07 · Before you get invoiced

Some of those installs never happened, and you shouldn't pay for them

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.

Apexapex / mobile / fraud
Installs claimed
4,086

What the networks reported, last 30 days

Held back
214

Failed the rules or the scorer

Billable
3,872

What Apex charges you for

Flagged for review

Every one of those is an install Apex chose not to bill you for

Most measurement vendors make more money the more installs they claim. That's a bad thing to have on the other side of the table. Apex charges for matched installs, so the flagged ones cost us, not you. If a flag is wrong, mark it valid and it goes back in the count.

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 too

08 · Right now

When she signs in, the last ten minutes come with her

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.

Apexapex / web / live

Activity

apex / web / live

People here now

3 shopping now

On 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 list

09 · 8:52am, she closes the app

She walks away with a full cart, and a follow-up runs without pestering her if she already bought

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.

Apexapex / journeys / cart recovery

What she left behind

8:52am
Her bag$145.00

Every 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 have

10 · Inside the journey

You can try two reminders and keep the one that actually brings orders

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.

Apexapex / experiments / cart reminder wording
Draft
Live
3Decision
4Promote

+$23,400 a quarter

What it is worth

Urgency

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.

How we counted

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 here

11 · 9:52am

You write the reminder once. She gets it wherever she actually is

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.

Apexapex / communications / composer

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}}Portland

Switch the tabs above the preview. Each one is drawn the way that surface really looks.

Four channels, one message

12 · Set up once

Mail leaves from your company, and receipts get the same care as campaigns

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.

Apexapex / settings / email domains
lark.exampleVerifiedfrom hello@lark.example
DKIM 1CNAME
Nameapex1._domainkey.lark.example
Valueapex1.dkim.apex.inc
DKIM 2CNAME
Nameapex2._domainkey.lark.example
Valueapex2.dkim.apex.inc
SPFTXT
Namelark.example
Valuev=spf1 include:amazonses.com ~all
Apexapex / communications / transactional

A 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 mail

13 · Everyone like her

She joins a group that anyone on your team can read

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.

Apexapex / audiences

Repeat buyers going quiet

3,184 people

People who haveand have notin

WorkspaceWinback journeyMeta audience syncHoldout eligibility

App users with something in the cart

Maya is in this one902 people

People whoin the lastand have

WorkspaceCart recovery journeyMobile push audience

One order, no second

11,740 people

People who havemore than

WorkspaceSecond-order experimentGoogle customer match

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 everywhere

14 · Day 34

Her second order is the one that tells you whether the business works

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.

Apexapex / engagement / adoption

The milestone, as a sentence

apex / engagement / adoption

When 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.

Order placedchosenorder_placed2.9K / day, web and app
In-app purchasein_app_purchase84 / day, App Store only
Review submittedreview_submitteddeclared, never firedSet up
Apexapex / engagement
Daily active
10,610
+540.0 pp vs prev
Weekly active
32,800
+380.0 pp vs prev
Monthly active
80,800
+290.0 pp vs prev
Stickiness
13.1%
+80.0 pp vs prev

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 default

15 · Meanwhile, on the product page

The page she bought from was already an experiment, and the winner can become the real 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.

Apexapex / experiments / product page
Draft
Deploy
3Live
4Decision
5Promote
6Graduate

The two pages shoppers are being split between

server-side
Controlno size help
lark.example/t/running-shoes
Variant Bsize help
lark.example/t/running-shoes

One 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 sent

16 · The record

One screen holds everything that happened to her

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.

Apexapex / customers / maya-okafor

Maya Okafor

maya@example.com

$390

lifetime value

Lifetime value
$390

$498 charged across 3 orders, minus the $45 she sent back and $63 of tax and shipping.

Lifetime gross profit
$180

What survives the $210 the shoes cost. A 46% margin, taken from the store's own cost per item.

Payback
2.9x

$180 kept against the $62 it cost to acquire her. This is the number that decides whether to buy more shoppers like her.

First seen
Paid social, on iOS
Orders
3 over 12 months
App installed
Yes, on day 0
Consent
Marketing opted in

Purchase history

3 orders across 12 months

Lifetime valueGross profit
Lifetime value$390
Gross profit$180

The monthly bars add up to the lifetime value and gross profit shown above.

How she got here

every event, in order
  1. Tapped a paid social ad on her phone

    go.lark.example/running-shoes-launch, then the mobile website

    page_view

  2. Took the app banner

    It routed through the same Apex link, so the tap kept its campaign

    smart_banner_click

  3. Installed the app

    Matched to the Meta click. A best guess, 0.80 confidence

    app_install

  4. Landed on the shoe she was looking at

    lark://app/product/running-shoes, not the app's home screen

    deep_link_open

  5. Added the running shoes

    $145.00, size 8, then she closed the app

    add_to_cart

  6. Opened the cart reminder

    Version: Urgency, sent as a phone notification

    push_opened

  7. Placed her first order

    $145.00, credited to Meta, paid social

    order_placed

  8. Ordered twice more

    $190.00 and $163.00 over the next ten months

    order_placed

  9. Sent one item back

    $45.00 returned, so it stops counting as revenue

    order_refunded

Every experiment she was in

3 assignments

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 together

17 · The money question

She spent $390 with you. You kept $180. She cost $62 to find.

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.

Apexapex / customers / value

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 orders
  1. What she paid, across 3 orders$498Every charge the store confirmed. Not what her cart said, what she was actually charged.
  2. Minus the item she sent back-$45A refund reverses the sale. Apex takes it off the day it happens, not at the end of the quarter.
  3. Minus tax and shipping-$63Tax was never your money. Shipping isn't money the product earned.
  4. Lifetime value$390The revenue one shopper has brought in so far. Discounts are already gone, because a discount lowers what she was charged.
  5. Minus what the shoes cost-$210The cost of the goods themselves, per item, sent in on the order or pulled from the store platform.
  6. Lifetime gross profit$180What one shopper actually leaves you. This is the number to compare against what she cost to get.
Lifetime value
$390

Revenue from one shopper, refunds already off

Lifetime gross profit
$180

46% of her lifetime value

What she cost to get
$62

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 one

18 · Where the cost half comes from

Apex shows how much of that $180 is measured, and how much it had to guess

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.

Apexapex / products / cost
Last 30 days
x

$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
ProductUnitsUnit priceUnit costCostRevenue
running shoes2,140$145.00$61.30Reported$310,300
Vomero 181,010$160.00$68.75Reported$161,600
Metcon 9690$150.00$64.20Reported$103,500
Everyday Plus socks, 6 pack900$28.00—Not reported$25,200
Club Fleece hoodie165$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 filled

19 · Multiply by every shopper

Once you can do this for every shopper, Monday's question is where the next dollar goes

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.

Apexapex / channels

Next moves

  • TikTok

    TikTok is losing money

    Every $1 it costs to get a customer here comes back as $0.58 of gross profit. You spent $39,360 in 90 days. Cut it, or fix the targeting.

    Review channel
  • Pinterest

    Pinterest is close to break-even

    $1.03 of gross profit for every $1 of acquisition cost. That's only measured on 62% of its revenue, so treat it as a rough read.

    Review channel
  • Pay creators more

    Partner links return $3.80 of gross profit for every $1 of commission, and they pay back in the first month. This is the best row on the board.

    Plan more budget
  • Google Ads

    Spend more on Google

    $2.26 of gross profit for every $1 of acquisition cost, paid back inside a month. There's room to spend more here.

    Plan more budget
  • Pinterest

    Connect Pinterest so spend syncs itself

    Right now somebody types Pinterest spend in by hand. Connect it and the spend and the orders arrive on their own.

    Connect Pinterest
Apexapex / channels / economics
Apexapex / channels / outbound

Meta

268 / day

Facebook and Instagram. Server-side conversions with real order value, not a pixel estimate.

Google Ads

Google Ads

268 / day

Enhanced conversions plus lifetime value, so Smart Bidding sees profit.

LinkedIn

LinkedIn

62 / day

Conversions matched back to the campaign that earned them.

Apexapex / partner network

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.

E-commerce12.0% of purchase
Apply

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 it

Keep what worked

The order ended. What it taught you didn't.

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.

89% confident· 4 experiments, 61,000 shoppers

last moved by App banner placement test

Saying a size is nearly gone recovers more carts than a plain reminder.

91% confident· 3 experiments, 1 disagreed

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.

72% confident· 2 experiments, 24,000 carts

last moved by Channel timing test

Size help near the top of the page cuts returns without cutting orders.

44% confident· 1 experiment, still running

last moved by Product page size help

order, from the ad to the profit
1order, from the ad to the profit
steps in the example below
19steps in the example below
ways every result gets checked
4ways every result gets checked
installs Apex refused to bill
214installs Apex refused to bill

Your move

Make the next order more profitable.

Find better customers. Help more of them buy. Give them a reason to return. Prove what increased profit.