McTaba Labs logo
Software EngineeringThe WhiteboardProjectsEventsMasterclassesWebinarsLearn
Book Call

500+ developers already in the community

Get answers, find accountability partners, and stay ahead

Join Discord →
McTaba Labs logo

Educating 1 million students in tech by 2030.

Programs

  • HighSchool Graduates Launchpad
  • AI & Business Automation
  • Corporate Training
  • McTaba Story & Mission
  • Full-Stack Curriculum
  • Course Pricing & Plans
  • Frequently Asked Questions

Resources

  • Join Discord Community
  • Tech Events in Nairobi
  • Masterclasses
  • Free Resources
  • Learn
  • Campus
  • Africa Tech Talent Report
  • Partner With Us
  • Start a Project
  • Our Work

Contact Us

  • 124 Manyani East Road, Lavington, Nairobi
  • +254727795603
  • Book a Discovery Call

Office Hours:

Mon-Fri: 9am - 2pm EAT

Sat: 10am - 12pm EAT

© 2027 McTaba Labs - A product of Edtech Industries. All rights reserved.

Privacy PolicyTerms of ServiceRefund Policy
  1. Learn
  2. Paystack for African Developers
  3. Offline Terminal Behaviour and Queued Transactions
Bonaventure OgetoBy Bonaventure Ogeto|Updated July 22, 2026

Offline Terminal Behaviour and Queued Transactions

Paystack Terminal requires internet connectivity to process card payments — it cannot authorize cards offline. When connectivity drops, the terminal enters a waiting state. Your POS app should detect the offline state, optionally fall back to cash, and retry any in-progress terminal requests when connectivity returns. Do not queue card transactions offline — they will not be processed until reconnected.

In this article

  1. 1. What Works (and Does Not Work) Offline
  2. 2. Detecting Terminal Offline State
  3. 3. Designing POS for Intermittent Connectivity
  4. 4. Learn More

What Works (and Does Not Work) Offline

FeatureOnlineOffline
Card payment (tap/chip/PIN)YesNo
Display invoice/amountYesLimited (last pushed)
Receipt printingYesNo (for new sales)
Terminal status checkYesNo
Cash recording (app-side)YesYes (your app, not terminal)

The Paystack Terminal is a cloud-connected device. Every card authorization goes through the payment network in real time. There is no offline authorization mode.

Detecting Terminal Offline State

// Poll terminal status before pushing a payment
async function checkTerminalStatus(terminalId) {
  var response = await fetch(
    'https://api.paystack.co/terminal/' + terminalId,
    { headers: { Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY } }
  );
  var data = await response.json();
  // data.data.status: 'active' | 'inactive'
  return data.data?.status === 'active';
}

// In your POS checkout flow
async function processPayment(terminalId, amount) {
  var online = await checkTerminalStatus(terminalId);

  if (!online) {
    // Offer fallback
    return { error: 'Terminal offline', fallback: 'cash' };
  }

  // Push to terminal
  return pushToTerminal(terminalId, amount);
}

// Your POS app should also watch for network connectivity
window.addEventListener('offline', () => {
  showAlert('Network disconnected. Payment terminal unavailable. Accept cash or wait for reconnection.');
});

window.addEventListener('online', () => {
  hideAlert();
  recheckTerminalStatus();
});

Get weekly developer tips

Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.

No spam. Unsubscribe anytime.

Designing POS for Intermittent Connectivity

Practical patterns for connectivity-resilient POS systems:

  • Dual connectivity: Connect the terminal to both Wi-Fi and a 4G SIM. Most Paystack Terminal devices support SIM cards. When Wi-Fi drops, the SIM activates automatically.
  • Cash fallback UI: Add a "Record cash payment" button that logs the sale locally without needing terminal connectivity. Sync to your backend when online.
  • Status indicator: Show a green/red dot in your POS UI reflecting terminal status. Poll GET /terminal/:id every 30 seconds during active sessions.
  • In-flight timeout handling: When you push a payment and the terminal goes offline mid-transaction, poll GET /terminal/:id/event for the action_id to check completion. Set a 60-second timeout before showing a "retry or use cash" prompt.
// Polling for in-flight terminal action
async function pollTerminalAction(terminalId, actionId, maxAttempts = 12) {
  for (var i = 0; i < maxAttempts; i++) {
    var response = await fetch(
      'https://api.paystack.co/terminal/' + terminalId + '/event/' + actionId,
      { headers: { Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY } }
    );
    var data = await response.json();

    if (data.data?.status === 'success') return { paid: true };
    if (data.data?.status === 'failed' || data.data?.status === 'timeout') return { paid: false };

    await new Promise(r => setTimeout(r, 5000)); // wait 5s between polls
  }
  return { paid: false, error: 'timeout' };
}

