Some checks failed
lint.yml / feat: attach a self-describing ticket card to the email (1.6.1-aio.10) (pull_request) Failing after 0s
The v1.6.1-aio.9 mail still scored 8.4/10 on mail-tester: the remaining
deduction was HTML_IMAGE_ONLY (1.8) — an HTML part whose only content of
note is a remote <img>. Remote images are also blocked by default in most
clients until the reader opts in, and a bare QR saved from that mail says
nothing about what it opens.
- New `qr.py` module (QR + logo helpers moved out of views_api) with
`render_ticket_card`: site title, event name, when/where, the branded
QR, name on ticket, ticket id and the door instruction, laid out with
the bundled DejaVu Sans; `format_event_when` gives "Fri 19 Feb 2027,
16:00 - 20:00"; filenames are `ticket-<event-slug>-<id8>.png`.
- `GET /events/api/v1/ticket-card/{ticket_id}` serves the same PNG
(anonymous, like the QR endpoint); the email's "Ticket image" link
now points there.
- The ticket email becomes multipart/mixed: text + HTML alternatives
(URLs as links, no <img>) plus the card as a PNG attachment, which
clients show inline at the end of the message and which works offline
at the door.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYwoAkZZmXMMmaBp4WGUBo
4 KiB
4 KiB
Events - LNbits extension
For more about LNBits extension check this tutorial
Sell tickets for events and use the built-in scanner for registering attendees
Events allows you to create tickets for an event. Each ticket is in the form of a unique QR code. After registering and paying, the user gets a QR code to present at registration/entrance.
Events includes a shareable ticket scanner, which can be used to register attendees.
Usage
-
Fill out the event information:
- event name
- wallet (normally there's only one)
- event information
- closing date for event registration
- begin and end date of the event
-
Use the built-in ticket scanner to validate registered, and paid, attendees

Guest checkout, card payments and email delivery (aio fork)
- Identity.
POST /events/api/v1/tickets/{event_id}accepts either an LNbitsuser_idor a guestname+email; auser_idticket may also carry anemailso logged-in buyers get their ticket mailed. - Payment methods.
extra.payment_methods(lightning,fiat) lists the rails an event accepts; an empty list keeps the legacy rule (Lightning always, fiat whenallow_fiat). The effective list is published on the NIP-52 event astickets_payment_methodsand enforced at purchase. - Return to the calling app. A client may send
frontend_url(its app root, e.g.https://app.example/events). Its origin must be one ofLNBITS_CORS_ALLOWED_ORIGINS, the LNbits base URL orLNBITS_CUSTOM_FRONTEND_URL, otherwise the request is refused. Under that root the extension builds the Stripesuccess_url(/events/{event_id}?checkout=success&tickets=<id,id>),cancel_url(/events/{event_id}?checkout=cancelled) and the emailed ticket link (/events/ticket/{ticket_id}). Absent, the LNbits host is used as before. - Stripe session. The buyer's email is passed as
customer_email(prefilled and locked on the hosted page); the line item is named after the event;event_id,quantityandticket_idsride along as metadata. - Email. Multipart text + HTML (links, no images) with the ticket card
attached — a self-describing PNG (site, event, when, where, QR with the
instance logo, name on ticket, ticket id) also served at
GET /events/api/v1/ticket-card/{ticket_id}; the bare QR stays atGET /events/api/v1/qr/{ticket_id}. Headers carry Date, Message-ID and a From display name (site title).POST /events/api/v1/tickets/{ticket_id}/resend-emailreturns aTicketResendResultwith per-channel outcome.
Powered by LNbits
LNbits is a free and open-source lightning accounts system.




