+ problemWhat the client asked for
Nestle Professional Thailand's distributor portal had calcified into a WordPress and Drupal hybrid that had accreted over roughly seven years of regional IT decisions. The foodservice team, responsible for supplying NESCAFE, MAGGI, NESTEA and MILO in bulk formats to hotels, hospitals, schools and catering operators across the kingdom, was managing three separate content surfaces: a public marketing site on WordPress, a Drupal-based distributor login with a 2016-era interface, and a standalone recipe database in yet another system. The distributor login had become a friction point. Distributors called the hotline rather than logging in, because the Drupal instance showed static pricing from quarterly uploads and SKU availability lagged reality by up to forty-eight hours. The Bangkok-based digital lead wanted a unified stack, bilingual TH/EN routing that respected Thai script rendering, and a path to self-service content management for the foodservice marketing team.
+ processHow it was built
We kicked off in February 2024 with a two-week discovery sprint in Nestle Professional Thailand's offices off Rama IX road, shadowing the foodservice team, interviewing six distributor account managers, and auditing the existing Drupal data model. The scope crystallized into four workstreams: a public Next.js marketing surface with Sanity CMS for brand catalogue and campaign pages; a distributor portal with Auth0-backed authentication consuming SAP middleware for live pricing and inventory; a CMS-driven recipe library and chef training section with role-based access; and bilingual routing with Thai as the default locale. We scoped deliberately tight: five months, three senior engineers plus a fractional product designer, with Nestle's internal SAP middleware team as a fixed interface. We did not touch SAP directly. Their middleware team exposed a signed REST endpoint that abstracted IDoc into predictable JSON, and we built a thin adapter layer in Next.js API routes to normalize responses and handle the distributor-specific pricing matrix. We shipped weekly to a Vercel preview environment shared with Nestle's QA lead. The full platform shipped in late May 2024.
- Next.js 14
- Tailwind
- Sanity CMS
- Auth0
- SAP middleware (signed REST)
- Sentry
- Vercel
+ outcomeWhat shipped and what it changed
Distributor login time dropped meaningfully in the weeks post-launch, with the pilot group reporting a smoother reordering flow that surfaced their negotiated pricing without the previous drift between portal and invoice. The share of phone orders placed through the hotline, previously a high portion of total volume, fell as distributors began self-serving for routine reorders. The foodservice team published a meaningful body of recipes and training modules in the first month without a single dev ticket, a marked shift from the previous quarterly release cadence. Nestle Professional Thailand extended the engagement through Q3 2024 for phase two features. The relationship continues.
+ the technical winThe critical architectural decision was treating Nestle's SAP middleware as an opaque boundary rather than an integration target. Their internal team managed IDoc schema changes, SAP release cycles, and endpoint security. We consumed a single signed REST contract with versioned paths, building a distributor-aware pricing layer in Next.js API routes that cached responses at the edge and fell back to stale data with Sentry alerts rather than hard failures. This abstraction meant our build velocity stayed independent of SAP release windows, which operated on quarterly cycles. The pricing layer resolved distributor-specific matrices by reading claims from the Auth0 session, mapping to a distributor code in the middleware request, and merging live SAP pricing with CMS-managed promotional overrides when present. For SKUs with no live price, the layer surfaced a negotiated fallback rather than blocking the cart.
+ scopeWhat was delivered
- WordPress + Drupal hybrid migration to Next.js + Sanity.
- Auth0-backed distributor portal with role claims.
- SAP middleware adapter (signed REST), edge-cached, distributor-aware pricing.
- Bilingual TH/EN routing with Thai as the default locale.
- Sanity-driven recipe library and chef training with role-based access.