Learn More

This guide is part of the Paystack Terminal guide series.

Sign up for the McTaba newsletter

Key Takeaways

  • ✓Paystack Terminal is online-first. Card authorization requires a live connection to the payment network.
  • ✓The terminal cannot process cards offline — unlike some POS devices with offline PIN, Paystack does not support this.
  • ✓Design your POS app to detect terminal connectivity status and offer a cash fallback when offline.
  • ✓Transactions in-progress when connectivity drops will timeout — the customer must retry on reconnect.
  • ✓Use the GET /terminal/:id endpoint to poll terminal status and detect if a device is online.
  • ✓For high-connectivity-risk environments, deploy with a 4G/LTE SIM as a failover alongside Wi-Fi.

Frequently Asked Questions

Can Paystack Terminal process contactless payments without internet?
No. Contactless (tap-to-pay), chip-and-PIN, and magnetic stripe all require an active internet connection for authorization. The payment network verification happens in real time. There is no offline batch mode.
What happens to a transaction that was in-progress when connectivity was lost?
The terminal will display a "processing" screen until it times out. On timeout, the transaction is cancelled and no money moves. The customer must retry. Check your transaction history — no charge will appear for a timed-out transaction.
Does the Paystack Terminal have a built-in SIM?
Some Paystack Terminal models support SIM cards for mobile data connectivity. Check the spec sheet for your specific device model. Using a SIM as a connectivity fallback significantly reduces outage risk in areas with unreliable Wi-Fi.
How should I handle the cash fallback in my inventory system?
Record cash sales in your POS app with a different payment_method: "cash" flag. Store them locally if offline, sync when back online. Inventory should decrement the same way as card sales. Your daily reconciliation should balance card terminal receipts against Paystack dashboard totals, and cash sales against your cashbox count.

Learn Paystack Integration

KES 2,999

The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.

Start Paystack Course

Not ready? Create Free Account

Keep reading

Paystack Terminal and In-Person Payments: Complete Guide

Paystack Terminal lets you accept card payments at a physical location using Paystack POS devices. You push a payment request from your server to the terminal, the customer taps or inserts their card, and you get a webhook when it succeeds. This guide covers the full integration.

Read more

Terminal Invoice Payments via API

When a customer walks in with an invoice to pay, your system needs to push the exact invoice amount to the terminal, track which invoice the payment covers, and mark it as settled once the card payment completes. This guide covers the full flow: from invoice lookup to terminal push to webhook reconciliation.

Read more

Building a Terminal App with React Native

If your team already knows React, React Native is the fastest path to a native POS app. This guide shows you how to structure a React Native terminal app, communicate with your backend, manage payment state, and design a tablet-first interface that cashiers can operate under real-world conditions.

Read more

Restaurant Ordering and Terminal Payment Flow

Restaurant payment flows are different from retail. Orders change after they are placed (added dessert, extra drinks). Bills split between customers. Tips are added after the meal. This guide shows you how to build a restaurant ordering system that works with Paystack Terminal for the final payment step.

Read more

Paystack Gateway Responses: Reading What the Bank Told You

When a payment fails on Paystack, the gateway_response field tells you exactly what the bank said. Approved. Declined. Insufficient Funds. Timeout. This guide decodes the most common gateway responses, explains what they mean for your integration, and shows you how to turn cryptic bank codes into messages your customers can act on.

Read more

Explore related topics

M-Pesa & African Stack

M-Pesa Daraja API tutorials, USSD development, and WhatsApp Business API guides. The African Stack that global bootcamps do not teach.

Learn to Code in Kenya

Everything a Kenyan needs to know before writing their first line of code. Career paths, real costs, hardware requirements, and honest answers about what it takes.

Learning to Code

Roadmaps, language guides, and practical advice for learning to code and launching a programming career.

Breaking Into Tech

Practical, no-nonsense guides for anyone looking to start or change their career in tech. From choosing your first language to acing interviews.

The African Stack: Skills for This Market

The skills that make Kenyan developers hard to replace: M-Pesa, USSD, WhatsApp, fintech, and building for the African market.

Bonaventure Ogeto

Bonaventure Ogeto

Founder, McTaba Labs

Bonaventure is the founder of McTaba Labs, a coding bootcamp in Nairobi, Kenya. He has spent years building products for the African market and mentoring the next generation of developers across the continent.