All posts
17 min readShoppex Team

The Benchmark: Shoppex vs SellAuth, Komerza and Sell.app

Storefront load times, API latency measured with real accounts, and API depth across four platforms. Full methodology, honest caveats, and the numbers that did not flatter us.

Anyone can ship an ecommerce platform now. AI turned a weekend project into an afternoon project, and this space is drowning in the results. Shipping stopped being the hard part somewhere around 2024. What's still hard is engineering — tail latency under load, signed webhooks with replay protection, APIs that clean up after themselves. None of that shows up on a landing page. All of it shows up in a benchmark.

So we ran one. We'd made an offer that only makes sense if Shoppex actually beats the platforms we're asking you to leave, and claims like that deserve receipts. This post is the receipts: storefront speed, API latency, API depth, across Shoppex, SellAuth, Komerza and Sell.app. Methodology included, raw numbers included, and — this part matters — the places where we lost included.

Everything was measured on 2026-08-09 from one machine in Germany. Every test is reproducible, and only the authenticated section needs an account.

Storefront speed

The buyer-facing number. We ran Lighthouse against hosted storefronts on each platform: same machine, same settings, median of three runs per site.

Largest Contentful Paint, simulated mobilelower is better
Shoppex
Komerza
Sell.app
SellAuth
2.4 s
7.0 s
12.6 s
not measurable (bot challenge)

Lighthouse 13.4.1, simulated mobile (412px, 4G throttling), median of 3 runs per site, 2026-08-09. Shoppex: clean-minimal-demo.myshoppex.io (the demo linked on our homepage). Komerza: demo.mykomerza.com (their official demo). Sell.app: halalware.sell.app (a live hosted shop; no official demo exists). SellAuth storefronts answer Lighthouse with an HTTP 503 bot challenge, so a cold-load audit is not possible. To be fair: in a real Chrome session that passed the challenge, their demo reached an LCP of about 0.8 s on a warm repeat visit (Slow 4G, 4x CPU) — fast, but not comparable to the cold loads above.

Full medians below, including two more of our theme demos — and yes, including the column where we originally lost. More on that in a second.

StorefrontPerf scoreFCPLCPTBTSpeed Index
Shoppex, default theme0.991.4 s1.4 s0.09 s1.5 s
Shoppex, starlight theme0.991.5 s1.5 s0.11 s1.9 s
Shoppex, clean-minimal theme0.951.6 s2.4 s0.09 s2.0 s
Komerza, official demo0.413.1 s7.0 s3.1 s3.2 s
Sell.app, live shop0.512.0 s12.6 s1.0 s2.3 s

Here's the story we could have quietly left out. The first run of this benchmark caught us. Our Total Blocking Time came back at nearly three seconds — worse than Sell.app's — and when we dug into the trace, the culprit wasn't our renderer at all. It was our own bot-protection JavaScript, taxing every single page load with about two seconds of main-thread work. A security setting we'd turned on and never measured. We switched it off the same afternoon, re-ran everything, and the scores you see above are the result: 0.95 or better on every theme, TBT down around 0.1 seconds. That's the entire argument for benchmarking your own stuff, compressed into one embarrassing afternoon.

Run it yourself:

npx lighthouse https://clean-minimal-demo.myshoppex.io --preset=perf --view

The public API: does it exist, and how fast is it

This one's for the developers — anyone running a custom storefront on their own domain, a Discord bot, anything headless. Before you can measure an API you have to find one, and that search turned out to be a result in itself:

ShoppexSellAuthKomerzaSell.app
Public storefront JSON API, no key neededYes, powers @shoppexio/storefrontNoYes, powers their embed scriptNo
What a headless developer gets without a server-side keyProducts, product detail, shop info, cart, checkoutNothing publicProduct detail, basket, checkoutNothing public

SellAuth and Sell.app render product data into the page server-side, and we found no public JSON endpoint on either. Everything runs through key-gated server APIs. That's a legitimate architecture choice, to be clear. It just means "build your own frontend" starts with "build your own backend proxy", which is a strange first step to hand a customer.

