Skip to content
All work

SaaS Platform

Appsha

A SaaS platform re-architected from a Next.js monolith into a decoupled three-tier system, with a built-in CRM, live notifications, and real-time sync.

Visit live site
Appsha, SaaS Platform

The context

Appsha had grown as a single Next.js application handling frontend, API, and business logic in one deployable unit. Every change, however small, meant redeploying the whole system, which made the application a single point of failure and coupled unrelated release cycles together. On top of that, the product needed to own the relationship side of its customers' work: inquiries arrived through bookings, forms, purchases, and downloads, and then lived nowhere in particular.

What the work involved

  • Led the migration from the monolithic Next.js application to a decoupled three-tier architecture, so frontend, API, and data layers could be deployed independently.
  • Designed and built the RESTful API surface with JWT authentication and role-based access control, which now powers core platform functionality.
  • Engineered a WebSocket-based real-time system for live data sync, replacing the previous polling approach.
  • Built the live notification system on top of that WebSocket layer: events reach the user the moment they fire, are persisted so nothing is missed while a session is closed, and stay consistent across every tab a user has open.
  • Built the platform's CRM (its contact and follow-up product) end to end, from the data model through the API to the interface customers work in, scoped deliberately as contacts, history, and the next step rather than a sales pipeline.
  • Made contact capture automatic: every conversion event on a customer's profile (booking, form submission, purchase, file download, or service inquiry) writes a contact record, so the list builds itself with no manual entry, spreadsheets, or copy-paste between tools.
  • Resolved contacts arriving from those different sources into one record per person, so a lead who first submits a form and later books is a single history rather than two disconnected entries.
  • Modelled a full interaction history per contact (notes, logged interactions, activity, and follow-up detail), retained indefinitely, so a contact returning months later opens with the whole thread intact.
  • Built email into the contact record itself: messages are composed and sent without leaving the platform, and each one is logged back against that contact automatically.
  • Added deals and tasks on top of contacts, and tagged service inquiries with the service requested and the date it arrived, so follow-ups resolve to a concrete next step instead of depending on memory.
  • Built an event-driven transactional email system on Loops, covering lifecycle events including trials, upgrades, downgrades, and payment failures.
  • Integrated Strapi as the headless CMS so non-technical teams could manage content without a developer in the loop; it ran the platform's content for several months, before the marketing site was later moved onto a different CMS.
  • Developed a Gemini-powered AI content generation feature, built around a reusable service and prompt architecture rather than one-off calls.
  • Authored Swagger API documentation and internal architecture guides for developer onboarding.
  • Managed the AWS footprint (EC2, database, and messaging) across all platform services.

Outcome

Independent deployments per tier and no single point of failure; polling replaced by pushed updates and live notifications; and a CRM where contacts capture themselves from every conversion event and carry their full history, email, and follow-ups on one record. Content turnaround dropped to same-day once the team could publish without a developer in the loop.

More work