It does the catalogue work. It publishes nothing.
An outdoor and fishing retailer runs around 156 products on Shopify, and one person is responsible for every price, every bundle, every freight weight and most of the inbox. This agent does that work and hands it over as drafts. Every tool is dry-run by default, and the step from draft to live is always a person's.
A catalogue only rots in ways customers notice.
Everything waits on the same person
Product copy, bundle pricing, freight weights, the materials on a product page, the sales inbox, what competitors are charging. In a business with an owner and effectively one staff member, all of it queues behind the same person, and all of it rots quietly while something more urgent happens.
The errors are invisible from the front
A bundle variant with no components linked prices correctly, renders correctly and cannot be bought, and nothing on the page says so. A product can be complete, priced and active while published to no sales channel, so it still returns a 404. One set of 144 bundle variants sat at zero weight for weeks, quietly charging the cheapest freight band on parcels up to nine kilos.
The inbox is answered from a phone
Two people share the sales inbox and answer it between other jobs. Replies are short and good, because four years of them have worked out what to say. None of that was written down anywhere.
Six jobs that used to queue behind one person.
All of it runs through one purpose-built set of tools, scoped to the catalogue and the inbox and nothing else.
Products and variants
Created as drafts, with the store's own metafield definitions read live so a field added in the admin this morning is settable this afternoon. A checklist has to pass before anything can be published, and publishing is a separate, deliberate act.
Bundles
Components linked through the API, prices derived from the tier structure, and inventory left to derive from the components the way the platform intends. The bundle maths is the part a person should never be doing in their head.
Materials and FAQs
The accordion on a product page, filled one product at a time from what the page and the supplier actually state. No source, no entry, and the gaps come back as a list of specific questions rather than as silence.
Freight weights
Bundle weights summed from components with a packaging allowance. Where a component has no weight, it skips and says so, because a guessed weight is a freight bill somebody eats.
Customer email
Unanswered threads classified and labelled, routine replies pre-written as drafts in the house voice, the rest escalated. It only touches threads where the last message is inbound and nobody has replied.
Competitor pricing
A handful of boutique competitors tracked against a SKU map, with an append-only price history, and recommendations issued as ranges that depend on cost rather than as confident numbers.
The refusals are written into the tools
A rule in a prompt is a request. A rule in a function is a wall. The limits that matter here are coded into the tools themselves, so they hold whichever assistant is driving and whatever anybody types at it.
That matters most on price. A store this size has one person checking, and the damage from a bad price is done by the time anybody looks. So the tool refuses the shapes a mistake takes, and a blocked change comes back as a question rather than as a failure.
Refused by the tool
Over 50% off
Discounts are capped in code
A price move over 20%
Refused outright, in either direction
A new number in copy
A description edit can't introduce a figure
A rename that breaks a filter
Blocked if the theme matches on that word
A guessed weight
Skips the component and reports the skip
A disagreement between components
Reported, never quietly resolved
No generated product photographs
Bundle images are built by cutting the real product photographs out of their backgrounds and arranging them on a clean canvas. Every pixel of every product comes from a photograph of that product, sized against its real measurements so the things in the picture are in proportion to each other.
The reason is the law rather than the look. Misrepresenting goods is a Consumer Law problem in Australia, and an image a model invented is a representation nobody can stand behind. Where two variants share one photograph, the tool says so instead of producing two identical pictures of products that differ.
Claims carry a source
A material has to be an actual material. A brand isn't one, a component isn't one, and neither is a property like BPA-free.
Savings are computed every time
A bundle saving is measured against what the items cost separately today.
Gaps come back as questions
Unsourceable facts arrive as one list of specific questions, each naming what would unblock it.
Dry run, preview, apply, then go and check.
Dry run
Every tool defaults to dry run. The first call against the store changes nothing and comes back with what it would do.
Show the preview
The proposed change in full, with the reasoning and the source of every customer-facing fact. Anything it could not source is named as a gap rather than filled in.
Apply
On approval, the same call runs for real. It creates drafts, never live products, and the step from draft to active is always separate and always a person's.
Verify by re-reading
Several Shopify writes return no error while doing nothing at all, so a write is never trusted on its response. The agent re-queries what it just changed and reports what it found.
A house voice, taken from the archive.
Four years of sent replies already contained the answer to almost every question the inbox gets. That archive — 3,262 human-written replies, around 226,000 words — was read once and turned into the house voice: the shape of a reply, the register, the sign-offs, and roughly 1,900 verified question-and-answer pairs to draft from. The median real reply is thirty-eight words and one paragraph, so that is what the drafts look like.
The archive is frozen at the point it was read, and anything the agent writes is labelled so a future pass can exclude it. A voice model that learns from its own output stops sounding like the person it came from, and the only reliable signal of what good looks like is the edits a human makes to a draft.
What it won't do.
It can't reach the money
Orders, customers, refunds and inventory quantities are outside the tools entirely. Not guarded by a rule in a prompt — the functions do not exist, so there is nothing to talk it into. It can read orders for analysis and that is the whole of its relationship with them.
It won't invent a number
A price, a stock level, a date, a spec, a tracking number. If the figure isn't in the thread or the archive, the draft gets a visible placeholder for a person to fill. An empty field beats a confident wrong one, and on a product page a confident wrong one is a Consumer Law problem.
It won't normalise a deliberate oddity
One line sells below its siblings on purpose. The agent asks before touching any price that isn't demonstrably broken, and a broken price means a compare-at below the selling price or a figure that contradicts the product's own spec.
It never presses send
Email is drafts only, every time. If a person answers a thread while the agent is drafting a reply to it, the agent abandons its own draft. Nothing is ever moved to trash or spam.
Built with
Around forty tools, reached through the Model Context Protocol, which is the open standard for handing an AI assistant a set of tools. Component writes go through this one because the platform gives whichever app assigns a bundle's components sole rights to manage them afterwards, and that is a decision worth making on purpose. The client owns the code.
Running a store where everything queues behind you?
An agent can do the catalogue work, the pricing arithmetic and the first draft of the inbox, and still leave every public decision with you. Start with a free Workflow Review and I'll tell you what is worth handing over.