For the two platforms where a public endpoint exists, we measured the single-product fetch — the request every product page makes. Twenty-five requests each, fresh connection every time:

Single product fetch, p95 latencylower is better
Shoppex
Komerza
SellAuth
Sell.app
92 ms
118 ms
no public endpoint
no public endpoint

25 sequential requests per endpoint with fresh connections, TTFB, both platforms measured back to back on 2026-08-09. Medians: Shoppex 63 ms, Komerza 65 ms. Shoppex returned 4.5 KB per product, Komerza 2.2 KB. Shoppex endpoint: api.shoppex.io/v1/storefront/products/unique/{id}. Komerza: m-api.komerza.com/{storeId}/products/{id}. SellAuth and Sell.app have no public endpoint to measure. Earlier the same day we measured 76/106 ms on our side, then shipped a version-invalidated response cache and re-ran both platforms.

This one has a story. Our first run put Komerza a touch ahead at the median (67 vs 76 ms), with a response half the size of ours — and we don't enjoy losing medians. So we shipped a version-invalidated response cache the same day, re-measured both platforms back to back, and now it's 63 vs 65 ms: a tie, with our p95 ahead at 92 vs 118. The tail is what your slowest visitors feel. Both APIs are fast, honestly. The real four-way difference isn't speed at all — it's that half the field has nothing public to measure.

API depth

Everything past the storefront runs on the merchant API — orders, licensing, affiliates, webhooks, automation. We counted the documented endpoints in each platform's public reference. Not marketing pages: the actual reference docs, all read on the same day.

Documented public API endpointshigher is better
Shoppex
SellAuth
Sell.app
Komerza
302
232
200
109

Counted from each platform's public API reference index on 2026-08-09: docs.shoppex.io, docs.sellauth.com, docs.komerza.com, sell.app/docs/api. Sell.app documents some multi-operation pages, so its true operation count is a little higher than its page count.

Counts are a proxy, obviously. What ships around the API matters more:

ShoppexSellAuthKomerzaSell.app
Official SDK on npmYes, @shoppexio/sdkNo, community onlyNo, CDN storefront script only; API SDKs "in development"No, community only
Manage webhooks via APIYes, incl. test, logs, retryNo, dashboard onlyYesYes
Signed webhooksTimestamped HMAC with replay protection and secret rotationHMAC, payload carries IDs onlyHMACHMAC with secret rotation
Idempotency keysYes, on money pathsNot in public docsNot in public docsNot in public docs
OAuth2YesNot in public docsToken exchange onlyNot in public docs
Orders via APIFull read/writeVia invoicesRead/writeRead-only

And the parts that don't fit in a table row: 59 webhook event types, API keys scoped per resource and action across 28 resources, cursor pagination, per-key IP allowlists. All 302 reference pages are generated straight from the OpenAPI spec of the running code, which is why the docs can't drift from reality. Keep that last sentence in mind — it becomes relevant further down.

The authenticated API under load

Everything above needs no account. But a production integration lives on authenticated endpoints, so we benchmarked all four platforms through regular merchant accounts. Nothing whitelisted, nothing staged — standard accounts on each platform's free or base tier.

Which operations? We didn't guess. We looked at what real integrations actually call most on the Shoppex API, and the answer is unglamorous: list products, update product, list orders, list reviews, fetch a single order, poll a payment's status, create things. Bots syncing stock and prices, bots polling whether a payment cleared, cron jobs paging through orders. That's what automation does all day, so that's what we measured — eight operations, on every platform that supports them.

Method: 30 recorded requests per operation after 3 warmups, sequential with 0.6 s spacing, fresh connection each time, measured from Germany on 2026-08-09. Every object the benchmark created got deleted afterwards. (Well — everywhere deletion was possible. Hold that thought.)

List products, p95 latencylower is better
Shoppex
Komerza
SellAuth
Sell.app
100 ms
153 ms
254 ms
534 ms

GET on each platform's product-list endpoint. This is the most widely used operation across real Shoppex integrations, so it comes first. Full percentiles for all six operations are in the table below.

