What's New — June 22 to July 31, 2026¶
The biggest month in Revel's history: reserved seating, membership subscriptions, and season passes all shipped, the interface learned Spanish and Portuguese, and you can now embed your events on your own website. Here's the tour.
🪑 Reserved Seating & Venues¶
Revel now does full reserved seating, end to end — from drawing your venue to seated checkout and the box office.
- Venue designer for organizers: draw sector blocks, place and rotate the stage, lay out rows and seats, and paint seats with price categories. A coverage warning lists exactly which seats are still unpainted or unpriced, so you can't accidentally put an unpriced seat on sale.
- Interactive seat picker for buyers: a positional venue map with pan and zoom, per-seat prices, a price-category legend, and a live total — fully keyboard-accessible, and available to guests buying without an account.
- No double-booking, ever: selecting a seat places a short server-side hold, so two buyers can never claim the same seat. If someone grabs it first, you see the conflict immediately.
- Best-available mode: buyers can also just pick a price category and quantity and let the venue assign the best remaining seats (row-first scoring under the hood).
- Per-seat-category pricing: one ticket tier can carry different prices per seat category — tiers advertise their real min–max price range, and tickets record the actual price paid.
- Box office: door sales, comps, reseating, and assigning or overriding seats at check-in, with attendee debt rolled up per order.
- Demo seed data includes three showcase venues (a theatre, a comedy club, and a music hall) if you want to see it in action.
💳 Membership Subscriptions¶
Organizations can now sell recurring memberships — the whole pipeline, from tiers to Stripe to member self-service.
- Tiers and plans: create membership tiers under org admin → Members, each with an optional gating questionnaire and an optional approval step, and attach plans — monthly, yearly, one-off lifetime, or free.
- Subscribing: members pick a tier and plan and pay through Stripe's hosted checkout; free and lifetime plans activate without a payment step. The membership appears the moment payment confirms, no refresh needed.
- My memberships (
/account/memberships): every membership you hold, with plan, status, payment history, and change-plan / cancel / rejoin actions. - Applications & review: tiers can require approval — applicants answer the questionnaire, organizers review in a Requests tab and approve, reject, or force-approve. Approval and rejection notifications now reliably reach the applicant.
- Organizer visibility: a subscription metrics strip, a Subscription-payments tab, membership revenue folded into org financials, staff-side revival of a lapsed membership, and migration of existing subscribers onto a tier. Sale caps and pausing are supported too.
- Public membership page: tiers now live on their own
/org/[slug]/membershippage — and organizations can publish a refund policy and grace period (shown to prospective members before they pay). Membership tiers are also drag-to-reorder (display_orderon the tier API).
🎫 Season Passes¶
Sell a single pass covering every event in a series — with fair pricing that adjusts as the season progresses.
- Pro-rata pricing: the pass price automatically drops for each event that has already passed (
price − passed_events × pro_rata_discount), shown to buyers as a struck-through full price with "N of M events remaining". - Buyers get a My passes page with a pass-level QR code, coverage progress, and PDF + Apple Wallet downloads; pass-derived tickets are badged "Season pass" in My tickets.
- Passes support free claims, offline reservation (pay at the venue), and Stripe checkout — online purchases use a single payment split penny-exact across the covered events, honoring each tier's VAT rate.
- Organizers manage passes from a new Passes tab on the series dashboard (pricing, sales window, quantity cap, per-event tier mapping, holders list, offline confirmation), and can extend a pass to later-added events — active holders get the new event's ticket free.
- Cancelling one covered event refunds each holder's share of that event; the QR check-in scanner accepts season-pass codes directly.
🎟️ Events & Tickets¶
- RSVP notes: opt in per event ("Accept a note with RSVPs",
accept_rsvp_notes, off by default) to collect a short note with each RSVP — dietary info, "arriving late", anything up to 500 characters. Works for guest RSVPs too, and notes show up in your attendees list and staff notifications. - Attendance visibility controls: decide separately whether guests see the attendee count, the capacity, and the guest list — with one-click Open and Discreet presets in the event wizard and recurring templates. Anything withheld is genuinely absent from the API response, not just displayed as a zero.
- RSVP on behalf of an attendee: org admins can create or edit an RSVP for someone directly from the attendees list — handy for phone or walk-up RSVPs.
- Attendees can now change or withdraw an RSVP on a full event — capacity is only enforced when claiming a seat, so a "yes → no" frees the spot and triggers the waitlist for the next person in line.
- Two-step online checkout: Stripe purchases now reserve your spot first, then start payment as a separate step — so an on-sale rush no longer queues buyers behind each other's ~2.5s Stripe calls. Interrupted checkouts resume cleanly via Resume Payment.
- Duplicating an event now prefills the new start date (rolling past dates forward) and shifts the waitlist cutoff along with the other dates.
- The attendees list gained a multi-select RSVP status filter, and search results no longer show duplicates when a term matches multiple tags.
- Recurring events are now DST-correct: occurrences honor the recurrence rule's timezone, so a weekly 19:00 event stays at 19:00 across daylight-saving changes — existing non-UTC series were re-anchored automatically.
- The dashboard Upcoming RSVPs count now includes Maybe responses (previously Going only, hiding exactly the tentative RSVPs you're most likely to forget), with a URL-driven multi-select filter (All / Going / Maybe / Not going).
🌐 Embeds & Sharing¶
- Embed Revel on your own website: a filtered event list for your organization, a single event, or a series — via a one-line loader script or a plain iframe. Embeds honour
?theme=light|dark|auto, resize to their content, and ship no JavaScript to your page. - oEmbed support: pasting a Revel link into a supporting editor (many CMSs and forums) produces a live card automatically.
- Richer link previews: a versioned Open Graph share image, a square
og:logofor chat unfurls, and Markdown no longer leaks into search-result and social-share descriptions. - Invitation links got friendlier: the join pages now show which organization or event is inviting you (name, logo, tier), and an expired invitation is clearly distinguished from a used-up one (
410 Gonewith a machine-readablereason).
🗣️ Languages¶
- Spanish and European Portuguese: the whole interface — all ~7,900 strings — is now available in
esandpt, matching the languages Revel already emails in. The SEO landing pages have editions too. - Italian and German no longer fall back to English on ~480 strings each (account deletion, privacy settings, invitations, recurring events, waitlist messages…).
- Counted phrases now use each language's real plural forms — "3 persone si sono già unite" instead of an English "s" tacked onto a noun.
- German UI text is now gender-inclusive throughout (
Teilnehmer*innen), and the profile language menu finally lists every available language (French had been missing). - Dates speak your language too: every human-facing date now follows your chosen UI language with textual months everywhere, instead of browser-locale numeric dates — and first-time visitors no longer see the landing page flip from their language to English.
🎨 The Rebrand, Everywhere¶
- "Bubble" + Nata Sans shipped for everyone: lavender paper light mode, aubergine club dark mode, crimson heart accent, sticker-round corners, and the "let's revel." lockup — all color pairs pass WCAG AA contrast and color-blind separation checks.
- Branded emails and PDFs: every outbound email and generated document — invoices, credit notes, payout statements, tickets, revenue/VAT reports — restyled to the new brand. Tickets keep your organizer colors, adding only a subtle "Powered by let's revel." footer.
- Messages that were plain-text only (guest confirmations, invoice delivery, revenue reports) are now proper branded HTML.
🛠️ Under the Hood¶
- Backend runtime upgraded to Python 3.14; Django, anyio, httplib2, click, pyasn1, and pymdown-extensions all patched against known CVEs, and the frontend cleared a batch of high-severity dependency vulnerabilities.
- The staff admin panel got a major overhaul: ~30 list views optimized to stop per-row queries, richer filters and read-only audit fieldsets, and two admin-only security hardenings (escaped organizer-controlled names, superuser-only ownership transfer).
- Error responses across the API now have honest, documented schemas — what the OpenAPI spec says is what you actually get.
- GDPR data exports now use an explicit relation allowlist, so an export can never pick up third-party data.
- Search-engine crawl policy fixed: private areas (
/dashboard,/account, org admin) are disallowed for all crawlers again, and AI-training bots stay blocked. - Financial documents can no longer be silently lost: payout statements and attendee invoices record when their email was sent, surface delivery errors in the admin, and retry undelivered emails via a sweep; one failed payout email no longer aborts the rest of the batch.
- Telegram: banned users are blocked from the bot, and
/unsubscribenow actually stops notifications. - Self-hosting: a new interactive
bootstrap_admincommand (run by the setup wizard) creates the first superuser and organization on a fresh instance, and deploys now post a Discord notification when they go live. - Ops: production now pages on Stripe money-correctness counters, deploys only roll out (and announce) components whose image actually changed, vulnerability-scanner probes are dropped at the Caddy edge, and public brand assets allow cross-origin embedding.