Client work · 2018–now · for KARM Thrift Stores

OnTrac

A point of sale made for the thrift industry.

KARM needed a point of sale built around the way thrift stores really work, with payments and gift cards built in, that plugged straight into ThriftTrac, the software they already sold to other stores. I built it in 2018, and eight years on I'm still building it.

Client
KARM Thrift StoresFour projects, 2016–2024
We built
iPad App, Rails Web App & API
With
Swift, Ruby, Rails, Sidekiq
The OnTrac register today: a six-line order on the left, with tax and $94.45 due, and a grid of category buttons, such as Clothing, Shoes and Furniture, on the right.
The OnTrac dashboard: four big tiles, a green Sale, a blue Refund, a purple Reprint and a red Lock, with Cashier @ Halls at the top.

The brief

A POS for thrift

KARM needed a POS tailored for the thrift industry, with integrated payment and gift card processing, that also plugged into their SaaS product, ThriftTrac™.

The challenge

Nothing off the shelf fitted

KARM Thrift Stores, the makers of ThriftTrac™, was in need of a point of sale that met the unique challenges of the thrift industry. KARM asked for guidance in evaluating the existing solutions on the market and whether any could work for their organization, and ultimately explored creating a tailor-made platform to integrate with ThriftTrac™.

What we made

An iPad app, made to measure

I built an iOS application for iPad that seamlessly integrated with the ThriftTrac™ platform, offered a simplified and intuitive experience for cashiers and customers, and uniquely addressed the problems competing solutions failed to solve when dealing with the thrift industry. It has been worked on every year since, through three card processors.

OnTrac in production, September 2026

  • 24.7 milliontransactions at the point of sale since 2018
  • $625 milliontaken at the register
A hand tapping large category buttons, such as Clothing and Linens, on the OnTrac iPad app

2018 · Discovery

First, make sure it needed building at all.

KARM approached me first to confirm that there wasn’t an existing product that fitted the unique needs of the thrift industry. Nothing did, so I set out to build a custom iPad application that tied into ThriftTrac, KARM’s software platform, and I defined the experience and the requirements for a point of sale that would suit not only KARM as an organization, but also every other customer of ThriftTrac.

KARM had little experience building software, so I walked Evan Crass and the team through the entire process, from discovery and design to development and launch.

OnTrac iPad app designs: a PIN login keypad, a sale screen with category buttons, and Sale, Refund and Lock menus

2018 · App design

Designed for ease of use, hands down.

I wanted an experience that cashiers and customers alike would find intuitive and pleasant, and that would keep the checkout fast. So the design has large buttons, bright, high-contrast colors, full-screen messages and a guided workflow, all to lower the training threshold for a cashier who may be a volunteer on their first shift.

It had to feel quick rather than cumbersome, while still supporting a variety of configuration options and even different iPad sizes.

A cashier opens a cash drawer under an iPad mounted on a store counter while a customer waits

2018 · Development

Builds in their hands as soon as features were done.

With a focused user experience defined by detailed user stories and high-resolution interactive designs, I delivered builds of the native iPad app, written in Apple’s Swift, to KARM as quickly as features were completed. The API it talks to was started in March 2018 and the app itself in May, and I announced OnTrac Point of Sale that September.

Delivering builds continuously meant I heard from KARM often and quickly, and could adapt to the tweaks and scenarios that discovery hadn’t turned up.

“We’re not software developers, and so it helps to have someone tell us how to make all the pieces fit together. We had an idea of what we needed, but they made it a reality, and that was the beauty of our partnership.”

Evan Crass, KARM Thrift Stores
Hands typing on a laptop showing the ThriftTrac web app's New Category form with Point of Sale settings

2018 · The web app and the API

Built on what KARM already had.

KARM markets ThriftTrac to thrift stores across the country to manage and analyze their performance, in an industry that is very data-poor. Offering OnTrac as a feature for existing ThriftTrac customers meant building on an existing customer base and on the data collection already in place, and gave store managers and executives one streamlined workflow.

I added functionality to the ThriftTrac web application, so that management can configure the POS to fit their organization and see live transactions and metrics. I also built an entirely new mobile API for the iPad app to talk to ThriftTrac with, so that I could scale and deploy it separately from the main web app. It runs on the same engine as ThriftTrac itself, which the ThriftTrac case study tells.

2018 · Launch

Launched, then straight on to cards.

