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.
| Feature | Online | Offline |
|---|---|---|
| Card payment (tap/chip/PIN) | Yes | No |
| Display invoice/amount | Yes | Limited (last pushed) |
| Receipt printing | Yes | No (for new sales) |
| Terminal status check | Yes | No |
| Cash recording (app-side) | Yes | Yes (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.
// 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.
Practical patterns for connectivity-resilient POS systems:
// 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' };
}
This guide is part of the Paystack Terminal guide series.
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