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.

📥 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).

✨ Enhancements

#ChangeWhat to verify on stage
#266–#270Event Registrant Import — 4-step admin wizard (upload CSV → map columns → preview with classify / capacity / dedup → commit), async commit + ticket/QR confirmation email (incl. lapsed-member handling).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).
#271–#274Event Response Import — CSV parser + question-mapping resolver, email↔registration matching preview, commit + key-level response merge writer, and the org-portal "Import Responses" wizard.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)

#FixWhat to verify on stage
#299 closed todayImport 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 todayImported 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 / #276Wizards 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)

#FixWhat to verify on stage
#279 closed todayRegistration 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 todayregistrationClosed / isAttendeeListPublic not reflected after refreshEventDetailPanel 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 / #221Create-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.

#ChangeWhat to verify on stage (admin portal)
#201 / #206Cross-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.
#207Member membership detail page (/members/:tenantId/:memberId).Open a search result → the member's membership detail page loads.
#202 / #208Edit 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 / #209Change membership type (billing-neutral).Edit Membership → change type → saved, no invoice/charge generated.
#204 / #210Set / renew expiry (billing-neutral; explicit date or extend-period).Edit Membership → set or extend expiry → membershipExpiresAt updates without billing.
#205 / #211Reactivate 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

#ChangeWhat to verify on stage
#224Segment 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.)
#257Public 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

#FixWhat to verify on stage
#263Treasury 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.
#264Treasury 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).
#256Member 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

  1. New features: Event Registrant/Response Import (incl. #299/#309/#275/#276 fixes); super-admin Member Editor (#201–211).
  2. Event fixes: #279 (deadline), #310 (close-registration display), #220/#221 (sidebar) — and confirm #280 is still broken.
  3. Communications: #224 segments, #257 public unsubscribe.
  4. Finance: #263/#264 treasury, #256 mobile responsiveness.
  5. 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.