Skip to main content
Back to Projects
FeaturedConstructionCRMAutomated PaymentsDatabase Management

ConstrActive Platform

Lead, CRM and subscription platform for a construction business: GoHighLevel for CRM and automation, Supabase for data and Stripe for recurring plans.

ConstrActive Platform
GoHighLevel
CRM
Supabase
Data
Stripe
Payments

Facts about the build and who it was for. Any figure here is shown on a public store listing or site linked on this page — how we present portfolio work.

Project Story

The Challenge

Construction companies struggled with disparate systems for managing leads, services, and payments, leading to inefficiencies and a lack of cohesion.

What Was Built

Sameem worked on connecting GoHighLevel (CRM and marketing automation), Supabase (database) and Stripe (recurring plans) into one flow.

The Result

Lead capture, customer records and recurring Stripe plans tied together in one flow.

Project Details

A platform for a construction business that ties lead capture, customer records and recurring service plans together. Sameem worked on the integration: GoHighLevel for CRM and marketing automation, Supabase for the database, and Stripe for subscription billing.

Tech Stack

Cloud-based Infrastructure
Stripe Payment Processing

No public link for this project

Category

Node.js Backend & AWS
Written by DevoraXReviewed by Sameem Amjad, Founder & Lead Architect EngineerLast updated Based on project records and public sources (case study)

ConstrActive Platform is a web platform for construction businesses that combines GoHighLevel for CRM and marketing automation, Supabase for its database and Stripe for recurring payments. Sameem Amjad worked on it. Customers can browse services, submit enquiries and enrol in recurring plans, while administrators work from centralised data and automated workflows.

What problem was ConstrActive Platform designed to solve?

The problem was that construction companies struggled with disparate systems for managing leads, services and payments, which led to inefficiencies and a lack of cohesion. That is a shape rather than a toolchain. The functions a construction business runs on, attracting work, describing what it sells and collecting money for it, each sit in software that knows nothing about the others. Read that way it is a data problem before it is a software problem, because nothing suggests any individual component was failing at the job it was bought for. The difficulty named is cohesion, which is a property of the gaps between systems rather than of anything inside them.

Systems that do not share identifiers cannot be joined automatically. In an arrangement of that kind the same customer exists more than once, once per system, with nothing connecting the copies, and whoever needs the whole picture has to assemble it. That is the weight the word inefficiencies is carrying here. It also sets a ceiling on what can be automated at all, because automation needs some component that holds enough context to decide what should happen next, and a system that sees only payments, or only enquiries, does not have that context by itself.

How is the platform architected across GoHighLevel, Supabase and Stripe?

The platform uses GoHighLevel for CRM, Supabase for database management and Stripe for payment processing, so that the key services form one ecosystem rather than sitting beside one another. That division means the build is an integration before it is an application. Everything of consequence in a build like this happens at the seams between the three, not inside any one of them.

The split follows the grain of the problem. Each of the three areas has a different tolerance for error, a different rate of change and a different weight of obligation attached to it. Money is the least forgiving and the most regulated. A sales conversation changes constantly and tolerates approximation. The platform's own stored data has to outlive both. Keeping them in specialist systems means each can be operated on its own terms instead of being averaged into one general tool that is adequate at all three and good at none. For the people using it, the outcome is that customers can explore services, submit enquiries and enrol in recurring plans, while administrators work from centralised data and automated workflows.

Why use GoHighLevel for CRM and marketing automation rather than building one?

GoHighLevel carries the CRM side of the platform: lead capture, customer management and marketing automation. The decision in that arrangement is one of adoption rather than construction. The lead lifecycle is carried by an established product, and the build's own code is not where it lives. That is usually the right trade, because CRM is a domain that looks small from outside and is not. A working one needs contact deduplication, pipeline stages, ownership and assignment rules, multi-channel messaging, appointment scheduling, opt-out handling and deliverability management. None of that is differentiating for a construction company, all of it is expensive to build, and the maintenance cost never stops, because messaging channels and their rules change independently of the business using them.

Marketing automation carries a second and quieter cost. Underneath any sequence of triggers and delays is durable scheduling: work that must fire later, survive a restart, not fire twice, and be cancellable when circumstances change before it runs. That is real infrastructure rather than a feature. Adopting the platform means the build feeds it accurate data and reads its decisions back out. It is also work that never becomes an advantage in the market a construction firm competes in, because nobody chooses a contractor on the strength of how their reminder emails were queued.

What does Supabase contribute as the database layer?

