umair.
FinTech / Web32025

IAMDivinity

MLM platform with Authorize.net fiat payment integration, CIM-based subscription billing, smart contract rank distribution, and a complete isolated staging environment on DigitalOcean.

Role

Full-Stack Developer

Duration

3 months (ongoing)

Year

2025

Overview

IAMDivinity came to me with a partially broken Authorize.net integration, a subscription billing loop that wasn't completing, inaccurate rank tracking in the MLM engine, and no way to test changes safely. Over three months I resolved all of it — diagnosed the credential mismatch killing their payments, rebuilt the billing flow properly, fixed the commission engine, and stood up a full staging environment.

What I built

Authorize.net Fiat Payments

Full card payment processing via Authorize.net. First charge creates a CIM profile atomically using createCustomerProfileFromTransaction for seamless recurring billing.

Subscription Billing Engine

Recurring subscription cycles with configurable expiry. Test mode supports short cycles for verification. Renewal jobs run via Node.js cron.

MLM Rank Engine

personalVolume and downline volume tracked correctly across tiers. Rank advancement logic fires on volume thresholds and triggers smart contract rank updates.

Smart Contract Integration

Rank changes are written on-chain via Solidity contract calls. Ensures rank data is tamper-proof and auditable outside the platform's database.

Staging Environment

Isolated DigitalOcean droplet with separate subdomain, MongoDB instance, PM2 process manager, and Nginx reverse proxy. All changes go through staging before hitting production.

Challenges solved

01

Demo Authorize.net accounts behave differently from sandbox — credentials are not interchangeable. The original integration mixed them, causing testRequest errors on every live attempt

02

createCustomerProfile was being called separately from the first charge, causing timing issues. Switched to createCustomerProfileFromTransaction which atomically creates the CIM profile on first successful charge

03

personalVolume wasn't accumulating correctly across downline tiers — the recursive aggregation query had an off-by-one in how it walked the tree

04

Staging MongoDB needed rank data seeded correctly to test rank advancement — wrote a seed script that mirrors the production tier structure

05

PM2 cluster mode on DigitalOcean was causing socket conflicts — moved to fork mode with a proper ecosystem.config.js

Tech stack

Frontend

Next.jsTypeScriptTailwindCSS

Backend

Node.jsExpressMongoDBMongooseCron Jobs

Payments

Authorize.net SDKCIM ProfilesSubscription Billing

Blockchain

SolidityEthers.jsSmart Contract Deployment

DevOps

DigitalOceanPM2NginxMongoDB Atlas

Need something built?

I'm open to new projects. Let's talk about what you're building.

Get in touch