List orders, p95 latencylower is better
Shoppex
SellAuth
Komerza
Sell.app
116 ms
198 ms
210 ms
513 ms

GET on each platform's canonical order-list endpoint (SellAuth and Sell.app call them invoices). Sell.app documents a /v2/orders endpoint, but the live API returned 404 for it. So we measured /v2/invoices, which their docs list as the backwards-compatible lane.

Create product, p95 latencylower is better
Shoppex
SellAuth
Komerza
Sell.app
159 ms
163 ms
233 ms
771 ms

POST with each platform's minimal valid product payload. At the median, SellAuth was a little faster than Shoppex (122 ms vs 139 ms). Shoppex has the tighter tail. Komerza's free tier capped the product count mid-run, so its pass ran untimed deletes between creates.

Create checkout invoice, p95 latencylower is better
Shoppex
SellAuth
Komerza
Sell.app
250 ms
470 ms
872 ms
992 ms

The operation a headless checkout runs on every sale, mapped to each platform's closest equivalent: Shoppex POST /dev/v1/payments (creates the invoice plus hosted payment URL), SellAuth checkout sessions, Komerza dashboard orders (their API has no checkout-session endpoint, and order creation needs stocked license keys), Sell.app charges. SellAuth returned 429s after about 25 sequential requests, so its percentiles come from the 22 successful ones. Shoppex payment links, a lighter operation, measured 70/103/166 ms the same day.

Full percentiles, all operationsp50, with p95 / p99 below · bar shows p95 per row · lower is better
ShoppexSellAuthKomerzaSell.app
List products70 ms100 / 106best p95125 ms254 / 61681 ms153 / 207480 ms534 / 546
List orders76 ms116 / 137best p95122 ms198 / 1021155 ms210 / 303452 ms513 / 4673
Get single order68 ms102 / 115best p95155 ms314 / 489not measured*471 ms536 / 1636
Poll payment status70 ms85 / 126best p95140 ms167 / 17385 ms106 / 297473 ms524 / 550
Create product139 ms159 / 172best p95122 ms163 / 455197 ms233 / 2257686 ms771 / 808
Update product144 ms193 / 207118 ms144 / 158best p95169 ms191 / 194671 ms744 / 925
List reviews67 ms78 / 78best p95111 ms126 / 13280 ms92 / 121455 ms508 / 582
Create checkout invoice210 ms250 / 403best p95109 ms470 / 598687 ms872 / 1121959 ms992 / 1208

* Our Komerza test store has no orders, and the API refused to create one (stock validation). There was no order to fetch.

The table says something the bars can't: look at the tail. Our worst p99 across all eight operations is 403 ms — and that's the one that creates an invoice, writes a customer, and mints a payment URL in a single call. Every other platform has at least one operation with a p99 above 590 ms, and Sell.app's order list hit 4.7 seconds. If your cron pages through orders or your bot batch-updates products, the p99 is the difference between an integration that feels instant and one that feels broken.

Now the footnotes we promised, because a benchmark that only reports its wins is an ad. SellAuth beats us on update-product outright — faster at every percentile, 144 vs 193 ms at p95 — and their medians on create-product and checkout-session creation are quicker than ours too. Credit where due; their tails are where it comes back. SellAuth was also the only platform that rate-limited us, throwing 429s on checkout creation after about 25 sequential requests. Reasonable protection, but undocumented: none of the three publishes numeric rate limits, while Shoppex sends x-ratelimit-* headers on every response. And one artifact we couldn't clean up no matter how much we wanted to: SellAuth and Sell.app let you create billing objects through their APIs but offer no way to delete them, so our test invoices and zero-value charges are still sitting there. Sorry. On Shoppex, every object the benchmark created was deleted through the same API that created it.

Webhook delivery: the invisible benchmark

Webhooks are how your bot finds out something happened — a sale, a new order, a stock change. Nobody benchmarks them because they don't show up on any status page. Which is precisely why we did. One receiver, ten real events per platform, measured from API call to received webhook.

