All work
Resume

Client project · Shipped

Corplify

A custom portal that takes Malaysian company registration from signup to payment to SSM filing, plus a partner portal for referral agents.

Role
Freelance product designer and developer, solo. Designed every flow and built it in PHP and MySQL.
Scope
Full-stack B2B portal and partner portal to digitise company incorporation and secretarial needs
Timeline
2026, in phases
Methods
Flow mapping, provider comparison, phased releases reviewed with the client
Tools
Figma, PHP, MySQL, Stripe, Didit, Claude
View live site

TL;DR

Corplify
PHP & MySQLB2BFull-Stack Build

The Challenge

Corplify, a digital corporate secretary, needed a portal WordPress was never built to run.

A multi-step application workflow tied to payment and admin review, not a marketing site

No manpower to force WordPress and plugins to fit the workflow

A custom PHP/MySQL build beat no-code and low-code on both speed and cost

Role

Freelance product designer and developer

Tools

Figma, PHP, MySQL, Stripe, Didit, Claude

Outcome

Customer and partner portals live at corplify.my

The Build

End-to-end portal covering the full customer journey.

Signup screen with OTP verification

Signup and login with OTP email verification and optional 2FA

Multi-step company registration form

5-step company registration with autosaving drafts and step restore

SSM company-name checker

SSM company-name search, fuzzy-matched against a live registry of real registrations

Admin dashboard listing applications

Application review, status tracking, bulk CSV updates, Excel export

Live chat widget with human escalation

Automated status emails and a live chat widget with human escalation

Service landing page

11 service landing pages and an article hub, each with its own title, meta description, and canonical

Partner Portal

Referral partners place orders, track applications and withdraw commission.

1 database, 2 views

Partners see the same application rows as customers, filtered by partner. A second database would drift.

3 ways to link a client

A referral link, a collapsed referral code field at signup, and manual assignment by admin.

Partners see less than customers

Masked ID numbers, no date of birth or address. So the client, not the partner, confirms company details.

Partner view of a client's application, with masked IC numbers

Identity Checks

  1. 01

    Pick a provider, don’t build one

    Liveness and anti-spoofing need specialist tech.

  2. 02

    Check the right people

    Directors, plus shareholders holding 20% or more.

  3. 03

    Check after payment

    From 1 Nov 2026, Didit’s free tier drops to about 30 checks a month.

  4. 04

    Staff choose the method

    A Didit link or a video call, with a live x/30 counter.

  5. 05

    2 fails, then stop

    No refund and a new application, written into the Terms.

Provider pricing, checked Sept 2026

Didit (chosen)

USD 0.33 a check, 500 free a month

iDenfy

USD 1.35 a check, USD 135 monthly minimum

Sumsub

USD 1.35 to 1.85 a check, USD 149 to 299 monthly minimum

Jumio

Quote only, est. USD 25,000 to 100,000+ a year

The Trade-off

Vanilla PHP, deliberately.

No frameworkNo dependenciesClean handover

No framework, no third-party dependency manager. A conscious call for full control and a clean handover, not a hosting limitation. Fewer moving parts to maintain, nothing to upgrade later, and easy to pass to another developer with no framework knowledge required.

Excel export

Hand-built XML SpreadsheetML instead of a heavier spreadsheet library. Works anywhere, nothing to install.

E-signing, deferred

I rejected an in-house build: a signature has to stand up as legal evidence. It moves to a signing API after launch.

Debugging under a live schema

Several production bugs traced back to the same root cause: code assuming database columns that had not been migrated yet, or reading data that had moved tables.

Draft-save failing silently

insert attempted columns that did not exist yet on unmigrated databases

Applications reopening on step 1

step number was saved before the step counter updated

Admin document viewer breaking

read a path column that had been replaced by a proper documents table

Outcomes

MEASURED

Customer and partner portals both live.

SUCCESS METRICS

No usage numbers yet.

REFLECTION

Shipping solo meant every call, and every fix, was mine. Vanilla PHP kept the surface small enough to hand over; the bugs taught me the rest: version the schema alongside the features, not behind them.

corplify.my homepage

What’s Next?

02

Phase 2: E-signing

Document signing through an API, with SignWell the leading option.

03

Phase 3: Reach

Physical and digital marketing to build the customer base the product is now ready to support.

Context

WordPress could not run what Corplify needed: a multi-step application tied to payment and admin review.

Corplify is a digital corporate secretary in Johor Bahru. Its team had no developer to bend WordPress and plugins around the workflow, and a custom build beat no-code tools on both speed and cost.

