In-person card sales: Stripe Terminal reader ("terminal" payment method) and tap-to-pay #39

Open
opened 2026-09-06 17:55:16 +00:00 by padreug · 0 comments
Owner

Wanted for events: hand the organizer's phone to a buyer, they enter their email, then tap a card to pay.

Findings (2026-09-06)

  • Tap to Pay on Android/iPhone exists only in Stripe's native Terminal SDKs (Android, iOS, React Native). The Terminal JavaScript SDK supports smart readers only, so a PWA cannot turn the phone into a contactless reader.
  • Works today with zero code: open the guest checkout (#36) on the organizer's phone, hand it over, buyer types name + email, then pays on Stripe's hosted page with Apple Pay / Google Pay or by typing the card.
  • lnbits already has the server side for readers: fiat_method: "terminal" creates a card_present PaymentIntent and can process_payment_intent on a reader_id (upstream #3678), plus POST /api/v1/fiat/stripe/connection_token.

Proposal

  1. payment_method: "terminal" in api_ticket_create: extra["fiat_method"] = "terminal", extra["terminal"] = {"reader_id": …} from an organizer setting; a "Collect on reader" button in the scan/sell view; settlement via the existing payment_intent.succeeded webhook. Needs a Stripe smart reader (WisePOS E / S700).
  2. Phone-only tap-to-pay: a small React Native wrapper around the events standalone using the Terminal RN SDK. Separate, larger.
Wanted for events: hand the organizer's phone to a buyer, they enter their email, then tap a card to pay. ## Findings (2026-09-06) - **Tap to Pay on Android/iPhone exists only in Stripe's native Terminal SDKs** (Android, iOS, React Native). The Terminal **JavaScript SDK supports smart readers only**, so a PWA cannot turn the phone into a contactless reader. - Works **today with zero code**: open the guest checkout (#36) on the organizer's phone, hand it over, buyer types name + email, then pays on Stripe's hosted page with Apple Pay / Google Pay or by typing the card. - lnbits already has the server side for readers: `fiat_method: "terminal"` creates a `card_present` PaymentIntent and can `process_payment_intent` on a `reader_id` (upstream #3678), plus `POST /api/v1/fiat/stripe/connection_token`. ## Proposal 1. `payment_method: "terminal"` in `api_ticket_create`: `extra["fiat_method"] = "terminal"`, `extra["terminal"] = {"reader_id": …}` from an organizer setting; a "Collect on reader" button in the scan/sell view; settlement via the existing `payment_intent.succeeded` webhook. Needs a Stripe smart reader (WisePOS E / S700). 2. Phone-only tap-to-pay: a small React Native wrapper around the events standalone using the Terminal RN SDK. Separate, larger.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiolabs/events#39
No description provided.