Migration · PHP (Laravel / CodeIgniter / custom) → Node.js + TypeScript
PHP to Node.js / TypeScript Migration Guide
PHP is fine. PHP combined with a fragmenting team, ageing dependencies and a need for shared code between web and mobile — is harder. We migrate to Node.js + TypeScript, often in parallel with the existing PHP stack, until the legacy is retired.
Why teams migrate
- Engineering team finds it hard to hire PHP talent
- You want to share code between backend, frontend (Next.js) and mobile (React Native)
- Long-term maintainability concerns with legacy frameworks
- Need to integrate with modern AI / serverless / edge tooling more easily
- Performance characteristics not met by PHP-FPM scaling model
Our migration approach
Phase 1 — Strangler fig setup
We route specific endpoints through a new Node.js + TypeScript service. PHP stays in production. No big-bang.
Phase 2 — Module-by-module migration
Each business module (orders, identity, billing, etc.) is rewritten in TypeScript with proper tests, then routed through. PHP version is retired module by module.
Phase 3 — Database and shared schema
Database migrations are typically held until all modules are on the new stack — to avoid running two ORMs concurrently. We use Prisma or Drizzle for type-safe access.
Phase 4 — PHP retirement
Once parity is reached, PHP infrastructure is shut down. Single language stack from then on.
Pitfalls we've seen
- Don't underestimate session and auth migration. PHP sessions vs JWT vs new auth flows need careful planning.
- Don't rewrite as a lift-and-shift. Use the migration as a chance to fix the domain model.
- Test the data layer thoroughly. ORM behaviour between Eloquent / Doctrine and Prisma can surprise you.
- Plan for two production stacks during migration. Operationally heavier, briefly.
Pricing and timeline
Price range
$25,000 – $80,000
USD, fixed-cost after written scope
Timeline
16 – 26 weeks
Phased rollout from kickoff to legacy retirement
FAQ
Why not just stay on PHP?
If your stack works and your team is happy, stay. We've turned down migration engagements where the case wasn't there. Migrate when hiring, code-sharing or modernisation pain genuinely justify it.
What about Laravel-to-Node parity for things like Eloquent?
Prisma and Drizzle cover most Eloquent patterns with TypeScript safety. Some Laravel-specific magic (model events, scoped queries) needs explicit reimplementation, not auto-translation.
Will users notice?
No. With proper routing (LB rules, reverse proxy) we cut over endpoint by endpoint. Users see no regression.
Considering this migration?
We'll scope it phase-by-phase and share a fixed-cost proposal within 48 hours. See the related service below for our standard web app development approach.