Shehab Sherif/CTO at ClearSplit/Fintech & Payments Engineering

I build systems where money can't be wrong.

Payments, ledgers, and reconciliation: the parts of a product that have to be correct every single time. I turn ambiguous financial requirements into systems that reconcile to the cent, and I own them end to end, from the data model to the screen the operator actually uses.


Selected work

trust-ledgerTrust-accounting ledger architectureOpen source

A double-entry trust ledger built in production for a property-management platform holding guest and owner funds. One write boundary, append-only journals enforced at the database layer, corrections by reversal, and statements pinned to the exact ledger state they read. A clean-room TypeScript reference implementation and a passing test suite ship alongside the write-up.

The ledger is permanent; everything around it is disposable. The sharpest consequence: no foreign keys on the journal lines, because a disposable table must never be able to delete or orphan a financial record. The journal line doesn't depend on the booking, it remembers it.

TypeScriptPostgresDouble-entryTested
the accounting chain
PMS / manual factsraw inputstransactions + categoriesclassifybusiness modelauthor termsdated split gridprice, frozentrust + operating ledgerrecord eventsstatements + payoutsread the booksbank reconciliationmatch cash
orchestrantPayment routing and orchestration engineOpen source

A cart context resolves which payment methods a checkout offers and how each one routes: per-method discovery unions methods across providers, weighted rules pick a primary and a fallback chain, and charging a method cascades it through soft declines, a 3-D Secure pause, and a clean stop on a hard decline. The core engine is pure TypeScript; an interactive console and an HTTP API are adapters over it.

Discovery and a live charge run the same resolver, so the methods a preview offers can never drift from what the checkout actually charges, the classic bug in a routing layer. And only savable failures cascade, so a retried request never double-charges.

TypeScriptNext.jsPostgresPorts & adapters
charge cascade
POST /api/chargeidem: t1mock_asoft_failmock_bsuccessPayment approved by mock_b

About

I'm a software engineer who works where accuracy is non-negotiable and the edge cases are the real work. As CTO at ClearSplit, I'm building a double-entry trust-accounting platform for short-term-rental property managers from the ground up: the ledger, multi-PMS reconciliation, tax and owner statements, and the security and multi-tenancy that fintech demands.

Before that, at SellAbroad, I built core pieces of an event-driven commerce platform powering checkout and payments across 150+ countries, including a multi-provider payment orchestration engine and a fault-tolerant, queue-based processing system with retries, idempotency, and database-level locking.

I care about systems I understand end to end over sheer volume. The two projects here are the clearest window into how I think: not the happy path, but what keeps the numbers right when everything around them is changing.