nordisk/monetize
docs/buyflows-v2.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1700 990" width="1700" height="990" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<defs>
<linearGradient id="board" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#0b1c2e"/><stop offset="1" stop-color="#06111d"/></linearGradient>
<linearGradient id="chip" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#14384f"/><stop offset="1" stop-color="#0e2a3e"/></linearGradient>
<linearGradient id="rail" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#173d57"/><stop offset="1" stop-color="#0c2438"/></linearGradient>
<linearGradient id="slot" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/></linearGradient>
<marker id="head" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#a9c3d4"/></marker>
<marker id="headw" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#dff1ff"/></marker>
</defs>
<rect x="0" y="0" width="1700" height="990" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1"><line x1="0" y1="84" x2="1700" y2="84"/><line x1="0" y1="954" x2="1700" y2="954"/></g>
<g fill="#16415c"><circle cx="40" cy="20" r="2"/><circle cx="1660" cy="20" r="2"/><circle cx="40" cy="972" r="2"/><circle cx="1660" cy="972" r="2"/></g>
<text x="40" y="44" fill="#eaf6ff" font-size="22" font-weight="700">The buy flows</text>
<text x="250" y="44" fill="#9fc9e0" font-size="15">every buy method, the hops it takes and its step ids (INTEGRATION-v2.md §8)</text>
<rect x="1010" y="33" width="24" height="14" rx="3" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<text x="1042" y="44" fill="#cfe6f5" font-size="12">the product (its site, its boxes)</text>
<rect x="1010" y="59" width="24" height="14" rx="3" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<text x="1042" y="70" fill="#cfe6f5" font-size="12">the ONE box (open monetize)</text>
<rect x="1330" y="33" width="24" height="14" rx="3" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<text x="1362" y="44" fill="#cfe6f5" font-size="12">outside: the buyer, Stripe, the cloud</text>
<rect x="283" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#9fb4c4" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="379" y="120" fill="#9fb4c4" font-size="12.5" font-weight="700" text-anchor="middle">Browser</text>
<text x="379" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">buy.js · welcome.js</text>
<rect x="482" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#7CFFB2" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="578" y="120" fill="#7CFFB2" font-size="12.5" font-weight="700" text-anchor="middle">Product site + relay</text>
<text x="578" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">monetize-site-buy routes</text>
<rect x="680" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#6fd3f5" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="776" y="120" fill="#6fd3f5" font-size="12.5" font-weight="700" text-anchor="middle">ONE box</text>
<text x="776" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">gRPC door · state</text>
<rect x="879" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#9fb4c4" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="975" y="120" fill="#9fb4c4" font-size="12.5" font-weight="700" text-anchor="middle">Stripe checkout</text>
<text x="975" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">via stripe.wasm</text>
<rect x="1077" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#9fb4c4" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="1174" y="120" fill="#9fb4c4" font-size="12.5" font-weight="700" text-anchor="middle">Cloud + installer</text>
<text x="1174" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">via upcloud.wasm</text>
<rect x="1276" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#7CFFB2" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="1372" y="120" fill="#7CFFB2" font-size="12.5" font-weight="700" text-anchor="middle">Estate boxes</text>
<text x="1372" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">Fleet: report + pull</text>
<rect x="1474" y="100" width="193" height="740" rx="8" fill="url(#rail)" fill-opacity="0.35" stroke="#6fd3f5" stroke-opacity="0.45" stroke-width="1.2"/>
<text x="1571" y="120" fill="#6fd3f5" font-size="12.5" font-weight="700" text-anchor="middle">Mail</text>
<text x="1571" y="137" fill="#86b3cc" font-size="10" text-anchor="middle">sent by the ONE box</text>
<path d="M90 179.0 L1571 179.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="156" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="183" fill="#eaf6ff" font-size="17" font-weight="700">B1</text>
<text x="96" y="175" fill="#eaf6ff" font-size="12" font-weight="700">Free account</text>
<text x="96" y="191" fill="#86b3cc" font-size="10">card check, nothing charged</text>
<rect x="288" y="156" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="164" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="174" fill="#eaf6ff" font-size="10.5" font-weight="700">B1.1–B1.4</text>
<text x="300" y="189" fill="#9fc9e0" font-size="10">offer · ladder · name · start</text>
<circle cx="288" cy="179.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="156" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="164" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="174" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/signup/*</text>
<text x="499" y="189" fill="#9fc9e0" font-size="10">B1.6 welcome polls /status</text>
<circle cx="487" cy="179.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="156" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="164" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="174" fill="#eaf6ff" font-size="10.5" font-weight="700">Signup.Start: card check</text>
<text x="697" y="189" fill="#9fc9e0" font-size="10">B1.6 Signup.Status → Created</text>
<circle cx="685" cy="179.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="156" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="164" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="174" fill="#eaf6ff" font-size="10.5" font-weight="700">B1.5 card check (setup)</text>
<text x="896" y="189" fill="#9fc9e0" font-size="10">nothing is charged</text>
<circle cx="884" cy="179.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="156" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="164" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="174" fill="#eaf6ff" font-size="10.5" font-weight="700">B1.7 account.sign_in</text>
<text x="1491" y="189" fill="#9fc9e0" font-size="10">B1.9 sign-in again</text>
<circle cx="1479" cy="179.0" r="2.6" fill="#dff1ff"/>
<path d="M90 241.0 L1571 241.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="218" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="245" fill="#eaf6ff" font-size="17" font-weight="700">B2</text>
<text x="96" y="237" fill="#eaf6ff" font-size="12" font-weight="700">Paid account</text>
<text x="96" y="253" fill="#86b3cc" font-size="10">pay once, the account follows</text>
<rect x="288" y="218" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="226" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="236" fill="#eaf6ff" font-size="10.5" font-weight="700">B2.1–B2.3 start {plan}</text>
<text x="300" y="251" fill="#9fc9e0" font-size="10">B2.7 welcome polls</text>
<circle cx="288" cy="241.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="218" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="226" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="236" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/signup/start</text>
<text x="499" y="251" fill="#9fc9e0" font-size="10">B2.8 /auth/signup/rename</text>
<circle cx="487" cy="241.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="218" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="226" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="236" fill="#eaf6ff" font-size="10.5" font-weight="700">Signup.Start: checkout</text>
<text x="697" y="251" fill="#9fc9e0" font-size="10">B2.5 callback · B2.6 settle</text>
<circle cx="685" cy="241.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="218" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="226" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="236" fill="#eaf6ff" font-size="10.5" font-weight="700">B2.4 pay</text>
<text x="896" y="251" fill="#9fc9e0" font-size="10">back to /welcome?session=</text>
<circle cx="884" cy="241.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="218" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="226" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="236" fill="#eaf6ff" font-size="10.5" font-weight="700">B2.6p add_principal</text>
<text x="1293" y="251" fill="#9fc9e0" font-size="10">pulled by the main</text>
<circle cx="1281" cy="241.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="218" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="226" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="236" fill="#eaf6ff" font-size="10.5" font-weight="700">account.sign_in</text>
<text x="1491" y="251" fill="#9fc9e0" font-size="10">the sign-in link</text>
<circle cx="1479" cy="241.0" r="2.6" fill="#dff1ff"/>
<path d="M90 303.0 L1571 303.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="280" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="307" fill="#eaf6ff" font-size="17" font-weight="700">B3</text>
<text x="96" y="299" fill="#eaf6ff" font-size="12" font-weight="700">Instance, as a visitor</text>
<text x="96" y="315" fill="#86b3cc" font-size="10">new_account = true</text>
<rect x="288" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="288" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">B3.1 ladder · B3.2 start</text>
<text x="300" y="313" fill="#9fc9e0" font-size="10">B3.12 watch /status, 3 s</text>
<circle cx="288" cy="303.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="288" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/private/start</text>
<text x="499" y="313" fill="#9fc9e0" font-size="10">no ticket: a visitor</text>
<circle cx="487" cy="303.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="288" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">EstateOrder.Start: ordered</text>
<text x="697" y="313" fill="#9fc9e0" font-size="10">B3.4 held · B3.5 account</text>
<circle cx="685" cy="303.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="288" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">B3.3 pay estate/<co></text>
<text x="896" y="313" fill="#9fc9e0" font-size="10">captured at B3.4</text>
<circle cx="884" cy="303.0" r="2.6" fill="#dff1ff"/>
<rect x="1082" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="1083" y="288" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="1094" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">B3.7 lay · B3.8 install</text>
<text x="1094" y="313" fill="#9fc9e0" font-size="10">laying → installing</text>
<circle cx="1082" cy="303.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="288" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">B3.9 call home, sale check</text>
<text x="1293" y="313" fill="#9fc9e0" font-size="10">B3.10 paired → captured</text>
<circle cx="1281" cy="303.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="280" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="288" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="298" fill="#eaf6ff" font-size="10.5" font-weight="700">B3.11 estate.ready</text>
<text x="1491" y="313" fill="#9fc9e0" font-size="10">+ account.sign_in</text>
<circle cx="1479" cy="303.0" r="2.6" fill="#dff1ff"/>
<path d="M90 365.0 L1571 365.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="342" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="369" fill="#eaf6ff" font-size="17" font-weight="700">B4</text>
<text x="96" y="361" fill="#eaf6ff" font-size="12" font-weight="700">Instance, signed in</text>
<text x="96" y="377" fill="#86b3cc" font-size="10">the actor ticket</text>
<rect x="288" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="350" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">B4.1 who + ticket</text>
<text x="300" y="375" fill="#9fc9e0" font-size="10">the buyer is signed in</text>
<circle cx="288" cy="365.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="350" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/private/start</text>
<text x="499" y="375" fill="#9fc9e0" font-size="10">ticket for the estate</text>
<circle cx="487" cy="365.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="350" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">EstateOrder.Start: ordered</text>
<text x="697" y="375" fill="#9fc9e0" font-size="10">no account is made</text>
<circle cx="685" cy="365.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="350" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">as B3.3</text>
<circle cx="884" cy="365.0" r="2.6" fill="#dff1ff"/>
<rect x="1082" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="1083" y="350" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="1094" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">as B3.7–B3.8</text>
<circle cx="1082" cy="365.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="350" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">as B3.9–B3.10</text>
<circle cx="1281" cy="365.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="342" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="350" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="360" fill="#eaf6ff" font-size="10.5" font-weight="700">estate.ready</text>
<circle cx="1479" cy="365.0" r="2.6" fill="#dff1ff"/>
<path d="M90 427.0 L1372 427.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="404" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="431" fill="#eaf6ff" font-size="17" font-weight="700">B5</text>
<text x="96" y="423" fill="#eaf6ff" font-size="12" font-weight="700">Grow the account</text>
<text x="96" y="439" fill="#86b3cc" font-size="10">a bundle raises the caps</text>
<rect x="288" y="404" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="412" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="422" fill="#eaf6ff" font-size="10.5" font-weight="700">B5.1 bundles · B5.2 buy</text>
<text x="300" y="437" fill="#9fc9e0" font-size="10">B5.5 the site polls status</text>
<circle cx="288" cy="427.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="404" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="412" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="422" fill="#eaf6ff" font-size="10.5" font-weight="700">/api/account/subscription/*</text>
<text x="499" y="437" fill="#9fc9e0" font-size="10">B5.3 the site's /paid/<ref></text>
<circle cx="487" cy="427.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="404" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="412" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="422" fill="#eaf6ff" font-size="10.5" font-weight="700">Purchase.Bundles · Start</text>
<text x="697" y="437" fill="#9fc9e0" font-size="10">Reserved → Captured</text>
<circle cx="685" cy="427.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="404" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="412" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="422" fill="#eaf6ff" font-size="10.5" font-weight="700">B5.3 pay</text>
<text x="896" y="437" fill="#9fc9e0" font-size="10">B5.4 callback</text>
<circle cx="884" cy="427.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="404" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="412" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="422" fill="#eaf6ff" font-size="10.5" font-weight="700">B5.6 entitlement</text>
<text x="1293" y="437" fill="#9fc9e0" font-size="10">grow_room past the room</text>
<circle cx="1281" cy="427.0" r="2.6" fill="#dff1ff"/>
<path d="M90 489.0 L1571 489.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="466" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="493" fill="#eaf6ff" font-size="17" font-weight="700">B6</text>
<text x="96" y="485" fill="#eaf6ff" font-size="12" font-weight="700">Grow an instance</text>
<text x="96" y="501" fill="#86b3cc" font-size="10">one step of the ladder</text>
<rect x="288" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="474" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">B6.1 ladder · B6.2 change</text>
<text x="300" y="499" fill="#9fc9e0" font-size="10">B6.9 watch /status</text>
<circle cx="288" cy="489.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="474" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/private/change</text>
<text x="499" y="499" fill="#9fc9e0" font-size="10">B6.3 /paid/estate/<co>/…</text>
<circle cx="487" cy="489.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="474" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">EstateOrder.ChangePlan</text>
<text x="697" y="499" fill="#9fc9e0" font-size="10">queued → resizing → done</text>
<circle cx="685" cy="489.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="474" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">B6.3 pay the difference</text>
<text x="896" y="499" fill="#9fc9e0" font-size="10">0 = no page, queued</text>
<circle cx="884" cy="489.0" r="2.6" fill="#dff1ff"/>
<rect x="1082" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="1083" y="474" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="1094" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">B6.6 resize, capture</text>
<text x="1094" y="499" fill="#9fc9e0" font-size="10">data never shrinks</text>
<circle cx="1082" cy="489.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="474" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">B6.7 grow_go_ahead</text>
<text x="1293" y="499" fill="#9fc9e0" font-size="10">Fleet.Ask grow_set</text>
<circle cx="1281" cy="489.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="466" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="474" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="484" fill="#eaf6ff" font-size="10.5" font-weight="700">B6.8 estate.changed</text>
<text x="1491" y="499" fill="#9fc9e0" font-size="10">or estate.change_failed</text>
<circle cx="1479" cy="489.0" r="2.6" fill="#dff1ff"/>
<path d="M90 551.0 L1372 551.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="528" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="555" fill="#eaf6ff" font-size="17" font-weight="700">B6b</text>
<text x="96" y="547" fill="#eaf6ff" font-size="12" font-weight="700">Sign-in link again</text>
<text x="96" y="563" fill="#86b3cc" font-size="10">for an instance</text>
<rect x="487" y="528" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="536" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="546" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/private/sign-in-again</text>
<circle cx="487" cy="551.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="528" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="536" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="546" fill="#eaf6ff" font-size="10.5" font-weight="700">SendSignInAgain</text>
<text x="697" y="561" fill="#9fc9e0" font-size="10">EstateOrder · 409 if too soon</text>
<circle cx="685" cy="551.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="528" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="536" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="546" fill="#eaf6ff" font-size="10.5" font-weight="700">sign_in_again (pulled)</text>
<text x="1293" y="561" fill="#9fc9e0" font-size="10">the main mails the link</text>
<circle cx="1281" cy="551.0" r="2.6" fill="#dff1ff"/>
<path d="M90 613.0 L1571 613.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="590" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="617" fill="#eaf6ff" font-size="17" font-weight="700">B7</text>
<text x="96" y="609" fill="#eaf6ff" font-size="12" font-weight="700">Renew</text>
<text x="96" y="625" fill="#86b3cc" font-size="10">a: instance · b: account</text>
<rect x="288" y="590" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="598" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="608" fill="#eaf6ff" font-size="10.5" font-weight="700">B7a.1 Renew <co></text>
<text x="300" y="623" fill="#9fc9e0" font-size="10">B7b.2 renew the account</text>
<circle cx="288" cy="613.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="590" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="598" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="608" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/private/renew</text>
<text x="499" y="623" fill="#9fc9e0" font-size="10">/api/…/subscription/renew</text>
<circle cx="487" cy="613.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="590" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="598" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="608" fill="#eaf6ff" font-size="10.5" font-weight="700">EstateOrder.Renew</text>
<text x="697" y="623" fill="#9fc9e0" font-size="10">Purchase.Start{renew}</text>
<circle cx="685" cy="613.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="590" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="598" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="608" fill="#eaf6ff" font-size="10.5" font-weight="700">pay renewal-N</text>
<text x="896" y="623" fill="#9fc9e0" font-size="10">B7a.3 captured</text>
<circle cx="884" cy="613.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="590" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="598" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="608" fill="#eaf6ff" font-size="10.5" font-weight="700">a re-signed go-ahead</text>
<text x="1293" y="623" fill="#9fc9e0" font-size="10">entitlement (B7b)</text>
<circle cx="1281" cy="613.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="590" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="598" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="608" fill="#eaf6ff" font-size="10.5" font-weight="700">B7a.0 renewal_reminder</text>
<text x="1491" y="623" fill="#9fc9e0" font-size="10">estate.renewed</text>
<circle cx="1479" cy="613.0" r="2.6" fill="#dff1ff"/>
<path d="M90 675.0 L1571 675.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="652" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="679" fill="#eaf6ff" font-size="17" font-weight="700">B8</text>
<text x="96" y="671" fill="#eaf6ff" font-size="12" font-weight="700">Cancel</text>
<text x="96" y="687" fill="#86b3cc" font-size="10">a: account order · b: instance</text>
<rect x="288" y="652" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="660" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="670" fill="#eaf6ff" font-size="10.5" font-weight="700">B8a cancel order</text>
<text x="300" y="685" fill="#9fc9e0" font-size="10">B8b stop renewing</text>
<circle cx="288" cy="675.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="652" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="660" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="670" fill="#eaf6ff" font-size="10.5" font-weight="700">/api/…/subscription/cancel</text>
<text x="499" y="685" fill="#9fc9e0" font-size="10">/auth/private/cancel</text>
<circle cx="487" cy="675.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="652" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="660" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="670" fill="#eaf6ff" font-size="10.5" font-weight="700">Purchase.Cancel</text>
<text x="697" y="685" fill="#9fc9e0" font-size="10">409 if paid · EstateOrder.Cancel</text>
<circle cx="685" cy="675.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="652" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="660" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="670" fill="#eaf6ff" font-size="10.5" font-weight="700">B8a.1 hold released</text>
<circle cx="884" cy="675.0" r="2.6" fill="#dff1ff"/>
<rect x="1082" y="652" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="1083" y="660" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="1094" y="670" fill="#eaf6ff" font-size="10.5" font-weight="700">B8b.2 stopped at the end</text>
<text x="1094" y="685" fill="#9fc9e0" font-size="10">of the paid period</text>
<circle cx="1082" cy="675.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="652" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="660" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="670" fill="#eaf6ff" font-size="10.5" font-weight="700">estate.cancelled</text>
<text x="1491" y="685" fill="#9fc9e0" font-size="10">estate.stopped</text>
<circle cx="1479" cy="675.0" r="2.6" fill="#dff1ff"/>
<path d="M90 737.0 L1372 737.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="714" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="741" fill="#eaf6ff" font-size="17" font-weight="700">B9</text>
<text x="96" y="733" fill="#eaf6ff" font-size="12" font-weight="700">Terminate</text>
<text x="96" y="749" fill="#86b3cc" font-size="10">no backup</text>
<rect x="288" y="714" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="722" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="732" fill="#eaf6ff" font-size="10.5" font-weight="700">B9.1 type the name</text>
<text x="300" y="747" fill="#9fc9e0" font-size="10">a fresh key touch</text>
<circle cx="288" cy="737.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="714" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="722" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="732" fill="#eaf6ff" font-size="10.5" font-weight="700">/auth/private/terminate</text>
<text x="499" y="747" fill="#9fc9e0" font-size="10">backup: skip</text>
<circle cx="487" cy="737.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="714" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="722" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="732" fill="#eaf6ff" font-size="10.5" font-weight="700">EstateOrder.Terminate</text>
<text x="697" y="747" fill="#9fc9e0" font-size="10">terminating → terminated</text>
<circle cx="685" cy="737.0" r="2.6" fill="#dff1ff"/>
<rect x="1082" y="714" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="1083" y="722" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="1094" y="732" fill="#eaf6ff" font-size="10.5" font-weight="700">B9.3 give everything back</text>
<text x="1094" y="747" fill="#9fc9e0" font-size="10">machines, disks, DNS</text>
<circle cx="1082" cy="737.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="714" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="722" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="732" fill="#eaf6ff" font-size="10.5" font-weight="700">forgotten by Fleet</text>
<text x="1293" y="747" fill="#9fc9e0" font-size="10">no backup is taken</text>
<circle cx="1281" cy="737.0" r="2.6" fill="#dff1ff"/>
<path d="M90 799.0 L1571 799.0" stroke="#a9c3d4" stroke-width="1.6" fill="none"/>
<rect x="30" y="776" width="238" height="46" rx="8" fill="url(#chip)" stroke="#5aa6cf" stroke-opacity="0.7" stroke-width="1.4"/>
<text x="42" y="803" fill="#eaf6ff" font-size="17" font-weight="700">B10</text>
<text x="96" y="795" fill="#eaf6ff" font-size="12" font-weight="700">Test orders</text>
<text x="96" y="811" fill="#86b3cc" font-size="10">the operator's, test card</text>
<rect x="288" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="289" y="784" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="300" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">operator console · CLI</text>
<text x="300" y="809" fill="#9fc9e0" font-size="10">B10.3 operator's own buy</text>
<circle cx="288" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="487" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="488" y="784" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="499" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">/api/test-purchase/start</text>
<text x="499" y="809" fill="#9fc9e0" font-size="10">/site/test-order (admin)</text>
<circle cx="487" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="685" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="686" y="784" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="697" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">TestPurchase.Start</text>
<text x="697" y="809" fill="#9fc9e0" font-size="10">OrderSite{test_order}</text>
<circle cx="685" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="884" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="885" y="784" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="896" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">the vendor's TEST card</text>
<text x="896" y="809" fill="#9fc9e0" font-size="10">nobody pays at a page</text>
<circle cx="884" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="1082" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#9fb4c4" stroke-width="1.8"/>
<rect x="1083" y="784" width="4" height="30" rx="2" fill="#9fb4c4" fill-opacity="0.85"/>
<text x="1094" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">as B3.7–B3.8</text>
<circle cx="1082" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="1281" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#7CFFB2" stroke-width="1.8"/>
<rect x="1282" y="784" width="4" height="30" rx="2" fill="#7CFFB2" fill-opacity="0.85"/>
<text x="1293" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">as B3.9–B3.10</text>
<circle cx="1281" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="1479" y="776" width="183" height="46" rx="7" fill="url(#chip)" stroke="#6fd3f5" stroke-width="1.8"/>
<rect x="1480" y="784" width="4" height="30" rx="2" fill="#6fd3f5" fill-opacity="0.85"/>
<text x="1491" y="794" fill="#eaf6ff" font-size="10.5" font-weight="700">"The site is ready"</text>
<text x="1491" y="809" fill="#9fc9e0" font-size="10">or estate.ready</text>
<circle cx="1479" cy="799.0" r="2.6" fill="#dff1ff"/>
<rect x="30" y="878" width="1640" height="72" rx="10" fill="url(#rail)" stroke="#7fc8ea" stroke-width="2"/>
<g fill="#0a1c2c" stroke="#7fc8ea" stroke-width="1.5"><circle cx="50" cy="914.0" r="4"/><circle cx="1650" cy="914.0" r="4"/></g>
<text x="66" y="902" fill="#dff1ff" font-size="14" font-weight="700">how to read it</text>
<text x="215.28" y="902" fill="#bcd9ec" font-size="11">a row is one buy method; a chip is a hop of it, in the lane of the party that acts; the ids (B3.4) are the rows of the tables in INTEGRATION-v2.md §8,</text>
<text x="66" y="919" fill="#bcd9ec" font-size="11">which give for each step the route, the gRPC call, the state after it, the exact error words and the log lines · the buyer's page never leaves the product's site</text>
<text x="66" y="936" fill="#bcd9ec" font-size="11">except at Stripe checkout · the ONE box never calls into an estate: the boxes pull their orders (add_principal, entitlement, grow_go_ahead, sign_in_again)</text>
</svg>