Changelog
All notable changes to Generous.nz are recorded here, grouped by version. Every deployed build has a version number, a git tag, and an entry below.
Versioning scheme
Versions follow MAJOR.MINOR.PATCH:
- 0.x — pre-launch. Minor bumps mark a completed build phase or major feature set; patches are bug fixes on the current build.
- 1.0.0 — first public launch.
- 1.x+ — post-launch: minor = new features, patch = fixes, major = breaking changes or significant re-architecture.
Each version is tagged in git (v0.2.0) and the current version is kept in
package.json. See docs/version-control.md for how to cut a release.
[0.4.0] — 2026-08-24
Go-live hardening (build phase 4).
Added
- Daily reconciliation: ledger snapshot with anomaly checks — payments
without a Stripe reference, settlements missing transfers, settlements
stuck for 30+ days, failed transfers/invoices, and invoices that can't be
collected because the wholesaler has no bank mandate. Includes a Stripe
platform-balance snapshot, a daily emailed report, an admin page with
run-now and history (migration 0015), and a
/api/cron/reconcilejob. - Payment failure alerts: declined payments now email the platform so card-testing patterns are visible.
- GST export completeness: the tax report now includes wholesale subscription invoice fees and GST alongside donations and orders.
- Email templates: 7 new previewable/test-sendable templates — wholesale fulfilment request, voucher code delivery, fulfilment review invite, wholesale invoice, and NZ BECS direct-debit notice.
- Fraud runbook:
docs/fraud-runbook.mdcovering fraud models, detection controls, review workflow, escalation path and scenario runbooks. - Go-live checklist:
docs/go-live.mdrewritten with the Phase 4 checklist — live split test, chargeback drill, legal pages, GST export, email templates, failure alerts, reconciliation, and the fraud runbook.
Changed
- Admin Reports page shows wholesale invoice fees in totals and the CSV
export includes a
wholesale_invoicerow type with a totals row.
[0.3.0] — 2026-08-24
Wholesale marketplace — build phase 3 (depth & scale).
Added
- Monthly BECS invoicing (the "auto bill" ask, done properly): wholesalers connect an NZ bank account once via Stripe-hosted mandate setup; the monthly cron creates an invoice per approved wholesaler with a subscription fee, notifies them before each debit (as NZ direct-debit rules require), and charges the saved mandate off-session. Webhooks mark invoices paid/failed, failed debits retry automatically (3 attempts, 72h apart), and admins can retry, waive or mark invoices paid. Wholesaler billing page + admin invoice ledger (migration 0014).
- Organisation-level wholesaler accounts: applications can be attached to an organisation; OWNER/ADMIN members share the same wholesale account and can manage products, vouchers, orders, analytics and billing.
- Bulk catalog import: CSV template, per-row validation, prohibited-item scanning, moderation on import, and a row-by-row error report.
- Inventory sync: bulk stock updates by SKU, auto-pause when a product sells out (including mid-sale in the webhook), low-stock and sold-out emails, and SKU support on products.
- Wholesaler reviews: buyers with a paid/fulfilled order can review a supplier; ratings appear on the public catalogue; review invites are emailed on fulfilment; reviews go through the moderation queue.
payment_intent.succeededwebhook handling for invoice settlement.
Changed
- Wholesaler authorization is now organisation-aware (a member of an org with an approved wholesale account can operate it).
- Wholesale products can carry a SKU used for import and stock sync (unique per wholesaler).
Fixed
- Invoice generation is resilient to email failures — a failed notification no longer skips the direct debit.
[0.2.0] — 2026-08-24
Wholesale marketplace — build phases 1 and 2.
Added — Phase 1: Core wholesale
- Wholesaler application flow with admin approval, rejection and suspension
(
/dashboard/wholesale,/dashboard/admin/wholesalers). - Wholesale catalogue products: stock, auto-expiry (15/30/45/90+ days), physical/voucher types, minimum 10% commission enforcement, moderation.
- Public wholesale marketplace (
/wholesale) plus a wholesale filter and "Fulfilled by [business]" badges on the explore and fundraiser pages. - One-click "Add to my store" for fundraisers with a sale-price floor of cost + minimum commission, and a quantity selector.
- Payment engine: destination charge with a partial transfer (fundraiser's
net routed straight to their account),
on_behalf_ofso the fundraiser is the seller of record, application fee (platform fee + wholesaler share), then an automatic platform→wholesaler transfer with retry handling. WholesaleSettlementrecords for every order: gross, fees, GST, commission, wholesaler net, status, hold, transfer and reversal IDs (migration 0012).- Buyer receipts issued in the fundraiser's name with the fulfilment party shown.
- Refund safety: refunds use
reverse_transferso money is pulled back from the fundraiser, and the wholesaler's share is reversed automatically. - Fraud controls: 30-day payout holds for fresh accounts
(
riskHoldPayoutsUntil), 24-hour velocity monitoring that flags suspicious fundraisers to the moderation queue, admin hold release / retry / cancel in the settlement log. - Wholesaler fulfilment queue: order notifications, buyer details, mark as fulfilled.
Added — Phase 2: Trust & robustness
- Voucher codes: wholesalers generate or paste codes per voucher product; codes are emailed to the buyer automatically on payment; voucher orders fulfil themselves; refunded orders return codes to the pool (migration 0013).
- Proportional refund reversals: partial refunds reverse only the matching share of the wholesaler transfer.
- Automatic dispute outcomes: on
charge.dispute.closed, a lost dispute recovers the wholesaler's share and a won dispute re-pays the fundraiser and wholesaler automatically. - Dispute console: submit evidence to Stripe, accept-and-refund, sync from Stripe, and wholesale settlement context on every dispute.
- Wholesaler analytics (
/dashboard/wholesale/analytics): paid-to-you total, 30-day view, per-product sales, and CSV order export. - Fundraiser "Sales & orders" page (
/dashboard/sales): every order with the full split — total, fees, supplier share, and the fundraiser's keep.
Changed
- Wholesale payment architecture corrected to Stripe's documented split
pattern (destination charge + partial transfer +
on_behalf_of); the platform balance only ever holds the fee plus the wholesaler share in transit. Seedocs/wholesale-marketplace.md. - Settlement engine now retries failed transfers automatically on a schedule and only emails admins on the first failure.
- Required Stripe webhook events updated: added
charge.dispute.closed, replacedtransfer.failedwithtransfer.reversed.
Fixed
- Fundraiser wholesale listings were capped at one unit; fundraisers can now offer as many units as they want (bounded by supplier stock).
- TypeScript/build errors in the webhook event handling.
[0.1.0] — 2026-08-22
Marketplace core (initial release build).
Added
- Platform foundation: accounts, fundraisers, product listings, donations, orders, Stripe Connect payouts, moderation queue.
- Campaign types: ticket sales, peer-to-peer, supporter subscriptions and licensed raffles.
- Organisation dashboards with team roles, branded storefronts, custom URLs and multi-campaign pages.
- AI tools: fundraiser/product content generation, newsletters, sponsor proposals, grant drafts, AI moderation and fraud review (DeepSeek/OpenAI).
- Admin suite: user management, audit logs, transaction search, GST/tax reporting, site settings, email templates, announcements, payouts, refunds and dispute handling.
- Trust features: reviews, verified-charity badges, raffle licence management, risk dashboard.
- Growth: multi-currency support, PWA/mobile experience, push notifications.
- Help centre with live search, floating help widget with contact form, getting started page, and public marketplace with share links.
- Legal document set (ToS, Privacy, agreements, policies) published as pages.
- Email notifications: receipts, campaign updates, moderation decisions, refund/dispute updates.
- Image uploads, Google/Apple social login, database backup tooling, Stripe setup tooling and rate limiting on auth/payment endpoints.