A payment reconciliation platform connecting merchant checkout, an Android SMS agent, and operational dashboards to match mobile-wallet payments and notify merchant systems.
Connecting merchant checkout, trusted SMS evidence, reconciliation, and signed payment notifications.
| Area | Details |
|---|---|
| Project | Multi-tenant payment platform |
| Contribution | Application architecture, full-stack web development, payment workflows, and Android integration |
| Status | Verified staging / controlled pilot documented in the repository |
SMSPayBD is a payment-reconciliation platform for merchants collecting money through mobile-wallet channels. I built the project around the operational gap between a customer making a payment and a merchant system having reliable evidence that the corresponding order can move forward.
The product combines a merchant dashboard, hosted checkout, a backend API, background jobs, and an Android SMS agent. The important part is the connection between these pieces: an incoming message becomes structured evidence, that evidence is matched to a payment intent, and the merchant receives a signed status event.
A screenshot or a transaction ID alone is a weak operational workflow. Incoming SMS can be duplicated, delayed, malformed, or difficult to associate with a particular order. A payment system also needs to distinguish an unmatched message from a confirmed payment and give support staff a way to resolve exceptions.
The engineering challenge was to make that lifecycle explicit while keeping each merchant organization isolated from other tenants.
| User | Responsibility |
|---|---|
| Platform owner | Manage merchant organizations and inspect platform-wide operations |
| Merchant administrator | Manage organization users, API keys, receiving accounts, and integrations |
| Finance and support | Inspect payment evidence and resolve reconciliation exceptions |
| Customer | Open checkout and complete the external payment |
The flow above describes the product journey. The following sections explain the implementation and the boundaries of this case study.
| Capability | How it appears in the product |
|---|---|
| Payment intents | Amount, reference, expiry, and hosted-checkout context for a merchant request |
| SMS agent | Trusted-message capture, device validation, a local queue, and retry handling |
| Reconciliation | Reference and exact-amount matching, transaction-ID recovery, and review actions |
| Duplicate handling | Separate treatment of duplicate SMS and repeated transaction identifiers |
| Webhooks | Endpoint management, HMAC-signed delivery, retries, and delivery details |
| Sandbox | Simulation tools for exercising the integration without a live payment |
The codebase separates the web dashboard, API, worker, and Android application. PostgreSQL stores the business records, Prisma provides the data-access layer, and Redis/BullMQ support asynchronous work. This separation gives a payment request, the evidence received for it, and the notification sent afterward distinct responsibilities.
Tenant ownership is an explicit domain boundary. Organizations own their users, customers, intents, SMS events, devices, and webhook resources. Sandbox and Live are environments within a merchant tenant. Provider-level access and merchant-level access therefore answer different questions.
The documented device policy also has two layers: the provider permits payment methods for an organization, and the Android device enables a local subset. The effective methods are the intersection of those choices.
The diagram separates the original request, incoming evidence, reconciliation decision, and merchant notification.
| Layer | Technology |
|---|---|
| Web application | Next.js, React, TypeScript |
| API | NestJS |
| Persistent data | PostgreSQL and Prisma |
| Background work | Redis and BullMQ |
| Device integration | Android SMS agent |
| Infrastructure | Docker; Hostinger/Coolify deployment |
| Decision | Reason |
|---|---|
| Intent before evidence | Give every checkout request a stable business record before an SMS arrives |
| Review queue | Keep ambiguous or unmatched evidence visible rather than forcing an automatic match |
| Signed notification | Let the merchant verify a payment-status message before using it to update an order |
| Separate worker | Keep retries and expiry work outside the immediate dashboard interaction |
| Explicit tenant ownership | Scope payment operations to the merchant organization rather than relying on UI filtering |
An Android phone introduces real operational dependencies: connectivity, device availability, SMS delivery, and provider-message formats. Background workers also need monitoring; a healthy dashboard does not prove that a webhook queue is moving.
The repository documents a verified staging/controlled-pilot stage. Broad rollout still has readiness work around worker alignment, end-to-end browser tests, replay protection, rate limiting, backups and restore checks, monitoring, and live-device validation. The public marketing page describes a wider provider roadmap; this case study does not treat every advertised provider as a verified parser implementation.
The most valuable lesson was to model the uncertain parts of a payment workflow explicitly. Payment evidence, a matching decision, and merchant notification are related events, but they should not be collapsed into a single optimistic success flag.

A secure MFS simulation built with an auditable double-entry ledger
Next.js 16 · React 19 · TypeScript · Tailwind CSS v4

A unified enterprise solutions platform for business growth
Next.js · TypeScript · Tailwind CSS · shadcn/ui

Fintech Marketing Website with Lead Capture
Next.js · React · TypeScript · Framer Motion