Webhook delivery, median latencylower is better
Shoppex
Komerza
Sell.app
SellAuth
under 1 s
10.8 s
no delivery received
not configurable via API

10 events per platform on 2026-08-09, same receiver (webhook.site), time from API call to received webhook. Shoppex: product:created events; every delivery arrived in under a second, below the 1 s resolution of the receiver. Komerza: order.created events, range 2.4 s to 13.4 s. Sell.app: their documented per-charge webhook_url field accepted our receiver, but not one webhook arrived within 45 seconds, across 10 charges. SellAuth webhooks can only be configured in the dashboard, not via API, so we could not set one up.

Sit with that chart for a moment. If a buyer pays and your Discord bot delivers the key off the webhook, that buyer waits eleven seconds on Komerza. On Shoppex they don't wait at all — every one of our ten deliveries landed faster than the receiver could timestamp it. Sell.app might deliver webhooks fine in other flows, and the zero-value test charges are a plausible explanation for the silence. But those were the only charges their API would let us create, on the exact field their docs advertise for exactly this purpose.

When the docs describe an API that does not exist

We didn't go looking for this one. It kept finding us. Three separate times during this benchmark, Sell.app's documentation described something their live API doesn't have:

  1. The docs tell new integrations to prefer /v2/orders. The live API answers 404. We had to fall back to /v2/invoices.
  2. The docs describe webhook channels under /v2/webhook-channels, nine endpoints deep. The live route answers 404.
  3. The docs promise charge.created webhooks on the per-charge webhook_url field. Ten charges, one receiver, zero deliveries.

There's a word people in this space love throwing at each other's platforms: slop. Here's the thing — slop isn't about who used AI or how fast you shipped. Slop is measurable. It's documentation describing endpoints that don't exist. It's a 4.7-second p99 on the endpoint every integration polls. It's webhooks that never arrive, on the exact field the docs advertise. A developer burns hours on that before discovering the bug was never on their side.

Our 302 reference pages are generated from the OpenAPI spec of the running code, and CI fails the build when they drift. Our docs can't describe an API that doesn't exist, because no human writes them. Judge every platform — ours very much included — by what you can measure. That's what this post is for.

The scoreboard

Twelve benchmarks in this post produced a clear winner. The tally:

Benchmarks won, out of 12 measuredhigher is better
Shoppex
SellAuth
Komerza
Sell.app
11
1
0
0

One point per benchmark with a clear winner: storefront LCP, public API p95, documented endpoints, eight authenticated operations (p95), and webhook delivery. Ties and non-measurable entries score for nobody. Every underlying number and every caveat is in the sections above.

BenchmarkWinner
Storefront LCP, cold load, mobileShoppex, 2.4 s
Public storefront API, p95Shoppex, 92 ms
Documented API endpointsShoppex, 302
List products, p95Shoppex, 100 ms
List orders, p95Shoppex, 116 ms
Get single order, p95Shoppex, 102 ms
Poll payment status, p95Shoppex, 85 ms
Create product, p95Shoppex, 159 ms
Update product, p95SellAuth, 144 ms
List reviews, p95Shoppex, 78 ms
Create checkout invoice, p95Shoppex, 250 ms
Webhook deliveryShoppex, under 1 s

Eleven out of twelve. SellAuth takes update-product, fair and square. A ranking compresses away a lot of nuance though, so treat this table as the index rather than the verdict — the sections above hold every number, every method, and every place where the picture was less flattering for us, including the afternoon our own bot protection turned up in our own trace.

Reproducibility

The storefront and public-API sections are reproducible tonight, by anyone, without an account anywhere. The authenticated section needs your own API keys, but any regular account on each platform works — nothing about the method depends on who's asking. That's the standard we think platform comparisons should be held to, and if you rerun any of this and get materially different numbers, we genuinely want to hear about it.

Did the numbers move you? Then the offer stands until September 30, 2026: six months of Shoppex Business, free, for anyone switching from a paid competitor. Or start on the compare page and check our claims line by line.