Portfolio / System Ops / ghostkitchen

Una ghost kitchen,
pronta prima del giorno uno.

Il cliente si è rivolto a noi prima dell'apertura — stava pianificando una ghost kitchen a cinque brand che girava su un'unica linea di preparazione, e cercava un sistema in grado di reggere fin dal lancio. Il brief era chiaro: ogni brand doveva sembrare un negozio a sé per il cliente, ma la cucina, l'admin e la contabilità dovevano funzionare come un'unica operazione. Abbiamo costruito l'intero stack su quella base, pronto il giorno dell'apertura.

ClienteGhostKitchen (pre-launch)
AmbitoCatalogo · Cucina · Admin · Consegna
Brand al lancio2 pronti · 3 pre-cablati
Timeline5 settimane · 2026
Cosa abbiamo costruito

Uno stack ordini multi-tenant travestito da cinque negozi diversi.

Ogni brand ha la sua pagina catalogo, il suo colore, il suo tracker di stato, il suo feed stile Instagram. Per il cliente sembra un negozio specializzato. Dietro le quinte c'è un unico database, un unico pannello cucina e un unico registro finanziario — taggati per brand a ogni riga, così i conti saranno corretti fin dalla prima chiusura mensile.

Modulo 01

Catalogo per brand

Menu a feed Instagram per ogni brand — post a carosello, doppio tap, stepper aggiungi al carrello, campo note. Ogni brand ha il suo URL, la sua palette e il suo tono di voce. Il cliente tocca il link in bio su Instagram o TikTok del brand, atterra sulla sua vetrina e vede un solo negozio, non cinque.

BrandizzatoPWAHook esaurito
Modulo 02

Checkout geo-consapevole

La geolocalizzazione in tempo reale calcola la tariffa di consegna rispetto al pin della cucina prima che il cliente confermi. Paga in contanti, con QRIS o bonifico. L'ordine arriva in cucina nel momento in cui il QRIS viene confermato.

QRISGeofenceZero assistenza
Modulo 03

Pannello cucina

Un solo schermo sulla linea di preparazione. Ogni ordine in coda, con bordo colorato per brand. Le stazioni scorrono da in coda → in cottura → pronto. Contatori in tempo reale in cima. Nessun ticket cartaceo, nessun ordine perso.

Taggato per brand3 fasiLive
Modulo 04

Tracker di stato in tempo reale

Cinque fasi — ricevuto, pagato, in cottura, in consegna, arrivato. Il cliente vede il brand da cui ha ordinato, non "ghost kitchen." Aggiornamento automatico dai tap sul pannello cucina. L'URL di stato rimane nel browser così il cliente può riaprirlo invece di chiamare.

5 fasiLink riapribile
Modulo 05

Admin consapevole del brand

Il pannello del titolare. Filtra per brand, per fase, per data. Vedi gli ordini attivi, il conteggio di oggi, lo storico, la divisione del fatturato brand per brand. Una sola schermata per gestire tutti e cinque i brand — senza cambiare app.

Filtro brandStorico
Modulo 06

Finance con costi condivisi

Tracciamento del fatturato per brand con ripartizione dei costi condivisi (affitto, personale, gas, imballaggi). P&L mensile per brand calcolato in automatico. Tracker del budget marketing così sappiamo il costo per cliente per brand — l'unico numero che decide cosa lanciamo dopo.

Per-brand P&LCAC

Cinque brand, una sola linea di preparazione. Due attivi il giorno dell'apertura; tre pre-cablati nel database.

● La richiesta

"Ogni brand deve sembrare un negozio a sé."

Il cliente voleva lanciare con due brand e avere altri tre pre-cablati nel database per dopo. Ogni brand aveva il suo posizionamento, la sua palette e il suo pubblico — un cliente che ordina una rice bowl coreana non dovrebbe mai sapere che la stessa cucina spedisce anche geprek. La vetrina per il cliente doveva leggere come un brand unico e riconoscibile fin dal primo tap.

Ma costruire cinque volte la stessa cosa non era un'opzione. Serviva un'unica shell che indossasse cinque facce — semplice da lanciare un nuovo brand in un giorno, non in uno sprint.

"Il cliente tocca il link in bio aspettandosi un negozio. Deve vedere un negozio, non un centro commerciale del cibo." — brief del fondatore
9:41●●● ▮ 4G
B
Bap Bowl
Korean rice bowls · Open
Cart · 1
Bowls Sides Drinks
Bulgogi Bowl · telur ½
Rp 38.000
+
Spicy Pork Bap
Rp 42.000
+
● Cosa abbiamo costruito

Un solo framework di catalogo, sei skin brand.

Una singola shell PWA fa il render della vetrina. Uno slug brand nell'URL carica i token di colore, la tipografia, i prodotti e il copy giusti all'avvio — stesso codice, negozio diverso. Il cliente tocca il link in bio Instagram o TikTok del brand, atterra sulla sua vetrina dedicata, e non vede mai gli altri.

