Back to cases
Case Info

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 SiteSubscription ProductAnalytics & Ops
Primary audience Anonymous visitors · MQLsPaying subscribersMarketing · Sales ops
Salesforce surface Lead writes + scoringAccount + subscription stateReporting layer
Auth None (anonymous)SSO + MFASSO + internal role
Refresh cadence Content-managedReal-time on subscription eventsNear-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.

Stage 1

Enrich

< 200 ms
14%

IP and firmographic enrichment, deduplication against Salesforce, blacklist filters for known non-buyer patterns.

Stage 2

Score

< 350 ms
36%

Gradient-boosted model trained on closed-won opportunities. Outputs a calibrated probability of becoming an SQL within 90 days.

Stage 3

Disqualify

< 80 ms
28%

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.

Stage 4

Route

< 120 ms
22%

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 3Vue 3Next.jsReactTypeScript

Nuxt/Vue across marketing and ops dashboards; Next.js/React for the subscription product

Backend services

LaravelPHPRedis-backed queues

Domain-rich CRUD across leads, subscriptions, accounts, and content; async work off the hot path

Data plane

PostgreSQLMongoDBDynamoDBRedis

Postgres for transactional state, Mongo for content, Dynamo for high-write telemetry, Redis for cache and queue

Infrastructure

DockerAWSCloudflare

Container deploys to AWS; Cloudflare for edge caching, WAF, and DDoS protection

Analytics & observability

ETL pipelineColumnar warehouseBI toolingCentralised logging

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

M1–M3

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.

M4–M6

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.

M7–M9

WordPress cutover · subscription product v1

Redirect map verified, WordPress retired. First version of the subscription product live, wired to NetSuite for revenue recognition.

M10–M12

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.

M13–M15

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.

M16–M18

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

Oleksandr Kotliarov — Engineering LeadArchitect — 1 engineerBackend (Laravel · PHP) — 4 engineersFrontend (Nuxt · Vue · Next.js · React) — 3 engineersQA — 3 engineersData analytics — 1 engineerBusiness analyst — 1

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.

Other cases

More cases

View all cases
EduHam — Coding Learning Platform from Zero to Scale
EdTech | seed

EduHam

EduHam — Coding Learning Platform from Zero to Scale

5,000+ Concurrent learners (built from zero)
50,000+ / day Code submissions executed at peak
< 500 ms Sandbox cold start, p99 across 10 languages
Efficlose — Meeting Intelligence SaaS for Revenue Teams
B2B SaaS | series-a

Efficlose

Efficlose — Meeting Intelligence SaaS for Revenue Teams

23 Live CRM and PM integrations on a shared plugin contract
50,000+ / day Meeting minutes captured, transcribed, and analysed
< 90 s p95 From meeting end to CRM-ready summary