Portfolio · WooCommerce · 10 store engagements

A slow store does not lose visitors. It loses orders.

Cart lag is abandoned revenue. A slow store loses buyers at the exact moment they had decided to buy: the checkout rebuilds itself from scratch, the buy button moves after paint, and paid clicks land on a page that opens too late. These 10 engagements are all store work. Every number traces to a report the client could re-run, and the quotes carry the public feedback scores, including the one that is not a five.

what slow cost, on the record
zero ordersafter a month of ad spend (Google Ads and social), the owner's report on rawteen.comconversion crash, same daya cache experiment gone wrong took a Spanish campaign's conversion rate to near zero for a day on sculpiflex.com~3x sales, next dayafter the checkout was fixed on bio-sol.ca, the owner reported roughly triple the online sales the following day (client-reported, Dec 2023)

Three anchors, three sources. The full ads-side receipts live on the Ads & Conversion page.

Why slow stores lose orders, in three beats.

  1. 01

    The checkout is the slowest page on the store.

    Cart and checkout are excluded from page cache on purpose: they show carts, currencies, and logged-in state. So the page where the order is actually placed is the one rebuilt from scratch on every visit, and when that path breaks, orders die mid-funnel. A WAF silently blocking checkout AJAX (vapevine.ca), 504 storms at the FunnelKit checkout during campaigns (sculpiflex.com): both are checkout paths, not marketing pages.

  2. 02

    Layout shift kills orders that were already won.

    The visitor waited. The page opened. Then popups and late-loading widgets pushed the buy button after paint, and the tap landed on nothing. Search Console flagged 0.45 CLS on demagieexpert.nl; the popup shifts were stabilized and CLS settled near zero. The visitor had already decided to buy. The page just moved out of the way.

  3. 03

    Paid traffic prices your slowness in real time.

    Ad clicks land with tracking parameters that bypass page caches, and the wait feeds the landing page experience side of Quality Score: a slow store pays more per click, because the auction prices ad quality, not the 1-to-10 score. One owner on this page ran a month of ads into a store that would not open, and recorded zero orders. The spend-side ledger for that story lives on the Ads & Conversion page.

06 · 5 store arcs · the cost in red, the return in green

5 stores, opened up.

What it cost, the fix, what came back. Where a deeper story already lives on a sibling page, the arc here is the store side and the link goes to the rest.

sculpiflex.com

Jul 2025, ongoing · via MIDAGENCY

What it cost

~2s TTFB

about 70% of the LCP failure · ads traffic worldwide

A high-traffic store selling worldwide through Meta and Google ads, where every landing URL carries campaign params and a geolocation currency switcher busted the page cache per currency. TTFB sat around 2 seconds, roughly 70% of the LCP failure. On ads traffic, cache experiments gone wrong showed up same-day as conversion crashes: one Spanish-campaign crash took the conversion rate to near zero for a day. Checkout 504 storms added their own lost orders during campaigns.

The fix

  • Per-currency page-cache architecture, so the currency switcher stops busting the cache
  • Cache-control conflicts resolved between CDN and store
  • FunnelKit checkout stabilized; 504 storms during campaigns ended
  • Migration to Cloudflare and Hetzner

What came back

sub-1s TTFB

cache safe to test · conversion crashes gone from the log

TTFB came down from ~2s to sub-1s, and the cache became safe to test on live ads traffic. That was the client's framing of the whole job: live testing on this traffic means burning money, so even a 1% conversion improvement covers the server budget.

rawteen.com

Apr 2025, ongoing · phase 2 active

What it cost

a month of ad spend, zero orders

the owner's report, Google Ads and social

Ad clicks landed on a store that took too long to open, and the owner's report after a month of spend was zero orders. A 2026 re-audit measured 4 MB mobile payloads and 2.5 to 3s uncached TTFB. The budget did not fail. The store it pointed at did.

The fix

  • Full-store speed on the Elementor build: nginx fixes, LiteSpeed crawler throttled under load
  • Cron cache warming, so the cache is hot before the ads land
  • REST API kept fast: the store feeds a mobile app through the Woo API
  • Elementor Pro template features that forced full page reloads on product filtering reworked instead of a rebuild

What came back

~100ms cached TTFB

from 2.5s · phase-2 retainer active since 2026 · public feedback 5.0

From 2.5s TTFB to ~100ms cached. When the client's senior developer recommended dropping Elementor outright, the honest answer was that a rebuild costs weeks while optimization gets Elementor green, so the template-level cause was reworked instead. The relationship continued into a phase-2 infrastructure retainer.

Cunningham Clinic

18-month TTFB rescue, then the 2026 rebuild repair

What it cost

5s TTFB

clinic and store on one slow origin

The clinic site carries a store, and the whole origin was slow: 5s TTFB, with GTranslate language pages among the worst offenders. The first rescue took 18 months of caching and server work. Then the 2026 Colibri-to-Elementor rebuild quietly reintroduced frontend pain: a 5.4 MB PNG hero sat as a CSS background inside the Elementor page stylesheet, discoverable only after 51 render-blocking stylesheets, about 1.2s of discovery delay, while Lighthouse still looked fine and CrUX showed the damage.

