All postsPublished

Customer support at 360Películas: one inbox and AI agents on a short leash

WhatsApp conversations left for days led me to Chatwoot as the single inbox, the store's app as the bot's brain and Rakazo agents that propose before acting.

Illustration: on a desk, a laptop with the single inbox, a phone with a conversation and a robot arm sorting the messages, all linked by light trails.
Illustration: on a desk, a laptop with the single inbox, a phone with a conversation and a robot arm sorting the messages, all linked by light trails.

360Películas, my online store for pre-cut car window tint, gets questions on WhatsApp, by email and on Instagram. For months, customer support rested on an AI agent wired straight into WhatsApp and a handful of ad hoc tools. At today's volume, that stopped being enough.

This autumn I started building something else, in three pieces: a new back office in the store's application, Chatwoot as the single inbox, and an agent platform, Rakazo, for the background work. It is still in progress. This post covers what changed, the rules I put around the agents, what it cost and what I learned along the way.

Before: a good agent with no inbox

The store's WhatsApp agent went through several models, first Grok and then other providers, and it answered well about what it knew: prices, order status, tracking. The trouble was not the answers it gave. It was everything around them.

  • Forgotten conversations. When a conversation needed a person, it could sit for several days without a reply. There was no organised inbox and no way to see at a glance who was waiting, and for how long.
  • No clear owner. Tickets existed, but only for WhatsApp and only after the agent handed a conversation over. Nobody was clearly on duty to watch them, and there was no view of how long each customer had been waiting. When everyone can reply, often nobody does.
  • Scattered channels. Email and Instagram lived elsewhere, each with its own history. The same customer could write on all three and nobody put the pieces together.
  • Tone and facts. Some automatic messages addressed customers with the informal Portuguese «tu», which is not the store's tone. And the agent sometimes got things wrong, such as saying we only sold full kits, when the rear windshield is sold on its own from 89 €.

None of this is fixed by a better model. It is an organisation problem, and the organisation had to exist before putting more AI on top.

Three pieces, one job each

The store's application holds the data and makes the decisions. Chatwoot is where the conversations live. Rakazo's agents do the background work, and they only reach the store through the application, never the database directly.

Diagram: WhatsApp, email and Instagram arrive in Chatwoot; Chatwoot talks to the 360Películas application, which replies as an Agent Bot; Rakazo's agents connect to the application through an MCP server; the owner approves proposals.
The new architecture. The store's application sits in the middle: it is the only piece that touches orders and money.
Diagram: WhatsApp, email and Instagram arrive in Chatwoot; Chatwoot talks to the 360Películas application, which replies as an Agent Bot; Rakazo's agents connect to the application through an MCP server; the owner approves proposals.

The new architecture. The store's application sits in the middle: it is the only piece that touches orders and money.

The back office: where the facts live

In another post I described how orders left Notion and Filament gave way to a custom back office. That was the foundation for everything else: an agent can only answer well about an order if the order lives somewhere with rules. Since then the back office has gained what customer support needs.

  • Orders, tracking and the supplier balance, now with supplier credits recorded as entries of their own.
  • Refunds and proposals. An action that touches money or an order can start as a proposal and is only carried out once approved.
  • A communications log. Every email, message and notification sent to a customer, in one place.
  • History with before and after. Every change to an order keeps the old value and the new one, such as "Status: Shipped → Delivered", and who made it.
  • Returned orders, with a status of their own, "Devolvida" (returned), instead of a note lost in a comment.
  • A page for tracking problems, to see in one place the orders whose shipment needs attention.
  • Notifications on hold. Automatic notifications are held for 30 minutes before they go out, so they can be reviewed. I explain why further down.
Mock-up of an order's history in the back office, in Portuguese, with lines such as Status: Shipped to Delivered, each with the time and who made the change.
Mock-up with fictitious data: an order's history, with the old and new values. The back office is in Portuguese.
Mock-up of an order's history in the back office, in Portuguese, with lines such as Status: Shipped to Delivered, each with the time and who made the change.

Mock-up with fictitious data: an order's history, with the old and new values. The back office is in Portuguese.

Mock-up of the Notifications on hold page, in Portuguese, with automatic emails held back and the time left before each one goes out.
Mock-up with fictitious data: automatic notifications wait 30 minutes before going out.
Mock-up of the Notifications on hold page, in Portuguese, with automatic emails held back and the time left before each one goes out.

