How to issue reward cards via API in Nigeria — a step-by-step guide
A practical guide for developers and product teams integrating programmatic reward card issuance into Nigerian platforms. Covers trigger design, Naira denomination, delivery channel selection, and the failure modes that will bite you if you skip them.
Nigeria is the largest reward market in sub-Saharan Africa by both population and B2B programme volume. FMCG brands, fintechs, betting platforms, banks, telecoms, and employers are all issuing rewards at scale — or trying to. The technical integration is straightforward when you understand the market-specific considerations. When you don't, you get high issuance rates and low redemption, and you spend three weeks debugging something that wasn't a code problem.
This guide walks through the complete integration — from designing your trigger events to delivering a Naira-denominated reward card to a Nigerian recipient's WhatsApp or USSD session.
Step 1 — Design your trigger events before you write a line of code
The most common integration mistake is treating the API call as the starting point. It isn't. The starting point is a precise definition of what event should trigger a reward, for which recipient, of what value, in which format.
Get this wrong and you'll either over-issue (giving rewards for actions that don't warrant them, burning budget) or under-issue (missing qualifying events because your trigger logic has edge cases). Both are expensive.
For each reward trigger in your programme, define:
The qualifying event
Purchase confirmed, bet settled, milestone reached, referral activated, survey submitted — be specific. 'Purchase' is not specific enough. 'First purchase above ₦5,000 on a qualifying SKU, confirmed by payment gateway webhook' is.
The recipient identifier
Phone number is preferred for Nigerian programmes. Most delivery channels (USSD, WhatsApp, SMS) route on phone number. Email works for corporate employee programmes but reaches fewer people reliably.
The reward value and currency
Always NGN. Never USD with conversion. ₦2,000, ₦5,000, ₦10,000 — set the value in Naira at the moment of issuance.
The reward category
Grocery, electronics, fashion, connectivity, beauty, food, fuel — the category determines which brands the recipient can choose from at redemption.
The delivery channel
WhatsApp for smartphone users, USSD for any phone, SMS for confirmation. Decide based on your recipient profile.
Deduplication logic
What prevents the same event from triggering twice? Payment gateway retries, duplicate webhooks, and race conditions will fire your trigger more than once if you don't handle them.
Step 2 — Authentication and environment setup
The QIFTS API uses bearer token authentication. Every request includes your API key in the Authorization header. Use separate keys for your test and production environments — this sounds obvious but causes real production incidents when test keys accidentally go live.
// Environment variables — never hardcode keys
QIFTS_API_KEY=qf_live_xxxxxxxxxxxxxxxx
QIFTS_BASE_URL=https://api.qifts.com/v1
// Request headers — every call
{
"Authorization": "Bearer qf_live_xxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Idempotency-Key": "your-unique-event-id" // critical
}Idempotency keys are not optional
Every reward issuance request should include an Idempotency-Key header — a unique identifier for that specific event. If your server retries a failed request, or your webhook fires twice, the API will return the original response instead of issuing a second reward. Use your internal event ID or a UUID generated at the moment the qualifying event occurs.
Step 3 — The issuance call
The core API call is a POST to /v1/rewards/issue. For a Nigerian programme, the payload looks like this:
// Request
{
"recipient": {
"phone": "+2348012345678", // E.164 format, NG country code
"name": "Chidinma A." // optional — personalises delivery message
},
"reward": {
"value": 5000,
"currency": "NGN", // always NGN for Nigerian programmes
"category": "grocery", // grocery | electronics | fashion |
// connectivity | beauty | food | fuel
"expires_days": 90 // 30, 60, or 90 — default 90
},
"delivery": {
"channel": "whatsapp", // whatsapp | ussd | sms | web
"language": "en" // en | yo | ig | ha (Yoruba/Igbo/Hausa)
},
"programme": {
"id": "prog_fmcg_q2_2026",
"trigger": "purchase_confirmed",
"reference": "order_88211bc" // your internal event ID
}
}
// Response
{
"reward_id": "rwd_NG_9f3k2m",
"status": "issued",
"recipient": "+2348012345678",
"value": 5000,
"currency": "NGN",
"category": "grocery",
"delivery": {
"channel": "whatsapp",
"status": "delivered",
"delivered_at": "2026-06-01T14:23:01.441Z"
},
"redemption": {
"code": "QFT-8821-NG",
"expires_at": "2026-08-30T23:59:59Z",
"brands": ["Shoprite Nigeria", "Spar Nigeria", "Justrite", "+6 more"]
}
}Language localisation
Nigeria has three major language groups beyond English — Yoruba (Southwest), Igbo (Southeast), and Hausa (North). If you know your recipient's language preference from your own user data, pass it in the delivery object. The WhatsApp and SMS message will be delivered in that language. Recipients who receive reward notifications in their own language redeem at measurably higher rates.
Step 4 — Handling the webhook response
Rather than polling for reward status, configure a webhook endpoint to receive delivery and redemption events. The QIFTS platform pushes events to your endpoint the moment a status changes.
// reward.delivered — fires when WhatsApp/SMS confirmed delivered
{
"event": "reward.delivered",
"reward_id": "rwd_NG_9f3k2m",
"programme_reference": "order_88211bc",
"delivered_at": "2026-06-01T14:23:01Z",
"channel": "whatsapp"
}
// reward.redeemed — fires when recipient uses code at a brand
{
"event": "reward.redeemed",
"reward_id": "rwd_NG_9f3k2m",
"redeemed_at": "2026-06-02T09:11:22Z",
"brand": "Shoprite Nigeria",
"value_redeemed": 5000,
"currency": "NGN"
}
// reward.expired — fires if not redeemed before expiry
{
"event": "reward.expired",
"reward_id": "rwd_NG_9f3k2m",
"expired_at": "2026-08-30T23:59:59Z"
}Your webhook handler should return HTTP 200 within 5 seconds. If it doesn't, QIFTS will retry with exponential backoff. Make your handler idempotent — it may receive the same event more than once.
Step 5 — Nigeria-specific failure modes to handle
These are the issues that show up in Nigerian integrations specifically and aren't covered well in generic API documentation.
Phone number format inconsistencies
Nigerian phone numbers appear in at least four formats in databases: 08012345678, 8012345678, +2348012345678, and 2348012345678. The API expects E.164 format (+234...). Normalise all phone numbers to E.164 in your preprocessing layer before calling the API — do not rely on the API to handle format variations.
WhatsApp delivery failures and USSD fallback
Not every Nigerian phone number is registered on WhatsApp. If WhatsApp delivery fails (the number isn't registered, or the user has blocked business messages), your integration should automatically fall back to USSD notification + SMS confirmation. Configure this in your delivery preferences rather than handling it in your application code.
Network operator mapping
Nigerian numbers are prefixed by network operator — MTN (0803, 0806, 0813, 0816), Airtel (0802, 0808, 0812), Glo (0805, 0807, 0815), 9mobile (0809, 0817, 0818). If your programme has network-specific promotions or you're issuing airtime rewards to a specific operator, parse the prefix. The API can return the network operator in the recipient object if you request it.
Naira value perception thresholds
Based on programme performance data, there are effective minimum values below which Nigerian recipients don't bother redeeming. For grocery: ₦1,000 minimum. For electronics: ₦3,000 minimum. For experience or premium categories: ₦5,000 minimum. Below these thresholds, the effort of redemption exceeds the perceived value. Size your rewards accordingly — five ₦500 rewards issued over a month will outperform one ₦2,500 reward delivered at month end, but ten ₦200 rewards will underperform both.
Step 6 — Testing your integration
Use the QIFTS sandbox environment for all testing. The sandbox behaves identically to production but routes delivery to a test phone number you configure. Run through these scenarios before going live:
- →Happy path: qualifying event fires, reward issued, WhatsApp delivered, recipient redeems
- →Duplicate event: same idempotency key sent twice — confirm only one reward issued
- →Invalid phone number: confirm your normalisation handles all four NG formats
- →WhatsApp fallback: set test phone to non-WhatsApp number — confirm USSD notification fires
- →Webhook delivery failure: return 500 from your endpoint — confirm QIFTS retries
- →Expiry: issue a test reward with 1-day expiry, confirm expiry webhook fires
Before you go live
Run a manual end-to-end test with a real Nigerian phone number in your staging environment. The experience of receiving a WhatsApp reward notification, clicking through to the redemption microsite, and choosing a Shoprite reward card will tell you more about your integration than any unit test.
Full API reference
QIFTS API documentation — complete endpoint reference
Authentication, all endpoints, webhook events, error codes, and SDK references.
Nigeria market guide
Nigeria reward cards — 24 categories, local brands, ₦ denomination
The full catalogue of brands and categories available for Nigerian reward programmes.