Klenvox
Back to blog
7 April 20266 min readPaystackPaymentsNigeriaTechnical

Paystack for Course Payments: The Complete Setup Guide

How to accept course payments with Paystack, set up installments, handle refunds, verify transactions, and avoid the most common mistakes Nigerian course creators make.

By Klenvox Team

Paystack is the default payment processor for Nigerian course creators. If you're accepting Naira from students in Nigeria, you will use Paystack (or Flutterwave, but Paystack is more common for course businesses). This post covers setup, installments, fees, refunds, and the gotchas nobody tells you.

Why Paystack for courses

Paystack wins for Nigerian schools because:

  • Naira native: no FX conversion losses on local students
  • Bank transfer + card + USSD: covers every Nigerian payment method
  • Instant settlement on most accounts (T+0 or T+1)
  • Installments via subscriptions API: real payment plans, not manual tracking
  • Good developer documentation: if you're building or integrating, their docs are solid
  • Business account required: CAC-registered businesses only, which is good for legitimacy

Alternatives: Flutterwave (works, similar fees, slightly different dashboard), Stripe (only if you're charging in USD for international students).

Setup: the 20-minute path

If you're starting from zero, here's the sequence:

  1. Register your business with CAC (Business Name or LTD). You cannot onboard Paystack for courses as a personal account.
  2. Open a business bank account. Most Nigerian banks will do this online for CAC-registered businesses.
  3. Sign up at paystack.com with your business email.
  4. Submit KYC documents: CAC certificate, director's ID, utility bill, bank statement. Approval takes 1-5 business days.
  5. Generate your API keys (test and live) in the dashboard.
  6. Connect Paystack to your course platform via API key or native integration.

If your platform supports Paystack natively (Klenvox does), step 6 is entering two API keys into a settings page. If you're building from scratch, it's a multi-day integration.

Understanding the fees

Paystack's fees as of 2026:

  • Local cards: 1.5% per transaction, capped at ₦2,000 per transaction
  • International cards: 3.9% + ₦100 per transaction
  • Bank transfers: 1.5% capped at ₦2,000
  • USSD: 1.5% capped at ₦2,000

Plus:

  • Settlement fee: typically free within Paystack's standard accounts
  • Withdrawal to your bank: free daily transfer for most account tiers

What this means for pricing:

  • On a ₦100,000 course sale, Paystack takes ₦1,500 (capped at ₦2,000 so effectively ₦1,500).
  • On a ₦500,000 course sale, Paystack takes ₦2,000 (the cap).
  • On a ₦15,000 course sale, Paystack takes ₦225.

This is cheap compared to global processors. Build your pricing around it.

Installments with Paystack Subscriptions

For courses above ₦50,000, installments significantly boost conversion. Here's how to set them up:

Option 1: Paystack Plans + Subscriptions (recommended)

  1. Create a "Plan" in Paystack dashboard with the installment amount and interval (e.g., ₦50,000 every 30 days, 3 times)
  2. When a student enrolls, create a subscription on that plan
  3. Paystack automatically charges on each interval
  4. You get a webhook on each successful (or failed) charge

Option 2: Split payments on one transaction Paystack supports "split payments" where a single transaction pays multiple amounts to different accounts. Useful if you share revenue with instructors or partners.

Option 3: Manual multi-charge (don't do this) Some schools just send students 3 separate payment links a month apart. Bad idea: students forget, you chase, some default, accounting is chaos.

Use real subscriptions. Your platform should handle this automatically.

Webhooks: the part everyone gets wrong

When a student pays, Paystack sends a webhook to your server. Your server must:

  1. Verify the webhook signature using your secret key and an HMAC-SHA512 hash of the raw body
  2. Look up the transaction in Paystack to confirm the amount and status (don't trust the webhook payload alone)
  3. Update your student's enrollment status to "active"
  4. Return 200 immediately (even before processing)
  5. Process the real work asynchronously (send welcome email, trigger certificate, etc.)

The #1 mistake: trusting the webhook payload without verification. Attackers can fake webhook calls to your endpoint. Always verify the signature.

Sample verification in Node.js:

const crypto = require('crypto')

function verifyPaystackWebhook(req) {
  const hash = crypto
    .createHmac('sha512', process.env.PAYSTACK_SECRET_KEY)
    .update(JSON.stringify(req.body))
    .digest('hex')
  return hash === req.headers['x-paystack-signature']
}

If your platform handles Paystack webhooks for you, confirm they're doing verification. Most do; some don't.

Refunds the right way

Paystack supports full and partial refunds via API or dashboard. Refunds take 5-10 business days to hit the student's card.

Your refund policy should be:

  • Published clearly on your pricing page and checkout
  • Time-bound (typically 7 days from enrollment, before they've consumed significant content)
  • Conditional on content consumed (if they've completed 50%+ of lessons, no refund)
  • Processed within 48 hours of the request to maintain trust

Bank transfer refunds are trickier because Paystack doesn't fully automate them. You'll often need to manually wire the money back. Document this in your refund policy.

Common mistakes

1. Going live with test keys. Paystack test keys accept fake card numbers (4084084084084081). If your live environment uses test keys, students will "pay" but no real money moves. Always double-check which keys are active.

2. Not validating amounts server-side. A student could modify the checkout page to change the price. Always verify the paid amount matches what you expected in the webhook handler.

3. Forgetting to handle failed subscription charges. If a student's card fails on installment 2 of 3, Paystack notifies you. Your platform needs to pause access or trigger a dunning flow.

4. Mixing currencies without realizing it. If you accept international cards, students can be charged in USD. Your reporting needs to handle both currencies or you'll have accounting chaos.

5. Not reconciling Paystack settlements with bank deposits. Paystack shows you transactions in the dashboard. Your bank shows you deposits. They should match. Reconcile weekly or you'll miss discrepancies.

Multi-tenant schools: per-school Paystack keys

If you're running multiple schools (or building a platform like Klenvox), each school needs its own Paystack account. Why:

  • Each school's revenue goes directly to their bank, not through you
  • Each school has its own dashboard and reporting
  • You avoid becoming a money transmitter (legally complicated)
  • Tax reporting is cleaner (each school is its own tax entity)

On Klenvox, each school enters their own Paystack keys in their settings. Payments go directly to them. The platform only earns from the SaaS subscription, not from course revenue.

What to do this week

If you're setting up Paystack for the first time:

  1. Register your business with CAC (if not done)
  2. Sign up at paystack.com and start KYC
  3. Integrate with your platform (or confirm your platform already supports Paystack)
  4. Test with Paystack test mode using their test card numbers
  5. Switch to live mode only after end-to-end testing works

Once live, you can accept your first payment within hours.


Klenvox has Paystack built in with per-school keys, automatic installments, webhook verification, and refund support. Set up your school with Paystack in minutes.