Case study · A multi-market fresh-produce company

Customer Service Portal: Claims, Refunds, Coupons

Service console across three markets for claims, refunds, coupons and tech support — wraps WooCommerce, the claims DB and Make.com as sources of truth.

Headline outcome

One service console for executives across three markets. Source systems stay authoritative, every action audit-logged in two places, and AI does the first pass on every claim photo.

The brief

GrowXLabs built a customer service portal that lets a multi-market fresh-produce company run service operations across three markets from a single console — wrapping their existing WooCommerce stores, claims database, and Make.com automation as sources of truth, with AI doing the first pass on every claim photo and a full audit trail behind every action.

The team had been working out of a fragile no-code stack — a Glide app on top of a tangle of spreadsheets and ad-hoc tools — to handle quality claims, refunds, coupons, and customer tech support across all three markets at once. The data they needed lived in the source systems, but the people doing the work didn't have a console that talked to all of those systems together. Worse, when they jumped into WooCommerce directly to issue a coupon or process a refund, none of those actions were getting tracked anywhere — the audit trail had a hole in it.

They asked us to build one console that would close that hole, move faster than the no-code stack, and leave the source systems exactly where they were.

What we built

A single service portal built on three principles:

  • One console for the service team. Orders, quality claims, refunds, coupons, customer tech support, and an admin/configuration panel — all in one app, market-scoped so an executive only sees the market they're working in. A KPI dashboard sits on top.
  • Source systems stay the source of truth. The portal never owns customer or order data. Order detail is fetched live from the e-commerce store every time it's opened. Claims write back to the claims database. Coupons and customer emails are issued through Make.com. Supabase is used as a fast read-cache for list views — never as the system of record.
  • Every action is audit-logged in two places. Every refund, claim update, and coupon action is written both as a note on the source order ("[Service Portal] refund issued by …") and as an immutable row in an internal activity log. The audit hole the team had before is closed.

Coupon lifecycle from one place

The portal handles the full coupon lifecycle — create, update, and cancel coupons — without anyone needing to log into WooCommerce. Previously, the service team did this directly in WooCommerce admin and none of those actions were getting tracked: coupons appeared in the system with no record of who issued them, when, or against which claim. That was a real audit gap.

Now every coupon action runs through the portal:

  • Coupons are created against a specific claim, with the customer, amount, expiry, and reason captured automatically.
  • Updates and cancellations are one-click and instantly reflected in WooCommerce.
  • Every action lands as an order note on the customer's source order and in the internal audit log.

The team gets the speed of doing it in one place, and the business gets a complete trail behind every coupon ever issued.

Refunds, with duplicate prevention built in

Refunds are issued directly from the portal — one click, hits the e-commerce store, logs the order note. The dangerous edge case in any refund tool is the same one: an executive double-clicks the button, the network is slow, and the customer gets refunded twice. We hardened against it on three layers:

  • Database — a CHECK constraint that prevents both a refund and a coupon being recorded against the same claim.
  • Edge function — idempotency keys on every refund call to WooCommerce; the second click no-ops instead of issuing a second refund.
  • UI — the refund button disables the moment a refund is in flight and stays disabled once one has been issued for that claim.

A double refund isn't possible from this portal. The team can move fast without that fear.

Order detail

#1031849 · A. Lindgren

Delivered
SKU
Product
Qty
Total
Claim
P-241
Organic strawberries (500g)
×1
EUR 8.00
#10872
P-118
Heritage tomatoes (1kg)
×1
EUR 7.00
#10872
P-403
Sourdough loaf
×2
EUR 9.60
P-722
Free-range eggs (6)
×1
EUR 4.20
!
Refund blocked · coupon already issued for this claim
Coupon FRESH-A4QK for EUR 6.90 was issued on 02 May 2026 against claim #10872. A second refund cannot be created for the same lines.
Order detail with refund blocked — the system enforces the rule, the agent doesn't have to remember it.

Where AI does the first pass

Every photo uploaded to a quality claim is run through a vision model that scores the issue — type (mold, damage, taste, weight, packaging), severity, and a confidence number.

  • Claims with high-confidence routine issues flow through the standard executive path.
  • Claims below the configured confidence threshold are auto-routed to admin for human approval before any compensation goes out.
  • The score is always shown to the executive and the admin — never hidden, never blindly trusted.

The executive gets a pre-filled summary of what the photo shows and the suggested category. They confirm or override in one click. Manual classification on routine claims effectively disappears.

Claim #10872QualityCoupon
×
Order
#1031849
Customer
A. Lindgren
Resolution
EUR 6.90
Resolved by
M. Bergstrom
SKU
Product
Issue
Impact
Amount
P-241
Organic strawberries (500g)
Mold
60%
EUR 4.80
P-118
Heritage tomatoes (1kg)
Bruising
30%
EUR 2.10
AI quality check
2 photos analysed
Issue match
92%
Impact estimate
78%
Recommend
Approve · coupon
Claim review with AI quality check — issue match, impact estimate, and a recommended resolution before a human looks.