The fix

  • The rescue: page-caching rework, Redis object caching, PHP-FPM tuning
  • GTranslate pages fixed; later, /es/ pages cached through Cloudflare
  • The rebuild repair: hero re-served as optimized WebP with fetchpriority=high
  • A second page went 3.6 MB to 83 KB; stylesheet chain trimmed, leftover block plugins removed

What came back

1.19s TTFB

from 5s · the rebuild trap, closed

TTFB settled at 1.19s. The rebuild is the cautionary half of the story: a site that had already been rescued once lost the work silently, because the lab test never scrolled and the field data did. Store owners rebuilding a theme should re-run the speed work the week the rebuild ships, not the quarter after.

demagieexpert.nl

GSC-reported CLS program

What it cost

0.45 CLS

flagged in Search Console

A CLS program opened by Search Console's own report: 0.45 CLS on an Elementor + WooCommerce build, with the shifts coming from popups and late-loading assets on a store selling to two countries. On a webshop, layout shift is not cosmetic: the buttons it moves are Add to cart and checkout.

The fix

  • Elementor font subsetting saved roughly 500 KB
  • New dedicated server for the store
  • Prebuilt static HTML delivery for 99% of visitors
  • Popup-caused layout shifts stabilized

What came back

~0 CLS

from 0.45 · visitors on static HTML, editor untouched

CLS settled near zero. The builder stayed as slow as ever in the editor, and that was fine: the editor path is not the visitor path. 99% of visitors now get prebuilt static HTML, and the team keeps the workflow they know.

vapevine.ca + clinic store family

Three-year ongoing relationship

What it cost

984 URLs failing

mobile CrUX, product URLs across the store family

984 product URLs failing mobile Core Web Vitals in CrUX across a family of four stores, with checkout failing in a way scores did not show: a WAF was blocking the checkout AJAX calls, so carts died mid-funnel on a medical store where the order matters most.

The fix

  • WAF-blocked checkout AJAX unblocked
  • Dynamic caching restored for cart and checkout
  • EWWW and PHP 8 plugin conflicts resolved

What came back

CWV green

held across a three-year ongoing relationship

The failing URLs recovered to Core Web Vitals green. The ongoing relationship is the point of this arc: three years of holding vitals green across four stores while catalogs, plugins, and PHP versions kept changing underneath.

The store ledger.

Every engagement in the WooCommerce roster, 10 rows.

StoreScopeBeforeAfterEvidence
sculpiflex.comDTC store, ~7M views/month, 42 currencies~2s TTFB · checkout 504 storms · same-day conversion crashessub-1s TTFB · per-currency cache safe to testproject records
rawteen.comDTC food store + mobile app on Woo APIa month of ad spend, zero orders · 2.5s TTFB~100ms cached TTFB · phase-2 retainer activeproject records · public feedback 5.0
Cunningham ClinicDermatology clinic + store5s TTFB · 5.4 MB hero behind 51 stylesheets1.19s TTFB · hero re-served optimizedCrUX · project records
demagieexpert.nlMagic-tricks webshops, NL and DE0.45 CLS (GSC-reported)~0 CLS · 99% of visitors on prebuilt static HTMLGSC · project records
vapevine.ca + clinic store familyVape retail + medical e-commerce, 4 stores984 product URLs failing mobile CrUXCWV green · three-year ongoing relationshipCrUX · project records
rousehome.comWooCommerce on AWS EC2erratic TTFB: 200 ms vs 3,000 ms for the same page, spikes to 10sstabilized with W3TC + Redis · five-year relationshipproject records
trykinshape.comHigh-traffic DTC store, via MIDAGENCYSiteGround, migration under load25-30% faster server response · mobile 24h-average TTFB under 1sproject records
Debriefs storeE-commerce9s load2s loadpublic feedback 5.0
ScapedesignBelgian WooCommerce webshopno before/after number in the recordshired twice within three monthspublic feedback 4.85
DealssutraLarge deals and coupons siteno before/after number in the recordsa very large WooCommerce site optimized to load fastpublic feedback 5.0

Two rows carry no before/after numbers because the records hold no metric the client could re-run, so those rows stay qualitative instead of invented. Numbers come from the engagements themselves: CrUX, Search Console, and project records. Quotes are verbatim public Upwork feedback. Narratives are paraphrased from project records, never pasted from private correspondence.

In the clients' words.

"He resolves the issues of the loading time as great as he promised. He is one of the best choices if you need his work."
rawteen.com · Upwork 5.0
"Milan went above and beyond. He managed to get my website from a 9 second load time, down to 2 seconds."
Debriefs store · Upwork 5.0
"Very impressed by the speed improvement of my WooCommerce shop, was not expecting that much of a change."
Scapedesign · Upwork 4.85
"He just optimized a very big WooCommerce website to load super fast. Do not think twice before hiring him."
Dealssutra · Upwork 5.0

Verbatim public Upwork feedback, scores included exactly as recorded: Scapedesign's is a 4.85, not a five.

Your cart is losing orders you already paid for.

Free audit: where the checkout path stalls, what the cache misses, what it is worth. Honest findings either way.

Get a free store audit