Release Notes — Jun 16, 2026 — Event Import, Member Editor & fixes
For reviewers testing staging (https://stg-rcme.membervu.com; admin portal https://stg-admin.membervu.com). This note consolidates everything that landed on stage (dev) since the Jun 15 accounting-milestone note — two sizeable new features (Event Registrant/Response Import, and the super-admin Member Editor), the Communications segment + unsubscribe work, treasury follow-ups, and a batch of event bug fixes (incl. 4 closed today). Grouped by area with a "What to verify" hint. All items verified present on dev on 2026-06-16.
Scope notes.
Payment gateway is still inert (carried from the Jun 15 note) — no live GCash/Maya/card/Split-Pay or webhooks. Use SimulatePayment / manual payment recording. #258 (webhook tenant-boundary) is therefore not live-testable.
Not testable yet (open, not on stage): the Waitlist epic (#300–#308) is in flight — the guide still states "no waitlist," which remains correct for stage. #280 (event guest-limit not persisted) is still open — see Events below.
Out of local QA scope: #277 / #278 (staging Prisma-migration / compose drift) are DevOps/deploy-plumbing, not tester-facing behaviour.
📥 Event Registrant & Response Import — NEW feature
A new admin capability to bulk-import event registrants from a CSV, and to import question/answer responses against existing registrations. Reached from Event admin → an event → Registration tab (drawer-based wizards; org portal stg-rcme.membervu.com).
Open an event → Registration tab → Import registrants. Upload a CSV → map columns → preview shows new vs duplicate vs over-capacity rows → commit. Imported people appear as registrants; new guests get an account + QR-code confirmation email (check stg-webmail.membervu.com).
On an event with authored custom questions, open Import Responses → upload a CSV keyed by attendee email → preview matches rows to registrations → commit → answers appear on each registrant (Attendees tab).
🐛 Bug Fixes (import)
#
Fix
What to verify on stage
#299 closed today
Import showed a 404 in the UI although it succeeded server-side — the status poll built its URL with undefined instead of the commit-response batchId. Fixed.
Run a registrant import → the wizard shows the real batch status / success (no spurious 404). Confirm the imported rows actually landed.
#309 closed today
Imported guests weren't linked to their registration (EventRegistration.memberId stayed NULL), which silently suppressed the account + QR confirmation email. Fixed (member now linked).
Import a brand-new guest → they receive the MemberVu account + QR-code email, and the registration is linked to the new member (visible on the Attendees tab).
#275 / #276
Wizards crashed at Preview (FE/BE response-shape mismatch) and the "Import Responses" button was wrongly disabled (gate miscounted ticketed registrations). Both fixed.
Preview step renders without crashing; the Import Responses action is enabled when the event has registrations.
🎟 Events — bug fixes (4 closed today)
#
Fix
What to verify on stage
#279 closed today
Registration Deadline not persisted on event edit — the save handler dropped registrationDeadline from the payload (write-side omission). Fixed.
Edit an event → set a Registration Deadline → save → refresh → the deadline persists (was reverting to None).
#310 closed today
registrationClosed / isAttendeeListPublic not reflected after refresh — EventDetailPanel didn't map those fields from the API into the tabs (read-side omission, distinct from #279's write-side bug). Fixed.
Toggle "close registration" (and the public-attendee-list toggle) on the Registration tab → save → refresh → the UI reflects the saved state (was showing the old state).
#220 / #221
Create-Event sidebar active-state — the sidebar highlighted "All Events" instead of "Create Event" on the create route. Root-caused + fixed.
Navigate to Create Event; the sidebar highlights "Create Event", not "All Events".
⚠️ Still open — #280: the event guest limit (maxGuestsPerMember, "Up to N per member") has the same dropped-payload root cause as #279 and is not yet fixed. Editing the guest limit will still silently revert on refresh. Don't file a duplicate — note it against #280.
🛠 Super-Admin Member Editor — NEW (admin portal)
A new platform-operator capability in the super-admin portal (stg-admin.membervu.com, separate login) to search members across tenants and edit a membership directly. This is the platform portal, not the tenant org portal.
#
Change
What to verify on stage (admin portal)
#201 / #206
Cross-tenant member search — search by email across all tenants; results return status / type / expiry.
In the admin portal, open Members (/members) → search by email → results from any tenant show status, membership type, expiry.
#207
Member membership detail page (/members/:tenantId/:memberId).
Open a search result → the member's membership detail page loads.
#202 / #208
Edit Membership modal — shell + change-status control, with a dual-audit trail + required reason.
On the detail page → Edit Membership → change status with a reason → audit entries recorded.
#203 / #209
Change membership type (billing-neutral).
Edit Membership → change type → saved, no invoice/charge generated.
#204 / #210
Set / renew expiry (billing-neutral; explicit date or extend-period).
Edit Membership → set or extend expiry → membershipExpiresAt updates without billing.
#205 / #211
Reactivate lapsed member — EXPIRED/CANCELLED → ACTIVE; fixes OQ-RET-16 by setting a future expiry.
Edit Membership on an EXPIRED member → Reactivate → status ACTIVE and a future expiry set (pairs with the Jun 15 #151 fix in the org portal).
✉️ Communications
#
Change
What to verify on stage
#224
Segment management UI built (backend already existed) — /admin/segments.
Open /admin/segments → create / edit / view an audience segment; use it as a broadcast audience. (Previously backend-only, no UI.)
#257
Public unsubscribe now functional — the HMAC token route is registered before auth middleware so the link resolves for anonymous recipients (previously the token couldn't be decoded → unsubscribe failed).
Click the unsubscribe link in a broadcast email as a logged-out recipient → the page resolves and unsubscribes (no auth bounce / no failure). Pairs with the Jun 15 #254 tenant-param fix.
💰 Treasury & finance follow-ups
#
Fix
What to verify on stage
#263
Treasury payment DTO enriched — emits memberId, netIsEstimated, masked card, acquirer ref, request id (supports the #262 treasury fix).
On /admin/treasury, payment rows show the enriched detail (member link, masked card, acquirer/request refs) without errors.
#264
Treasury source filter returned a silent 400 — the frontend sent PAYBIZ/EXTERNAL in the wrong case. Fixed (lowercased to match the backend schema).
On the treasury page, filter by payment source (PayBiz / External / …) → the list filters correctly (no silent 400 / empty result).
#256
Member financial/account views now mobile-responsive — wide tables no longer overflow on small screens (BillingTab Recent Payments fixed).
On a narrow/mobile viewport, open the member account → Billing / Recent Payments → no horizontal overflow; tables reflow cleanly.
Suggested review order
New features: Event Registrant/Response Import (incl. #299/#309/#275/#276 fixes); super-admin Member Editor (#201–211).
Event fixes: #279 (deadline), #310 (close-registration display), #220/#221 (sidebar) — and confirm #280 is still broken.
Communications: #224 segments, #257 public unsubscribe.
Finance: #263/#264 treasury, #256 mobile responsiveness.
Skip: gateway/webhook flows (inert — #258), Waitlist (#300–308, not on stage), DevOps #277/#278.
Source of truth: the membervu/membervu-pm tracker. Stage builds from dev — dev-presence verified 2026-06-16 (event fixes #310 84b1a8e9, #309 67ecfb61, #299 95205f74, #279 d558689e; import wizards #267–274; member editor #206/#207/#208/#211; #224 be276378; #257 8cce7897; #263 b9ff22c2, #264 089da714, #256 71208ef6). Gateway flows inert in all QA environments.