Skip to content

Gate & check-in integration

At the Beach Club entrance, a member opens Check in in the FINNS app and shows a QR code. The gate scans it and asks core. Core answers granted or denied. The gate needs no member data and makes no network calls other than one. Gates are physical hardware supplied by a vendor; this section is the contract that hardware must meet.

People

GuestMember once signed in
StaffGuest services, admins

Touchpoints

FINNS PassApple/Google Wallet
Guest appFlutter (mobile app + web)
Booking websiteCTG
Gate scannerVendor TBD
Admin consoleSvelteKit

Trident platform

API
LoyaltyPoints ledger and membership
AssetsWallet balance, wristbands
AccessesGym
Relationships
ReservationsEvents
Transactions
Customer PII

Services

Guest identityKeycloak
Staff identityJumpCloud
Transactional emailAmazon SES
Payment gatewayAirwallex
POSShiji
PMSDaylight
Customer engagementSota Platforms
CDPInsider
flowchart LR
  classDef ours fill:#13686C,stroke:#0B4A4D,color:#ffffff
  classDef ext fill:#F3ECDF,stroke:#B9A88B,color:#12191B
  classDef person fill:#E9724C,stroke:#C55A37,color:#ffffff

  m(["Member"]):::person
  app["FINNS app<br/>one-time QR"]:::ours
  gate["<b>Gate</b><br/>QR scanner"]:::ext
  core["Trident core"]:::ours

  m --> app
  app -- "1 · get QR" --> core
  app -. "2 · shown on screen" .-> gate
  gate -- "3 · POST /check-ins {gateId, qr}" --> core
  core -- "4 · granted / denied (reason)" --> gate

You scan

An opaque text like FINNS1:…. You don’t decode it; you send it to core verbatim.

You send

One call per scan: {gateId, qr}, with the gate token.

You act

Open only on granted. Denied, errors and timeouts all keep the gate closed.

You hold

A gate token from FINNS, and your gate’s id ([a-z0-9-]{1,64}).

Internal and confidential. Share partner sections only as partner builds (pnpm build:partner).