The business case depended on resolving work

Dinsko handles about 18,000 orders and 4,200 support tickets each month. Three support agents covered questions about deliveries, sizing, returns, and refunds. At NocodeAssistant, we built a custom support agent in five weeks.

Dinsko had already tried Intercom Fin. In that setup, it gave the standard return window for sale and custom items and sent customers to a tracking page instead of checking their order. A quick answer could still leave the full task with a person.

The case for a custom build came from those gaps. The agent needed access to live orders, carrier data, and the exact return rules. A managed tool would have reduced the software we had to maintain. Building our own gave us control over the steps between a customer asking for help and the work being completed. That control came with responsibility for integrations, testing, and policy changes.

The model selects tools, and code applies policy

We separated conversation from business rules. Claude Haiku interprets the request and selects the tools to call. Those tools retrieve order data and check eligibility. The return windows and exceptions belong in code, where the same inputs can produce the same result.

Responsibility Where it belongs
Understand the request and ask for missing details Model
Retrieve the order and carrier status Connected systems
Check item type, return window, and refund path Fixed rules
Confirm and submit a refund request Tool workflow with a recorded confirmation
Resolve failed requests and complex cases Support team

The earlier version used fixed routing for the conversation as well. That made requests with several steps awkward. Model tool selection gave the agent more freedom to follow the request, while the policy checks kept the actions bounded.

The agent checks eligibility, asks the customer to confirm, and submits a refund request with an audit trail. Failed or repeated requests go to a person. The model has enough freedom to manage the conversation without deciding the refund policy.

Search had to preserve exact terms

We used Voyage AI embeddings and PostgreSQL with pgvector to search 23 help documents. Keyword search runs alongside semantic search, which matches meaning. The documents cover returns, sizing, care, warranty, and shipping across Swedish, Norwegian, and English.

Customers sometimes use the exact policy terms in their questions. Semantic search can find a related passage while missing that exact wording. Combining both methods gives the system a way to match the customer’s meaning and the terms that matter to the answer.

This adds retrieval and ranking work to maintain. It was useful here because the documents contain policy exceptions that a broadly relevant answer can miss.

Escalation was part of the product

An unresolved conversation still needs to produce useful work. We made the handoff include the conversation summary, order context, and a suggested category. A support agent can start from the checks already completed.

This changes how I assess an AI support system. Resolution rate matters, but so does the amount of work left for the person who receives the next ticket. Pushing every request toward automatic completion can make the remaining cases harder to resolve.

We also streamed progress while tools ran. A customer can see that an order lookup or eligibility check is in progress. Streaming improves feedback during a wait. It does not make the underlying lookup faster.

Evaluation exposed mistakes in the system and the tests

Our retrieval benchmark initially compared document titles. Several correct chunks from one document could receive a misleading score. We changed the comparison to document IDs before using the results to judge retrieval quality.

Another failure came from product copy that instructed the reader to recommend a premium insole. The agent followed that instruction during return conversations. We changed the system prompt to separate retrieved reference material from instructions that control the agent.

We built 40 adversarial test cases covering ambiguous requests, multiple requests in one message, prompt injection, and questions outside the agent’s scope. Release checks blocked changes that dropped retrieval precision or the adversarial pass rate below the set thresholds.

I would bring this evaluation work forward in the next build. A test is useful only when its scoring matches the failure we need to prevent.

The result changed staffing and service costs

After 90 days, the agent resolved 47% of tier-one tickets without a person, about one-third of all tickets. Median first response fell from 4.2 hours to 8 seconds. Monthly support team cost fell from €14,200 to €9,200, a 35% reduction.

One employee moved from support to customer retention. Their salary moved to that budget. The custom agent ran on roughly €380 per month, already included in the support cost figure.

The result supports a specific decision: automate repeatable support work with clear policy boundaries, and make the remaining human work easier to complete.