Teams relied on scattered tools to track SEO data, making analysis slow and the numbers impossible to trust.
Lead Software Engineer & Technical Lead
A unified SEO intelligence platform aggregating domain, keyword, backlink, and competitor data into one real-time dashboard.
5+ tools replaced by one platform, cutting time spent on reporting by 70%.
The brief
Every team touching SEO had its own tool. Backlinks in one place, keywords in another, competitor data somewhere else, and a spreadsheet holding it all together. Nobody trusted the numbers because you could never tell which export came from which tool, or how stale it was. The ask was straightforward: one dashboard, one source of truth, with every number dated.
I led the full technical side: architecture, service design, frontend, deployment, and production support. The goal wasn't to wrap existing tools in a nicer interface. It was to build a system where the data pipeline and the presentation layer were designed together from the start.
Backlinks analysis: historical tendency, authority score, referring domains, and distribution by follow type, TLD, and country.
Domain keywords view: top content categories by traffic, audience demographics, and a full keyword table with search volume, CPC, rank, and difficulty.
Building it
The platform is a microservices system orchestrated with Docker Compose. A single API Gateway handles all client traffic, validates JWT auth, and fans requests out to three downstream services: Auth, Profiles, and DataBuilder. Services never call each other directly. Inter-service communication runs through an internal Socket.io event bus, so each service stays isolated and events like USER_CREATED or USER_LOGGEDIN are subscribed to independently.
The DataBuilder service is the core of the product. It connects to the DataForSEO API and exposes a widget system where each widget is a self-contained class that knows which data calls to make and how to shape the result for the frontend. Bulk fetching lets the frontend load a full dashboard view in a single request. Every request is instrumented with high-resolution timings persisted to MongoDB, which made tuning the Redis caching strategy concrete rather than guesswork.
The hard part was volume on the frontend. Keyword tables with hundreds of thousands of rows that still had to feel instant. Server-side aggregation, Redis caching per widget, and a strict widget contract kept it manageable: each widget asks for exactly the shape it needs, degrades to a skeleton when a source is slow, and always shows when its data was last fetched. Six months in, the platform had replaced five separate subscriptions and cut reporting time by about 70%.
Want the long version, or something similar built?