How we measure the team

Service-executive performance is tracked directly inside the portal:

  • Claims resolved per executive — volume signal.
  • Average AI confidence score across the claims an executive raises — quality signal.

The second metric is the more interesting one. An executive whose average confidence is consistently low is raising borderline or weak claims. An executive whose average is consistently high is reading customer issues correctly. The data is right there in the dashboard, alongside resolution time and market split, so coaching conversations are grounded in evidence rather than impressions.

Dashboard

Portal analytics · 2 cycles · all markets
2026-W192026-W18
Total claims
47
32 resolved
Quality claims
29
62% of total
Delivery claims
18
38% of total
Resolution rate
68.1%
32 of 47
Total amount
4,210
EUR
Avg AI score
71.4
Quality lines
Quality issue mix
29 lines
Mold
38%
Bruising
24%
Wrong item
18%
Missing item
12%
Other
8%
Resolution mix
EUR 4,210
EUR
Coupon41%
Refund36%
Redelivery23%
Operations dashboard — claim volume, resolution mix, and AI-score health for the cycle. Drives the weekly review.

What changed for the service team

From three different no-code apps and a folder of spreadsheets, to one console that knows about every market, talks to every source system, and leaves an audit trail behind every action.

The bigger structural win: source systems are now the single source of truth. Service executives no longer jump into WooCommerce to issue coupons or refunds, so the audit hole is closed. Time saved per claim is significant — what used to mean tool-switching across multiple tabs is now done in one console with AI-assisted classification and one-click resolution.

The team is faster, the work is better tracked, and the business has full visibility into how each executive is operating.

How we built it

Production stack from day one. Security and audit posture were non-negotiable.

  • React + TypeScript on Vite, Supabase backend. Postgres for read-cache and internal tables, Supabase Auth for sign-in, Supabase Storage for ticket debug attachments. Row-level security on every table; market-scoped policies; an INSERT-only audit log.
  • Supabase Edge Functions for every external call. Zero third-party credentials in the browser. Every WooCommerce, claims-API, Make.com, or AI request goes through a Deno edge function with secrets stored only in Supabase. The portal client only ever talks to Supabase.
  • Three WooCommerce store integrations. One per market, with order fetch, refund creation, coupon create/update/cancel, and order-note logging. Each store treated as an independent source of truth.
  • Claims REST API integration. Read and write against the company's existing claims database — list refresh, single-claim live refresh, and writes that go straight back to source.
  • Make.com webhook for customer comms. Coupon issuance and customer emails dispatched through the company's existing automation platform; the portal never sends customer messages directly.
  • OpenAI Vision for claim photo analysis. Confidence-gated; routine flows through, low-confidence routes to admin.
  • Sentry for frontend error tracking. Every error tagged with route, user role, and market.

Closely related: our build for a field operations company — a different stack, same operating principle of wrapping a multi-tool reality in one console with proper audit and AI assistance. More on the kinds of systems we ship in our services.

Frequently asked

How do you build a customer service portal for WooCommerce?

We build it as a standalone app with a Supabase backend that talks to WooCommerce's REST API through Supabase Edge Functions — never directly from the browser. The portal owns workflow, AI assistance, and audit; WooCommerce stays the source of truth for orders, refunds, and coupons. For this build we used React + TypeScript on Vite with Supabase Postgres, Auth, and Storage.

Why build a custom service portal instead of using Zendesk or Gorgias?

Off-the-shelf helpdesks are ticket-shaped — they don't natively integrate with WooCommerce orders, write back to a custom claims database, or trigger Make.com automations on resolution. A custom portal gives the team one console that talks to all those systems together, with audit trails written into both source systems and an internal log. The trade-off is build cost; the payoff is a workflow that matches how the business actually operates.

How can AI help with quality claim resolution in e-commerce?

We run every uploaded claim photo through a vision model that classifies the issue (mold, damage, taste, weight, packaging) and assigns a confidence score. High-confidence claims flow through the standard executive path; below-threshold claims auto-route to admin for human approval. Manual classification on routine claims effectively disappears, while humans still own every judgement call.

How do you keep WooCommerce as the source of truth when adding a custom portal on top?

By treating the portal's database as a read-cache only, never as the system of record. Order detail is fetched live from WooCommerce every time it's opened. Every refund, coupon, and order-note write goes through a Supabase Edge Function back to WooCommerce. Nothing in the portal's database is authoritative for customer or order data — list-view caching is the only thing it does locally.

How do you measure customer service team performance using AI?

Two visible metrics per executive: claims resolved (volume) and average AI confidence score across the claims they raise (quality). The second metric is the differentiator — a low average flags executives who consistently raise borderline claims; a high average means they're reading customer issues correctly. Coaching becomes evidence-based instead of impression-based.

Start a conversation

Ready to build something
that actually works?

No hard sell. We listen, understand your challenge, and tell you honestly whether we can help — and how.