Mock-up with fictitious data: automatic notifications wait 30 minutes before going out.

Chatwoot: a single inbox

Chatwoot is an open-source customer support platform. I host it on my own server, and it is now the single inbox for WhatsApp, email and Instagram. WhatsApp reaches it through a bridge from the WhatsApp API the store already used, WhatsMiau. Every conversation has a status, an owner and a priority, and anyone on the team can see at a glance what is waiting for a reply.

Chatwoot demo screenshot: a list of conversations from several channels on the left, the open conversation in the middle and the contact's details on the right.
Chatwoot's conversation screen, with the project's own demo data. Image from the Chatwoot repository, MIT licence.
Chatwoot demo screenshot: a list of conversations from several channels on the left, the open conversation in the middle and the contact's details on the right.

Chatwoot's conversation screen, with the project's own demo data. Image from the Chatwoot repository, MIT licence.

Chatwoot is the interface. The brain is still the store's application: Chatwoot hands every new message to an Agent Bot, which is the application itself, and the application decides what to do.

  • Tools, not memory. To answer, the bot looks up the order status, tracking, the catalogue and prices, and the knowledge base.
  • Handover with a note. When it passes a conversation to a person, it leaves a private note with what it has already found out, so whoever picks it up does not have to read everything from the start.
  • Quiet hours. Anything written to a customer at night waits until 09:00.
  • Automatic priority. The bot's classification of the conversation sets its priority. It only ever raises it, never lowers it, and stops touching it as soon as a person changes it.
  • One customer, several channels. The same customer on WhatsApp, email and Instagram is linked to a single contact, with the history together.

"@bot" notes

This is the piece I like most. In a private note, which the customer never sees, the team can give the bot an instruction. A real example:

private note
@Bot 360p vai buscar a fatura do fornecedor e manda para a ups diretamente

In Portuguese, that reads "fetch the supplier invoice and send it straight to UPS". The bot fetches the supplier's invoice from our system, emails it to the carrier in a separate conversation the customer never sees, and tells the customer only that it is being handled. One sentence in a note replaces downloading a document, writing an email and coming back to the conversation to update the customer.

Mock-up of a Chatwoot conversation, in Portuguese: the customer asks about an order held at customs, the team writes a private note to the bot, the bot confirms in a note that it sent the invoice to the carrier and tells the customer it is being handled.
Mock-up with fictitious data: an “@bot” note and what the customer sees next.
Mock-up of a Chatwoot conversation, in Portuguese: the customer asks about an order held at customs, the team writes a private note to the bot, the bot confirms in a note that it sent the invoice to the carrier and tells the customer it is being handled.

Mock-up with fictitious data: an “@bot” note and what the customer sees next.

Rakazo: agents for the background work

Rakazo is an open-source agent platform by elie222, which I also host on my own server. Each agent has instructions, tools, routines and, when it needs one, a computer with a browser. Today there are three kinds:

  • The "CEO". It runs support and operations three times a day: it sweeps the conversations, proposes refunds, replacements and replies for approval, and follows up on whatever is pending.
  • Ops Fornecedor (supplier ops). It talks to the supplier through a browser, the way a person would.
  • Support agents per channel, for email, Instagram and WhatsApp.
Rakazo demo screenshot: a list of agents on the left and, next to it, a conversation with one of them summing up the work it did in a mailbox.
Rakazo's interface, with the project's own demo data. Image from the Rakazo repository, Apache 2.0 licence, cropped.
Rakazo demo screenshot: a list of agents on the left and, next to it, a conversation with one of them summing up the work it did in a mailbox.

Rakazo's interface, with the project's own demo data. Image from the Rakazo repository, Apache 2.0 licence, cropped.

An MCP server instead of a robot clicking around

Moving the agents onto my own server made me think about efficiency. The obvious route was a "master bot" clicking around the back office in a browser, the way a person would. It works, but it is slow and expensive: every screen it reads costs tokens and time, and everything depends on the screen not changing.

Instead, I built an MCP server tailored to the system. The agents talk to the store's application directly, through tools with a limited scope, guards and an audit log. It is faster, cheaper and safer. The browser is kept for where there is no alternative, such as talking to the supplier.

