Products & Benefits
Pricing models, checkout fields, metadata and automatic benefit grants.
Pricing models
| Model | Behavior |
|---|---|
fixed | One price, set by you. The amount can be edited later; everything else about pricing is locked. |
pwyw | Pay-what-you-want with an optional minimumAmount and a pre-filled defaultAmount. The API rejects anything below the minimum. |
free | No payment step — checkout immediately creates a paid order and grants benefits. |
The pricing model (and product type) is immutable after creation — enforced at the database layer, not just the UI. This protects grandfathering: every checkout session snapshots the price at the moment it's created, so orders always reflect what the buyer actually saw, even if you change the price a minute later.
All prices are in ETB minor units in the API (santim; 10000 = 100.00 ETB). Buyers
pay exactly your listed price; withdrawal-time taxes (30% government + 5% Jami) come out
of your balance, never out of the buyer's pocket.
Checkout URLs
Every published product gets an opaque checkout token (p_…) and a hosted checkout page:
https://jami.bio/jamidev/p_x7Kf3mQz9aBcRaw product IDs are deliberately not accepted in URLs. Draft and archived products return a branded "not available" page.
Checkout fields
Collect custom information at checkout (text, number, date, checkbox, select). Fields are
defined once per organization (Developer → Checkout Fields) and attached to products
with a required flag. Collected values are stored on the order and echoed in webhook
payloads via the session's collected fields.
Metadata
Products carry a free-form metadata map (string → string). It's snapshotted onto every
order at completion and included in order.* webhook events — useful for SKUs, internal
IDs, or plan names. Checkout links can add their own metadata,
which wins over product keys on conflict.
Benefits
Benefits are granted automatically when an order is paid:
- License key — a unique key generated per order, shown on the buyer's success page,
included in the receipt email, and delivered in the
benefit.grantedwebhook payload. - Discord roles, GitHub access, file downloads, feature flags and custom benefits are scaffolded and dispatch through the same grant pipeline.
Grants are idempotent per order — replayed payment notifications never double-grant.