Supabase is the database layer. Supabase itself is PostgreSQL with authentication, storage and generated APIs built around it, so the data sits in a relational engine rather than in a proprietary store. The general case for a relational engine is strongest exactly where this platform's value sits, in the connections between records rather than in any record on its own. Constraints declared in the database hold no matter which code path performs a write, including one added later by someone who did not read the original assumptions, which is a different and more durable guarantee than checking the same rule in application code. Indexed relational queries are also what keeps an administrative view over accumulated history fast as that history grows, rather than quietly slower every month.

The services around the engine matter as much as the engine. Authentication that resolves against the same database, and row-level policies written next to the tables they protect, keep authorisation in one reviewable place. That is worth having whenever a single database is reachable by both public and internal callers, which is the situation any platform with a public enquiry path and an internal administrative view is in.

How does Stripe handle recurring subscription plans here?

Customers can enrol in recurring plans, and Stripe carries payment processing. Those two facts together make billing a subscription problem rather than a checkout problem, and the distance between the two is where most of the engineering in any billing integration lives. A single charge succeeds or fails once and is then finished. A subscription runs indefinitely. It has renewal dates, plan changes that need prorating, cards that expire mid-term, payments that fail and must be retried on a schedule, cancellations that take effect at different moments depending on terms, and refunds, tax and receipts attached to all of it. Each of those is a small state machine, and owning them means owning every one of them correctly, for as long as the business has customers. Delegating them to a specialist puts the hardest parts of moving money, the card networks, issuers, currencies and retry behaviour, with a system built for nothing else.

The brief for this component, recurring plans plus a payment processor, is enough to locate where the difficulty sits: not in taking the first payment, but in everything that has to keep working in the months after it.

What engineering challenges come with integrating three external systems?

Integrating three external systems comes with constraints that apply to anything of this shape. Nothing spans a CRM, a database and a payment processor as a single transaction. A subscription can be created at one vendor and the matching local write can fail a moment later, and no rollback exists that reaches across a vendor boundary. An integration like this therefore has to be reconcilable rather than merely correct on the happy path. External objects need local references pointing back at their counterparts. Inbound events need to be safe to process more than once, because webhook delivery retries, duplicates and arrives out of order by design rather than by accident. State needs to be re-derivable by reading back from the source system, so that no single missed message is unrecoverable.

The other standing constraint is organisational rather than technical. Three vendors change on their own release schedules and enforce their own rate limits, and none of them consults the platform first. Keeping each integration behind a narrow internal interface is the ordinary defence, because it decides in advance how far a change on someone else's calendar is allowed to travel. Rate limits are a design input in the same way, because a call pattern that is unremarkable for one customer becomes a queueing problem at volume.

Can you see ConstrActive Platform today?

No: the web address the platform was listed under now serves an unrelated product, and the portfolio lists no Android or iOS app, so there is no public link to it.

The sections above set out why a construction business's leads, records and recurring billing are best split across a CRM, a relational database and a payment processor, and what has to hold at the seams between them.

Why this stack

  • GoHighLevel is the CRM and marketing automation layer. Lead capture, contact deduplication, pipeline stages, assignment, multi-channel follow-up and appointment scheduling amount to a large body of undifferentiated software for a construction business to own, and any time-based sequence rests on durable scheduling that survives restarts, does not double-fire and can be cancelled before it runs. Adopting an established platform means the lead lifecycle already exists as a product, so the build feeds it accurate data and reads its decisions back out.
  • Supabase is PostgreSQL with authentication, storage and generated APIs around it, which suits a platform whose value lies in the connections between records rather than in any single record. A relational engine enforces those connections regardless of which code path writes, including paths added long after the original assumptions were set, and indexed queries keep an administrative view over accumulated history from degrading as history grows. Supabase also places authentication and row-level authorisation beside the data they govern, which matters wherever one database is reachable by both public and internal callers.
  • Stripe carries payment processing, including the recurring plans customers can enrol in. Subscription billing is a far larger problem than a single charge: renewal schedules, proration on plan changes, expiring cards, failed-payment retries, cancellation timing, refunds, tax and receipts are each their own state machine, and owning one means owning all of them correctly and indefinitely. Delegating them puts card networks, issuers, currencies and retry behaviour with a system built for nothing else. Any application on top still has to treat inbound billing events as asynchronous and idempotent, since such deliveries retry and can arrive out of order.
  • Hosting: whatever runs the integration has to be reachable for inbound callbacks from Stripe and the CRM and has to keep outbound connectivity to all three services, which is the case for running it as a hosted service rather than as software that runs only sometimes or only on one machine.