---
title: "Automating after-sales returns to manufacturers, with a trace of every request"
description: "For Santécie, a medical-device distributor, a production automation that turns after-sales return files into filled manufacturer forms, with an audit trail for every request."
url: "https://mc-stud.io/en/work/robotform-after-sales-forms"
author: "Matisse Chenavas"
date: "2026-09-18"
lang: "en"
ai: "true"
---

# Automating after-sales returns to manufacturers, with a trace of every request

> Santécie’s after-sales return files are routed to the right manufacturer forms and filled automatically, with an audit trail for every request.

- **Client**: Santécie
- **Sector**: Healthcare, medical-device distribution
- **Period**: 2024-2026
- **My role**: Main developer, back end and front end
- **Setting**: Through a partner
- **Team**: Embedded in an existing team · 2 people (Embedded in the project team, with a second developer in 2024-2025.)
- **Status**: In production
- **Technologies**: NestJS, Prisma, Vue.js, Pinia, TypeScript, BullMQ
- **Reading time**: 4 min

## At a glance

- **Stake**: Every after-sales return must reach the manufacturer on that manufacturer’s own form; copying files across by hand took time and invited costly mistakes.
- **Mechanism**: Versioned routing rules designate the target forms, deterministic automation fills them, and AI only ever sees synthetic samples.
- **Proof**: Tens of thousands of requests processed in production since September 2025, with 100% operational completion according to my operational monitoring.
- **Impact**: Data entry becomes configuration: at least 500 hours avoided per 10,000 requests, and a failed request is replayed without redoing the batch.
- **Limits**: The indicators come from operational monitoring I report; they have not been independently audited.

## Metrics

- tens of thousands of requests processed in production since September 2025
- 100% operational completion, as defined above
- 0 operational failures, external outages tracked separately
- ≥ 500 h of data entry avoided per 10,000 requests (estimate)

## The starting point

Santécie distributes medical devices. When a device comes back for after-sales service, the return must go to the manufacturer with the right form, filled according to that manufacturer's template: each manufacturer has its own fields, versions and requirements. Return files mostly arrive as Excel spreadsheets, and someone had to copy their content across, form after form.

That work requires no judgement, but constant attention, and a copying mistake is expensive to fix. So the request had two parts: stop the re-keying, and know afterwards what was sent, where and why.

## What I built

The heart of the system is not the filling but the **routing**. A file can concern one form, several, or none, depending on its content. I structured the domain around three sharp notions: the form group, identified by a stable business code; the routing configuration, written as a sequence of conditions; the fill target, which ties a form to a precise version.


Two decisions mattered. Routing is resolved at run time, then frozen with the run: you fix a rule without rewriting history, and every filled form keeps the rule that produced it. With the team, I also separated completing a request, which only reruns what failed, from replaying it entirely.

A NestJS API with Prisma carries the domain, BullMQ queues absorb the volume, and a Vue 3 interface manages forms, their versions and the rules. Access is split by role, operator or administrator, and logs and processed content have a retention period.

### Where AI goes, and where it does not

With health data, the question is not whether AI can help, but where it is allowed to act. Production requests go through deterministic automation, with strict rules and schema. AI-assisted analysis is used only on synthetic samples, to generate the mapping models between incoming columns and a form's fields. Human validation happens upstream, on the configuration, not on each request.

> [!IMPORTANT] The data boundary
> Production content never goes through a language model. AI speeds up the preparation of mappings; it never sees the real files.

## Working inside the team, not beside it

I joined this project the way you join a team: through its code, its vocabulary and its habits, and I became its main author[^git]. Today the repository carries what lets someone else, human or agent, pick it up: a context file at the root, architecture decisions recorded one by one, an audit of the flows and a business glossary shared with the users.

That glossary mattered more than it seems. A "request" is not a "batch", a "replay" is not a "completion". The day a user asks why a form was filled twice, the answer lies in those distinctions.

## What the evidence shows

The automation has run in production since September 2025. The figures below come from my operational monitoring[^volume], and they only make sense with their definition.

> [!NOTE] Defining operational completion
> The automation fills the form end to end, without manual rework, and produces an audit trail of the run. This rate says nothing about the semantic correctness of a mapping. External dependency failures are tracked separately, as incidents.

The trace can be checked at any time: for a given request, the tool shows which rule applied, which branch was selected and which conditions were evaluated.


## What it changes

Re-keying turns into configuration: a rule is set once and applies to every incoming file. At 3 to 5 minutes of manual entry per form, every 10,000 requests represent between 500 and 830 hours of data entry avoided[^estimate].

When a file fails, you know which rule sent it where, and you complete or replay it without redoing the whole batch.


The system keeps evolving, with recent work on SAP routing integration and deployment. I work on it as an independent, embedded in the project team: first as a sole trader, then through MC Studio since January 2026.

## Limits

- The counts are mine: they have not been independently audited, and the exact volume is available on request.
- The completion rate measures end-to-end execution with its trace, not the correctness of each mapping.
- Time avoided is an estimate based on a manual entry duration, not a before-and-after measurement.
- The project is a team effort: product decisions were shared, and I do not claim sole direction.

[^git]: Git history of the repository: 113 of 193 commits are mine, from July 2024 to September 2026. A second developer contributed in 2024 and 2025. A commit count measures neither effort nor quality.

[^volume]: Aggregated counts from operational monitoring, which I report. The exact volume and an anonymised export of the counts are available on request.

[^estimate]: 10,000 requests × 3 minutes = 500 hours; × 5 minutes = about 830 hours. The 3 to 5 minutes is an estimate of manual filling time, not a measurement.

## Links

- [Santécie](https://santecie.com/)

---

Matisse Chenavas, Founder of MC Studio. https://mc-stud.io/en/work/robotform-after-sales-forms
