<div class="chartlet-wrapper chartlet-responsive chartlet-bp-640"><style>.chartlet-wrapper.chartlet-responsive{display:block;width:100%;container-type:inline-size}.chartlet-variant-mobile{display:none}@container (max-width:639px){.chartlet-bp-640 .chartlet-variant-desktop{display:none}.chartlet-bp-640 .chartlet-variant-mobile{display:block}}</style><style>.chartlet-stage{position:relative;display:inline-block;max-width:100%;vertical-align:top}.chartlet-stage>svg{display:block}.chartlet-hotspot{position:absolute;border-radius:8px;cursor:pointer}.chartlet-focus{margin:0 0 12px 0;font-size:13px}.chartlet-focus summary{cursor:pointer;min-height:24px}.chartlet-focus fieldset{border:none;padding:0;margin:4px 0 0 0}.chartlet-focus label{display:inline-flex;align-items:center;min-height:44px;margin-right:14px;cursor:pointer;white-space:nowrap}.chartlet-focus input{margin-right:4px}.chartlet-focus input:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-c5bbc166624832ea .chartlet-f{opacity:.18}#chartlet-c5bbc166624832ea-hs-0{left:1.562%;top:49.286%;width:6.771%;height:10%}#chartlet-c5bbc166624832ea-hs-1{left:14.583%;top:50%;width:6.771%;height:8.571%}#chartlet-c5bbc166624832ea-hs-2{left:29.167%;top:49.286%;width:7.292%;height:10%}#chartlet-c5bbc166624832ea-hs-3{left:44.271%;top:37.143%;width:8.333%;height:7.143%}#chartlet-c5bbc166624832ea-hs-4{left:44.531%;top:49.286%;width:7.812%;height:10%}#chartlet-c5bbc166624832ea-hs-5{left:60.677%;top:50.714%;width:7.292%;height:7.143%}#chartlet-c5bbc166624832ea-hs-6{left:74.74%;top:50.714%;width:7.812%;height:7.143%}#chartlet-c5bbc166624832ea-hs-7{left:90.104%;top:30%;width:6.771%;height:11.429%}#chartlet-c5bbc166624832ea-hs-8{left:90.104%;top:62.857%;width:6.771%;height:11.429%}#chartlet-c5bbc166624832ea-hs-9{left:90.104%;top:46.429%;width:6.771%;height:11.429%}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea .chartlet-n-9 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-c5bbc166624832ea-m .chartlet-f{opacity:.18}#chartlet-c5bbc166624832ea-m-hs-0{left:44.545%;top:1.818%;width:18.182%;height:5.091%}#chartlet-c5bbc166624832ea-m-hs-1{left:43.636%;top:14.545%;width:20%;height:4.364%}#chartlet-c5bbc166624832ea-m-hs-2{left:40.909%;top:30.182%;width:25.455%;height:3.636%}#chartlet-c5bbc166624832ea-m-hs-3{left:18.182%;top:42.909%;width:18.182%;height:5.091%}#chartlet-c5bbc166624832ea-m-hs-4{left:40%;top:43.636%;width:27.273%;height:3.636%}#chartlet-c5bbc166624832ea-m-hs-5{left:40.909%;top:60.364%;width:25.455%;height:3.636%}#chartlet-c5bbc166624832ea-m-hs-6{left:40%;top:73.091%;width:27.273%;height:3.636%}#chartlet-c5bbc166624832ea-m-hs-7{left:18.182%;top:89.818%;width:18.182%;height:5.818%}#chartlet-c5bbc166624832ea-m-hs-8{left:63.636%;top:89.818%;width:18.182%;height:5.818%}#chartlet-c5bbc166624832ea-m-hs-9{left:41.818%;top:89.818%;width:18.182%;height:5.818%}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-0:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-1:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-2:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-3:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-4:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-5:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-6:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-7:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-8:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea-m .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-c5bbc166624832ea-focus-9:checked) #chartlet-c5bbc166624832ea-m .chartlet-n-9 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" checked> Show all</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-0"> Shopper</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-1"> Shop app</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-2"> API gateway</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-3"> Catalog service</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-4"> Order service</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-5"> Order events</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-6"> Billing worker</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-7"> Catalog</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-8"> Orders</label><label><input type="radio" name="chartlet-c5bbc166624832ea-focus" class="chartlet-focus-node" id="chartlet-c5bbc166624832ea-focus-9"> Invoices</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Order platform and its data stores</figcaption><div class="chartlet-variant-desktop"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1536" height="560" viewBox="0 0 1536 560" id="chartlet-c5bbc166624832ea" role="img" aria-labelledby="chartlet-c5bbc166624832ea-title chartlet-c5bbc166624832ea-description" class="chartlet-root"><title id="chartlet-c5bbc166624832ea-title">Order platform and its data stores</title><desc id="chartlet-c5bbc166624832ea-description">Architecture diagram with 10 components and 9 connections in 2 boundaries. Order platform: API gateway, Catalog service, Order service, Order events, Billing worker, Data tier. Data tier (in Order platform): Catalog, Orders, Invoices. Main path: Shopper → Shop app → API gateway → Order service → Order events → Billing worker. Most connected: API gateway and Order service (3 connections each). Nothing leads into Shopper. Nothing leads out of Catalog, Orders and Invoices. Shopper (person): connects to Shop app (orders). Shop app (frontend): connects to API gateway (via HTTPS). API gateway (service): connects to Catalog service (browse) and Order service (checkout). Catalog service (service): connects to Catalog (via SQL). Order service (service): connects to Orders (via SQL) and Order events (publishes). Order events (queue): connects to Billing worker (delivers). Billing worker (service): connects to Invoices (via SQL). Catalog (database): no outgoing connection. Invoices (database): no outgoing connection. Orders (database): no outgoing connection.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-label,#chartlet-c5bbc166624832ea .chartlet-tick,#chartlet-c5bbc166624832ea .chartlet-value,#chartlet-c5bbc166624832ea .chartlet-value-inverse,#chartlet-c5bbc166624832ea .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea .chartlet-value,#chartlet-c5bbc166624832ea .chartlet-value-inverse{font-weight:600}#chartlet-c5bbc166624832ea .chartlet-value{fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea .chartlet-axis-title{font-weight:600}#chartlet-c5bbc166624832ea .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-c5bbc166624832ea .chartlet-bar,#chartlet-c5bbc166624832ea .chartlet-point{fill:var(--chartlet-accent)}#chartlet-c5bbc166624832ea .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-c5bbc166624832ea .chartlet-background{fill:var(--chartlet-background)}.chartlet-root{--chartlet-node:#eef3fd;--chartlet-lane:#f7f9fc;--chartlet-lane-head:#eef1f6;--chartlet-shadow:rgba(16,24,40,.09);--chartlet-role-blue:#2563eb;--chartlet-role-blue-fill:#eef3fd;--chartlet-role-green:#15803d;--chartlet-role-green-fill:#ecfdf3;--chartlet-role-amber:#b45309;--chartlet-role-amber-fill:#fff7e8;--chartlet-role-teal:#0f766e;--chartlet-role-teal-fill:#e9faf7;--chartlet-role-violet:#6d28d9;--chartlet-role-violet-fill:#f3efff;--chartlet-role-gray:#667085;--chartlet-role-gray-fill:#f7f8fa;--chartlet-role-red:#b42318;--chartlet-role-red-fill:#fef3f2}.chartlet-root.chartlet-theme-dark{--chartlet-node:#1a2436;--chartlet-lane:#121925;--chartlet-lane-head:#18212f;--chartlet-shadow:rgba(0,0,0,.45);--chartlet-role-blue:#7ea6ff;--chartlet-role-blue-fill:#1a2436;--chartlet-role-green:#4ade80;--chartlet-role-green-fill:#132a1d;--chartlet-role-amber:#fbbf24;--chartlet-role-amber-fill:#2b2210;--chartlet-role-teal:#2dd4bf;--chartlet-role-teal-fill:#0f2a27;--chartlet-role-violet:#b69cff;--chartlet-role-violet-fill:#231c38;--chartlet-role-gray:#9aa7bd;--chartlet-role-gray-fill:#161d29;--chartlet-role-red:#f97066;--chartlet-role-red-fill:#2d1616}#chartlet-c5bbc166624832ea .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-c5bbc166624832ea .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-c5bbc166624832ea .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-c5bbc166624832ea .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-c5bbc166624832ea .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-c5bbc166624832ea .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-c5bbc166624832ea .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-c5bbc166624832ea .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-c5bbc166624832ea .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-c5bbc166624832ea .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-c5bbc166624832ea .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-c5bbc166624832ea .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-c5bbc166624832ea .chartlet-flow-start{stroke-width:2}#chartlet-c5bbc166624832ea .chartlet-flow-end{stroke-width:3}#chartlet-c5bbc166624832ea .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-c5bbc166624832ea .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-c5bbc166624832ea .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-c5bbc166624832ea .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-c5bbc166624832ea .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-c5bbc166624832ea .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-c5bbc166624832ea .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-c5bbc166624832ea .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-c5bbc166624832ea .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-c5bbc166624832ea .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-c5bbc166624832ea .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-c5bbc166624832ea .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-c5bbc166624832ea .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="436" y="112" width="1076" height="328" class="chartlet-flow-group"/><text x="444" y="125" text-anchor="start" class="chartlet-flow-group-label">Order platform</text><rect x="1372" y="140" width="128" height="288" class="chartlet-flow-group"/><text x="1380" y="153" text-anchor="start" class="chartlet-flow-group-label">Data tier</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="128,304 216,304" class="chartlet-flow-edge chartlet-flow-main"><title>Shopper → Shop app: orders</title></polyline><polyline points="216,307.5 224,304 216,300.5 216,307.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="328,304 440,304" class="chartlet-flow-edge chartlet-flow-main"><title>Shop app → API gateway: [HTTPS]</title></polyline><polyline points="440,307.5 448,304 440,300.5 440,307.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="560,284 653.76,284 653.76,228 672,228" class="chartlet-flow-edge"><title>API gateway → Catalog service: browse</title></polyline><polyline points="672,231.5 680,228 672,224.5 672,231.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="560,304 676,304" class="chartlet-flow-edge chartlet-flow-main"><title>API gateway → Order service: checkout</title></polyline><polyline points="676,307.5 684,304 676,300.5 676,307.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><polyline points="808,228 1345.56,228 1345.56,200 1376,200" class="chartlet-flow-edge"><title>Catalog service → Catalog: [SQL]</title></polyline><polyline points="1376,203.5 1384,200 1376,196.5 1376,203.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><polyline points="804,324 902.24,324 902.24,344 1345.56,344 1345.56,384 1376,384" class="chartlet-flow-edge"><title>Order service → Orders: [SQL]</title></polyline><polyline points="1376,387.5 1384,384 1376,380.5 1376,387.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="804,304 924,304" class="chartlet-flow-edge chartlet-flow-main"><title>Order service → Order events: publishes</title></polyline><polyline points="924,307.5 932,304 924,300.5 924,307.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><polyline points="1044,304 1140,304" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Billing worker: delivers</title></polyline><polyline points="1140,307.5 1148,304 1140,300.5 1140,307.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><polyline points="1268,304 1345.56,304 1345.56,292 1376,292" class="chartlet-flow-edge"><title>Billing worker → Invoices: [SQL]</title></polyline><polyline points="1376,295.5 1384,292 1376,288.5 1376,295.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="132" y="279" width="50.32" height="21" class="chartlet-diagram-chip"/><text x="137" y="293" text-anchor="start" class="chartlet-diagram-chip-text">orders</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="332" y="279" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="337" y="293" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="564" y="259" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="569" y="273" text-anchor="start" class="chartlet-diagram-chip-text">browse</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="564" y="308" width="63.76" height="21" class="chartlet-diagram-chip"/><text x="569" y="322" text-anchor="start" class="chartlet-diagram-chip-text">checkout</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><rect x="812" y="203" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="817" y="217" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><rect x="808" y="328" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="813" y="342" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="808" y="279" width="64.24" height="21" class="chartlet-diagram-chip"/><text x="813" y="293" text-anchor="start" class="chartlet-diagram-chip-text">publishes</text></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><rect x="1048" y="279" width="57.52" height="21" class="chartlet-diagram-chip"/><text x="1053" y="293" text-anchor="start" class="chartlet-diagram-chip-text">delivers</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><rect x="1272" y="279" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="1277" y="293" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="24" y="278.5" width="104" height="56" class="chartlet-diagram-shadow"/><rect x="24" y="276" width="104" height="56" class="chartlet-flow-node chartlet-role-violet"><title>Shopper</title></rect><circle cx="76" cy="287" r="6" class="chartlet-arch-head"/><text x="76" y="316.5" text-anchor="middle" class="chartlet-flow-label">Shopper</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="224" y="282.5" width="104" height="48" class="chartlet-diagram-shadow"/><rect x="224" y="280" width="104" height="48" class="chartlet-flow-node chartlet-role-blue"><title>Shop app</title></rect><line x1="224" y1="292" x2="328" y2="292" class="chartlet-flow-inner"/><circle cx="232" cy="286" r="1.8" class="chartlet-arch-dot"/><circle cx="238" cy="286" r="1.8" class="chartlet-arch-dot"/><circle cx="244" cy="286" r="1.8" class="chartlet-arch-dot"/><text x="276" y="314.5" text-anchor="middle" class="chartlet-flow-label">Shop app</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="448" y="278.5" width="112" height="56" class="chartlet-diagram-shadow"/><rect x="448" y="276" width="112" height="56" class="chartlet-flow-node chartlet-role-blue"><title>API gateway</title></rect><text x="504" y="308.5" text-anchor="middle" class="chartlet-flow-label">API gateway</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"><rect x="680" y="210.5" width="128" height="40" class="chartlet-diagram-shadow"/><rect x="680" y="208" width="128" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Catalog service</title></rect><text x="744" y="232.5" text-anchor="middle" class="chartlet-flow-label">Catalog service</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"><rect x="684" y="278.5" width="120" height="56" class="chartlet-diagram-shadow"/><rect x="684" y="276" width="120" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Order service</title></rect><text x="744" y="308.5" text-anchor="middle" class="chartlet-flow-label">Order service</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"><rect x="936" y="282.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="936" y="280" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"/><rect x="932" y="286.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="932" y="284" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><text x="988" y="308.5" text-anchor="middle" class="chartlet-flow-label">Order events</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-9"><rect x="1148" y="286.5" width="120" height="40" class="chartlet-diagram-shadow"/><rect x="1148" y="284" width="120" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Billing worker</title></rect><text x="1208" y="308.5" text-anchor="middle" class="chartlet-flow-label">Billing worker</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"><polyline points="1384,175.5 1384,229.5 1385.772,230.794 1390.967,232 1399.23,233.036 1410,233.83 1422.541,234.33 1436,234.5 1449.459,234.33 1462,233.83 1472.77,233.036 1481.033,232 1486.228,230.794 1488,229.5 1488,175.5 1486.228,174.206 1481.033,173 1472.77,171.964 1462,171.17 1449.459,170.67 1436,170.5 1422.541,170.67 1410,171.17 1399.23,171.964 1390.967,173 1385.772,174.206 1384,175.5 1384,175.5" class="chartlet-diagram-shadow"/><polyline points="1384,173 1384,227 1385.772,228.294 1390.967,229.5 1399.23,230.536 1410,231.33 1422.541,231.83 1436,232 1449.459,231.83 1462,231.33 1472.77,230.536 1481.033,229.5 1486.228,228.294 1488,227 1488,173 1486.228,171.706 1481.033,170.5 1472.77,169.464 1462,168.67 1449.459,168.17 1436,168 1422.541,168.17 1410,168.67 1399.23,169.464 1390.967,170.5 1385.772,171.706 1384,173 1384,173" class="chartlet-flow-node chartlet-role-teal"><title>Catalog – Postgres</title></polyline><polyline points="1384,173 1385.772,174.294 1390.967,175.5 1399.23,176.536 1410,177.33 1422.541,177.83 1436,178 1449.459,177.83 1462,177.33 1472.77,176.536 1481.033,175.5 1486.228,174.294 1488,173" class="chartlet-diagram-rim"/><text x="1436" y="200.5" text-anchor="middle" class="chartlet-flow-label">Catalog</text><text x="1436" y="214.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"><polyline points="1384,359.5 1384,413.5 1385.772,414.794 1390.967,416 1399.23,417.036 1410,417.83 1422.541,418.33 1436,418.5 1449.459,418.33 1462,417.83 1472.77,417.036 1481.033,416 1486.228,414.794 1488,413.5 1488,359.5 1486.228,358.206 1481.033,357 1472.77,355.964 1462,355.17 1449.459,354.67 1436,354.5 1422.541,354.67 1410,355.17 1399.23,355.964 1390.967,357 1385.772,358.206 1384,359.5 1384,359.5" class="chartlet-diagram-shadow"/><polyline points="1384,357 1384,411 1385.772,412.294 1390.967,413.5 1399.23,414.536 1410,415.33 1422.541,415.83 1436,416 1449.459,415.83 1462,415.33 1472.77,414.536 1481.033,413.5 1486.228,412.294 1488,411 1488,357 1486.228,355.706 1481.033,354.5 1472.77,353.464 1462,352.67 1449.459,352.17 1436,352 1422.541,352.17 1410,352.67 1399.23,353.464 1390.967,354.5 1385.772,355.706 1384,357 1384,357" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="1384,357 1385.772,358.294 1390.967,359.5 1399.23,360.536 1410,361.33 1422.541,361.83 1436,362 1449.459,361.83 1462,361.33 1472.77,360.536 1481.033,359.5 1486.228,358.294 1488,357" class="chartlet-diagram-rim"/><text x="1436" y="384.5" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="1436" y="398.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"><polyline points="1384,267.5 1384,321.5 1385.772,322.794 1390.967,324 1399.23,325.036 1410,325.83 1422.541,326.33 1436,326.5 1449.459,326.33 1462,325.83 1472.77,325.036 1481.033,324 1486.228,322.794 1488,321.5 1488,267.5 1486.228,266.206 1481.033,265 1472.77,263.964 1462,263.17 1449.459,262.67 1436,262.5 1422.541,262.67 1410,263.17 1399.23,263.964 1390.967,265 1385.772,266.206 1384,267.5 1384,267.5" class="chartlet-diagram-shadow"/><polyline points="1384,265 1384,319 1385.772,320.294 1390.967,321.5 1399.23,322.536 1410,323.33 1422.541,323.83 1436,324 1449.459,323.83 1462,323.33 1472.77,322.536 1481.033,321.5 1486.228,320.294 1488,319 1488,265 1486.228,263.706 1481.033,262.5 1472.77,261.464 1462,260.67 1449.459,260.17 1436,260 1422.541,260.17 1410,260.67 1399.23,261.464 1390.967,262.5 1385.772,263.706 1384,265 1384,265" class="chartlet-flow-node chartlet-role-teal"><title>Invoices – Postgres</title></polyline><polyline points="1384,265 1385.772,266.294 1390.967,267.5 1399.23,268.536 1410,269.33 1422.541,269.83 1436,270 1449.459,269.83 1462,269.33 1472.77,268.536 1481.033,267.5 1486.228,266.294 1488,265" class="chartlet-diagram-rim"/><text x="1436" y="292.5" text-anchor="middle" class="chartlet-flow-label">Invoices</text><text x="1436" y="306.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g></svg><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-0" for="chartlet-c5bbc166624832ea-focus-0"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-1" for="chartlet-c5bbc166624832ea-focus-1"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-2" for="chartlet-c5bbc166624832ea-focus-2"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-3" for="chartlet-c5bbc166624832ea-focus-3"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-4" for="chartlet-c5bbc166624832ea-focus-4"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-5" for="chartlet-c5bbc166624832ea-focus-5"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-6" for="chartlet-c5bbc166624832ea-focus-6"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-7" for="chartlet-c5bbc166624832ea-focus-7"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-8" for="chartlet-c5bbc166624832ea-focus-8"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-hs-9" for="chartlet-c5bbc166624832ea-focus-9"></label></div></div><div class="chartlet-variant-mobile"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="440" height="1100" viewBox="0 0 440 1100" id="chartlet-c5bbc166624832ea-m" role="img" aria-labelledby="chartlet-c5bbc166624832ea-m-title chartlet-c5bbc166624832ea-m-description" class="chartlet-root"><title id="chartlet-c5bbc166624832ea-m-title">Order platform and its data stores</title><desc id="chartlet-c5bbc166624832ea-m-description">Architecture diagram with 10 components and 9 connections in 2 boundaries. Order platform: API gateway, Catalog service, Order service, Order events, Billing worker, Data tier. Data tier (in Order platform): Catalog, Orders, Invoices. Main path: Shopper → Shop app → API gateway → Order service → Order events → Billing worker. Most connected: API gateway and Order service (3 connections each). Nothing leads into Shopper. Nothing leads out of Catalog, Orders and Invoices. Shopper (person): connects to Shop app (orders). Shop app (frontend): connects to API gateway (via HTTPS). API gateway (service): connects to Catalog service (browse) and Order service (checkout). Catalog service (service): connects to Catalog (via SQL). Order service (service): connects to Orders (via SQL) and Order events (publishes). Order events (queue): connects to Billing worker (delivers). Billing worker (service): connects to Invoices (via SQL). Catalog (database): no outgoing connection. Invoices (database): no outgoing connection. Orders (database): no outgoing connection.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-label,#chartlet-c5bbc166624832ea-m .chartlet-tick,#chartlet-c5bbc166624832ea-m .chartlet-value,#chartlet-c5bbc166624832ea-m .chartlet-value-inverse,#chartlet-c5bbc166624832ea-m .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea-m .chartlet-value,#chartlet-c5bbc166624832ea-m .chartlet-value-inverse{font-weight:600}#chartlet-c5bbc166624832ea-m .chartlet-value{fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-axis-title{font-weight:600}#chartlet-c5bbc166624832ea-m .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea-m .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-c5bbc166624832ea-m .chartlet-bar,#chartlet-c5bbc166624832ea-m .chartlet-point{fill:var(--chartlet-accent)}#chartlet-c5bbc166624832ea-m .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-c5bbc166624832ea-m .chartlet-background{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-title-small{font-size:18px}.chartlet-root{--chartlet-node:#eef3fd;--chartlet-lane:#f7f9fc;--chartlet-lane-head:#eef1f6;--chartlet-shadow:rgba(16,24,40,.09);--chartlet-role-blue:#2563eb;--chartlet-role-blue-fill:#eef3fd;--chartlet-role-green:#15803d;--chartlet-role-green-fill:#ecfdf3;--chartlet-role-amber:#b45309;--chartlet-role-amber-fill:#fff7e8;--chartlet-role-teal:#0f766e;--chartlet-role-teal-fill:#e9faf7;--chartlet-role-violet:#6d28d9;--chartlet-role-violet-fill:#f3efff;--chartlet-role-gray:#667085;--chartlet-role-gray-fill:#f7f8fa;--chartlet-role-red:#b42318;--chartlet-role-red-fill:#fef3f2}.chartlet-root.chartlet-theme-dark{--chartlet-node:#1a2436;--chartlet-lane:#121925;--chartlet-lane-head:#18212f;--chartlet-shadow:rgba(0,0,0,.45);--chartlet-role-blue:#7ea6ff;--chartlet-role-blue-fill:#1a2436;--chartlet-role-green:#4ade80;--chartlet-role-green-fill:#132a1d;--chartlet-role-amber:#fbbf24;--chartlet-role-amber-fill:#2b2210;--chartlet-role-teal:#2dd4bf;--chartlet-role-teal-fill:#0f2a27;--chartlet-role-violet:#b69cff;--chartlet-role-violet-fill:#231c38;--chartlet-role-gray:#9aa7bd;--chartlet-role-gray-fill:#161d29;--chartlet-role-red:#f97066;--chartlet-role-red-fill:#2d1616}#chartlet-c5bbc166624832ea-m .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-c5bbc166624832ea-m .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-c5bbc166624832ea-m .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-c5bbc166624832ea-m .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-c5bbc166624832ea-m .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-c5bbc166624832ea-m .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-c5bbc166624832ea-m .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-c5bbc166624832ea-m .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-c5bbc166624832ea-m .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-c5bbc166624832ea-m .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-c5bbc166624832ea-m .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-c5bbc166624832ea-m .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-c5bbc166624832ea-m .chartlet-flow-start{stroke-width:2}#chartlet-c5bbc166624832ea-m .chartlet-flow-end{stroke-width:3}#chartlet-c5bbc166624832ea-m .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-c5bbc166624832ea-m .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-c5bbc166624832ea-m .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-c5bbc166624832ea-m .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea-m .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-c5bbc166624832ea-m .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-c5bbc166624832ea-m .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-c5bbc166624832ea-m .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-c5bbc166624832ea-m .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-c5bbc166624832ea-m .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-c5bbc166624832ea-m .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-c5bbc166624832ea-m .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-c5bbc166624832ea-m .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-c5bbc166624832ea-m .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-c5bbc166624832ea-m .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="56" y="304" width="328" height="772" class="chartlet-flow-group"/><text x="64" y="317" text-anchor="start" class="chartlet-flow-group-label">Order platform</text><rect x="68" y="960" width="304" height="104" class="chartlet-flow-group"/><text x="76" y="973" text-anchor="start" class="chartlet-flow-group-label">Data tier</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="236,76 236,152" class="chartlet-flow-edge chartlet-flow-main"><title>Shopper → Shop app: orders</title></polyline><polyline points="232.5,152 236,160 239.5,152 232.5,152" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="236,208 236,324" class="chartlet-flow-edge chartlet-flow-main"><title>Shop app → API gateway: [HTTPS]</title></polyline><polyline points="232.5,324 236,332 239.5,324 232.5,324" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="212,372 212,436.918 120,436.918 120,464" class="chartlet-flow-edge"><title>API gateway → Catalog service: browse</title></polyline><polyline points="116.5,464 120,472 123.5,464 116.5,464" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="236,372 236,472" class="chartlet-flow-edge chartlet-flow-main"><title>API gateway → Order service: checkout</title></polyline><polyline points="232.5,472 236,480 239.5,472 232.5,472" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><polyline points="120,528 120,980" class="chartlet-flow-edge"><title>Catalog service → Catalog: [SQL]</title></polyline><polyline points="116.5,980 120,988 123.5,980 116.5,980" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><polyline points="260,520 260,627.541 304,627.541 304,768.918 320,768.918 320,980" class="chartlet-flow-edge"><title>Order service → Orders: [SQL]</title></polyline><polyline points="316.5,980 320,988 323.5,980 316.5,980" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="236,520 236,656" class="chartlet-flow-edge chartlet-flow-main"><title>Order service → Order events: publishes</title></polyline><polyline points="232.5,656 236,664 239.5,656 232.5,656" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><polyline points="236,704 236,796" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Billing worker: delivers</title></polyline><polyline points="232.5,796 236,804 239.5,796 232.5,796" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><polyline points="236,844 236,908.918 224,908.918 224,980" class="chartlet-flow-edge"><title>Billing worker → Invoices: [SQL]</title></polyline><polyline points="220.5,980 224,988 227.5,980 220.5,980" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="240" y="81" width="50.32" height="21" class="chartlet-diagram-chip"/><text x="245" y="95" text-anchor="start" class="chartlet-diagram-chip-text">orders</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="240" y="213" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="245" y="227" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="153.6" y="377" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="203" y="391" text-anchor="end" class="chartlet-diagram-chip-text">browse</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="240" y="377" width="63.76" height="21" class="chartlet-diagram-chip"/><text x="245" y="391" text-anchor="start" class="chartlet-diagram-chip-text">checkout</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-7"><rect x="124" y="533" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="129" y="547" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-8"><rect x="264" y="525" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="269" y="539" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="167.76" y="557" width="64.24" height="21" class="chartlet-diagram-chip"/><text x="227" y="571" text-anchor="end" class="chartlet-diagram-chip-text">publishes</text></g><g class="chartlet-f chartlet-f-5 chartlet-f-6"><rect x="240" y="709" width="57.52" height="21" class="chartlet-diagram-chip"/><text x="245" y="723" text-anchor="start" class="chartlet-diagram-chip-text">delivers</text></g><g class="chartlet-f chartlet-f-6 chartlet-f-9"><rect x="240" y="849" width="47.56" height="21" class="chartlet-diagram-chip"/><text x="245" y="863" text-anchor="start" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="196" y="22.5" width="80" height="56" class="chartlet-diagram-shadow"/><rect x="196" y="20" width="80" height="56" class="chartlet-flow-node chartlet-role-violet"><title>Shopper</title></rect><circle cx="236" cy="31" r="6" class="chartlet-arch-head"/><text x="236" y="60.5" text-anchor="middle" class="chartlet-flow-label">Shopper</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="192" y="162.5" width="88" height="48" class="chartlet-diagram-shadow"/><rect x="192" y="160" width="88" height="48" class="chartlet-flow-node chartlet-role-blue"><title>Shop app</title></rect><line x1="192" y1="172" x2="280" y2="172" class="chartlet-flow-inner"/><circle cx="200" cy="166" r="1.8" class="chartlet-arch-dot"/><circle cx="206" cy="166" r="1.8" class="chartlet-arch-dot"/><circle cx="212" cy="166" r="1.8" class="chartlet-arch-dot"/><text x="236" y="194.5" text-anchor="middle" class="chartlet-flow-label">Shop app</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="180" y="334.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="180" y="332" width="112" height="40" class="chartlet-flow-node chartlet-role-blue"><title>API gateway</title></rect><text x="236" y="356.5" text-anchor="middle" class="chartlet-flow-label">API gateway</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-7"><rect x="80" y="474.5" width="80" height="56" class="chartlet-diagram-shadow"/><rect x="80" y="472" width="80" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Catalog service</title></rect><text x="120" y="496.5" text-anchor="middle" class="chartlet-flow-label">Catalog</text><text x="120" y="512.5" text-anchor="middle" class="chartlet-flow-label">service</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5 chartlet-f-8"><rect x="176" y="482.5" width="120" height="40" class="chartlet-diagram-shadow"/><rect x="176" y="480" width="120" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Order service</title></rect><text x="236" y="504.5" text-anchor="middle" class="chartlet-flow-label">Order service</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5 chartlet-f-6"><rect x="184" y="662.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="184" y="660" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"/><rect x="180" y="666.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="180" y="664" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><text x="236" y="688.5" text-anchor="middle" class="chartlet-flow-label">Order events</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-5 chartlet-f-6 chartlet-f-9"><rect x="176" y="806.5" width="120" height="40" class="chartlet-diagram-shadow"/><rect x="176" y="804" width="120" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Billing worker</title></rect><text x="236" y="828.5" text-anchor="middle" class="chartlet-flow-label">Billing worker</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-3 chartlet-f-7"><polyline points="80,995.5 80,1049.5 81.363,1050.794 85.359,1052 91.716,1053.036 100,1053.83 109.647,1054.33 120,1054.5 130.353,1054.33 140,1053.83 148.284,1053.036 154.641,1052 158.637,1050.794 160,1049.5 160,995.5 158.637,994.206 154.641,993 148.284,991.964 140,991.17 130.353,990.67 120,990.5 109.647,990.67 100,991.17 91.716,991.964 85.359,993 81.363,994.206 80,995.5 80,995.5" class="chartlet-diagram-shadow"/><polyline points="80,993 80,1047 81.363,1048.294 85.359,1049.5 91.716,1050.536 100,1051.33 109.647,1051.83 120,1052 130.353,1051.83 140,1051.33 148.284,1050.536 154.641,1049.5 158.637,1048.294 160,1047 160,993 158.637,991.706 154.641,990.5 148.284,989.464 140,988.67 130.353,988.17 120,988 109.647,988.17 100,988.67 91.716,989.464 85.359,990.5 81.363,991.706 80,993 80,993" class="chartlet-flow-node chartlet-role-teal"><title>Catalog – Postgres</title></polyline><polyline points="80,993 81.363,994.294 85.359,995.5 91.716,996.536 100,997.33 109.647,997.83 120,998 130.353,997.83 140,997.33 148.284,996.536 154.641,995.5 158.637,994.294 160,993" class="chartlet-diagram-rim"/><text x="120" y="1020.5" text-anchor="middle" class="chartlet-flow-label">Catalog</text><text x="120" y="1034.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-4 chartlet-f-8"><polyline points="280,995.5 280,1049.5 281.363,1050.794 285.359,1052 291.716,1053.036 300,1053.83 309.647,1054.33 320,1054.5 330.353,1054.33 340,1053.83 348.284,1053.036 354.641,1052 358.637,1050.794 360,1049.5 360,995.5 358.637,994.206 354.641,993 348.284,991.964 340,991.17 330.353,990.67 320,990.5 309.647,990.67 300,991.17 291.716,991.964 285.359,993 281.363,994.206 280,995.5 280,995.5" class="chartlet-diagram-shadow"/><polyline points="280,993 280,1047 281.363,1048.294 285.359,1049.5 291.716,1050.536 300,1051.33 309.647,1051.83 320,1052 330.353,1051.83 340,1051.33 348.284,1050.536 354.641,1049.5 358.637,1048.294 360,1047 360,993 358.637,991.706 354.641,990.5 348.284,989.464 340,988.67 330.353,988.17 320,988 309.647,988.17 300,988.67 291.716,989.464 285.359,990.5 281.363,991.706 280,993 280,993" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="280,993 281.363,994.294 285.359,995.5 291.716,996.536 300,997.33 309.647,997.83 320,998 330.353,997.83 340,997.33 348.284,996.536 354.641,995.5 358.637,994.294 360,993" class="chartlet-diagram-rim"/><text x="320" y="1020.5" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="320" y="1034.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-9 chartlet-f-6 chartlet-f-9"><polyline points="184,995.5 184,1049.5 185.363,1050.794 189.359,1052 195.716,1053.036 204,1053.83 213.647,1054.33 224,1054.5 234.353,1054.33 244,1053.83 252.284,1053.036 258.641,1052 262.637,1050.794 264,1049.5 264,995.5 262.637,994.206 258.641,993 252.284,991.964 244,991.17 234.353,990.67 224,990.5 213.647,990.67 204,991.17 195.716,991.964 189.359,993 185.363,994.206 184,995.5 184,995.5" class="chartlet-diagram-shadow"/><polyline points="184,993 184,1047 185.363,1048.294 189.359,1049.5 195.716,1050.536 204,1051.33 213.647,1051.83 224,1052 234.353,1051.83 244,1051.33 252.284,1050.536 258.641,1049.5 262.637,1048.294 264,1047 264,993 262.637,991.706 258.641,990.5 252.284,989.464 244,988.67 234.353,988.17 224,988 213.647,988.17 204,988.67 195.716,989.464 189.359,990.5 185.363,991.706 184,993 184,993" class="chartlet-flow-node chartlet-role-teal"><title>Invoices – Postgres</title></polyline><polyline points="184,993 185.363,994.294 189.359,995.5 195.716,996.536 204,997.33 213.647,997.83 224,998 234.353,997.83 244,997.33 252.284,996.536 258.641,995.5 262.637,994.294 264,993" class="chartlet-diagram-rim"/><text x="224" y="1020.5" text-anchor="middle" class="chartlet-flow-label">Invoices</text><text x="224" y="1034.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g></svg><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-0" for="chartlet-c5bbc166624832ea-focus-0"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-1" for="chartlet-c5bbc166624832ea-focus-1"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-2" for="chartlet-c5bbc166624832ea-focus-2"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-3" for="chartlet-c5bbc166624832ea-focus-3"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-4" for="chartlet-c5bbc166624832ea-focus-4"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-5" for="chartlet-c5bbc166624832ea-focus-5"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-6" for="chartlet-c5bbc166624832ea-focus-6"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-7" for="chartlet-c5bbc166624832ea-focus-7"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-8" for="chartlet-c5bbc166624832ea-focus-8"></label><label class="chartlet-hotspot" id="chartlet-c5bbc166624832ea-m-hs-9" for="chartlet-c5bbc166624832ea-focus-9"></label></div></div><p class="chartlet-source">Source: Illustrative reference architecture</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Order platform and its data stores</caption><thead><tr><th scope="col">Component</th><th scope="col">Kind</th><th scope="col">Boundary</th><th scope="col">Connects to</th></tr></thead><tbody><tr><th scope="row">Shopper</th><td>person</td><td></td><td>Shop app (orders)</td></tr><tr><th scope="row">Shop app</th><td>frontend</td><td></td><td>API gateway (via HTTPS)</td></tr><tr><th scope="row">API gateway</th><td>service</td><td>Order platform</td><td>Catalog service (browse), Order service (checkout)</td></tr><tr><th scope="row">Catalog service</th><td>service</td><td>Order platform</td><td>Catalog (via SQL)</td></tr><tr><th scope="row">Order service</th><td>service</td><td>Order platform</td><td>Orders (via SQL), Order events (publishes)</td></tr><tr><th scope="row">Order events</th><td>queue</td><td>Order platform</td><td>Billing worker (delivers)</td></tr><tr><th scope="row">Billing worker</th><td>service</td><td>Order platform</td><td>Invoices (via SQL)</td></tr><tr><th scope="row">Catalog</th><td>database</td><td>Order platform › Data tier</td><td></td></tr><tr><th scope="row">Invoices</th><td>database</td><td>Order platform › Data tier</td><td></td></tr><tr><th scope="row">Orders</th><td>database</td><td>Order platform › Data tier</td><td></td></tr></tbody></table></details></figure></div>