Scenario · Online store for one-off pieces · Artisan crafts
One-off pieces online,
never sold twice.
A workshop that creates unique works and sells them in store, by hand and by message. An online store designed for one-off pieces, custom commissions and shipping fragile items, including abroad.
E-commerce scenario — handmade sculptures and ceramics
A historic workshop.
No digital presence.
Picture a ceramics workshop in Deruta — Italy's majolica capital — run by the same family for generations. It makes hand-glazed terracotta sculptures and decorative objects, with techniques ranging from Renaissance majolica to contemporary forms commissioned by European collectors and interior designers.
The scenario: a ceramics workshop that sells only in its shop, at craft fairs and through one reseller abroad. The website is a static showcase from years ago: no e-commerce, no online commission requests, no English or German version, even though many of the workshop's visitors come from abroad.
The core problem: every piece is different. Selling handmade ceramics online isn't like selling T-shirts in three sizes. The catalogue has to show in real time what's still available, what has already shipped, and what can be commissioned from scratch with its own time and cost.
«Foreign customers ask us if they can buy online. We always say no. Losing a sale because you don't have a website stops being acceptable at some point.»
— Something I often hear from craft workshopsWooCommerce challenges for handcrafted one-off pieces
Five problems to solve,
none of them standard.
A "live" catalog — every piece unique and unrepeatable
When a piece is bought it has to disappear from the catalogue in real time, so nobody else can add it to their cart. Quantity always = 1 per item, with an atomic lock during checkout.
Custom commission form with a quote
Customers need to request a custom piece: size, technique, subject, colours. The form generates an automatic quote from configurable parameters (hours × complexity × materials) that the craftsperson can approve or adjust.
Shipping fragile ceramics: smart packaging calculation
Sculptures need custom packaging (double foam, a wooden crate for pieces over 30 cm). Cost depends on weight, size, destination and fragility. A custom plugin calculates the quote in real time using couriers' APIs (e.g. DHL and GLS).
A trilingual IT / EN / DE website without duplicate content
Every product page exists in three languages. Translations are managed with WPML and an automatic first draft (e.g. DeepL), with manual review of technical texts on glazing. Separate URLs per language with correct hreflang.
Maker dashboard: a catalogue anyone can manage
The workshop needs to upload a new piece in a couple of minutes: photos, title, technique, price, size — the rest is automatic. No complicated editors: a dedicated ACF Pro form built around how they work.
Custom WooCommerce plugins for one-off pieces
The devil is in the details.
Especially with WooCommerce.
WooCommerce is built for catalogs with multiple SKUs and variable stock. Adapting it to a model where "every product exists only once" requires surgical work on the cart core, the checkout experience and the whole sync system of the multilingual catalog.
Development process for a ceramics e-commerce
8–9 weeks from zero
to an online catalogue.
It starts from how the workshop really works: how pieces are made, how they're photographed, what a European collector needs to know before buying. From there, the data model (technique, firing, size, series, year) and an architecture of three independent custom plugins.
The heart of the system: each product has its quantity forced to 1 via a hook on woocommerce_product_get_stock_quantity. A MySQL transactional lock prevents double purchases: a record in wc_reserved_stock is created atomically when the piece enters a cart and released after 15 minutes if payment doesn't arrive. Load tests with dozens of simultaneous sessions on the same item.
The calculator integrates couriers' REST APIs: it takes weight, size and fragility, works out packaging volume with safety coefficients (×1.4 for double foam, wooden crate above 30 cm) and returns the cost via AJAX with a 60-minute cache. The commission builder creates range quotes (min–max) from a 4-variable matrix configurable without code.
WPML with automatic IT→EN→DE drafts and manual review of technical terms (majolica, raku glazing, refractory clay). A hook on woocommerce_reduce_order_stock keeps stock aligned across languages. VisualArtwork structured data in JSON-LD on every product page. An ACF Pro dashboard: a new piece goes in with 4 fields, the rest is automatic.
Image optimisation (5–10 MB originals → progressive WebP with lazy loading and a blurred placeholder). Stripe with local payment methods for Germany (SEPA) and the UK (Bacs). Automated Playwright tests, including "the same piece bought at the same time from two sessions". A soft launch with a small first collection.
WooCommerce technical solution for craft
Three custom plugins.
One artisan logic.
No ready-made plugin covers this case. The answer is three separate PHP modules, each with a clear job, hooked into WooCommerce through official hooks without ever touching the core.
Unique-piece manager — a catalogue that updates itself
Each product is flagged as a "unique piece" with an ACF field. The plugin intercepts add-to-cart and blocks it if another cart has already reserved the piece. Once the order is complete, the product becomes private (no longer listed) instead of "out of stock" — the URL stays live for SEO and shows a "this piece has found a home" page with similar pieces available.
Fragile-shipping calculator — custom packaging
The calculator gets net weight, dimensions (h × w × d in cm) and fragility level from the cart (1 normal, 2 high, 3 maximum for pieces over 30 cm or cold glazes). It applies packaging coefficients, works out volumetric weight with the couriers' formulas (L×W×H / 5000 or / 4000) and queries their APIs. The cheapest price compatible with the fragility level is returned via AJAX, cached for 60 minutes per destination and weight.
For shipments outside the EU (UK, Switzerland, USA) the plugin automatically prepares the CN23 customs form with the right entry for "ceramic artworks" (HS code 6913.90).
Commission builder — automatic quotes, no lost emails
Without a system, commission requests arrive by email and are often incomplete: no size, no budget, no idea of the technique. Many get lost in the back-and-forth. The builder guides the customer through 4 steps (technique → size → subject → urgency), shows a price range in real time (calculated on the server, not in JavaScript) and sends the maker a notification with all the data to reply with a final quote in one click. Accepted commissions become a WooCommerce order paid in two instalments (50% upfront via Stripe, 50% on collection).
Goal: almost every commission request complete on first submission, and replies the same day instead of days later.
WooCommerce PHP tech stack
Every tool has
a precise reason.
Why WooCommerce and not Shopify?
Shopify doesn't let you enforce stock logic at server level without relying on asynchronous webhooks — too slow to prevent race conditions on one-off pieces. WooCommerce, with direct access to the MySQL database, allows synchronous transactional locks. Also, WPML on a self-hosted WordPress is much more flexible for a three-language model with separate URLs and hreflang on future regional domains.
Why three plugins and not one?
Separating the jobs (unique pieces, shipping, commissions) means one component can be updated or replaced without touching the others. The shipping calculator, for instance, can be switched off when the workshop pauses international shipping — without affecting the catalogue or commissions.
Example goals — handmade e-commerce
From zero to online sales
across Europe.
Example figures, not a client's results: realistic goals for a scenario like this, to be measured over the first six months online against physical channels alone.
«A customer abroad buys the sculpture finished the week before, while the workshop is closed.» That's the scenario to aim for: a workshop that sells even when nobody's at the counter.
— The project's concrete goalLearnings: WooCommerce for handcrafted products
What I bring
to every project like this.
One-off pieces need a different data model from normal products. The temptation is to use WooCommerce "as is" with stock = 1. But without a transactional lock the risk of selling twice is real and hard to handle after the fact — especially with ceramics that can't be "replaced from the warehouse".
The "sold piece" page is SEO gold. Instead of a 404, showing the sold piece with an evocative message ("this piece has found a home") and a link to similar pieces reduces instant exits and leads people to explore more pieces.
For commissions, a price range works better than a fixed price. Showing "€800–1,200" instead of tying the customer to a figure before talking leads to more complete requests. The customer arrives already aligned on budget and the maker doesn't have to manage impossible expectations.
SEPA opens up the German market. In Germany many people don't use credit cards the way Italians do: without a local bank debit, lots of them abandon at checkout. Turning on SEPA is a trivial detail that makes a big difference — and a mistake that keeps happening.
VisualArtwork data brings traffic that Product doesn't see. Google Images searches for artworks bring qualified visits: someone searching for "contemporary majolica sculpture" has far higher purchase intent than someone arriving from generic searches.
Do you have an out-of-the-ordinary catalog?
One-off pieces, limited editions, made-to-order commissions — if your product doesn't fit any template, let's talk.
Have a similar project in mind?
Tell me about it: we start from goals and priorities, and the first call is free.