Case study · 2024 · B2B procurement

How a German hospitality group cut tender prep from 3 weeks to 4 days

A bespoke procurement platform replaced an Excel + email workflow across 47 properties — anonymized bids, scheduled publishing, and a full audit trail in one self-hosted system.

  • ClientGerman hospitality group
  • IndustryMulti-property procurement
  • Year2024
  • Engagement9-week build · retained ops
Pact procurement platform — buyer/supplier portal interface designed for a 47-property German hospitality group.
01 — At a glance
78%
Faster tender cycles3 weeks → 4 days median time-to-award
47
Properties unifiedOne procurement system across all locations
30+
Suppliers per tenderAnonymized bidding restored a real competitive floor
Summary

A 47-property German hospitality group ran procurement on Excel sheets and email threads. We built them a self-hosted B2B procurement platform in 9 weeks — buyer/supplier portals, anonymized bid comparison, RBAC, audit trail, and scheduled publishing. They went from 3-week tender cycles to 4 days, with a methodology and audit log they can defend in any procurement review.

The problem

Procurement was held together with Excel and goodwill.

Procurement at a 47-property hospitality group is not glamorous work. Every kitchen needs linens. Every property orders cleaning supplies, food contracts, laundry, maintenance — hundreds of line items, every quarter, from dozens of regional suppliers.

The buying team had been running this on a stack of Excel briefs, email threads with 8–15 suppliers per category, a second Excel to consolidate bids by hand, an awarding meeting, and more emails to confirm. Median tender cycle: 18–22 days. Most of that time was a buyer normalizing units (one supplier quotes per kg, another per pallet), redacting identities to keep evaluation fair, and chasing missing fields.

We were buying from 30+ suppliers and could not produce a defensible record of why any specific award was made.

Three failures kept compounding. Bids arrived in four different formats, so comparison was lossy and awards were appealable. Suppliers could see each other's identities in cc'd email threads, so the bidding floor stopped being competitive after round one. And there was no defensible audit trail — when finance or external auditors asked why a position went to vendor X over vendor Y, the answer lived in someone's head and a Slack message.

That last one is the question that made them call us. The auditor's question is not optional.

Pact comparison row showing bids labeled K-1, K-2, K-3, K-4 with a callout explaining that K-3 is a per-tender alias.

Anonymized bidding. Suppliers identified by per-tender alias only — every tender opens a fresh competitive floor.

02 — Why us

Why they chose Synara

Off-the-shelf tools didn't fit. SAP Ariba, Coupa, and the German-market entrants like Mercateo were either built for €100M+ procurement orgs or were thin marketplaces that didn't model multi-property delivery and incoterms the way German hospitality requires. The brief was honest: we don't want a marketplace, we want our procurement workflow, digitized and defensible.

They also wanted to own the deployment. German mid-market procurement teams care about data residency. Cloud-only SaaS was a non-starter for some compliance reviews. We agreed to ship a self-hosted Docker Compose stack with auto-HTTPS that the team could deploy on any EU VPS or on-premise infrastructure, with no vendor lock-in baked into the platform itself.

03 — What we built

A three-portal procurement platform — buyer, supplier, admin.

Three browser windows side-by-side showing Pact's Buyer, Supplier, and Admin portals.
01

Anonymized bidding

Suppliers identified by per-tender alias only (K-1, K-2, K-3). Buyers cannot correlate the same supplier across tenders — every tender opens a fresh competitive floor.

02

Three isolated portals

Buyer, supplier, and admin workspaces with separate routing, separate dashboards, and Casbin policies enforced server-side on every endpoint.

03

Audit log on every action

Fourteen entities log old/new JSON values, IP, user agent, and timestamp on every state change. Every "why did you do this" question is one query away.

04

Scheduled publishing

Drafts publish on a deadline via Postgres pg_cron + pg_net calling an internal endpoint. No external scheduler, no extra infra to operate.

05

Auto-close + closing reminder

Tenders auto-transition to closed at the deadline. Non-awarded suppliers get a reminder so they keep engaging on future tenders — quietly improving retention.

06

Multi-language at the route level

German (default) and English routing, plus translatable categories and regions stored as JSONB. Every supplier-facing string ships in both languages.

Pact's admin audit log table — entity, action, old → new diff, actor, IP, timestamp on every state change.

Every state change is logged with old → new diffs. The auditor's first internal review took under an hour.

04 — Architecture

In plain English, why each choice.

Frontend
Next.js 16 + React 19 with server components by default. Tailwind 4 + shadcn/ui. Server-rendered comparison tables so buyers get instant page loads even with 30+ supplier bids across 200+ positions.
Backend
Hono on Node, deployed alongside Next.js. Zod-validated payloads. Forty-two endpoints across eight modules — auth, tenders, bids, marketplace, dashboard, admin, users, infra.
Data layer
Postgres with Drizzle ORM. Fourteen tables modeling companies, users, properties, regions, categories, tenders, positions, bids, supplier-tender aliases, offer costs, supplier categories, audit logs, notifications, and platform settings.
Auth + RBAC
Supabase Auth handles email + password with JWKS-verified server-side checks. Casbin sits on top with policies in CSV — adding approver tiers or regional admin later is config, not code.
Notifications
Self-hosted Novu. In-app + email events on every meaningful state transition (new bid, closing reminder, award). Self-hosted because vendor lock-in on a notification provider is a slow, expensive mistake.
Files + infra
Cloudinary for product images (CDN included). pnpm + Turborepo monorepo. Docker Compose with Caddy reverse proxy doing auto-HTTPS. Deploys on any EU VPS or on-premise.
05 — Outcomes

What changed after launch.

78%
Cycle time reductionMedian tender cycle 18–22 days → 3–5 days.
<1 hr
First internal auditSample they previously could not have answered at all.
↑ 40%
Bids per tender (avg)Anonymized bidding plus closing reminders restored supplier engagement.
0
Sev-1 incidents since launchSelf-hosted stack has stayed quiet.

MethodologyNumbers are based on the client's internal tender logs. Pre-launch baseline is the manual workflow in Q4 2023; post-launch numbers are platform data through Q1 2025. Median values, not averages. Reported ranges where the procurement team agreed the figures are defensible internally.

Our previous procurement was held together with Excel and goodwill. The platform Synara built gave us a real workflow — and an answer to every audit question I have ever been asked.

Procurement LeadGerman hospitality group
06 — What’s next

We continue to operate the platform with the team on a retained engagement: small-scope feature work (approval tiers, deeper export tooling, supplier scorecards), monthly infrastructure review, and ongoing security patching of the self-hosted stack.

Stack
  • Next.js 16
  • React 19
  • Hono
  • Postgres
  • Drizzle ORM
  • Supabase Auth
  • Casbin
  • Self-hosted Novu
  • Cloudinary
  • Docker
  • Caddy
  • pnpm + Turborepo

Want a procurement platform like this for your team?

You don't need a €2B SAP rollout to digitize procurement. You need a workflow that fits your team, an audit trail that fits your reviewers, and an architecture you own. We can scope and deploy a customized version in 8–12 weeks.

Start a conversation