A POS with Stripe and Airtable?

Learn how to use Stripe Terminal to accept in-person payments from Charles Watkins.



Getting Started with Stripe Terminal

We’ve built several workflows using Stripe Payment links. In this livestream Dev Rel at Stripe Charles Watkins (@charlesw_dev) showed me how to take in-person payments using Stripe Terminal.

About Stripe

Stripe’s offerings enable businesses to accept payments in a myriad of ways: From one-time payments to recurring subscriptions and from online to in-person. The various options are interoperable, so Stripe is a solid platform that works with a business as it grows and changes. A new business could start online only with Payment Links and then add Stripe Terminal for processing payments at a brick-and-mortar store, pop-up, etc.

Who this video is for and what you’ll learn

In this intermediate-level stream, Charles and I build a workflow for processing in-person payments for a hypothetical hamburger restaurant. The Airtable base and scripts used are available so beginners can take advantage of the content too.

Payment Links and Terminal share similar constructs, making prior knowledge of Stripe Payment Links helpful.

Screenshot showing "Approved" message on Stripe Terminal
Stripe Terminal displaying an “Approved” message following a successful test of the workflow

How to follow along

To follow the featured workflow, you will need accounts on the following services:

To jump start your building, the following resources are available:

Tip: Be sure to add in your API keys, Stripe Terminal ID and other variables when using the scripts.

Let’s get into it

Step 1: Create Our Airtable Base (14:08)

For this workflow, Airtable stores all information and services as a point-of-sale interface. We started with five tables and added additional fields and relationships throughout the stream.

The base includes the following tables:

  • Point-of-Sale: This is our point-of-sale interface that will be used for adding and removing items from a customer’s cart.
  • Line Items: This is a breakdown of what was in each order and includes linked records to “Orders” and “Products”.
  • Orders: This table holds all transactions with status. It is used to connect payments received with what was purchased. The ID field serves as a primary key for finding data within Stripe.
  • Products: This table contains what we are selling with one row per product. In the case of a non-profit, this could alternatively be donations. While we did not create products in Stripe for the stream, one would likely want to do so for a real business scenario for improved dashboard reporting. It also opens up options for subscriptions.
  • Readers: Data on Stripe Terminal device used in the workflow.
Screenshot of "Point-of-Sale" Airtable base
Point-of-Sale Table shown partway through stream
Screenshot of Airtable base showing how to do a lookup
Adding a lookup to the Line Items table. Additional fields for converting the price to dollars, capturing number of items sold, and total price were added later.

Tip: If your Stripe configuration is set to US Dollars, you will be seeing amounts shown in pennies. Add a formula field to convert the value to dollars.

Screenshot showing how to set up a rollup field in Airtable
Adding a rollup to Orders to obtain the Total Price from the Line Items table.

Step 2: Set Up Stripe Payment Terminal (17:04)

While in test mode, I went from the Dashboard in Stripe to Readers to configure the Terminal. The serial ID is used as part of API calls and scripts.

Screenshot of Stripe Terminal page
Looking at information about the hardware on the Stripe's website

Step 3: Add in buttons to capture payment and cancel transactions (28:05)

You are likely familiar with tapping, swiping, or inserting a credit card into a physical piece of hardware to make a purchase. As a consumer, the process appears as if one workflow. Behind the scenes, it’s actually multiple steps.

The first step is sending the payment to the terminal (aka reader). This is called a payment intent and it represents a customer intending to make a purchase and includes the amount.

Once the system knows about the purchase, the appropriate credit card network is contacted for authorization. It’s at this point that a payment is pending.

The second step is taking the payment intent and sending it to the reader using the terminal API.

As you work with the Stripe APIs, you’ll see varying status messages to reflect the different parts of the process:

  • Send to Terminal: Created
  • Capture: Completed
  • Cancel: Canceled

We used Airtable buttons with scripts to cause our order to go to the Terminal and then to send data to Stripe.

Screenshot showing how to set up an Airtable script
Configuring a button to run the capture payment script. Copies of the scripts are in the “How to Follow Along” section.

Step 4: Set up the POS Dashboard (33:27)

We then set up the Point-of-Sale Dashboard to prompt the Stripe reader to shift to its payment acceptance screen to collect payment.

Screenshot configuring the point-of-sale dashboard
Setting up the POS Dashboard to handle checking out

Additional Tips

Check the YouTube chapter descriptions for extending the workflow with webhooks, adapting the scripts, and adding in receipts.

Ready to accept in person payments with Stripe Terminal? Let me know what you build!

Key takeaways

Similar streams