I worked closely with KARM to research hardware options for cash drawers, payment processing and receipt printers, and to advise on how they could deploy a large fleet of devices to their stores using Mobile Device Management (MDM) and the Apple Volume Purchase Program (VPP).

OnTrac launched in 2018 without card payments. They were always on the roadmap, and I began work on them straight after launch, with Heartland Payments. The cashier could then sell store gift cards, redeem them, and take credit and debit cards, and store managers had much less end-of-day paperwork and reconciliation to do. It was all configurable, down to letting an organization opt out. Three months in, I wrote up the lessons from adding it.

2018 to today

Still being built, eight years on.

I started the iPad app in May 2018, and I’m still adding to it. The first two years were the busiest, building it and then putting the card payments in. After that came the odd feature, like manager approval for discounts and a round-up donation at the till in 2020, and otherwise keeping up with Xcode, iOS and the libraries underneath it.

2024 brought more work on BridgePay and a move of the app’s dependencies to Swift Package Manager, and 2026 the third card processor and everything that came with it. It keeps running on the iPads and printers KARM’s stores first bought for it.

2018 · 2022 · 2026

Three Card Processors

OnTrac has taken cards through three processors, one after another. Heartland came first, in the months after launch. In August 2022 I added BridgePay, which meant refactoring the iPad app and some of the API so that OnTrac could work with more than one payment gateway, each organization set up for the one it uses.

That groundwork is why the third was easier. I had started on Dejavoo in the last week of January 2026, and on 6 February a ransomware attack took BridgePay’s gateway offline across the US, so most of the organizations using OnTrac couldn’t take cards at all. Dejavoo went straight to the top of the list, and the whole story is on the blog.

Step through the three terminals here.

The Heartland card terminal on a desk: a PAX terminal with a keypad and a small screen, with a tangle of power and network cables and adapters coming off it.

Heartland, the first

The terminal was wired to the store’s network, and the iPad found it by its IP address and talked to it directly.

Terminal
PAX, hardwired
In the app
An Objective-C SDK, with its own network protocol
Heartland The most cables, and an SDK nobody was maintaining
The BridgePay card terminal on a desk: a PAX terminal with a keypad and a taller screen, with a single cable and a white power adapter.

BridgePay, from August 2022

A generic terminal, built to work in any industry that takes cards, with hundreds of options that made it very hard to configure properly.

Terminal
PAX, one cable
In the app
The first time OnTrac had to support more than one gateway
BridgePay Fewer wires, until the ransomware attack of 6 February 2026
The Dejavoo card terminal on a desk: a slanted terminal with a large screen and a keypad, and no cables at all.

Dejavoo, from February 2026

Dejavoo makes the terminal and the software behind it, so a store’s terminal arrives configured the same way as every other. It has a battery, and it needs only Wi-Fi.

Terminal
Dejavoo’s own, on battery
In the app
A cloud API, with no local connection to the iPad at all
Dejavoo Started the week before BridgePay went down
A timeline of OnTrac's card payments: Heartland in late 2018, BridgePay in August 2022, the BridgePay outage on February 6, 2026, and Dejavoo in February 2026, rolled out to all of KARM first and then every other organization

2026 · The rollout

One store first, then everyone.

Each organization now has its own Dejavoo configuration in the API, and the iPad reads it for the location it’s signed in to. I began with a single KARM store, and because of the outage I enabled it for all of KARM’s stores much faster than I normally would have. The other thrift store chains and their locations across the country followed shortly after.

The main problem wasn’t the software. It was getting enough Dejavoo terminals quickly enough: sourcing them, getting them in, configuring them, and shipping them back out to stores overnight. OnTrac and the platform it belongs to help hundreds of thrift stores take millions of dollars in card payments, so when they stop working it matters to a lot of people quickly.

Receipts

Paper that fits the paper.

Receipts and cash drawers run through Star printers, and the cash drawer opens through the printer it’s plugged into. The receipt is drawn as a bitmap the width of the paper, because a narrower one left a printer clipping its left edge, and the app waits for the printer to be ready and for the drawer to open before it prints anything.

Most of the care here is for the things that go wrong mid-sale. If the printer reconnects halfway through a receipt, the app ignores the stale “online” messages that arrive after it, instead of crashing, and if the receipt can’t be uploaded the cashier is held on a retry before choosing how the customer wants it.

