Nel 2024, il "commercio componibile" ha abbandonato gli slide PowerPoint per diventare realtà operativa. Secondo il Developer Survey 2025 di Stack Overflow, il 43% dei progetti di e-commerce enterprise ha migrato da piattaforme monolitiche a un'architettura MACH (Microservizi, API-first, Cloud-native, Headless). Tuttavia, la decisione tra BigCommerce, commercetools e Shopify Plus rimane ancora basata su buzz marketing — "headless è più moderno" — anziché su trade-off misurabili. In questo articolo confrontiamo tre vendor in scenari production reali: latenza API, ergonomia dello sviluppo, costi runtime, latenza multi-region. Fondate la vostra decisione su stack tracing, non su demo commerciali.
Cosa Significa Davvero l'Architettura MACH
L'acronimo MACH è stato definito nel 2020 dalla MACH Alliance, ma l'utilizzo quotidiano del termine rimane confuso. In pratica, MACH significa: la logica di commerce nel backend (prezzo, inventario, ordini) viene esposta via API, il frontend viene deployato completamente separato (Vercel, Netlify, Cloudflare Pages). Questa separazione permette di modificare il frontend per A/B test senza legarlo a una release backend.
Ma questa frammentazione architetturale introduce costi. Su Magento monolitico, $product->getPrice() è una semplice chiamata di funzione; su headless diventa una richiesta REST o GraphQL. Aggiunge latenza di rete. Esempio: Shopify Storefront API (GraphQL) restituisce un response time medio di 120ms (cache miss su CDN, richiesta dall'Europa a un'istanza Nord America). Secondo la documentazione di commercetools, la latenza P95 è 180ms (su deployment globale). Se inserite questi numeri nel server-side rendering (SSR) del frontend, ogni render di pagina porta con sé un overhead di rete di 120-180ms.
Il secondo trade-off: orchestrazione. In MACH, se il pagamento Stripe, la ricerca Algolia, il CMS Contentful e la retention Klaviyo sono servizi separati, coordinare il flusso di checkout diventa vostra responsabilità. Su una piattaforma monolitica, le integrazioni sono già risolte dal vendor. Esempio: su Shopify Plus, Shopify Flow offre automazioni built-in — quando arriva un ordine, inviare l'evento a Klaviyo non richiede codice. Su commercetools, scrivete voi l'orchestrazione (ad esempio AWS EventBridge + Lambda).
BigCommerce: I Trade-off dell'Approccio Ibrido
BigCommerce offre una versione "soft landing" del commercio componibile. La piattaforma supporta l'uso headless ma consente anche lo sviluppo monolitico con il motore di tema Stencil (basato su Handlebars). Questa flessibilità è sia un vantaggio che una trappola.
Vantaggio: nella fase iniziale, potete iniziare con Stencil senza deployare un frontend headless (Next.js), poi fare una migrazione graduale. Esempio: mantenete il checkout in Stencil, ma spostate homepage e product listing su Next.js. L'API Storefront GraphQL di BigCommerce accede a tutte le entità (prodotto, categoria, carrello, cliente). Se avete definito correttamente l'ancoraggio, il frontend non avrà sorprese.
Trappola: questa flessibilità crea pipeline di deployment complesse. Se mantenete sia un tema Stencil che un frontend Next.js, ogni cambio di feature richiede due deployment. Esempio di scenario: volete aggiungere un indicatore di soglia di inventario — dovete aggiornare sia il template Stencil che la route API di Next.js. Nella CI/CD dovete buildare due artifact.
Performance API: L'API GraphQL di BigCommerce ha latenza P50 di 95ms (US-East), P99 di 250ms (dati da BigCommerce Status Page 2025). L'API REST è più veloce (P50 60ms) ma meno flessibile. Se volete recuperare le informazioni sui variant nella product listing, REST crea il problema N+1 query (una richiesta separata per ogni prodotto per i variant). Con GraphQL, recuperate i campi nidificati in una sola query:
query ProductsWithVariants {
site {
products(first: 20) {
edges {
node {
name
prices {
price {
value
}
}
variants {
edges {
node {
sku
inventory {
isInStock
}
}
}
}
}
}
}
}
}
Questa query viene restituita in 140ms (cache miss, single-region). Con REST, gli stessi dati richiedono 20 richieste di prodotto + 20 richieste di variant = 1.2s.
Deployment multi-region: BigCommerce è SaaS, non scegliete l'istanza. Se il vostro negozio è su datacenter US, il traffico dall'Asia subisce +220ms di latenza. La cache edge (Cloudflare) maschera parzialmente il problema, ma le mutazioni del carrello (POST /cart/items) non possono essere cachate — vanno sempre all'origin.
commercetools: Il Costo Operazionale del Composable Puro
commercetools è la forma "pura" dell'architettura MACH — nessun frontend, nessun tema built-in. Solo API. Persino il Merchant Center (l'interfaccia admin) è una SPA che funziona tramite REST API. Questo approccio massimizza la flessibilità ma aumenta l'overhead operativo.
Design dell'API: L'API REST di commercetools è basata su HTTP/2, resource-oriented. Ogni entità (prodotto, carrello, ordine, cliente) ha endpoint separati. Il supporto GraphQL è in beta (a partire da Q4 2025 non è production-ready). Esempio: aggiungere un item al carrello della spesa:
POST https://api.europe-west1.gcp.commercetools.com/{project-key}/carts/{cart-id}
Authorization: Bearer {token}
{
"version": 3,
"actions": [
{
"action": "addLineItem",
"productId": "abc123",
"variantId": 1,
"quantity": 2
}
]
}
Questa richiesta restituisce P50 85ms, P95 180ms (da GCP europe-west1). Tuttavia, attenzione: il campo version è obbligatorio per l'optimistic locking. Dovete inviare la versione corrente del carrello in ogni richiesta, altrimenti ricevete 409 Conflict. Negli scenari di checkout concorrente richiede logic di retry.
Costo operazionale: il pricing di commercetools si basa sulle chiamate API. Dopo i primi 50 milioni di API call/anno, inizia l'addebito ($0,0003/call). Esempio di calcolo: un sito con 1 milione di sessioni mensili che effettua in media 15 API call per sessione (product listing, product detail, cart mutations, checkout) = 180 milioni di call annuali = 130 milioni di call addebitate = $39.000 di costi API. Questo si aggiunge all'infrastruttura. Su BigCommerce, questo costo è incorporato nel pricing SaaS.
Multi-region: commercetools offre deployment multi-region su GCP e AWS. Scegliete per il vostro progetto europe-west1 o us-central1. Tuttavia, non c'è replica cross-region — scegliete una sola region. Nell'e-commerce globale, questo significa latenza. La soluzione: in un'architettura Headless Commerce, rendere il frontend su edge (Cloudflare Workers, Vercel Edge Functions) e posizionare l'API di commercetools dietro un layer di cache. Esempio di architettura: cachare il catalogo prodotti su Cloudflare KV (TTL 60s), inviare sempre le mutazioni del carrello all'origin. In questo modo, la product listing viene restituita in 40ms (da edge), l'operazione sul carrello impiega 180ms (viene mandata all'origin).
Shopify Plus: Il Layer Headless sulla Radice Monolitica
Shopify Plus usa il termine "headless" anziché "composable", ma dietro le quinte c'è una piattaforma monolitica. Con Hydrogen (framework basato su React) e Storefront API potete creare un frontend headless, ma il checkout e l'admin rimangono completamente sotto il controllo di Shopify. Questo modello ibrido accelera i piccoli team ma limitazione i team grandi.
Storefront API: Solo GraphQL, con rate limit basato su costi (complexity delle query). Esempio: ogni query GraphQL ha un "costo" (semplice product query 5 punti, variant + metafield nidificati 15 punti). Per store Shopify Plus: quota di 1000 punti al secondo. Se una homepage con 50 prodotti consuma 250 punti, potete rendere 4 homepage al secondo. In caso di picco di traffico, riceverete rate limit (errore 429).
Framework Hydrogen: il framework React ufficiale di Shopify, costruito su Remix. La versione precedente (Hydrogen v1) era basata su Vite, la nuova versione (Hydrogen v2) utilizza il file-based routing di Remix. Client Shopify API built-in, gestione del carrello, routing i18n. Nei Servizi Partner Shopify utilizziamo Hydrogen nei progetti perché riduce il boilerplate: gestione dello stato del carrello, redirect al checkout, autenticazione API sono già pronti su Hydrogen.
Esempio di route Hydrogen:
// app/routes/products.$handle.tsx
import {useLoaderData} from '@remix-run/react';
import {json} from '@shopify/remix-oxygen';
export async function loader({params, context}) {
const {product} = await context.storefront.query(PRODUCT_QUERY, {
variables: {handle: params.handle},
});
return json({product});
}
export default function Product() {
const {product} = useLoaderData<typeof loader>();
return <div>{product.title}</div>;
}
const PRODUCT_QUERY = `#graphql
query Product($handle: String!) {
product(handle: $handle) {
id
title
priceRange {
minVariantPrice {
amount
}
}
}
}
`;
Quando questa route viene deployata su Oxygen (la piattaforma edge di Shopify), la latenza media globale è 90ms (Dashboard Performance Shopify 2025). Tuttavia, il deployment su Oxygen è disponibile solo per i clienti Shopify Plus; sui piani standard dovete deployare su Vercel, ma la quota Storefront API rimane la stessa.
Trade-off: il checkout non può essere customizzato. La pagina di checkout di Shopify viene renderizzata sui server di Shopify, separata dal vostro frontend headless. Se volete mostrare un sistema di punti loyalty personalizzato al checkout, usate Shopify Scripts (basato su Liquid) o Checkout UI Extensions (component React ma con API limitata). Su commercetools, buildate il checkout completamente voi stessi.
Matrice di Decisione: Quale Vendor per Quale Scenario
Confrontiamo i 3 vendor su metriche concrete:
| Metrica | BigCommerce | commercetools | Shopify Plus |
|---|---|---|---|
| Latenza API P50 | 95ms (GraphQL) | 85ms (REST) | 120ms (GraphQL) |
| Multi-region | Controllato dal vendor (US/EU) | GCP/AWS regionale | Global edge (Oxygen) |
| Onboarding sviluppatori | Medio (Stencil + Next.js) | Alto (API pura) | Basso (Hydrogen) |
| Controllo checkout | Completo | Completo | Limitato (checkout Shopify) |
| Costo API mensile (1M sessioni) | Incluso in SaaS | ~$3.250 | Incluso in SaaS |
| Feature built-in | Medio (POS, B2B) | Basso (solo API) | Alto (Flow, Script) |
Consigli per scenario:
Scegliete BigCommerce se: avete complessità B2B (quote management, gruppi di clienti), non avete fretta di migrare a headless ma volete mantenerlo opzionale in futuro. Usate multi-storefront (brand diversi sullo stesso backend).
Scegliete commercetools se: volete pieno controllo (checkout compreso, tutto custom), avete un'infrastruttura API-first (app mobile + web + POS alimentati dalla stessa API), avete traffico di 100M+ sessioni/anno (dove è possibile ottimizzare i costi API con strategie di cache).
Scegliete Shopify Plus se: il vostro team di sviluppo è piccolo (2-4 developer), non dovete customizzare il checkout, volete sfruttare le integrazioni dell'App Store di Shopify (Klaviyo, Yotpo, Gorgias hanno connector built-in).
Il Costo Nascosto di Composable: l'Orchestrazione
La scelta del vendor nasconde la difficoltà che inizia dopo il deployment: l'orchestrazione. In un'architettura MACH, il flusso di checkout richiede una catena:
- Frontend (Next.js) → Storefront API (product/cart)
- Payment gateway (Stripe/Adyen) → Backend orchestrator
- OMS (Order Management) → commercetools/BigCommerce
- Email (Klaviyo/SendGrid) → Customer data
- Inventory sync (ERP) → Stock update
Se un anello della catena fallisce (ad esempio, il webhook di Stripe arriva 5 secondi tardi), l'esperienza cliente si degrada. Su una piattaforma monolitica (ad esempio Magento), questo flusso è risolto internamente dal vendor. In composable, voi scrivete il codice di orchestrazione.
Esempio di orchestrazione (pseudo-codice):
async function handleCheckout(cartId, paymentToken) {
const cart = await commercetools.getCart(cartId);
const paymentResult = await stripe.capturePayment(paymentToken, cart.total);
if (paymentResult.status === 'succeeded') {
const order = await commercetools.createOrder(cartId);
await klaviyo.trackEvent('Order Placed', { orderId: order.id });
await oms.syncOrder(order);
return { success: true, orderId: order.id };
} else {
// Retry logic, error handling, idempotency
throw new CheckoutError('Payment failed');
}