Money never moves without a person
The in-app assistant can prepare gift cards, promotions, and pricing rules from what it sees in a store. It cannot issue any of them. Each one is written as a draft — a real row, inert until approved — and surfaced where the merchant already manages that kind of thing. Approval is a separate, explicitly granted permission, checked on the server at the moment of approval rather than assumed from whoever created the draft. The limits are re-validated then too, against the row as it stands: a draft that was within bounds when prepared is checked again before it goes live, and a plan that lapsed in between blocks it. The same rule governs dynamic workflows. A workflow can rotate a collection or retag products on its own, because those are reversible. It cannot run a discount — it prepares one and waits. Approval is not the only limit on those drafts, because “one approval at a time” is weaker than it sounds once a rule runs on a schedule. A workflow that drafts a gift card for every customer meeting a threshold is bounded on both how many it may prepare in one run and their combined face value, and a run matching more than that stops and reports it rather than quietly choosing a subset — being told the rule is too broad is more useful than a silent partial result. A cooldown prevents the same customer being rewarded again on the next run, which is the failure that would otherwise compound quietly at every cadence. These ceilings live in the database and are re-clamped on every call, so a rule can narrow them but never widen them, whatever the request asks for. A markdown pricing rule is bounded differently, by scope: it covers only the products it actually identified rather than the whole catalogue, and only one such draft is outstanding at a time so a weekly rule cannot stack duplicates while a merchant is deciding.Margin is not assumed
Any automated action that affects price first checks that the store’s cost data is complete enough to reason about. The reason is specific: when a cost price is missing, margin arithmetic treats it as zero, which reads as 100% margin. A discount computed on that basis looks comfortably profitable and can be sold below cost. So rather than act on a plausible-looking number, the platform stops when coverage is too thin and says which products need costs filled in. This is a refusal, not a warning. It applies to the assistant, to standing workflows, and to advertising rules alike.Test credentials cannot serve a real customer
A store can be live while a payment provider is still configured with test credentials. Left unchecked, a shopper would complete checkout against a sandbox processor, see a confirmation, and pay nothing. On a production request, a provider whose credentials are not live-grade is hidden from the available payment methods and refused at initialization. The shopper cannot select it, and a direct API call gets an explicit error rather than a phantom success. The check applies to production requests only. A sandbox key sees every provider, including ones still on test credentials — that is what sandbox is for, and hiding them would make the mode useless for the testing it exists to support. So a sandbox checkout listing providers markedtest
or sandbox is the system working, not a leak; point a live key at the same store and those
providers are gone. The same asymmetry holds for every integration below: sandbox is permissive,
production is strict.
The merchant’s own in-store point of sale behaves differently on purpose: it warns rather than blocks,
because that is the merchant’s own device and they may be mid-setup. The distinction is who is
transacting — never let a customer pay into a test account; do let a merchant test their own till.
The same rule extends past payments to every integration a merchant connects themselves, because
every one of them has a test mode and a merchant can be live to shoppers while still holding test
credentials:
- Tax. A store connected to a sandbox tax account is not used to price real orders — a test engine’s rates are not the ones that get filed. The store’s own configured rates apply instead, so the shopper is still charged a number the merchant chose.
- Shipping. A test carrier token cannot buy a label for a production order. A test label is not accepted by any carrier, and buying one would mark the order shipped and send the customer a tracking number that never moves. Live rates are simply not offered, and the store’s own delivery pricing stands.
- Subscription billing. A billing processor configured with test credentials is not offered and is refused if named directly.
- Advertising. Automation rules run against a real ad account and move real budget, so only rules created in production ever execute. A rule authored while testing stays inert.
- Accounting. Ledger entries are never posted into a sandbox accounting company. When the connection is not pointed at a real one, entries stay queued rather than being sent — so nothing is lost, and the queue delivers once the connection is corrected. An entry that posts into a test book looks identical to a successful sync, which is precisely why it is refused instead.

