← work Case study · commerce · 2026

gerboni: e-commerce CMS system with support agent.

An e-commerce store selling the coats of arms of Latvian cities on shirts. Live, taking Stripe payments, and runnable by one person, because the back office is designed like operational tooling and the support agent can actually do things.

360
SKUs in the catalogue
10
city coats of arms
24/7
support agent with real tools
3
Baltic countries shipped to

The context

Every Latvian city has a coat of arms, and most Latvians can name three. GERBONI turns that heraldry into a product line (ten cities, six colours, six sizes, 360 SKUs), and it is a real shop with real payments, not a portfolio demo. So the real design problem turned out to be everything that happens after the order, not the storefront.

The bet

One person can run a retail operation end to end if the operational load is designed away rather than endured. Two moves carry that bet: a back office built with the care usually reserved for the customer side, and a support agent with real tools instead of scripted sympathy.

The GERBONI admin dashboard: order and revenue tiles, orders placed today, recent orders with statuses, and low-stock alerts with per-variant counts
The back office at a glance: orders, revenue, today's work and low-stock alerts surfaced before they become apologies. The shop's most frequent user is the person running it, so this side gets customer-grade design too. tap to enlarge

The design decisions

The admin panel is a product, not a chore.

An order pipeline that carries each purchase from pending to delivered, refunds handled in place, stock alerts with thresholds, CSV export for the accountant. Operational tooling earns its keep in the worst hour of the week, so it is designed for that hour.

The agent has hands.

Support runs around the clock on a Claude-powered agent over WebSocket, with tools for order status, refund requests and natural-language product search. The same architecture rule as my transit platform: the agent acts within its tools, and ownership stays human. A support bot that can only apologise is a complaint form with a typing indicator.

Guest checkout is the default.

An account is a reward for a good first experience, not a toll on the way in. Wishlist, reviews and recently-viewed reward the return visit instead of gating the first one.

Heritage carried by restraint.

A serif wordmark, flat heraldic marks, deep-red accents, Latvian first with an English toggle. The crests are the brand; the design's job is to stay out of their way.

The GERBONI order management table: sortable columns, status badges from pending to delivered, totals, item counts and CSV export
The order pipeline: sortable, filterable, exportable. Statuses carry the workflow from payment to doorstep, and a cancelled order is one more status, not a crisis. tap to enlarge
The GERBONI storefront: product grid of city coat-of-arms shirts with colour and size filters, search by city name, and wishlist hearts
The storefront: search by city, filter by colour and size. The heraldry does the branding. tap to enlarge

What shipped

Live with Stripe checkout and shipping across Latvia, Estonia and Lithuania. Designed and built solo: Next.js 16 storefront, FastAPI behind it, PostgreSQL underneath, deployed with Docker and Kubernetes configs. AI-powered recommendations and recently-viewed round out discovery without ever interrupting it.

What I learned

Commerce is where craft meets consequence: a confusing refund flow is not a usability finding, it is a chargeback. The storefront earns the order; the back office earns the second one. Designing the admin panel as carefully as the shop window is what makes a one-person business possible at all.