The MCP server is reserved for staff, with one token per agent and access limited to what each one needs. The tools are few and generic:

  • Reading orders, conversations and tracking, and searching the knowledge base.
  • Proposing a change. Nothing happens without approval. When I approve, the action runs: the reply goes to the customer or the replacement is created.
  • Sending a support message, with guards on the server: it respects quiet hours, it does not talk about money unless a refund has actually been carried out in the back office, it never uses the informal «tu», and it sends no more than three messages per customer per day.

There is a practical reason for keeping them few: Rakazo only shows up to 20 tools per server directly. It looked like a limitation and turned out to be good design. Instead of one tool per case, there is a small set that covers almost everything, and the important rules live on the server, not in each agent's instructions.

Mock-up of a proposal in the back office, in Portuguese: the CEO agent proposes a replacement film for an order, with the reason and the message for the customer, and Approve and Reject buttons.
Mock-up with fictitious data: an agent's proposal waiting for approval.
Mock-up of a proposal in the back office, in Portuguese: the CEO agent proposes a replacement film for an order, with the reason and the message for the customer, and Approve and Reject buttons.

Mock-up with fictitious data: an agent's proposal waiting for approval.

The guards

Agents with access to customers and money need limits that do not depend on what the instructions say.

  • Approval before money moves. Refunds and replacements are proposals. A person approves them.
  • Everything audited. Every action an agent takes is recorded: who, what and when.
  • Capped costs. Once, a browser run got out of hand and cost about 48 dollars. Now routines run three times a day, an alert fires above 4 dollars a day or 1 dollar per run, and each agent has a maximum number of screen actions per run.
  • Brakes. Safety holds, and switches that turn off each automation without touching the code.
  • Notifications on hold. A re-check of old shipments sent customers "shipment update" emails about orders that had nothing new. Since then, every automatic notification waits 30 minutes, on a page where the team can review it before it goes out.
  • Personal data kept out of instructions. No customer data goes into the agents' instructions, and audit logs are stored with personal data redacted.

What it cost: AI did not solve everything

It would be easy to tell this as if AI had done the work. It did not. Mostly, it sped up writing the code. The reason I am still talking about it is that there is always something to adjust, and only hours of work get you through most of the real cases and make everything truly ready for production.

  • Time. I picked two calm days and went all in. That was the start, not the end: the tuning goes on.
  • AI usage. Getting everything to work well came at a large cost in AI, both for coding and in the agents themselves.
  • Patches to applications that already work. Chatwoot is good, but it was not born for my system. It needed a custom Docker image to fit the store and WhatsMiau, the WhatsApp bridge.
  • One more machine. I set up a new VPS just to host this: Chatwoot, Rakazo and the agents. It is one more server to maintain and update.

For me it was worth it, because the underlying problem was real. But it is best to go in knowing that AI shortens the road, it does not remove it.

What I learned

  • Organisation before intelligence. The forgotten conversations were not the model's fault. They came from having no inbox, no clear owner and no view of waiting times.
  • Instructions guide, the server guarantees. No informal «tu», no money talk without a refund, no messages in the middle of the night: all of this is in the tool's code, not only in the prompt.
  • Approving is faster than writing. My job moved from drafting replies to reading proposals and pressing approve, or correcting them.
  • A bot has to know when to stop. It hands over with a note, lets go of the priority once a person changes it, and has a daily message limit.
  • A few generic tools age better than many specific ones.
  • Agents in a browser spend money in unpredictable ways. Cost limits have to exist before the first routine, not after the first bill.

Where it stands

It is too early for numbers, and I will not make them up. What is already clear: no conversation is forgotten for days, there is one inbox for the three channels, I approve instead of typing everything, and the bots know when to stop.

Since then, this is done too:

  • A store panel inside Chatwoot. With Chatwoot's Dashboard Apps, the order, the shipment and the scheduled messages show up next to the conversation, without switching tabs.
  • OAuth on the MCP server. The same server connects as a connector in ChatGPT and Claude, with the same tools and the same guards.

The rest is fine-tuning: every new case that shows up becomes one more rule or one more guard.

If your business's customer support is spread across WhatsApp, email and social media, and you want to bring it together with automation that knows when to stop, you can get in touch.

Need a site your team can update without calling a developer?

Start a project