A manager override: fields for a manager’s access code and PIN on pink, above a keypad, with the sale still showing on the left. A sale split across two payments: $20 in cash has been taken, a Cash Adjustments line of 0.02 rounds the cash to the nickel, and $17.70 is still due, with the Taking multiple payments switch on.

The cashier’s day

Cash is harder than it looks.

The cash drawer has two jobs in a sale: putting the customer’s cash in, and giving change back. The drawer can be asked to open at two moments too, on the payment screen and again once the whole sale is paid, and the second is easy to mistake for the first. The flag that asks for it means “this payment screen never opened the drawer,” not “this payment was cash.” I wrote every case out in plain language, with flow diagrams, in the app’s own docs, from a customer paying the exact amount in cash, where the drawer opens once and there is no cash back screen, to change owed, where a blue screen keeps the amount up until the cashier has finished making it.

Around that sits the rest of a till’s day. Some payment methods need a manager, who signs in over the cashier with their own code and PIN to approve them. A manager can take over another cashier’s drawer, but not without a location, and unlocking a drawer that wasn’t opened today asks for a deliberate OK. A sale can be split across tenders, with cash rounding that no longer strands a split sale, and a discount can be applied by category. The keypad, the PIN screen and the card result each give a small haptic tap, so the cashier can tell what the iPad did without looking at it.

Today

One Sale, Start to Finish

Here is a cash sale on the iPad app as it is today, screen by screen, from the first item to the thank-you. Tap the screen, or a step, to move through it.

The OnTrac register: six lines in the order on the left, such as 2 at 4.99 Clothing and 1 at 45.00 Furniture, with a subtotal of 86.46, tax of 7.99 and 94.45 due, beside a grid of category buttons from Clothing to Donations.
Ring up Each item is a category, a quantity and a price, all from big buttons.
A Round Up? prompt over the register asking whether the customer wants to donate $0.55 to round to the nearest dollar, with Skip and Donate $0.55 buttons.
Round up Before paying, the customer is offered the change to the next dollar as a donation.
The payment screen on green: $94.45 due, and buttons for Cash, Credit Card, Gift Card and five of the organization's own vouchers, with a switch for taking multiple payments.
Pay Cash, card, gift card, or one of the organization’s own vouchers, and a switch to split the sale.
The Tender Amount keypad showing $100.00 entered against a $94.45 balance, with quick buttons for $1, $5, $10 and $20.
Tender The cashier keys in what they were handed. Cash is rounded to the nearest nickel.
A full green screen reading TAKE $100.00 in CASH, with Cash Back: $5.55 along the bottom.
Take A whole green screen says what to put in the drawer, and what goes back.
A full blue screen reading Cash Back $5.55, with a check mark to finish.
Change The blue screen holds the change owed until the cashier has counted it out.
A green Thank You! screen, We appreciate your business, with Need a Printed Receipt? at the bottom.
Done The sale is recorded, and a printed receipt is a tap away if the customer wants one.

The Craft

One till, many hands

Each cashier signs in to the till with their own code and PIN, a manager can step in to approve what needs a manager, and every sale stays with the cashier and the store that made it.

Tested where it counts

The sums a point of sale can’t get wrong, from purchases, refunds and discounts to the card terminal’s answers, are covered by automated tests that run on every change, so the app can keep changing without putting anyone’s money at risk.

Delivery, automated

Delivery runs on fastlane, and everything from a release onwards is automated: each build is signed, built and sent to TestFlight on its own, and out to external testers, so feedback comes in from the people using it. I’ve set it all up to be as streamlined as possible, which means that even with only a small part of my time on OnTrac, KARM still gets the experience of working with a professional, enterprise-level software development firm.

A man in a Lotus shirt demonstrates a store checkout counter to a cashier while a videographer films
Watch the OnTrac filmThe KARM case study, on YouTube

More for KARM Thrift Stores

Four projects for KARM Thrift Stores

All the client work

2016 to 2024

  1. 2016 Still maintainedThriftTracBusiness software for thrift stores, and the platform the rest are built on. Read the case study
  2. 2018
    Still maintainedOnTracA point of sale made for the needs of the thrift industry, on iPad. You’re reading this
  3. 2020 No longer runningThrift Shopping NetworkLive, recorded and flash sales of donated treasures online, for the 2020 lockdown. Read the case study
  4. 2024 Still maintainedPricing GuideA shared price guide for thrift stores, on the iPads and Chromebooks in the store. Read the case study