Brendon Rice
Back to work

Foxera Terminal · iOS app

Taking card payments on the phone itself.

Foxera Terminal is the companion iPhone app for the Foxera booking platform. Staff take the payment on the same phone they carry, using Tap to Pay on iPhone, so there's no card machine to buy or reconcile.

ProjectFoxera Terminal
RoleDesign and build
TypeiOS app · card present
StatusLive
applelogo.png

The idea

The phone is the card reader.

Salons taking card payments usually have a separate terminal, which means another device to buy, charge and reconcile against the day's bookings. Tap to Pay on iPhone removes it: the client holds their card or phone near the top of the iPhone and the payment goes through Stripe, against the booking it belongs to.

The app itself is deliberately small. Staff log in once, the app connects and waits, and when someone takes a payment in the dashboard the amount appears on the phone ready to tap. Everything else — the sale, the receipt, the reporting — stays in the booking system.

No extra hardwareAn iPhone with Tap to Pay, and no card machine to reconcile separately.
Tied to the bookingThe amount is pushed from the dashboard, so takings line up with the day's appointments.
One screen to watchConnecting, ready, collecting, accepted or declined — each state named, never a bare spinner.
Built to Apple's rulesApple publishes a long list of requirements for Tap to Pay apps, and the build was worked through against them.

How it works

From opening the app to a paid booking.

01

Sign in and connect

Staff sign in with their Foxera account. The app gets a short-lived connection token from the booking system's API, then prepares and connects to the reader, showing what it's doing at each step. It reconnects by itself when the phone comes back from the background.

02

First run

On the first connection Apple's terms and account linking are presented by the Stripe SDK, followed by Apple's own instructions for holding a card to the phone. A help screen keeps that material available afterwards, and a first-launch splash explains what Tap to Pay is.

03

Waiting and collecting

Once connected the app sits on a green Ready screen and checks the booking system every second for a payment. When a checkout is started in the dashboard, the amount appears within about a second and collection begins. In testing, opening the app to a completed payment took around 20 seconds.

04

The outcome

A payment shows a clear accepted or declined result with the amount, then returns to Ready for the next one. The booking system sends the client a receipt either way, which is one of Apple's requirements.

05

When something's wrong

An iPhone that's too old or on an iOS version below 16.4 gets a screen explaining that, not a dead end. Crashes and handled errors are recorded with a trail of what happened beforehand, and shown on the next launch, which is what made the on-device problems findable at all.

06

Apple's requirements

Apple holds Tap to Pay apps to a specific checklist: how the app connects, which states it names on screen, the education it has to show, the devices it supports and the receipts it has to send. Each item was tracked through the build, and the first-run, returning-user and checkout flows were recorded and checked against what Apple asks to see.

Stack

What it's built with.

AppReact Native with Expo, TypeScript
PaymentsStripe Terminal SDK, Tap to Pay on iPhone
BackendFoxera's API for tokens and pending payments
iOS16.4 and up, A12 or newer, iPhone only
ReliabilityError boundary and crash reporting with breadcrumbs
DistributionBuilt with EAS for the App Store
Next project Foxera platform ↗
Or All work