Attivare un nuovo brand per il cliente è ora una riga nel database, un colore e una lista prodotti. Geprek 28 e Sego Sambel sono andati live nella settimana 2; Bap Bowl, Nasgor Mas e Tumis Bunda sono pre-cablati, pronti quando il cliente decide di attivarli.

9:41●●● ▮ 4G
G
Geprek 28
Sambal-first · Open
Cart · 2
Geprek Paket Minuman
Geprek Paha · sambal lvl 3
Rp 24.000
+
Paket Geprek + Es Teh
Rp 28.000
+
● La richiesta

"Il giorno uno, il cuoco non può stare a indovinare quale brand è quale."

Il rischio segnalato dai fondatori fin dall'inizio: con un solo team di preparazione che gestisce cinque brand, il contesto del brand svanisce tra l'ordine e il piatto. Un ticket "nasi + sambal + ayam" potrebbe appartenere a Geprek 28, Sego Sambel o Nasgor Mas — e una scatola con il brand sbagliato consegnata a un cliente nella settimana del lancio sarebbe molto pubblica, molto veloce.

La schermata cucina doveva rendere il brand impossibile da ignorare, anche al picco del servizio, anche nel primo turno che il team abbia mai fatto.

Dapur
4 antri 3 masak 2 siap
Geprek 28 #284
2× Geprek paha
1× Es teh
17:44 Masak
Bap Bowl #285
1× Bulgogi bowl
extra telur · pedas 2
17:45 Masak
Sego Sambel #286
1× Sego sambel daging
17:47 Antri
Nasgor Mas #287
3× Nasgor spesial
17:48 Siap
● Cosa abbiamo costruito

Ticket taggati per brand, avanzamento in tre fasi.

Ogni ticket sullo schermo cucina porta una barra sinistra colorata — un colore per brand. Il nome del brand campeggia in alto in mono grassetto. Non esiste scenario in cui il cuoco legge un ticket senza sapere di chi è l'ordine.

Tap per avanzare: antri → masak → siap. Il tracker di stato del cliente si aggiorna all'istante. Il chip nella coda brand dell'admin scende di uno. Un tablet, tre swipe, nessun secondo schermo da tenere sincronizzato — pronto per essere imparato dal personale in un pomeriggio.

9:41●●● ▮ 4G
B
Bap Bowl · #285
Estimasi 18 menit
Live
Pesanan diterima
17:31 · QRIS confirmed
Antrian dapur
17:32 · #285 di queue
Sedang dimasak
17:45 · station 2
+ 6 menit
3
Berangkat antar
menunggu
4
Tiba di tempat
menunggu
● La richiesta

"Dobbiamo sapere quale brand guadagna davvero."

Cucina condivisa, personale condiviso, gas condiviso, fornitore di imballaggi condiviso. Il fatturato per brand è banale — sommi le ricevute. Il profitto per brand è il numero più difficile. I fondatori volevano vederlo dal primo mese, non dopo un anno di supposizioni.

Il punto: la decisione "lanciamo il quarto brand?" doveva basarsi su un numero, non su una sensazione. Il che significava costruire la ripartizione dei costi condivisi nel sistema prima ancora che arrivasse il primo ordine.

"Se non vediamo il margine per brand, stiamo volando alla cieca su quale brand scalare." — brief del fondatore
9:41●●● ▮ 4G
$
Per-brand P&L
Live · auto-allocated
Month
G
Geprek 28
share of orders · 53%
margin tracked
S
Sego Sambel
share of orders · 47%
margin tracked
B
Bap Bowl
templated · awaiting launch
T
Tumis Bunda
templated · awaiting launch
● Cosa abbiamo costruito

brand_id a ogni livello, allocazione integrata nella chiusura mensile.

Ogni ordine, ticket, riga di stato e voce di registro porta il brand_id dal momento in cui viene scritto. I costi condivisi (affitto, gas, personale base) si ripartiscono automaticamente in base alla quota ordini di ogni brand in quel mese. I costi specifici per brand (SKU imballaggi, ingredienti taggati a un brand) colpiscono direttamente il registro corretto.

La spesa marketing è collegata a un brand e a una campagna — il costo per cliente si calcola da solo dal registro ordini. Il pannello admin brand-aware dà al titolare un'unica schermata per leggere tutti e sei.

Admin · Live
17:48 · 11 aktif
Geprek 28
Antri4
Sego Sambel
Antri3
Bap Bowl
Antri2
#284Geprek 28 Masak 17:44
#285Bap Bowl Masak 17:45
#286Sego Sambel Antri 17:47
#287Nasgor Mas Siap 17:48
Come è andato

Cinque settimane, brand prima di tutto.

