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.379] β 2026-09-17
Added
- A sample club shop at /demo/club-shop. The fastest way
to get a print supplier supplying club gear here is to show them what a
club shop is rather than describe it β so there is now a complete, realistic
one to send a link to: an example club, a story, a three-week order window
with real dates, and eight garments with prices, sizes, margins and the
quantities that went out in the first print run.
- The gear is drawn, not photographed (
components/club-shop-demo-gear.tsx). Flat garment mockups β hoodie, tee, training tee, polo, cap, beanie, socks, duffel β in club colours with the decoration placed where it would actually be printed, which is what a printer reads a tech pack for. No stock photography, nothing licensed, and a real club's colours are one object away. - Every number on the page is derived (
lib/club-shop-demo.ts): $13,518.00 of gear ordered, $2,801.00 to the club, 320 garments, 214 orders, a 20.7% margin. The cards, the progress bar and the print-run table all read from the same list, so they cannot disagree with each other. - Nothing on it is real, and nothing can be bought. There is no campaign, no product and no catalogue item behind any of it. That is also what makes the owner's instruction true β fundraisers cannot add this gear to their store until a print supplier is actually lined up, because there is nothing in the catalogue to add. Do not seed these items as records.
- The supplier-facing half: the first print run as a table (garment, decoration, sizes, what the club keeps, units), the size list the platform recommends, what a supplier would be asked for, and the filled-in brief a club would send β so "showing beats telling" is the whole page, not just the gear.
- Dates move with the day. The window closes 25 days out and gear lands 46 days out, computed on each view, so the sample never looks like a shop that closed months ago.
- Unadvertised on purpose:
noindex, nofollow, absent from the sitemap,/demo/disallowed inrobots.txt, and not linked from the home page. It is a link to send someone.
- The gear is drawn, not photographed (
Changed
- Dashboard β Club shop and the club shop help article now point at the sample shop, so the thing to put in front of a printer is one click from where a club is already working.
[0.9.378] β 2026-09-17
Docs
- Test runbook Step 4M covers the business ROI dashboard: the money must reconcile with a fixture (gross, commission, net, platform fee, and sales per $1 of commission), the reach panel must count views as catalogue plus fundraiser-shop copies, new buyers must mean "first order inside 30 days", the action list must fire from real conditions, and item views must increment on both public product pages. The handoff records why the commission total stays front and centre, and that the money comes from settlements rather than being recomputed.
[0.9.377] β 2026-09-17
Added
Business ROI dashboard (Dashboard β Wholesale β Your results). The old page was a sales report; a business deciding whether to keep offering fundraiser deals needs three things side by side, and now gets them:
- What it earned: sales through the platform, units, average order.
- What it cost: the commission paid to fundraisers totalled up β the number most businesses never see β plus the platform fee and GST invoiced, and a single headline: every $1 of commission returned $X of sales.
- Reach: views of their items (catalogue listings plus the copies sitting in fundraiser shops), how many fundraisers are promoting them right now, views-per-order, and whether buyers are new or repeat.
Plus a per-item table with share %, views, orders, viewsβorder conversion, sales, commission and what they kept; a month-by-month sales/commission chart; and an action list derived from the data (nobody has bought yet, fundraisers who added items and sold none, a share that's on the low side, items that have never sold, plenty of views but no orders).
Item view tracking (
Product.views,WholesaleProduct.views). Campaign pages already recorded visits, but individual items recorded nothing, so "impressions" was the one gap in this view. Counted once per page render of a live item, in the background, so it can never slow a page down.The nav and dashboard cards now say Your results rather than "Analytics & export", and the page description explains what it answers.
[0.9.376] β 2026-09-17
Docs
- Handoff note recording that the club shop is a preset over existing
machinery, and that a
CLUB_SHOPcampaign type should not be added β it would fork the campaign pipeline for no gain.
[0.9.375] β 2026-09-17
Added
- Club shop template. The highest-value thing a club, school or team can do
here is sell gear people actually want rather than asking for money β so
that's now a first-class flow instead of something a volunteer has to work
out from scratch. It's a preset over machinery that already exists (a
product-sales campaign, catalogue items added from a business, sizes as
product options, the campaign end date as the order window), so nothing about
the money model changed.
- Dashboard β Club shop is a new workspace: where the club is up to (derived from real data β payouts connected, page created, gear added, close date set, shop shared), a progress bar, the shop link with copy button, a supplier brief to send a printer, the size list to offer, what happens on an order, and the questions clubs actually ask.
- The create form has a template picker β Blank or Club shop. Choosing Club shop sets product sales, a sport category, a story skeleton with the blanks left in, and a 21-day order window, then tells the volunteer exactly what to do next. Everything stays editable.
- Wholesale product form: a one-click "Standard clothing sizes (XSβ3XL)" button adds a required Size option, so a print supplier can list a garment that can't be checked out without a size being chosen.
- New help article: Running a club or school shop.
[0.9.374] β 2026-09-17
Legal
- Terms update. The Terms of Service are now v3.3, with matching updates to the Fundraiser, Seller and Wholesaler Agreements. Read the current wording at /legal/terms.
[0.9.373] β 2026-09-17
Docs
- Test runbook Step 4L covers the language screen: the word list itself (and
the words it must not catch), reviews held versus clean reviews publishing,
a refused campaign update, a donor's message hidden while the donation still
goes through, and the AI pulling a published review back. It also records the
two testing gotchas that cost time: reviews are one per supporter per
campaign, and the review route's 5-per-hour limit is only cleared by
restarting PM2 as the
generosityuser.
[0.9.372] β 2026-09-16
Fixed
- Reviews are screened for swearing, vulgarity and abuse before they
publish. The screen reviews ran against was the prohibited items list
(weapons, drugs, counterfeit, gambling) β it contained no swear words at all,
so a review full of profanity was created
APPROVEDand went live instantly. "Reviews are screened" rested entirely on a list that had nothing to catch it.- A new language screen (
scanForLanguage) covers profanity, sexual vulgarity, abuse and slurs, and is evasion-aware:sh1t,f.u.c.k,f u c kandfuuuuckare all caught. It matches on word boundaries, so "class", "grass", "assess", "Scunthorpe", "shiitake", "cocktail" and "Cockburn" stay clean. - A review that trips it is held at
PENDINGwith a flag for a person β held, never auto-rejected (the promise stays true). - The AI's opinion now counts for reviews too: a verdict of
review,rejectorsuspendon an already-published review pulls it back toPENDINGfor a human (ai.review_held_for_human). Until now the AI check ran after publication and could change nothing, which is what made the word list the only real screening.
- A new language screen (
- The same screen now covers every piece of text people type. Campaign
titles and stories, product and wholesale listings, and organisation details
run through the combined screen (
scanForModeration), so profanity in them is held for a person like any other flag. - Donor messages. A donor's message appears on the campaign page the moment the donation is paid and was completely unchecked. The donation still goes through untouched β wording never blocks money β but a message that trips the screen is hidden until a person clears it, flagged in the queue (with the message shown, and the note that the donation itself is unaffected).
- Campaign updates. Updates go on the page and into supporters' inboxes, unscreened. They are now refused with a clear "please reword this" message if the screen trips. Refused rather than held on purpose: holding would mean the update could later appear without the email ever having gone out. Nothing is published, so nothing is being cancelled.