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.9.333] — 2026-09-11
Changed
- Discount codes are back to exactly how they were. The fundraiser coupon work had been folded into the existing group discount codes page, which changed that page's fields and wording. That's reverted: Discount codes are again just a percentage off platform fees (1–100%) for schools, clubs and groups, with the original fields and copy. Existing codes were never altered and are untouched.
Added
- Coupon codes now have their own admin area (Admin → Coupon codes), so new coupons can be added without touching the discount codes page: code, first $X raised fee-free, discount off platform fees after that, how long the reduced rate lasts, when to stop accepting new claims, a claim limit and a note — with edit, pause and delete. The two lists are kept completely separate: coupons never appear under Discount codes, and discount codes never appear under Coupons.
[0.9.332] — 2026-09-11
Changed
- Fundraiser pages no longer repeat "Fees covered by donors" twice. The badge above the donate form is gone; the explanation inside the form (under the amount buttons) stays, since that is the one that says the platform fee and card processing are added on top so 100% of the gift reaches the fundraiser.
[0.9.331] — 2026-09-11
Added
- Fundraiser coupon codes that combine two benefits. An admin can now create a code that makes a fundraiser's first $X raised fee-free, a code that reduces their platform fee after that (e.g. 25% off the 5% + GST), or a code that does both — with optional expiry dates and signup limits. Fundraisers can enter a code at sign-up or later from their go-live checklist, the dashboard shows how much fee-free fundraising they have left and when a reduced rate ends, and the fee engine spends the free volume before charging the reduced rate (referral volume, then the coupon, then any refund credits). Admin → Discount codes gained the free-volume field and now shows what each code actually gives.
[0.9.330] — 2026-09-11
Changed
- Saving a campaign is fast again. The save used to wait on two AI calls (the "what are you fundraising for" tag check and the fraud score) before it would respond — about 2 seconds on a good day and much longer when the AI provider was slow. Both now run after the response, alongside the moderation review that was already backgrounded, so the save returns as soon as the campaign is written and the redirect to the campaign page happens immediately. Editing a campaign also no longer waits on the AI tag check or the IndexNow search-engine ping. A slow save now logs a warning so we can see it if it ever creeps back.
[0.9.329] — 2026-09-11
Changed
- Static assets (JS/CSS) are now served from the CDN edge. They were being
served from the origin server; they now come from the Bunny pull zone behind
fast.generous.nz, so the browser fetches them from the nearest edge and the origin only serves the first request per edge. Driven by theASSET_PREFIXenv var (unset = self-hosted), so it can be switched off with an env change and a redeploy. Nginx's Content-Security-Policy now allows the CDN host for scripts and styles. Images were already on Bunny (images.generous.nz).
[0.9.328] — 2026-09-11
Added
- Stripe account guard. If a business's Connect account is disabled
(Stripe sets a disabled reason), deleted, or the business deauthorises the
platform, their catalogue items are paused and the copies fundraisers added
to their own stores are hidden straight away. It runs on the
account.updatedandaccount.application.deauthorizedwebhooks, with an hourly sweep as the backstop for missed webhooks. The business is suspended and admins get an email with the reason; when Stripe reports the account healthy again the guard restores exactly the items it took down (never anything a fundraiser or admin changed themselves) and emails admins again. Businesses that simply haven't finished onboarding have their listings hidden without being suspended, so buyers never reach a dead checkout. - Unfulfilled order guard. Paid orders that haven't been marked shipped or complete after a configurable number of days (default 7) send the seller a nudge — throttled to one reminder per order every three days — and produce an admin alert listing everything waiting, with anything past twice the window flagged as overdue. Runs with the daily reconciliation job.
- Admin → Settings: an Order follow-up & account guard card with the day threshold and a Run checks now button. Admin → Reconciliation: live panels for orders waiting on a seller and businesses paused by the Stripe guard.
- The business is told directly. The moment the guard takes their listings down they get an email explaining what happened, what was hidden, and a one-click link back into Stripe to fix it (falling back to the wholesale setup page if a link can't be created). They're reminded every 7 days while it's still broken, and get a second email when their listings come back.
Changed
- Brand line tidied up: the email and voucher footers and the web app manifest now say "Sell. Donate. Be Generous.nz", matching the site (they still had the old "Make a difference" tagline).
[0.9.326] — 2026-09-11
Changed
- The fundraiser QR code now uses the Generous.nz brand icon in the centre
(
public/icons/generosity-icon.png, converted from the supplied artwork), replacing the older site icon. It sits on the same white backing so the code stays scannable, and the previous icon stays in place as an automatic fallback if the brand asset is ever missing from a deploy.
[0.9.325] — 2026-09-11
Changed
- The campaign form's thank-you message is now prefilled: "Thanks so much for supporting our cause — it really means a lot to us…", so donation receipts carry a warm line instead of arriving bare. It stays optional — fundraisers can rewrite it or clear it (an empty box saves as no message, and the field is prefilled again next time the form is opened). Campaigns that already have their own message keep their own wording untouched.