The model: pay vendors on your own rails
Vendor Payments solves the inverse of Sales Payments. Where sales collection is money coming in from customers, vendor payments are money going out to suppliers — and the pain it removes is the app-switching dance most finance teams know too well: a purchase order is approved in one system, then a cashier opens M-Pesa or online banking to actually pay, and afterwards someone re-keys the amount, the reference, and the new balance by hand. AWRA collapses that into one action: you initiate the payment from the approved PO itself, and the confirmed payment posts back onto that PO automatically. Internalise the direction first, because it shapes every other decision in this course — this is the tenant paying its vendor, not a customer paying the tenant.
Like sales collection, vendor payments are non-custodial, but the credentials in play are different. M-Pesa payouts use the same TenantMpesaConfig the tenant already stores, but they rely on the initiator credentials (initiator name and the password used to build a security credential) rather than the STK passkey — because sending money is a B2C/B2B operation, not a customer prompt. Paystack transfers use the same TenantPaystackConfig secret key as card collection, but hit the Transfers API and draw from the tenant's Paystack wallet balance rather than the charge/subaccount flow. In every case the money leaves the tenant's own M-Pesa shortcode or Paystack wallet straight to the vendor; AWRA only initiates the request and records the outcome.
One guard governs the whole feature: you can only pay a purchase order that is approved and still has a balance due. This is enforced at the controller, not merely hidden in the UI, so a draft, pending, or cancelled PO cannot be paid even if someone crafts the request directly. The mental model to carry forward is a four-step loop that mirrors sales but points outward: the PO is approved, you initiate a payment by one of four methods, the provider confirms (or you record a manual payment), and the payment posts onto the PO — updating amount paid, balance due, and status without anyone re-keying a figure.
Key takeaways
- Vendor Payments are outgoing (tenant → vendor) — the inverse of Sales Payments and unrelated to AWRA subscription billing.
- M-Pesa payouts use the tenant's TenantMpesaConfig initiator credentials (not the STK passkey); transfers use TenantPaystackConfig on the Transfers API.
- It is non-custodial: funds leave the tenant's own shortcode or Paystack wallet directly to the vendor.
- Only an approved PO with a balance due can be paid, and that guard is enforced server-side, not just in the UI.