Manual
A provider that sells by invoice, so a deploy needs no key.
Manual is the provider with no vendor behind it. It opens an invoice and
records a refund, and it declares no checkout, no portal and no card rail. A
deployment uses it to prove the loop before a payment account exists.
import { Paykit } from "@potion.run/paykit";
export const Provider = Paykit.Manual();
export const billing = {
catalog,
providers: [Provider],
store: Paykit.MemoryStore(),
} satisfies BillingStackProps;
What it supports
| Capability | Manual |
|---|---|
invoice |
Yes. A checkout asks for one and gets an invoice id |
refund |
Yes. A refund is recorded and answers its own id |
checkout |
No. Asking for one fails with ProviderCapabilityMissing |
portal |
No |
setup |
No. There is no card rail to add a method to |
charge |
No. An invoice has a transfer behind it, not a card |
usage |
No. There is no vendor meter to report to |
quantity |
No. A seat change stays a local proration |
A refusal by capability is deliberate. The alternative would be a page that cannot take a card, or a charge that quietly does nothing.
What the deploy does
Paykit.BillingStack validates the catalog and records it. With Manual there
is no vendor object to create, so the deploy provisions nothing beyond stack
state.
The invoice id is inferred from a transfer, and the same command id answers the same invoice, so a retried checkout is one invoice and not two.
When to move on
Keep Manual for tests, for a first deploy and for invoiced customers. When you
need hosted checkout, tax and retries, swap the provider array for
Stripe or Polar. The catalog does not
change.
See Providers for the port and the capabilities, and the memory example for this provider as a runnable Worker.