Approve, edit, publish is refused — not silently allowed
An approval carries a digest computed over the exact manifest it was granted against — pages, prices, domain, payment methods. Publish recomputes that digest from the database at the moment it runs and compares it to the one on the approval. If a single section changed since the grant, publish is refused with a 409 naming the reason, not a 403 for being unauthorised — it is a state problem, not a permission problem.
There is no is_live column — liveness is whether a deployment exists
A site row has no status or published_at field that a stray PATCH could flip. Whether a site is live is computed by checking for a recorded deployment, and a deployment cannot be written without a granted, unexpired, unspent approval whose digest still matches.
A legally required page cannot be deleted, ever
Privacy, terms, refund and contact pages are appended automatically to every new site and refused from deletion outright — not gated behind approval, refused outright, because a business operating without a refund policy is a Consumer Protection E-Commerce Rules problem before it is a Kuber problem.
It will not hold a payment gateway's real credentials
Connecting a gateway scans the submitted configuration for anything shaped like a card number, a CVV or a full UPI VPA and refuses it before the approval is even read. A connection lands as approved_pending_credentials — Kuber stores a provider name and a public merchant reference, never the gateway's actual API key or webhook secret.
It will not accept a javascript: URL as a product image
A product import row whose image link does not start with http:// or https:// is rejected with the reason, per row, rather than the whole import failing or the payload silently landing in a rendered page's src attribute.
A gateway checkout is refused without a connected gateway — cash on delivery is not
Cart, checkout quote and order all run against the site's own catalogue, with stock reserved by one conditional UPDATE per tracked variant so two simultaneous checkouts for the last unit cannot both succeed. A COD checkout completes end to end with no credential. payment_method=gateway is refused outright with a 409 unless a KuberGatewayConnection already exists — there is no fallback path that takes online payment without one.
No courier API is called — every tracking event is written by the seller, never fetched
Order status moves through a fixed line a seller cannot skip, and shipment history is real, but there is no carrier-tracking-poller: no courier is chosen and no courier API exists in this deployment. A tracking page shows exactly what the seller typed, never a live courier feed it does not have.