ObjectFirst — Web Platform Rebuild for an Enterprise Storage Vendor
Web platform rebuilt off WordPress onto a Laravel + Nuxt 3 + Next.js stack. Salesforce wired as the system of record, a new subscription product launched alongside the appliance business, marketing attribution unified, and a thirteen-engineer team built from zero.
The Challenge
An enterprise storage vendor whose web presence was a WordPress site stapled to ad-hoc PHP scripts. Marketing attribution nobody trusted, an appliance business that only sold CAPEX, and a Salesforce instance the web stack could only push into one direction through three drift-prone integrations. Over eighteen months we retired the legacy stack, built the web platform on Laravel + Nuxt 3 + Next.js, integrated Salesforce as the system of record, shipped a brand-new subscription product alongside the appliance business, and stood up a warehouse the marketing team queried every morning. The team grew from zero to thirteen.
Three Web Surfaces, One Platform
Marketing site, subscription product, and analytics dashboards share the same backend. Three configurations of one platform meant every Salesforce-side change reached every surface in one release instead of three.
| Dimension | Marketing Site | Subscription Product | Analytics & Ops |
|---|---|---|---|
| Primary audience | Anonymous visitors · MQLs | Paying subscribers | Marketing · Sales ops |
| Salesforce surface | Lead writes + scoring | Account + subscription state | Reporting layer |
| Auth | None (anonymous) | SSO + MFA | SSO + internal role |
| Refresh cadence | Content-managed | Real-time on subscription events | Near-real-time via CDC |
When marketing launched a multilingual content track in month fourteen, the marketing site absorbed it in days. The subscription product and the dashboards never saw the change — they consumed the same content model and the same Salesforce contract as before.
Solution Architecture
Web stack rebuilt off WordPress
Laravel for domain services — leads, accounts, subscriptions, content. Nuxt 3 with Vue for marketing and ops surfaces; Next.js with React for the subscription product. Docker for parity from local to AWS production. Cloudflare in front for caching, WAF, and edge routing. WordPress ran in parallel until the last redirect was verified, then sunset.
Polyglot data plane, paired to the work
Postgres for transactional state — accounts, subscriptions, leads. MongoDB for content-heavy documents and product catalogues. DynamoDB for high-write event logs and session telemetry. Redis for caches, queues, and rate limits. Each store earns its place on access pattern.
Salesforce as the system of record
Two-way sync with field-level mapping, deduplication, and conflict resolution against the live Salesforce state. Every web-side touch — page views, downloads, scoring updates, subscription events — writes back. Sales ops trusts one timeline instead of reconciling two.
Closed-loop analytics and attribution
An ETL pipeline streams every operational store into a columnar warehouse. Marketing and ops query attribution, funnel health, and subscription cohorts on dashboards refreshed near real-time. The seam to the core appliance team is a stable contract: telemetry events flow in from the firmware, entitlements and subscription state flow out from the web platform.
AI Lead Scoring — Anonymous Visitor to SQL
Marketing used to route every form submission FIFO into an SDR queue. Half the queue was junk — competitors, students, recruiters. The AI scoring pipeline runs every lead through four stages before it reaches a human, each with a hard latency budget.
Enrich
IP and firmographic enrichment, deduplication against Salesforce, blacklist filters for known non-buyer patterns.
Score
Gradient-boosted model trained on closed-won opportunities. Outputs a calibrated probability of becoming an SQL within 90 days.
Disqualify
Rule layer on top of the model — students, internal addresses, sanctioned regions, and competitor domains are cut before the queue. Fully explainable for marketing-ops review.
Route
EV-ordered routing into SDR queues by territory and product fit. High-score leads land in real-time Slack channels.
Disqualification ran on the explainable rule layer so marketing-ops could audit every cut. SDRs stopped chasing the half of the queue that came from competitors, students, and recruiters.
Technical Stack
Frontend
Nuxt/Vue across marketing and ops dashboards; Next.js/React for the subscription product
Backend services
Domain-rich CRUD across leads, subscriptions, accounts, and content; async work off the hot path
Data plane
Postgres for transactional state, Mongo for content, Dynamo for high-write telemetry, Redis for cache and queue
Infrastructure
Container deploys to AWS; Cloudflare for edge caching, WAF, and DDoS protection
Analytics & observability
Operational stores stream into the warehouse; errors, logs, and metrics in one place
Key Technical Decisions
Full WordPress retirement over incremental modernisation
Tradeoff: Three months running two stacks in parallel with aggressive redirect-map verification
Why: Every incremental path we modelled left WordPress on the critical path of marketing operations for another year. We absorbed three months of dual operation in month nine and saved the cost back on every release after.
Salesforce as the system of record
Tradeoff: Two-way sync with field-level mapping, conflict resolution, and dedupe logic to own
Why: Sales ops will not adopt a second source of truth. Building a parallel CRM would have produced a tool nobody used. The integration had to be deep enough that web-side touches landed in the Salesforce timeline within seconds, or sales ops would route around it.
Launch a subscription product alongside the CAPEX appliance business
Tradeoff: A new revenue model finance, sales, and support had to operate in parallel with the appliance line
Why: An appliance-only model meant every customer relationship started and ended at delivery. The subscription product opened a continuous-revenue surface and gave the web platform a real product to own beyond a brochureware site.
Implementation Timeline
Discovery, first hires, architecture lock
Audited the WordPress estate, mapped the Salesforce surface area, designed the target architecture. First three engineers hired by end of month three.
New stack live in parallel
Laravel + Nuxt 3 marketing site shipped at a subdomain behind Cloudflare. First Salesforce two-way sync in production for a subset of forms.
WordPress cutover · subscription product v1
Redirect map verified, WordPress retired. First version of the subscription product live, wired to NetSuite for revenue recognition.
Subscription product GA · AI scoring v1
Subscription product moved out of beta alongside the appliance business. Lead scoring v1 replaces the FIFO SDR queue. Marketing attribution unified into one warehouse view.
AI scoring v2 · BI maturity
Gradient-boosted scoring model in production with explanation persistence. Dozens of marketing and ops reports refresh near real-time without engineering.
Observability, BI maturity, handover
Errors and logs centralised. Load balancing and read replicas in production. Team stable at thirteen. Marketing and sales ops run reports without engineering.
Challenges and How We Solved Them
The Problem
Salesforce data quality on cutover — the legacy stack had written into Salesforce for years through three integrations, producing duplicate leads, mismatched account associations, and field-level drift sales ops had been working around manually.
Approach
Built a reconciliation job against a Salesforce sandbox copy, surfaced every conflict pattern for sales-ops review, and let them codify the resolution rules. Migrated production after the rule set converged on under 0.5% manual touches.
Outcome
Cutover completed with no rollback. Sales ops reported the cleanest Salesforce instance in three years. The rule set became the baseline for ongoing data quality.
The Problem
Marketing attribution rebuild under live campaigns — the legacy stack carried UTM logic, form routing, and Salesforce campaign association the marketing team trusted even as it drifted from dashboards.
Approach
Ran the new attribution pipeline in shadow mode for six weeks, comparing every lead's path through both systems. Surfaced discrepancies to marketing-ops weekly. Cut over once the team agreed the new pipeline matched their mental model better.
Outcome
Cutover did not disrupt a single live campaign. Shadow-mode became standard practice for every analytics change.
Numbers That Moved
13
Engineers on the web team
was 0 ↑
Subscription + CAPEX
Revenue surfaces
was CAPEX only ↑
27
BI reports refreshed near real-time
was 3 ↑
< 350 ms
Lead-scoring latency
was Manual ↓
1
Salesforce-writing integrations
was 3 ↓
Real-time
Marketing attribution refresh
was Weekly export →
Before and After
| Dimension | Before | After |
|---|---|---|
| Web stack | WordPress + ad-hoc PHP | Laravel + Nuxt 3 + Next.js on AWS |
| Revenue model | CAPEX appliance sales only | CAPEX + subscription product |
| Lead routing | FIFO SDR queue, manual triage | AI-scored, EV-ordered, auto-disqualified |
| Salesforce integration | One-way push, three drift-prone integrations | Two-way sync, one owned contract |
| Analytics | Excel exports, weekly cadence | Warehouse + BI, dozens of live reports |
| Engineering team | 0 web engineers | 13 across web, data, QA, BA |
Engagement Team
Lessons Learned
When the company already runs on Salesforce and NetSuite, the web platform's job is to feed those systems honestly. Every hour spent building a parallel CRM was an hour the integration depth did not get.
A legacy stack rarely retires itself. Three months of parallel operation under a real cutover deadline beats eighteen months of incremental modernisation that leaves WordPress on the critical path forever.
AI lead scoring earns its keep on the disqualification side first. Cutting half the SDR queue without losing a single closed-won lead is a bigger lift than ranking the remaining half.
More cases
View all cases
EduHam
EduHam — Coding Learning Platform from Zero to Scale
Efficlose