No description
- Python 69.3%
- Vue 15.8%
- JavaScript 14.6%
- Makefile 0.3%
|
Some checks failed
lint.yml / chore(release): v1.6.8-aio.2 (push) Failing after 0s
Two wave fixes found while checking whether the webapp had been updated for v1.6.8. - #65 keep ticket waves when a client edits an event without them. A client that rebuilt the `extra` envelope rather than round-tripping it destroyed every wave: the list arrived empty, a single primary wave was synthesized from the event-level `amount_tickets`, and a multi-wave event silently collapsed into one tier. `promo_codes` had carried the same guard since the v1.6.8 merge; `ticket_waves` is the same class of organiser state and now carries it too. - #66 expose `ticket_waves` on public event responses. A buyer cannot choose a tier without its id, and nothing public carried one — the NIP-52 tags describe the active wave but name no id. Waves move to `EventExtraBase`, leaving promo codes as the only organiser-private field in `extra`. Buyers can now see upcoming tiers and their prices, which is what #61 recorded as the cost of the flat-tag decision. No schema change; both are model/serialisation only. Verified against bohm's dev LNbits before tagging: the exact PUT that collapsed a two-wave event now leaves both intact with the roll-up unchanged, the public endpoint carries the waves while still hiding promo codes, and a webapp-shaped edit that writes through to the primary wave takes effect (139 = 99 + 40) where it was previously discarded. #66 is a prerequisite for aiolabs/webapp#176, which is merged to dev and needs this deployed before its wave picker works for anyone but the organiser. |
||
|---|---|---|
| .github/workflows | ||
| docs | ||
| nostr | ||
| static | ||
| tests | ||
| .gitignore | ||
| .prettierrc | ||
| __init__.py | ||
| config.json | ||
| crud.py | ||
| description.md | ||
| LICENSE | ||
| Makefile | ||
| manifest.json | ||
| migrations.py | ||
| migrations_fork.py | ||
| models.py | ||
| nostr_hooks.py | ||
| nostr_publisher.py | ||
| nostr_sync.py | ||
| nostr_timestamp.py | ||
| package-lock.json | ||
| package.json | ||
| promo.py | ||
| pyproject.toml | ||
| qr.py | ||
| README.md | ||
| services.py | ||
| tasks.py | ||
| toc.md | ||
| transport_rpcs.py | ||
| uv.lock | ||
| views.py | ||
| views_api.py | ||
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. - Promo codes.
extra.promo_codes(code,discount_percent,active,max_uses;used_countis derived from paid tickets) are organizer-only: they are never part of public responses. Buyers preview a code withPOST /events/api/v1/promo/validate/{event_id}({codes, quantity}→ v2-shapedBasketTotals+currency); purchase enforcesactiveandmax_uses(each ticket of a multi-ticket purchase consumes one use) and rejects bad codes with a distinctdetail. Updates that omitextra.promo_codeskeep the stored list. - 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.




