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. Building a Freelance Marketplace on Paystack
Bonaventure OgetoBy Bonaventure Ogeto|Updated July 22, 2026

Building a Freelance Marketplace on Paystack

Collect the full project amount from the client. Hold the freelancer's share using a subaccount with manual settlement enabled. When the client approves the work, call POST /settlement/initiate (or trigger transfer from your balance) to release funds to the freelancer. Your platform commission is the percentage not allocated to the subaccount. Handle disputes by withholding settlement until resolved.

In this article

  1. 1. Hold Freelancer Payment on Charge
  2. 2. Release After Client Approval
  3. 3. Learn More

Hold Freelancer Payment on Charge

// Client pays for a project
app.post('/api/projects/:id/pay', async (req, res) => {
  var project = await db.projects.findById(req.params.id);
  var freelancer = await db.freelancers.findById(project.freelancer_id);
  var commissionRate = 0.10; // 10% platform commission
  var freelancerShare = Math.round((1 - commissionRate) * 100); // 90%

  var reference = 'proj_' + project.id + '_' + Date.now();

  var response = await fetch('https://api.paystack.co/transaction/initialize', {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      email: req.user.email,
      amount: project.budget * 100,
      subaccount: freelancer.subaccount_code,
      percentage_charge: freelancerShare,
      bearer: 'account',
      reference,
      metadata: { project_id: project.id, action: 'escrow_hold' },
    }),
  });

  var data = await response.json();
  res.json({ authorization_url: data.data.authorization_url });
});

Important: For true delayed settlement, create the freelancer subaccount with settle_interval: "manual". This holds the funds until you explicitly trigger settlement. Contact Paystack support to enable manual settlement on your account.

Release After Client Approval

// Client approves the delivered work
app.post('/api/projects/:id/approve', async (req, res) => {
  var project = await db.projects.findById(req.params.id);

  await db.projects.update({ status: 'approved', approved_at: new Date() }, { where: { id: project.id } });

  // If using manual settlement: initiate settlement for the subaccount
  // Or: transfer from your balance to the freelancer recipient
  await fetch('https://api.paystack.co/transfer', {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      source: 'balance',
      recipient: project.freelancer_recipient_code,
      amount: Math.round(project.freelancer_earnings * 100),
      reason: 'Project payment: ' + project.title,
      reference: 'release_' + project.id,
    }),
  });

  res.json({ released: true });
});

Get weekly developer tips

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

No spam. Unsubscribe anytime.

Learn More

This guide is part of the Paystack split payments guide.

Sign up for the McTaba newsletter

Key Takeaways

  • ✓Use subaccount with manual settlement (settle_interval: "manual") to hold the freelancer's share until client approval.
  • ✓Your platform commission stays on your main account — only the freelancer's share goes to the subaccount.
  • ✓After client approval, release funds via Paystack settlement initiation or a transfer from your balance.
  • ✓Set a dispute window (e.g., 7 days after delivery) before auto-releasing if no dispute is raised.
  • ✓Store project_id in transaction metadata for webhook handlers to match payments to projects.
  • ✓Paystack does not have native escrow — build the hold logic in your database with status flags.

Frequently Asked Questions

Does Paystack support true escrow?
No. Paystack does not offer true third-party escrow. The hold-and-release pattern approximates escrow using manual settlement or platform-held balances, but you are not a licensed escrow agent. For large project values or regulated escrow, work with a licensed escrow provider.
How long can I hold funds before releasing to a freelancer?
With manual settlement, Paystack can hold subaccount settlement for days to weeks. However, extended holds may raise compliance questions. Document your hold period in your terms of service and keep it reasonable (7-14 days for most freelance disputes).
What happens to the commission if a project is refunded?
Paystack refunds the full amount charged to the customer. The commission you held is also refunded. Your platform absorbs the refund from its balance. Design your refund policy carefully and build contingency into your commission rates to cover refund scenarios.
Can freelancers from other African countries use their local bank accounts?
Paystack supports subaccounts in GHS (Ghana), ZAR (South Africa), KES (Kenya), and other supported currencies in addition to NGN. Create subaccounts in the appropriate currency for each freelancer's country. Settlement goes to their local bank in their local currency.

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 Split Payments and Marketplaces: Complete Guide

Everything you need to split payments on Paystack: creating subaccounts, choosing between percentage and flat splits, multi-split transactions, fee configuration, delayed settlement, escrow-style patterns, and building real marketplace products with working Node.js code.

Read more

Percentage vs Flat Split Configuration on Paystack

A detailed comparison of percentage and flat split configurations on Paystack. Covers how each model works, worked margin calculations across different transaction sizes, when to use percentage vs flat, implementing per-transaction overrides, and building hybrid models that combine both approaches.

Read more

Escrow-Style Flows on Paystack and Their Limits

A thorough analysis of what escrow-style flows you can and cannot build on Paystack. Covers the difference between true escrow and delayed settlement, how to use manual settlement for hold-and-release patterns, the limits around hold duration and fund recovery, regulatory considerations in African markets, and when Paystack is not the right tool for escrow.

Read more

Building an Events Ticketing Platform with Splits

An events ticketing platform collects ticket revenue and routes it to event organizers after the event. This guide covers using Paystack splits to route organizer revenue and platform booking fees, handling multi-ticket types, and managing pre-event holds and post-event payouts.

Read more

Paystack Transfers and Payouts: Complete Guide

Everything you need to send money out of your Paystack account: creating transfer recipients, initiating single and bulk transfers, handling OTP requirements, managing failures, and building automated payout systems for bank accounts, M-Pesa wallets, and mobile money across Africa.

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.