Money & Balances.
Underneath every reward is money moving in a controlled way. An organization funds an account, sends draw against it as holds, and holds settle into captures or are released back. Here is the model.
Accounts
An Account is a pool of funds an organization draws against (proto/perkup/v1/account.proto). An organization can have more than one — for example to separate budgets by team or program. Each account has a balance that sends decrement and funding increments.
Holds, captures & the ledger
Money movement is recorded as BalanceTransaction entries (proto/perkup/v1/transaction.proto). The lifecycle of a send:
- Hold — when a reward is sent, its value is reserved against the account.
- Capture — when the recipient redeems, the held value is spent for real.
- Release — if a reward expires or is cancelled unredeemed, the hold returns to the account.
- Refund — a captured amount can be reversed back.
Holding value at send time, not capturing it until redemption, is why an organization only pays for rewards people actually accept — and why expired rewards return to the budget.
Funding
Organizations top up accounts through Stripe. The Perk Card prepaid Visa is issued and funded via Stripe Issuing, so card spend draws against funded balance. See Integrations for the payment stack.
Billing & invoices
Beyond reward value, PerkUp bills for services like bulk-swag warehousing (stripe_invoice.proto, WarehousingInvoice). Pricing principles — shipping included, no service fee — are on Pricing & Margin.
Source: proto/perkup/v1/{account,transaction,stripe_invoice}.proto · backend/app/ledger · backend/app/stripe