Skip to content
Paykit
Esc
↑↓navigate↵open⌘Jpreview
On this page

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.

Was this page helpful?