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.

Project typeOnline store for one-off pieces
SectorArtisan crafts
Typical timing8–10 weeks
●Scenario
online store · terracotta sculpture
Workshop
Catalog
Commissions
Workshop
🛒 0
One-off piece
Sculpture · Alba Series
Alba in Terracotta #07
€ 480
VAT included · shipping calculated at checkout
Dimensions
h 34 cm · base Ø 12 cm · weight 1.8 kg
Hand-glazed terracotta · fired at 1220°C
Available now
BUY — ONE-OFF PIECE
Want a commissioned piece?
Request a quote → 3–6 weeks

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 workshops
Scenario E-commerce + live catalogue + commissions (example)
Platform WooCommerce + PHP 8
Custom plugins Unique-piece manager, commission builder, fragile-shipping calculator
Languages IT · EN · DE (WPML)
Typical duration 8–9 weeks
Tags
WooCommerce custom PHP WPML one-off pieces commissions fragile shipping Stripe

WooCommerce 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.

01

Race condition on the one-off piece

Two people add the same piece to their cart at the same moment. WooCommerce alone doesn't prevent it: both reach checkout and one pays for a piece that's already sold. Fix: a MySQL transactional lock on wc_reserved_stock, released automatically if payment doesn't arrive within 15 minutes.

02

Real-time fragile shipping calculation

Couriers have no standard API for "fragile piece in a wooden crate". It takes a custom calculator that estimates packaging volume (+40% for double layers), works out volumetric weight, picks the best courier for the destination and shows the price in the cart via AJAX, with a one-hour cache to cut API calls.

03

Commission quotes: non-linear pricing logic

A commission's price depends on size, technique (majolica, glazed, raku), number of colours, subject (geometric or figurative) and urgency. No linear formula: a matrix of coefficients configurable from the panel, giving a price range (€ min–max) so the customer isn't tied to a figure before talking.

04

WPML + WooCommerce: trilingual stock sync

WPML duplicates products per language, but WooCommerce manages stock on the main version. The risk: a purchase from the English version doesn't update availability in the German one. Fix: a hook on woocommerce_reduce_order_stock that propagates the update to every translation through WPML's API.

05

SEO for artworks: structured data + high-resolution images

Ceramics need to be indexed with Schema.org VisualArtwork (not Product) to describe each work precisely to search engines, helping its visibility on Google Images. Each work has artist, technique, material, dimensions and year of production in its metadata. High-resolution images (5–10 MB) are served as progressive WebP with lazy loading so as not to hurt LCP.

Development process for a ceramics e-commerce

8–9 weeks from zero
to an online catalogue.

Weeks 1–2
Audit, architecture and data model

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.

→ Delivered: technical architecture + content structure + dashboard wireframe
Weeks 3–4
Unique-piece manager + transactional lock

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.

→ PHP plugin with PHPUnit tests
Weeks 5–6
Fragile-shipping calculator + commission builder

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.

→ Courier APIs · coefficient matrix · AJAX + cache
Week 7
Trilingual WPML + VisualArtwork schema + ACF dashboard

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.

→ hreflang across 3 languages · VisualArtwork JSON-LD · custom ACF Pro form
Weeks 8–9
Performance, SEO, testing and launch

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.

→ Lighthouse 90+ goal · automated tests · launch with a 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.

Solution 01 / 03

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.

// unique-piece-manager.php — atomic lock when adding to cart add_filter( 'woocommerce_add_to_cart_validation', 'tc_lock_unique_piece', 10, 3 ); function tc_lock_unique_piece( $passed, $product_id, $qty ) { if ( ! get_post_meta( $product_id, '_tc_unique_piece', true ) ) { return $passed; // not a one-off piece, no lock } // transactional lock: INSERT ... ON DUPLICATE KEY UPDATE global $wpdb; $reserved = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}wc_reserved_stock WHERE product_id = %d AND timestamp > %s AND order_id != %d", $product_id, date( 'Y-m-d H:i:s', time() - 900 ), // 15 min 0 ) ); if ( $reserved > 0 ) { wc_add_notice( 'This piece is already in another customer\'s cart. Explore the available works.', 'error' ); return false; } return $passed; }
Solution 02 / 03

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).

Shipping calculation
Shipping summary
DHL Express (2–3 days) € 38,50
GLS Premium Fragile ✓ € 24,90
Pick up at the workshop Free
Double-layer fragile packaging · wooden crate included · €500 insurance
Solution 03 / 03

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.

WooCommerce
PHP 8
WPML
DeepL API
Stripe (SEPA + Card)
Courier APIs (e.g. DHL)
Courier APIs (e.g. GLS)
ACF Pro
Rank Math SEO
Playwright E2E
3 custom plugins
WP Rocket + WebP

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.

↑
Online vs in-store sales
a new sales channel that didn't exist before
✓
First collection sell-out
goal for the first online collection
+3
Foreign markets opened
goal: new countries reached
90%+
Completed commissions
goal for complete requests
€ 680
Average AOV
average value of a unique piece (example)
90+
Lighthouse Score
goal even with heavy images

«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 goal

Learnings: 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.