I build payment systems that reconcile — multi-gateway checkout, marketplace payouts, and the webhook plumbing that keeps ledgers honest when networks don't cooperate.
Dubai, UAE — available immediately, remote or on-site
8+Years PHP / Laravel
5Payment gateways in production
1,486Tests on current SaaS
2Products live today
Selected work
Two production systems, both handling money.
Aviaspares · aviatrading.comBackend Lead · 2023–2026
A B2B aviation parts marketplace where buyers and sellers transact across borders. I owned the payments platform end to end — the part of the system where a bug doesn't throw an error, it loses someone's money.
Marketplace split payments with Stripe Connect. Connected-account onboarding, platform commission, and scheduled transfer releases to sellers — the multi-party settlement problem, solved in production.
Escrow.com integration for high-value transactions, including a reconciliation job that continuously re-syncs escrow state against local records rather than trusting a single webhook to have arrived.
Five gateways behind one interface. Stripe, Stripe Connect, PayPal, Escrow.com and Wise sit behind a single contract — checkout, order retrieval, transaction lookup, refund — with a resolver that picks the right gateway per payment and region.
Idempotent webhook processing. Every inbound event is signature-verified per provider, persisted with a uniqueness constraint on provider + event_id, and marked processed exactly once — so duplicate deliveries and retries can't double-credit an account.
Sanctions and country validation on payment methods, because an aviation parts marketplace has export-control exposure that most e-commerce doesn't.
A multi-tenant school management SaaS — schoolninty.com — built and operated single-handedly. One deployment serves many schools from a shared database and codebase, every query scoped by tenant.
Multi-tenancy done at the data layer, not bolted on: shared schema with per-school scoping across students, teachers, attendance, fee invoicing, exams, timetables and announcements, plus a separate super-admin plane for school and subscription management.
1,486 tests. Fee invoicing and attendance are the kind of thing parents notice when it's wrong, so the suite is the product's actual safety net.
Five dedicated queue workers — default, high, emails, sms, reports — under Supervisor, so a slow report run never delays a fee reminder.
Modern stack, deliberately: Laravel 13 on PHP 8.4, Inertia with Vue 3, PostgreSQL with pgvector, Redis for cache and queues.
Every payment provider redelivers webhooks — routinely, not occasionally. The obvious guard is a race condition, and on a handler that moves money that race is a double credit:
The bug most codebases ship:if (exists) return; else insert; has a gap between the check and the insert. Two concurrent redeliveries both pass the check and both process.
The fix: let the database arbitrate. A unique constraint on provider + event_id, with the constraint violation treated as the duplicate signal rather than as an error. No window, because no gap.
Plus the parts that bite in production: verification before any write, timestamp tolerance against replay, constant-time comparison, secret rotation, content fingerprinting for providers that send no event id, stale-claim takeover when a worker dies mid-handler, and deliberate replay instead of silent retries.
18 tests covering concurrent redelivery, tampered and replayed signatures, rotation and stale claims — CI across PHP 8.2–8.4 and Laravel 11/12.
Taking a card payment is a solved problem. What isn't solved, in most codebases I've seen, is what happens when the webhook arrives twice, or never; when a refund is issued against a transfer that already released; when the gateway says one thing and your ledger says another.
Multi-gateway architecture
A single contract per gateway, a resolver to choose between them, and DTOs at the boundary — so adding a provider doesn't mean touching checkout.
Idempotency & webhooks
Per-provider signature verification, event persistence with uniqueness constraints, and exactly-once processing that survives retries and out-of-order delivery.
Reconciliation
Scheduled jobs that re-derive state from the provider rather than trusting the event stream — the difference between a system that looks correct and one that is.
Marketplace payouts
Connected accounts, commission splits, hold-and-release scheduling, and cascading refunds back through seller balances.
Multi-tenant SaaS
Tenant scoping at the data layer, per-tenant configuration, and the operational tooling to run many customers from one deployment.
Event-driven Laravel
Events, listeners, observers and queued jobs used to keep payment state transitions explicit and auditable rather than buried in controllers.
Also
Background.
Eight-plus years across PHP and Laravel, with Vue 3 and TypeScript on the front end and Java/Spring Boot earlier in my career. I run Smart Indus Systems, a small development studio, and I work AI-forward — Claude Code is part of my daily toolchain, not a novelty.
Based in the UAE, originally from Pakistan. Comfortable working remotely across GST, European and US-overlapping hours.
Get in touch
Available for work now.
Open to senior backend or full-stack roles, and to contract work on payments integration specifically — Stripe Connect marketplaces, multi-gateway consolidation, or fixing a webhook pipeline that's double-processing.