Case Study · July 2026
Distributor Intelligence Dashboard for WAGO México
A two-person nearshore team built a Next.js dashboard aggregating sales, inventory, and forecast data for a WAGO México distributor — in 10 weeks, on budget, with full IP transfer.
Engagement length
10 weeks
Team size
2 engineers
Stack
Next.js 14, TypeScript, PostgreSQL
Data sources integrated
4
Time to first production deploy
3 weeks
Timezone
CST
The Problem
The distributor managed a WAGO product catalog of 4,000+ SKUs across three regional warehouses. Their existing workflow: weekly CSV exports from an ERP system, manually reformatted in Excel, then emailed to area sales managers.
The result was a 3–4 day lag between an inventory position changing and a sales rep knowing about it. Slow-moving SKUs sat unnoticed. High-demand items went out of stock before the reorder point was flagged.
The client needed a central dashboard that aggregated all data sources, made inventory vs. forecast positions visible at a glance, and could be maintained by their single internal IT resource without a data engineering team.
Constraints
- ›No real-time API from the ERP — data available as nightly CSV exports only
- ›One internal developer would maintain the system post-handoff; architecture had to be maintainable by a solo developer
- ›10-week fixed timeline — tied to end of fiscal quarter
- ›USD contract, IP assigned to client at project close
- ›WAGO product catalog updated weekly via their distributor API
Delivery Timeline
Discovery & Architecture
Mapped existing data sources (ERP export, distributor CRM, WAGO product catalog API, email order history). Designed the database schema and agreed on the component structure with the client's internal team.
Data Pipeline & Auth
Built ingestion scripts for ERP CSV exports and REST API sync with WAGO's catalog. Implemented NextAuth with role-based access (distributor managers vs. area sales reps). First staging deploy.
Core Dashboard Views
Shipped the three primary views: sales-by-SKU trend chart, inventory-position-vs-forecast table, and territory performance grid. All data rendered server-side with React Server Components.
Alerts & Reporting
Added threshold-based inventory alerts (email via Resend), PDF report generation, and a date-range filter that made the inventory table queryable across any trailing period.
QA, Handoff & Documentation
Full test suite (Vitest unit, Playwright E2E for critical flows). ADR documentation for all non-obvious architectural decisions. Deployment to Railway with GitHub Actions CI/CD. Two training sessions with the client team.
Technical Decisions Worth Explaining
Why Next.js App Router over a separate frontend/backend?
The client had one internal developer who would maintain the system post-handoff. A monorepo with co-located server components and route handlers was the lowest-maintenance architecture for a solo maintainer.
Why Railway over Vercel for hosting?
The ingestion jobs ran on a cron schedule and needed persistent PostgreSQL. Vercel's serverless environment doesn't support long-running jobs. Railway gave us a managed Postgres instance and cron jobs in the same platform, with a simpler billing model for the client.
Why server-side rendering for the dashboard?
The data updated nightly from ERP exports, not in real time. RSC with a 5-minute revalidation cycle was sufficient, avoided a client-side data fetching layer, and made the initial page load fast without hydration complexity.
Outcome
The dashboard shipped in week 10, one day before the deadline. The client's IT resource had maintainer access by week 9 and had made three independent configuration changes before the engagement closed.
The ERP-to-dashboard lag went from 3–4 days to 14 hours (next-morning nightly sync). Inventory alerts fired in the first week of production use, catching two understocked SKUs before they hit zero.
Build something similar?
Let's Talk About Your Dashboard
We build internal tools, distributor dashboards, and operations platforms for industrial and B2B clients. Same timezone, full IP transfer, transparent pricing.