Pre-release · Apache-2.0

Everything after “Add to cart”.

OrbCart is the open transaction layer for brands that already own their product data. Products, prices and inventory stay in your systems. One transaction core, built for your storefront and for AI agents.

  1. Cart Priced live from your systems
  2. Checkout Address, contact, consent
  3. Tax VAT by destination country
  4. Shipping Your rates and rules
  5. Payment Cards, wallets, local methods
  6. Order Frozen, handed to your ERP
The Nordgrat demo shop: the product page of the Daypack 30 l in green for €89.90, with an Add to bag button.
A buyer adds the Daypack 30 l to the bag in Nordgrat's own storefront. From there, OrbCart runs the purchase with five calls: a cart whose line is priced by Nordgrat's offers function, a quote with shipping of €4.95 and 19% VAT included, signed, for a total of €94.85, and an accepted payment that becomes order NG-2026-000142.

Why OrbCart

Sell without a second catalog.

OrbCart is the transaction layer, from cart to order. It is deliberately no catalog, no PIM and no shop system: brands that own their product data already run those.

01

Shop platforms

Only sell what lives in their catalog, so your products move in.

02

Headless platforms

Expect your SKUs in their catalog. Live price and stock take custom glue.

03

Payment checkouts

Collect the money, some even tax. Cart, stock and orders stay yours.

04

Building it yourself

Gives you full control. Idempotency, payment failure cases, tax, order snapshots and agent protocols, all built and run in-house.

OrbCart

Asks your systems through one function, so nothing moves in and nothing syncs. The whole transaction, from cart to order, comes built in.

Catalog copies
0
Sync jobs
0
Function to write
1

How it works

One function connects your systems.

Your integration is an offers function: given the lines of a cart, it answers from the systems you already run. Tax, shipping, payment and the order are OrbCart’s job.

worker.ts @orbcart/runtime
import { defineCommerce } from "@orbcart/runtime";
import { channels } from "./channels";
import { erp } from "./erp";

export * from "@orbcart/runtime/objects";

export default defineCommerce({
  channels,
  offers: async (lines, { currency }) => {
    const articles = await erp.articles(lines);
    return articles.map((article) => ({
      reference: article.sku,
      title: article.name,
      price: { amount: article.cents, currency },
      taxCategory: "standard",
      shipping: { weightInGrams: article.grams },
      tags: article.promotions,
    }));
  },
});
  1. Your account, your data.

    Deploys as a Worker into your own Cloudflare account. Carts, quotes and orders live in storage you own.

  2. Nothing to sync.

    OrbCart asks for the lines in a cart the moment it needs a price. No copy exists that could fall behind.

  3. Your product model, untouched.

    An offer is a reference, a title, a price and a tax category. Variants, sets and configurations stay the way your ERP knows them.

  4. Tags end a sale.

    Tag an offer, and one call voids it in every open cart. More on that below.

One call ends a sale everywhere.

When your sale ends, one call voids its offers in every open cart. From the moment it returns, no quote takes the old price: each buyer’s next click gets the regular one. Carts without the tag stay as they are.

Nordgrat ends its summer sale early with one call: admin.offers.invalidate({ tags: ["summer-sale"] }). Six carts are open. The three that hold a Rucksack 45 l, tagged summer-sale at €119.90, have their offer voided at once; at each buyer’s next click the acceptance returns quote_changed with the regular price of €149.90. The carts with a headlamp, a bottle and a tent carry no tag and stay as they are.

Runs on the edge

The whole transaction. None of the servers.

OrbCart deploys as a Worker into your own Cloudflare account. No server to patch, no cluster to scale, no Kubernetes: every cart is its own Durable Object, so a busy day adds objects, not load on one database.

A self-hosted shop system asks you to run app servers, background workers, a database, a cache, a queue and search, and to patch, back up and scale each of them. OrbCart is a Worker you deploy with wrangler, and one Durable Object for every cart that buyers open.

Built for the bad day

Right, even when the network isn’t.

Retries, timeouts and double clicks are normal on the internet. OrbCart gives each of them an answer: no double charge, no lost order, no guessed state.

Stripe sandbox · 25 September 2026

Stripe’s answer never arrives.

A run against Stripe’s sandbox on 25 September 2026. The buyer pays €94.85 by card; Stripe acts, but its answer is dropped on purpose. After 0.76 seconds the buyer sees pending and the payment is unknown. OrbCart does not guess: it asks Stripe again under the same idempotency key, and after 30.96 seconds the payment is authorized and order NG-2026-000004 is placed. At Stripe there is exactly one PaymentIntent, captured once.
  • Retry-safe calls

    Every call that moves money carries a key. A retry gets the first answer, never a second charge.

    Idempotency-Key
  • Unknown is a state

    A timeout is neither failed nor paid. OrbCart asks the provider until it knows.

    payment: unknown
  • Signed quotes

    Every total a buyer accepts is signed, and anyone can check it against your public keys.

    ES256 · jwks.json
  • Side effects after the commit

    The handover to your ERP runs after the order is saved, and waits while your ERP is down.

    outbox
  • Refunds to the cent

    Partial refunds per line, from the amounts frozen in the order, not from today’s prices.

    orders.refund()

Two front doors

One checkout for shoppers and their agents.

AI agents are starting to buy, and they need a checkout they can verify. An agent gets the same core as your storefront: the same prices, the same rules and the same signed quote.

A buyer in Nordgrat’s storefront and an AI agent acting for a buyer reach the same OrbCart core. The agent adds the daypack, asks for a quote and verifies its signature against Nordgrat’s public keys: €94.85 with shipping and VAT, the same signed quote the storefront gets.

For developers

Batteries included.

The parts every brand rebuilds come with OrbCart: a checkout kit, payments, VAT, shipping, refunds and a local runtime. Your code is the part only you can write.

checkout.tsx @orbcart/react
import { Checkout } from "@orbcart/react";

export function CheckoutPage({ cart }: Props) {
  return (
    <Checkout
      cart={cart}
      locale="de-DE"
      labels={labels}
      onOrdered={(order) => showReceipt(order)}
    />
  );
}
refund.ts @orbcart/admin
const admin = createAdmin({ url, key });

const refund = await admin.orders.refund(orderId, {
  lines: [{ line: "l_1", quantity: 1 }],
  reason: "return",
});

Built in today

Cart and checkout
Address, contact and consent on one page
Signed quotes
ES256, verifiable with your keys
VAT by destination
Germany, Austria, the Netherlands, France
Shipping rules
Per country, with exclusions
Payments by Stripe
Cards with 3-D Secure, Apple Pay, Google Pay, Klarna, iDEAL, Bancontact, EPS, Przelewy24, TWINT
Express checkout
One button for the wallets
Stock holds
Through your own inventory system
Refunds
Partial, per line, to the cent
Order handover
To your ERP, retried until it lands
Checkout kit
React components and hooks
Local runtime
orbcart dev on your machine
Ending a price
One call per tag, every open cart

On the roadmap PayPal, Adyen, discount codes, signed-in buyers. Project status

Start with one function.

Keep your catalog where it is. Write the offers function, and OrbCart runs everything after “Add to cart”.

  1. 01 Explore the demo Nordgrat’s shop in test mode. Pay with a Stripe test card and watch the order arrive.
  2. 02 Get started Run OrbCart on your machine and connect it to your systems with one function.
  3. 03 Project status What works today, what is being built and what comes next. Pre-release, in the open.