Platform Engineering

A working CRM on hosting that was never meant to run one

The brief called for a modern React CRM. The hosting plan had no Node.js runtime at all — so the standard stack was off the table before day one.

Context

A client needed an internal CRM — contacts, deals, a login-gated dashboard — and had already committed to a shared hosting plan for cost reasons. The plan had no Node.js App feature in its control panel: the usual React-frontend-plus-Express-backend pairing simply could not run there.

The challenge

Re-platforming to different hosting wasn't on the table — the client had already paid for and committed to the plan. The architecture had to work within a PHP-only shared-hosting environment while still shipping a modern single-page React interface.

What we did

The concrete engineering decisions that made this work.

Static frontend, server-rendered nowhere

The React app was built as a static Vite bundle and deployed to a subpath — no Node process required at runtime, only a static file server.

PHP REST API in place of Express

The backend became a lightweight PHP REST API — auth, session, and data endpoints — running on the same shared PHP-FPM the hosting plan already supported.

One JSON row per record type

Rather than a rigid relational schema for a fast-moving internal tool, each collection is stored as JSON rows, keeping schema changes to a data-shape change, not a migration.

Bearer-token sessions

Authentication runs on bearer tokens issued by the PHP API, checked on every request — no framework-specific session middleware to fight the hosting environment over.

Outcome

A live, working CRM — deals pipeline, contacts, authenticated dashboard — running entirely inside a shared-hosting plan with zero Node.js support, at zero additional hosting cost to the client.

ReactVitePHPMySQL
Get started

Start a strategic discussion

Book a free architectural consultation. We reply within 24 hours.