E-commerce site and upcoming digital products shop

My business website and upcoming digital products shop were built in two technical versions from the same content, to compare a WordPress solution and a custom-built one objectively.

Status: the shop is being published. No price or date is announced, and no link is offered until it is online.

Context and problem solved

I needed a professional bilingual (French and English) website that is fast and well referenced, with a digital products shop (applications, scripts and Excel add-ins), which I can evolve without depending on a provider.

Rather than decide in advance, I built two versions of the same site and compare them on measurements. This approach echoes the article WordPress or a custom-built website: how to choose?

Two technical versions

WordPress and WooCommerce

WordPress structured with Bedrock (dependencies managed by Composer), a light theme written for the project, WooCommerce for the shop, Polylang for French and English (shop in French).

Docker stack with a Caddy reverse proxy (TLS, HTTP/3), page cache, memory limits, health checks, and a deployment script with backup, smoke test and rollback.

Astro and Node server

HTML pages generated in advance with Astro: no PHP or database on the visitors’ path. A small Node server only handles the dynamic parts: contact form, purchase and download, back office.

Content in JSON validated by schemas and versioned in git; publishing rebuilds the site in a fresh folder and then switches over at once, with no half-built page.

Technical choices and architecture

  • Content: in the Astro version, typed blocks validated before every build; in the WordPress version, a replayable content load (pages, menus, forms, products, SEO).
  • Security: security headers and a strict content policy; in the Astro version, a custom back office (administrator and editor roles, hashed passwords, optional two-factor authentication, cross-site request protection, progressive lockout of attempts, audit log); payment delegated to a specialised provider, with no card data on the site; signed download links, limited in time and in number.
  • Performance: numeric budgets checked by tests (page weight, a single CSS file and a single in-house script, fonts hosted on the site, no third-party request before consent).
  • Container-based deployment: Docker Compose in both cases, behind a shared proxy, with resource limits and backups.
  • Tests: WordPress version, PHP static analysis (level 6), WordPress security rules, PHP tests, then 699 passing browser tests (mobile and tablet layout, SEO, accessibility in light and dark themes, bilingualism, download, performance). Astro version: 21 unit tests, 1,402 checks of the generated HTML and 186 browser tests.

Difficulties and lessons learned

  • Missing thumbnails: on the WordPress version, PHP had been compiled without JPEG support, so no thumbnail was generated and images arrived at full size. After the fix, the home page went from 271 KB and 20 requests to 89 KB and 10 requests.
  • Scripts loaded everywhere: emoji and shop scripts were loaded on every page; they were removed where they are not needed.
  • Layout shift: text moved when fonts arrived (a 0.15 shift on the product list); width-adjusted fallback fonts brought it back to 0.
  • What the tests revealed: on the Astro version they exposed “javascript:” links accepted by the markup engine and tables that could not be reached by keyboard, both fixed. A failing test reveals a flaw in the site, not in the test.
  • Measuring in the right place: speed measurements made locally do not reflect production; weight and request counts are reliable, but response times must be measured on the final host.
  • Journey choices: one product purchased at a time, with no basket, to keep things simple.

Honest status

Today, both versions are built and tested locally. Astro version measurements, locally: a home page of about 4 KB of compressed HTML, main content displayed in about 50 ms, no layout shift, and the full 128-page site built in about 0.5 s.

What remains: putting the shop online (being published), validating the real payment journey with test keys, final measurements on the host, professional review of the terms of sale and notices (withdrawal right for digital content, VAT, cancellation) and a review of the content editor by a non-technical person.

What this shows about my work

  • Comparing two approaches on measurements rather than preferences.
  • Delivering a fast, accessible and secure site, checked by automated tests before every release.
  • Giving autonomy: a back office designed for a non-technical person.
  • Knowing the limits of each solution (WordPress and custom-built alike) and explaining them honestly.

This website is itself a static variant, without a shop, of the Astro version.

A website or shop to build?

Describe your project in a few lines and I will tell you which approach looks right.

Request a quote