After the first release, the client asked for 3 more things: a portal for referral partners, identity checks on directors and shareholders, and the site in Bahasa Malaysia and Chinese.

The build

One portal covers the whole customer journey, from signup to a filed company. I built it in phases, and the Corplify team reviewed and reprioritised after each one instead of working to a single fixed spec.

  • Accounts: signup and login with email OTP and optional 2FA.
  • Application: a 5-step form with autosaving drafts and step restore. It now covers 11 services.
  • Name checker: SSM company-name search, fuzzy-matched against a live registry.
  • Payment gate: applications stay hidden from admin until Stripe confirms payment.
  • Admin and comms: review, status tracking, bulk CSV updates, Excel export, status emails and a live chat with human escalation.
Multi-step company registration form
The 5-step application, with autosaved drafts.
Admin dashboard listing applications
Admin review, with status tracking and bulk updates.

Partner portal

Partners refer clients, place orders for them, track their applications and withdraw their commission. 3 calls shaped it.

Rejected: a second database

1 database, 2 views

A partner sees the same application rows as the customer, filtered by partner. Syncing orders between 2 copies drifts, so there is only 1 copy.

3 ways to link a client

A referral link does most of the work. A collapsed “Have a referral code?” field at signup catches links that messaging apps strip. Admin can assign a partner by hand for phone sign-ups. A wrong code never blocks signup.

Partners see less than customers

Partners get masked ID numbers (••••••-••-1234) and no date of birth, gender, race or address. So a partner can’t confirm company details they can’t see. The client confirms, and the partner sees the status.

Partner view of a client's application, with masked IC numbers for each director and shareholder
The partner's view of a client application. Demo data.

Identity checks

Directors and shareholders have to prove who they are before Corplify files with SSM. 5 rules shaped the flow.

1. Pick a provider, don’t build one

Liveness and anti-spoofing need specialist tech, so I compared 4 providers. Didit won on cost.

ProviderPricing, checked Sept 2026
Didit (chosen)USD 0.33 a check, 500 free a month
iDenfyUSD 1.35 a check, USD 135 monthly minimum
SumsubUSD 1.35 to 1.85 a check, USD 149 to 299 monthly minimum
JumioQuote only, est. USD 25,000 to 100,000+ a year

2. Check the right people

Directors, plus shareholders holding 20% or more.

3. Move the check after payment

From 1 Nov 2026, Didit replaces 500 free checks with USD 10 of credit, about 30 checks. Checks before payment would spend that credit on people who never pay.

4. Staff choose the method

Per application, staff send Didit links in 1 email or arrange a video call. A live x/30 counter sits beside the button.

5. 2 fails, then stop

1 failed check shows a warning and 3 options: a new link, a review, or a video call. 2 fails mean no refund and a new application. I wrote this into the Terms and Refund Policy, and customers tick their agreement before submitting.

Translation

The customer site runs in English, Bahasa Malaysia and Chinese. One pass added 373 Malay and 477 Chinese strings. A script listed every translated string in the code and checked each one against the language files.

Deliberate gap

Emails stay English

The site doesn’t store each customer’s language, so translating at send time would use the admin’s language instead. Fixing that properly is its own project.

Trade-offs

Rejected: a framework

Vanilla PHP, deliberately

No framework and no dependency manager, for full control and a clean handover. The Excel export shows the trade-off: hand-built XML SpreadsheetML instead of a heavier library, so there is nothing to install.

Rejected: an in-house build

E-signing deferred, not built

A signature has to stand up as legal evidence, and that liability shouldn’t sit in a custom portal. It moves to after launch through a signing API, with SignWell the leading option.

Debugging under a live schema

Several production bugs traced back to one root cause: code assuming database columns that hadn’t been migrated yet, or reading data that had moved tables. A draft save failed silently, applications reopened on step 1, and the admin document viewer broke. Each fix named its root cause instead of patching around it.

Outcomes

Measured

Customer portal and partner portal both live.

Success metrics

No usage numbers yet.

corplify.my homepage
corplify.my, live.

Reflection

Shipping solo meant every call, and every fix, was mine. The schema bugs taught me to version the schema alongside the features, not behind them.

I first built the homepage “How it works” section to capture the mouse wheel, 1 step per scroll. With a real wheel, the page got stuck at step 1 and step 5. I removed the scroll lock and snapping. Readers own the scroll bar, which is why this page scrolls normally too.

Next

  • E-signing through a signing API.
  • Phase 3: marketing to grow the customer base.

Both portals are live. corplify.my

View live site