Three storefronts, three ad accounts and a CRM built from scratch.
The client is a Dutch furniture and bedding retailer running three brands, and has asked not to be named. I run the online side of all three: the storefronts, the product feeds, the advertising, the email flows, the CRM the team works in every day, and the automation around a ten week delivery cycle.
Where it started
A furniture retailer selling three brands, with a showroom and an online store that had grown over years. Product data was inconsistent, the advertising had been set up by someone else and left running, the CRM belonged to somebody else, and nobody could say which part was working, because the tracking was reporting the wrong thing.
Furniture makes all of this harder than it sounds. Orders run between roughly 750 and 2,500 euro, custom pieces take ten to twelve weeks, and a customer researches for weeks before buying once. Any measurement that only looks at this month is measuring the wrong window.
Everything that was delivered
40 things, six areas, one person, all of it still running.
Storefronts and theme
- Two further Shopify stores built from scratch for the other two brands
- The main store migrated off WooCommerce onto the same domain
- 373 products, 835 variants rebuilt
- 68 collections remapped with hero, feature and FAQ content
- 739 redirects mapped, so no existing link breaks
- Custom theme work: load more, filters, badges, spec accordions, comparison slider
- Around 40 custom snippets rebuilt from the old WooCommerce store
Product data and pricing
- 822 offers live in Merchant Center with zero errors
- Issues fixed across three Merchant Center accounts
- Feed built directly after the official app could not produce one
- Catalogue reconciled against the supplier list: sold, archived, or never listed
- Price rule audit against the dealer agreement, violations reported
- New price proposal built for August 2026 from the supplier price list
Advertising
- Google Ads relaunched: Standard Shopping plus a tight Search set
- Meta rebuilt after thousands of add to carts and no recorded purchases
- Tracking rebuilt server side, domain verified
- 4.3% conversion rate across all campaigns
- Enquiries counted: WhatsApp, calls and route requests
- Products under 250 euro kept out of Shopping, big ticket only
- Batch only changes, so Smart Bidding is not restarted every week
Email and retention
- Klaviyo connected to Shopify and the data flow verified
- Three step abandoned cart sequence, written in Dutch
- Two step browse abandonment sequence
- Opt in re-permission campaign to make the existing list mailable
- Copy written for a ten week order cycle, showroom first, discount last
- Monitoring script that catches flows left sitting in draft
Compliance and trust
- Thuiswinkel Waarborg certification review worked through end to end
- 34 numbered findings fixed and verified on the live store
- Checkout button label corrected through a market level translation override
- Payments page trimmed to the methods actually accepted
- Withdrawal form and identity clauses added to the terms
- Duplicate headings removed across around twenty pages
- Cookie consent position and newsletter consent line fixed
Software and automation
- Django CRM built from scratch, because they were locked out of their own
- Ten years of history migrated in as a read only archive
- Sales screen, order warning dashboard and admin for showroom staff
- Order tracking page customers check themselves
- QR invoices that open the right order page
- WhatsApp integration receiving customer messages automatically
- Order update messages that used to be typed by hand
The work, in six parts
The result first, then how it was done.
Three storefronts, one migrated with its rankings intact
Two Shopify stores built from scratch, and a third moved off WooCommerce onto the same domain without losing its search position.
The group sells three brands: its own, plus two it carries as the official Netherlands dealer. Replatforming usually costs a month of traffic, because every product URL changes shape. Here the domain stayed, 373 products and 835 variants were rebuilt, 68 collections remapped, and 739 redirects put in place so every old address still lands on the right page. Live on 10 July 2026. The old store carried around forty custom PHP snippets, and the behaviour worth keeping was rebuilt in Liquid rather than dropped in the move.
A product feed the official Google app could not build
822 offers pushed live with zero errors, after proving the tool everyone is told to use was broken for this store.
The Shopify Google app kept failing to produce a usable feed. Two days went into that before I accepted it was not going to be fixed and built the feed directly instead. 822 offers, zero errors, across three Merchant Center accounts. The catalogue itself was reconciled against the supplier list on 11 August 2026: what is still sold, what should be archived, and what had never been in the CRM in the first place. A separate pass checked live prices against the dealer price agreement and listed every rule violation.
Advertising rebuilt around what actually gets measured
A 4.3% conversion rate across all campaigns, counting the enquiries a furniture buyer actually sends rather than online checkouts alone.
Google Ads relaunched in mid July 2026 as two campaigns, Standard Shopping plus a tight Search set, with products under 250 euro kept out of Shopping because this is a big ticket business. Meta was rebuilt on 3 August 2026: the account had thousands of add to cart events and not one recorded purchase, because the tracking had never been set up properly. Changes go in as one consolidated batch rather than daily edits, so Smart Bidding is not sent back into learning every time something is adjusted.
Email flows, because the traffic was already paid for
Cart, browse and re-permission flows live in Dutch, working the visitors the ads had already brought in.
Klaviyo was connected to Shopify, then six emails were written and built: a three step abandoned cart sequence, a two step browse abandonment sequence, and an opt in campaign to make the existing list mailable again. The copy is written around a ten to twelve week custom order cycle, so the second email invites people into the showroom instead of reaching for a discount, and the discount only appears at the end. A monitoring script checks the account, because the most common failure in Klaviyo is a flow that looks finished and is still sitting in draft.
A certification review, worked through finding by finding
34 findings from the Thuiswinkel Waarborg review fixed and verified on the live store.
Thuiswinkel Waarborg is the trust mark Dutch shoppers look for before they buy from a store they do not know. The review produced a long list: a checkout button label that could only be changed through a market level translation override rather than the theme, a payments page listing methods the store does not accept, missing withdrawal form and identity clauses in the terms, duplicate headings across around twenty pages, consent banner position, a newsletter consent line. Each fix was scripted so it can be re-run and re-verified against the live store rather than done once by hand and forgotten.
Software they own, instead of software they rent
A Django CRM, an order tracking page, QR invoices and a WhatsApp integration, all built from scratch. The full CRM build is documented here.
The client was locked out of their own CRM by the party who held it, on a server that was being switched off. The rescue came first, so the deadline stopped driving the decision, and the replacement second: a Django application with its own data model, admin, sales screen and order warning dashboard, with ten years of history migrated in as a read only archive rather than replayed into a new accounting engine. On top of it sits an order tracking page customers check themselves, QR invoices that open the right order, and a WhatsApp integration so the update messages that used to be typed by hand arrive on their own.
How it ran
The record, with the dates the changes actually went live.
The insight that changed how this account is judged
Furniture is not bought the way analytics assumes. Nobody spends two thousand euro on a sofa from a photograph. People search, they read, they shortlist, and then they ask a question before they commit to anything.
Searches online and finds the product page
Sends a WhatsApp, calls, or asks for the route
Takes weeks over the decision
Orders, ten to twelve weeks before delivery
Only the first two steps are visible to Google and Meta. Judge the account on online checkouts alone and it looks like a failure while the enquiries keep coming in. That is the single most common reason a business with a long buying cycle concludes that advertising does not work for them.
So the measurable step is the one that gets measured. WhatsApp clicks, phone calls and route requests are treated as conversions and mirrored across Google and Meta, which points the bidding at people who get in touch rather than people who check out online. The ten to twelve week order cycle sits on top of that, which means any reporting window shorter than a quarter is reading noise.
Honest notes
Two days went into fighting the broken Google app before I accepted it could not be fixed and went around it. I should have reached that decision sooner. iDEAL also turned out not to be a simple toggle on Shopify, which is a migration risk worth knowing about before you move rather than after.
The rebuilt campaigns launched recently, so there is no twelve month revenue chart here yet. When there is one it goes on this page, including the months that disappoint. The client's store address is not published here at their request.
Want this level of attention on your store?
Start with the free 15 point check. Written, two working days, no call required, and it tells you what is actually holding the site back before anyone quotes you for anything.