Skip to content

E-commerce development

Next.js Commerce

Storefronts on Shopify, Commerce Layer, Medusa or a custom backend - built so the product page is static, the cart is not, and neither one waits for the other.

Commerce is where the Next.js rendering model earns its keep, and where getting it wrong is most expensive. A product page that takes three seconds does not convert, and every storefront template we have inherited made the same architectural choice: one use client at the top, because the cart needs state.

That decision makes the catalogue - the part that should be static, cached at the edge and indexed - as dynamic as the checkout.

How we split it

The catalogue is static. Product pages, collections and search landing pages are generated at build or revalidated by tag when the backend says something changed. They come off the CDN, they are indexable, and their LCP does not depend on your commerce API being awake.

The cart is a client island. A small component, not a boundary around the page. Quantity, mini-cart and add-to-cart are interactive; the product description, images, reviews and structured data around them are not, and stay on the server.

Prices and stock are the exception, handled deliberately. They cannot be stale, and they also cannot be allowed to make the page dynamic. Either they stream in behind Suspense while the rest of the page paints, or they are tag-revalidated on the backend's webhook. Which one depends on how often your prices actually move - we will ask rather than assume.

Checkout stays where it is. If you are on Shopify, the hosted checkout is PCI-compliant, converts well and is not worth rebuilding. We integrate up to it. A custom checkout is a project of its own and we will tell you when it is not justified - and when it is, it is built on a division of trust that does not include the browser, with a return page that survives the redirect.

What we do about the parts that decide revenue

Product structured data with real Offer and availability, so rich results show a price. Correct canonicals across variant and filter URLs - a faceted catalogue generates thousands of near-duplicate addresses, and left alone they spend your crawl budget on parameter combinations nobody searches for.

Core Web Vitals treated as a commerce metric rather than an engineering one, measured on the templates that carry traffic, with a budget enforced in CI so the next theme change does not undo it.

Which backend

Shopify (Storefront API), Commerce Layer, Medusa, BigCommerce, or your own service. The storefront architecture is the same in each case; what differs is the data layer, and that is the part we type and cache carefully.

If you are on Shopify's own themes and considering a headless storefront, the honest answer is that it is worth it when you have a real front-end team or us, and not worth it when you do not. A Liquid theme maintained well beats a headless storefront nobody owns.

How an engagement runs

We start from revenue rather than architecture. Which templates carry the traffic, where the funnel loses people, and what the current platform makes impossible.

The scope that follows names the backend, the template list, the URL map with its redirect plan, and the performance budget, priced per phase. It is signed before the build begins. The URL map in particular is agreed up front, because a replatform that discovers its redirects late has already lost the rankings.

Then the build, deployed per phase, with the budget enforced in CI from the first one.

What you receive

The storefront, the typed data layer against your commerce backend, the URL map with its redirects, and the performance budget running in CI on the templates that carry traffic.

Also the parts nobody demos: the cache strategy per template written down, what the page does when the backend is slow or down, and the faceting rules that decide which parameter combinations a crawler is allowed to reach.

The two numbers that move commerce revenue live on the templates carrying the traffic. LCP, which on a product page is almost always the image. And the rest of Core Web Vitals, measured on real visitors and not in a lab. Facets, pagination and parameter URLs are the other half, and keeping them out of the index is structural, not a setting.

Scope and terms

Engagement model
Fixed scope, agreed in writing before work starts. Not a day rate against an open backlog.
Price and timeline
Both are set per project, once the scope is. Quoted together, before anything is built.
What we need from you
One person who can approve decisions, and access to your repository and issue tracker.
Not included
Anything outside the agreed scope. It becomes its own scope rather than a variation order.
Third-party costs
Hosting, licences, API fees and SaaS subscriptions are contracted and paid by you.
Invoicing
Codefacture Yazılım A.Ş., Türkiye. EUR, USD or GBP by bank transfer, with no Turkish VAT on exported services.

Frequently asked questions

Is a headless storefront worth it over a Shopify theme?
It is worth it when you have a front-end team, or us, and something the theme genuinely cannot do. It is not worth it when nobody will own it afterwards. A well-maintained Liquid theme beats a headless storefront that nobody looks after.
Which commerce backends do you work with?
Shopify through the Storefront API most often, then Commerce Layer, Medusa and BigCommerce. A service of your own works too. The storefront architecture is the same in each case and the data layer is what differs.
What happens to our existing URLs?
They stay. A replatform that changes URLs throws away rankings you already paid for, so the URL map comes before the build and the redirects ship with it.
How does it stay fast as the catalogue grows?
Product pages are static and revalidated; the cart and anything personalised is not, and neither waits for the other. Then a performance budget in CI, measured on the templates that carry traffic, so the next theme change cannot quietly undo it.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page