Non abbiamo iniziato dal database. Abbiamo iniziato con una pagina catalogo simulata per uno dei brand di lancio, su un telefono, e l'abbiamo messa davanti ai fondatori — un cliente ci crederebbe? Una volta che ha funzionato, abbiamo lavorato a ritroso verso la cucina e l'admin.

  1. Settimana 1–2 · Shell brand

    Costruito prima il framework della vetrina cliente — una shell PWA, token di tema per brand, catalogo IG-feed, geo-checkout, tracker di stato. Cablato con le foto prodotto e il copy dei due brand di lancio.

  2. Settimana 3 · Cucina e admin

    Costruito il pannello cucina attorno al flusso di preparazione che i fondatori avevano su carta. Percorso sul pavimento della cucina reale con il cuoco capo e i fondatori, schermata ricostruita due volte. I ticket colorati per brand sono nati da quella passeggiata.

  3. Settimana 4–5 · Finance + consegna

    Ripartizione costi condivisi, P&L per brand, tracking CAC. Dry-run con ordini test seeded end-to-end — flusso cliente, flusso cucina, flusso admin, chiusura finance. Consegnato con i QR catalogs pronti da attivare all'apertura.

Pronto al lancio

Scope del giorno uno, consegnato.

Questo è quello che i fondatori trovano il giorno dell'apertura. I numeri operativi live (CAC, margine per brand, throughput) arrivano una volta che la cucina è in funzione — li pubblicheremo quando ci sono dati reali alle spalle.

2
Brand pronti al giorno uno
Geprek 28 + Sego Sambel · cataloghi, prezzi, tracker di stato tutti attivi
3
Brand pre-cablati
Bap Bowl, Nasgor Mas, Tumis Bunda — si attivano quando i fondatori sono pronti
5 sett
Dal brief alla consegna
vetrina cliente, cucina, admin, finance — un solo ingaggio
1 giorno
Per lanciare un 6° brand
nuova riga, nuovi token di tema, nuova lista prodotti — stesso percorso nel codice
100%
brand_id coverage
ordini, ticket, voci di registro — nulla senza tag nel database
0
Abbonamenti SaaS richiesti
gira sull'infrastruttura che i fondatori già possiedono — nessuna bolletta mensile da scalare
Sotto il cofano

Costruito snello, sull'hardware che avevamo già.

Architettura

Una shell, tema per brand al render

La vetrina cliente è una singola PWA. Uno slug brand nell'URL carica i token del tema (colori, tipografia, copy), la lista prodotti e la destinazione ordine all'avvio. Nuovo brand = nuova riga nella tabella brands, nuova lista prodotti, si spedisce.

Vanilla JS · CSS tokens · service-worker · per-brand manifest
Stack

Frontend statico · backend PHP / MySQL

Ospitato sullo stesso setup XAMPP che il titolare usa già per il resto dell'operazione. Nessun build step, nessun Docker, nessuna reinvenzione. Leggibile dal cugino, di proposito — lo schermo cucina deve continuare a funzionare quando lo sviluppatore dorme.

XAMPP · PHP 8 · MySQL 8 · Swiper · Vanilla PWA
Flusso ordini

Taggato per brand a ogni livello

Ogni ordine, ticket, riga di stato e voce di registro porta il brand_id. La cucina filtra per brand_id, l'admin filtra per brand_id, la finance alloca per brand_id. Non esiste posto nel sistema dove una riga esiste senza sapere a quale brand appartiene.

brand_id everywhere · soft delete · audit log
Interfaccia cliente

Bio-link first, nessuna app da installare

Il cliente arriva dal link in bio Instagram o TikTok del brand, apre una PWA, ordina, paga con QRIS, segue l'URL di stato. Nessun app store, nessun login. Il social del brand fa il lavoro di marketing; la vetrina deve solo convertire.

PWA · IG / TikTok bio link · QRIS · localStorage cart
Interfaccia cucina

Un tablet, tre swipe

Un tablet Android a parete sulla linea di preparazione. I ticket arrivano in streaming, con bordo colorato. Tap per avanzare attraverso tre stati. Contatori live in cima così il cuoco conosce la profondità della coda senza aprire nulla.

Android · fullscreen PWA · long-poll updates
Finance

Ripartizione costi condivisi per quota ordini

Affitto, gas e costo del personale base vengono suddivisi ogni mese in base alla quota ordini di ogni brand sul totale. I costi specifici per brand (SKU imballaggi, ingredienti taggati a un singolo brand) colpiscono direttamente il registro corretto. Formula leggibile dal titolare visibile riga per riga.

monthly close · per-brand P&L · CAC linkage
Successivo → Mikro Farm

Gestisce più brand
da un unico posto?

Chiamata di analisi gratuita. L'abbiamo fatto per noi stessi — sappiamo cosa morde al secondo mese.