Do you ship to Northern Ireland?
This document specifies the AI customer support system for a UK eCommerce store operated by our client on WordPress, handling 80–150 orders per day. The system is delivered by Marketing 8080AI, who own the technical side of the project and the integration; the client approves the final developer or agency, and payments.
The product gives the store's shoppers an AI support agent that helps with promotions and offers, order tracking, and common pre-sale and post-sale questions, and that hands over to a human when needed. The project is split into 3 phases: the voice support agent built with Vapi is developed first, followed by the chat agent. Both agents draw on one shared knowledge base. The solution relies on n8n automations and API integrations (WooCommerce, order data, knowledge base) running on our self-hosted n8n instance on a VPS.
The defining requirement is the feedback loop: every question the agent cannot answer is logged, the client's team reviews these in one place, adds the correct answer, and both agents use it from then on — without a developer.
The audience is two-sided: the client's support team, who live in the review-and-answer tooling all day, and the store's shoppers, who meet the voice and chat agents.
The system comprises:
Provisioned infrastructure: a shared FastAPI backend process for application APIs and domain modules; MariaDB for application-owned persistent data; a React frontend; a LiteLLM gateway for the backend's model-provider calls; and PostgreSQL supporting LiteLLM, separate from application-owned storage.
Removed from scope
The voice agent is the first delivery focus and is built with Vapi; the chat agent follows in a later phase. Both are customer-facing and reachable without an account: a shopper can start a voice or chat support conversation from the public Landing page or the dedicated support surfaces without signing in. The agents answer from one shared knowledge base and escalate to a human when they cannot help.
The client's team and human support agents use a first-party application with application-owned identity. A client support team member enrolls through Sign Up and returns through Login; a human support agent returns through Login. The Unanswered Questions, Answer Editor, and Handover Queue destinations are role-restricted. The anonymous entry interactions (Landing, Voice Support, Chat Support, Login, Sign Up) remain reachable without prior identity.
The n8n instance on the self-hosted VPS owns the automation work: logging unanswered questions, syncing accepted answers into the shared knowledge base, and calling WooCommerce and order data APIs for order tracking. The FastAPI backend owns application APIs and domain modules; MariaDB holds application-owned persistent data; LiteLLM mediates the backend's model-provider calls, backed by its own PostgreSQL. The client approves the final developer or agency, and payments — this is a commercial boundary, not a product behavior.
UNANSWERED · <n>; a row of 48px pixel icon tiles (voice, chat, parcel, tag, handover) joined by a dotted ink line to a green stamp tile reading SYNCED TO BOTH AGENTS; one oversized white outlined "unanswered question" card with an Add answer button rendered as a physical sticker with a 6px solid ink offset shadow.UNANSWERED · 0); success (counter and stamp render); error (counter unavailable — show muted — and keep navigation usable); recovery (retry counter fetch).VOICE / CHAT), a tabular timestamp, and an inline Add answer button; a dashed pending chip on unanswered items; a solid green live in both agents chip on resolved items; a split-flap terracotta counter in the top bar stepping the unanswered count on every new log.Add answer.Add answer button; status chip.live in both agents).live in both agents); error (save failed — retry, answer preserved); recovery (resubmit).FR-1 — AI customer support system for the client's UK eCommerce store (explicit) As the client's store, I should have an AI customer support system built for a WordPress store handling 80–150 orders per day, so that shoppers get support without a developer in the loop.
FR-2 — Promotions and offers help (explicit) As an eCommerce customer, I should get help with promotions and offers from the AI agent, so that I understand current deals.
FR-3 — Order tracking help (explicit) As an eCommerce customer, I should get help tracking my order from the AI agent, so that I know where my order is.
FR-4 — Common pre-sale and post-sale questions (explicit) As an eCommerce customer, I should get common pre-sale and post-sale questions answered by the AI agent, so that routine questions are resolved immediately.
FR-5 — Human handover when needed (explicit) As an eCommerce customer, I should be handed over to a human when the AI agent cannot help, so that my issue is still resolved.
FR-6 — Three-phase delivery, voice first (explicit) As Marketing 8080AI, I should deliver the project in 3 phases with the Vapi voice support agent developed first and the chat agent following, so that the voice channel is prioritized.
FR-7 — One shared knowledge base (explicit) As the client's store, I should have both agents use one shared knowledge base, so that answers are consistent across voice and chat.
FR-8 — n8n automations and API integrations on the self-hosted VPS (explicit) As Marketing 8080AI, I should run n8n automations and API integrations (WooCommerce, order data, knowledge base) on our self-hosted n8n instance on a VPS, so that the integration is under our control.
FR-9 — Log every unanswered question (explicit) As the client's store, I should have every question the agent cannot answer logged, so that no gap is lost.
FR-10 — Review logged questions in one place (explicit) As a client support team member, I should review the logged unanswered questions in one place, so that I can see every gap from both agents.
FR-11 — Add the correct answer (explicit) As a client support team member, I should add the correct answer to a logged unanswered question, so that the gap is closed.
Add answer on a card.FR-12 — Both agents use the answer from then on, without a developer (explicit) As the client's store, I should have both agents use the added answer from then on without a developer, so that the fix is immediate and permanent.
live in both agents chip.pending until synced.FR-13 — Client support team member self-service enrollment (required_inference) As a client support team member, I should be able to enroll via Sign Up, so that I can begin reviewing and answering questions.
FR-14 — Returning verification via Login (required_inference) As a client support team member or human support agent, I should be able to log in, so that I can resume my protected work.
FR-15 — Role-restricted access to protected destinations (required_inference) As the client's store, I should have Unanswered Questions, Answer Editor, and Handover Queue restricted by role, so that only authorized team members and human support agents act on them.
FR-16 — n8n automations for logging and knowledge base sync (required_inference) As Marketing 8080AI, I should have n8n automations on the self-hosted VPS handle unanswered-question logging and shared knowledge base sync, so that the loop runs without manual intervention.
pending.FR-17 — WooCommerce and order data API integrations (required_inference) As an eCommerce customer, I should have my order looked up via WooCommerce and order data APIs, so that order tracking answers are accurate.
live in both agents chip, and the unanswered count steps down.Add answer button; the split-flap counter steps up.Add answer on a card, opening Answer Editor.pending chip becomes a solid live in both agents chip.Muse: Susan Kare. Headline: "Every question answered. Every gap logged."
Colour tokens (light mode):
#F4F1EA (warm paper)#FFFFFF (white tiles)#1C1B18 (ink)#E4572E (terracotta — single hot action colour: primary buttons, unanswered count badge, record dot)#2E6E5B (deep green — resolved / synced state, stamps, status chips)#8A8578 (metadata, timestamps)Typography:
clamp(40px, 7vw, 96px), sentence case, flush-left, often one word per line.clamp(32px, 4.5vw, 56px).UNANSWERED · 14).Shape language: chunky 2px ink outlines on white tiles with 10px radius; pixel-step corners (a single 2px notch cut from one corner of hero blocks); pill buttons with a 3px solid offset shadow in ink; stamp-shaped chips with a dashed border for pending; 8px grid throughout — icon tiles 48×48 squares, badges 20px rounded squares. No soft shadows, no blur, no glass.
Layout: visible 12-column grid on the warm paper ground with 32px gutters at 1280px, collapsing to a single column at 375px. Unanswered Questions is a tiled grid of 3-up cards (2-up at 768px, 1-up at 375px). Navigation is a top bar of pixel-icon tabs, not a sidebar. Every page begins with a left-aligned oversized VT323 wordmark and a single rule.
Imagery: pixel pictograms as the image system — a 24×24 and 48×48 icon set drawn on the grid for phone, speech bubble, parcel, tag/promotion, handover arrow, question mark, stamp and sync. Where a larger visual is needed, a single oversized pixel icon (e.g. a parcel or speech bubble) is rendered at 240px as a flat colour block on the paper ground. No photography, no illustration scenes, no 3D.
The public entry is a flat, poster-like first screen on warm paper #F4F1EA. The left 7 columns carry a stacked VT323 headline at clamp(40px, 7vw, 96px) — "Every question answered. / Every gap logged." — each line flush-left with a terracotta 2px rule beneath the first word. Beneath it, a single row of 48px pixel icon tiles (voice, chat, parcel, tag, handover) is connected by a dotted ink line to a green stamp tile reading SYNCED TO BOTH AGENTS. The right 5 columns hold one oversized white outlined tile — a mock "unanswered question" card with its Add answer button — tilted 0deg but with a 6px solid ink offset shadow so it reads as a physical sticker on the page. A thin terracotta split-flap counter top-right reads UNANSWERED · 14. No gradient, no blob, no centred stack, no blue button. The concept recomposes only accepted content and controls: the two channel entries, the shared-knowledge promise, the unanswered count, and the Add answer action.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
SYNCED TO BOTH AGENTS stamp tile.prefers-reduced-motion, all motion becomes instant state swaps with no loop; a usable static arrangement is provided.#1C1B18 on paper #F4F1EA and white #FFFFFF meets readable contrast; terracotta and green are used for actions and status, not body text.
AI support · voice first, then chat
Shoppers reach a voice or chat agent that answers from one shared knowledge base — promotions and offers, order tracking, and everyday pre-sale and post-sale questions. When the agent can’t help, it hands over to a human with the conversation intact.
Do you ship to Northern Ireland?
The client’s team answers each logged question once; the knowledge base updates and both agents use it from then on — no developer needed.

AI support · voice first, then chat
Shoppers reach a voice or chat agent that answers from one shared knowledge base — promotions and offers, order tracking, and everyday pre-sale and post-sale questions. When the agent can’t help, it hands over to a human with the conversation intact.
Do you ship to Northern Ireland?
The client’s team answers each logged question once; the knowledge base updates and both agents use it from then on — no developer needed.
No comments yet. Be the first!