Skrót RMA pochodzi od Return Merchandise Authorization, czyli autoryzacji zwrotu towaru. W praktyce system RMA jest programem do reklamacji: przyjmuje zgłoszenie, nadaje mu numer i pilnuje, żeby sprawa nie utknęła w skrzynce mailowej jednego pracownika. SoftwareStudio rozwija Studio RMA.net jako aplikację internetową działającą w przeglądarce, także w modelu SaaS.

Artykuł rozkłada obsługę reklamacji na mierzalne odcinki czasu i porównuje model SaaS z instalacją lokalną. Kolejne części opisują dobór systemu do skali firmy oraz mechanizmy, które utrzymują porządek w dokumentacji. Kod w przykładach ma nazwy poglądowe i nie odzwierciedla schematu żadnego produktu.

Czas reakcji w systemie RMA i jego pomiar

Szybkość reakcji na reklamację wpływa na zadowolenie klienta bardziej niż samo rozstrzygnięcie. Czas reakcji składa się jednak z kilku odcinków, a ich suma ukrywa miejsce, w którym sprawa stoi. System RMA mierzy każdy odcinek osobno, bo dopiero wtedy wiadomo, gdzie usprawnienie da efekt.

OdcinekOd zdarzeniaDo zdarzeniaCo zwykle go wydłuża
Rejestracjawysłanie formularzazapis zgłoszenia i numerręczne przepisywanie z e-maili
Przypisaniezapis zgłoszeniawyznaczenie właścicielabrak reguły przydziału
Pierwsza odpowiedźprzypisaniewiadomość do klientakolejka bez terminu
Decyzjaprzyjęcie towaruzawiadomienie klientaoczekiwanie na oględziny

Zgłoszenie trafia do systemu natychmiast, niezależnie od tego, czy wypełnia je klient, czy pracownik przy telefonie. Odcinek rejestracji zbliża się więc do zera, a kontrola przesuwa się na przypisanie i pierwszą odpowiedź. Sposób przyjmowania spraw przez Internet opisuje artykuł o obsłudze reklamacji online.

SELECT DISTINCT
       PERCENTILE_CONT(0.5) WITHIN GROUP
           (ORDER BY DATEDIFF(MINUTE, DataWplywu, DataPierwszejOdpowiedzi)) OVER () AS MedianaMinut
FROM dbo.Reklamacja
WHERE DataPierwszejOdpowiedzi IS NOT NULL
  AND DataWplywu >= DATEADD(MONTH, -1, SYSDATETIME());

Zapytanie liczy medianę czasu do pierwszej odpowiedzi z ostatniego miesiąca. Mediana jest odporna na pojedyncze sprawy, które czekały tygodniami, a średnia arytmetyczna reaguje na nie silnie i zaniża obraz codziennej pracy zespołu.

Numer sprawy nadawany przez bazę

Każda sprawa dostaje unikalny numer, który identyfikuje ją w wiadomościach, na etykiecie zwrotnej i w rozmowie z klientem. Numer nadaje baza, a nie aplikacja, bo dwa równoległe zgłoszenia nie mogą otrzymać tej samej wartości. W SQL Server służy do tego obiekt SEQUENCE.

CREATE SEQUENCE dbo.SeqReklamacja AS INT START WITH 1 INCREMENT BY 1;

SELECT CONCAT('RMA/', YEAR(SYSDATETIME()), '/',
              FORMAT(NEXT VALUE FOR dbo.SeqReklamacja, '000000')) AS Numer;

Sekwencja gwarantuje unikalność, ale nie ciągłość. Wycofana transakcja zostawia lukę w numeracji, co jest zachowaniem prawidłowym. Zerowanie numeracji co rok wymaga osobnej sekwencji na rok albo polecenia ALTER SEQUENCE RESTART w ustalonym terminie. Zasady budowy numeru opisuje artykuł o numerze RMA.

Priorytet i kolejka spraw

Kolejka posortowana wyłącznie według daty wpływu sprawia, że pilne sprawy czekają za prostymi. System nadaje więc priorytet według reguł i sortuje listę najpierw po priorytecie, a dopiero potem po terminie odpowiedzi.

  • Priorytet z umowy - odbiorca biznesowy z zapisanym czasem odpowiedzi wyprzedza zgłoszenia bez takiego zobowiązania.
  • Priorytet z rodzaju wady - zgłoszenie dotyczące bezpieczeństwa użytkownika trafia na początek kolejki.
SELECT Numer, Priorytet, TerminOdpowiedzi
FROM dbo.Reklamacja
WHERE Status <> 'Zamkniete'
ORDER BY Priorytet ASC, TerminOdpowiedzi ASC;

Reguły priorytetów zapisane w danych da się zmienić bez wdrażania nowej wersji aplikacji, a zespół widzi na liście, dlaczego dana sprawa stoi wyżej.

Model SaaS i instalacja lokalna programu do reklamacji

W modelu SaaS dostawca utrzymuje infrastrukturę i wdraża aktualizacje, a firma płaci abonament i loguje się przez przeglądarkę. Przy instalacji lokalnej te same zadania spadają na dział IT klienta. Studio RMA.net jest aplikacją ASP.NET opartą na bazie MS SQL Server, więc obie ścieżki są technicznie możliwe, a wybór sprowadza się do podziału odpowiedzialności.

ObszarSaaSInstalacja lokalna
Infrastrukturapo stronie dostawcyserwery i baza w firmie
Aktualizacjewdraża dostawcawdraża dział IT w oknie serwisowym
Rozliczenieabonamentlicencja oraz utrzymanie infrastruktury
Integracjeinterfejs API przez Internetdostęp do baz w sieci wewnętrznej
Kontrola danychzapisy umowy z dostawcąpełna kontrola w firmie

Sposób udostępnienia konkretnego systemu potwierdza się w ofercie dostawcy. Rozwiązanie w chmurze nie wymaga własnej infrastruktury serwerowej ani angażowania działu IT do bieżącej administracji, co przesądza o wyborze w mniejszych firmach. Szczegóły modelu opisuje strona system RMA w modelu SaaS, a poszerzone spojrzenie na chmurę artykuł obsługa reklamacji w chmurze.

Reguła: w umowie SaaS trzeba zapisać, gdzie leżą dane, kto wykonuje kopie zapasowe i w jakim czasie odtwarza się system po awarii.

Kopie zapasowe i cele odtwarzania

RPO określa, ile danych firma może stracić w razie awarii, liczone jako czas od ostatniej kopii. RTO wyznacza czas, w którym system musi wrócić do pracy. Dla systemu reklamacyjnego dziennik zmian i załączniki mają większą wartość niż sam ekran, więc kopię robi się także dla plików, a nie tylko dla bazy. Podstawy tworzenia kopii opisuje dokumentacja kopii zapasowych SQL Server.

W systemie obsługującym wiele firm dane każdej z nich muszą być rozdzielone. Można to zrobić osobną bazą dla klienta albo wspólną bazą z filtrowaniem wierszy, na przykład mechanizmem Row-Level Security. Wybór wpływa na koszt utrzymania i na łatwość odtworzenia danych jednego klienta.

Wybór systemu RMA do skali firmy

Nie każda firma potrzebuje tego samego zestawu funkcji. Dobór warto zacząć od skali reklamacji i liczby osób, które będą pracować w systemie, a dopiero potem porównywać ofertę.

Skala działalnościTypowe potrzebyNa co uważać przy wyborze
Mała firma handlowaprosty formularz i numer sprawybrak eksportu danych przy zmianie systemu
Średnie przedsiębiorstwoprzydział do działów i integracja z ERPograniczona liczba pól konfigurowalnych
Sieć z wieloma magazynami zwrotówrole oraz interfejs APIwydajność listy spraw przy dużej bazie
Mężczyzna w okularach pracuje przy komputerze, na ekranie widać tabelę z pomarańczowymi polami
Praca z listą spraw: przy większej skali liczą się filtrowanie i przydział spraw oraz widoczność terminów.

Małe firmy najczęściej zaczynają od formularza zgłoszeniowego i automatycznej numeracji. Średnie i duże przedsiębiorstwa oczekują dodatkowo integracji z systemami ERP i e-commerce oraz wielopoziomowych uprawnień. Zestawienie argumentów za wdrożeniem zebrano w artykule 10 powodów, aby wdrożyć system RMA online.

Przy wyborze programu do reklamacji trzeba sprawdzić cztery kryteria.

  • Model rozliczeń - abonament lub licencja i jej zależność od liczby stanowisk.
  • Skalowanie - możliwość elastycznego zwiększania liczby użytkowników bez zmiany architektury.
  • Interfejs API - dostępność dokumentacji, która ułatwia podłączenie kolejnych systemów.
  • Wsparcie wdrożeniowe - szkolenia zespołu, od których zależy tempo przejścia na nowe narzędzie.

Migracja i eksport danych

Zmiana systemu nie może zostawić historii spraw w starym narzędziu, bo klient wraca z reklamacją także po latach. Przed wyborem trzeba sprawdzić, czy system pozwala wyeksportować dane w formacie nadającym się do przeniesienia, na przykład CSV albo przez interfejs API.

Migracja wymaga mapowania statusów starego systemu na statusy nowego oraz próby na kopii bazy. Sprawy otwarte przenosi się zwykle na końcu, w oknie serwisowym, żeby nie zmieniały właściciela w trakcie przenoszenia.

Historia sprawy jako dowód w sporze z klientem

Zmiana statusu i komentarz zapisują się z czasem oraz nazwą autora, tak samo jak każda wysłana wiadomość. Historia działa jak dziennik: wpisy się dopisuje, a nie edytuje. Gdy klient kwestionuje decyzję, firma pokazuje datę zgłoszenia i treść korespondencji wraz z załącznikami, zamiast odtwarzać przebieg z pamięci pracowników.

CREATE TABLE dbo.HistoriaSprawy (
    Id         BIGINT IDENTITY PRIMARY KEY,
    SprawaId   INT           NOT NULL,
    Zdarzenie  NVARCHAR(100) NOT NULL,
    Autor      NVARCHAR(100) NOT NULL,
    Data       DATETIME2     NOT NULL DEFAULT SYSDATETIME()
);

DENY UPDATE, DELETE ON dbo.HistoriaSprawy TO RolaAplikacji;

Polecenie DENY odbiera roli aplikacji prawo do zmiany i usuwania wpisów. Aplikacja może tylko dopisywać, więc nawet błąd w kodzie nie zmieni zapisanej historii. Korekta pomyłki oznacza nowy wpis z adnotacją, a nie nadpisanie starego.

Pełna historia porządkuje też dokumentację. Zamiast papierowych formularzy i zagubionych wiadomości firma ma jedno miejsce, w którym da się wyszukać sprawę po numerze albo po numerze zamówienia. Wpływ tego porządku na relacje z klientami opisuje artykuł zarządzanie reklamacjami a lojalność klientów.

Porządek w dokumentacji zamiast papierowego obiegu

Papierowe formularze i zagubione dokumenty pochłaniają czas, który zespół mógłby poświęcić na rozwiązywanie problemów. Podobnie działają telefony klientów z pytaniem o status. System RMA zastępuje ten obieg jednym rekordem w bazie, do którego każdy dział ma dostęp według swojej roli.

Problem w obiegu papierowymMechanizm w systemieSkutek
Zagubiony formularzrekord w bazie z unikalnym numeremwyszukiwanie sprawy po numerze
Brak śladu decyzjidziennik zmian statusuodtworzenie przebiegu w sporze
Telefony o statusportal klienta ze statusem onlinemniej zapytań do zespołu
Ręczne numerowaniesekwencja nadawana przez bazębrak zdublowanych numerów

Automatyzacja usuwa też powtarzalne czynności administracyjne, takie jak nadawanie numerów referencyjnych czy wysyłka potwierdzeń. Pracownik zajmuje się sprawą merytorycznie od pierwszej minuty, a system pilnuje formalności.

Przypomnienia o terminach i portal klienta

Studio RMA.net wspiera komunikację z klientem przez automatyczne powiadomienia e-mail i SMS. Po stronie firmy powtarzalne przypomnienia o terminach obsługuje zadanie cykliczne, na przykład zadanie SQL Server Agent. Zadanie uruchamia się o ustalonej godzinie i wybiera sprawy zbliżające się do terminu.

SELECT r.Id, r.Numer, r.WlascicielEmail, r.TerminDecyzji
FROM dbo.Reklamacja AS r
WHERE r.Status <> 'Zamkniete'
  AND r.TerminDecyzji <= DATEADD(HOUR, 24, SYSDATETIME())
  AND NOT EXISTS (SELECT 1 FROM dbo.Powiadomienie AS p
                  WHERE p.SprawaId = r.Id AND p.Rodzaj = 'Termin24h');

Warunek NOT EXISTS zapobiega dublowaniu przypomnień. Po wysłaniu wiadomości zadanie zapisuje wiersz w tabeli powiadomień, więc kolejne uruchomienie pominie tę sprawę.

Status sprawy widoczny online

Jednym z największych źródeł obciążenia zespołu są pytania o status. Portal klienta odpowiada na nie bez udziału pracownika, a przeglądarka pobiera stan sprawy z interfejsu firmy.

async function pobierzStatus(numer) {
  const odp = await fetch(`/api/reklamacje/${encodeURIComponent(numer)}/status`,
                          { headers: { 'Accept': 'application/json' } });
  if (!odp.ok) throw new Error('Status niedostepny: ' + odp.status);
  return odp.json();
}

Adres w przykładzie jest poglądowy i nie opisuje interfejsu produktu. Klient, który widzi etap sprawy, rzadziej dzwoni z pytaniem, a pracownicy mają więcej czasu na sprawy wymagające decyzji.

Kobieta w pomarańczowym swetrze trzyma smartfon z pustym ekranem, obok stoi otwarty laptop
Status sprawy dostępny na telefonie i w przeglądarce ogranicza liczbę zapytań kierowanych do działu obsługi.

Reguła: przypomnienie o terminie wysyła się z zapasem czasu, a wiadomość zawiera numer sprawy i nazwę osoby, która odpowiada za następny krok.

Analiza etapów z opóźnieniem

Reklamacje przestają być wyłącznie kosztem, gdy dane z nich prowadzą do zmiany procesu. System RMA pokazuje, które produkty są zgłaszane najczęściej i na którym etapie sprawy czekają najdłużej. Drugie pytanie wymaga zapisu każdej zmiany statusu z datą, czyli tej samej historii, która służy jako dowód.

SELECT Status,
       AVG(DATEDIFF(HOUR, DataZmiany, NastepnaZmiana)) AS SredniaGodzin
FROM (
    SELECT Status, DataZmiany,
           LEAD(DataZmiany) OVER (PARTITION BY SprawaId ORDER BY DataZmiany) AS NastepnaZmiana
    FROM dbo.HistoriaStatusu
) AS t
WHERE NastepnaZmiana IS NOT NULL
GROUP BY Status
ORDER BY SredniaGodzin DESC;

Funkcja okienkowa LEAD zestawia datę wejścia w status z datą wejścia w następny, więc różnica jest czasem przebywania sprawy w danym statusie. Wynik wskazuje wąskie gardło: jeśli najdłużej trwa oczekiwanie na towar, poprawa formularza niczego nie przyspieszy, a zmiana etykiety zwrotnej i komunikacji z klientem może przyspieszyć wiele spraw.

Zestawienie produktów według liczby zgłoszeń odpowiada na drugie pytanie: co reklamują klienci. Odniesione do wolumenu sprzedaży wskazuje asortyment, w którym wada powtarza się częściej niż wynika z przypadku. Wniosek trafia do działu zakupów albo do producenta, a po zmianie materiału lub dostawcy ten sam raport pokazuje, czy liczba zgłoszeń spadła.

Integracje z ERP i platformami kurierskimi

Studio RMA.net oferuje API REST, które umożliwia wymianę danych z systemami ERP i e-commerce oraz z platformami kurierskimi. Kierunek przepływu ma znaczenie: dane o zamówieniu i produkcie schodzą do zgłoszenia, a decyzja o sposobie rozpatrzenia wraca do systemu finansowego.

KierunekPrzekazywane daneEfekt
ERP do RMAzamówienie, dokument sprzedaży, nabywcaformularz uzupełniony bez ręcznego wpisywania
RMA do ERPdecyzja i wartość korektydokument korygujący lub zwrot płatności
Kurier do RMAnumer przesyłki i status paczkiśledzenie towaru w karcie sprawy

Wywołania między systemami mogą się powtarzać po błędzie sieci, więc odbiorca powinien traktować ten sam komunikat jako jedno zdarzenie. Numer zewnętrznego dokumentu zapisany w unikalnym indeksie chroni przed zdublowaniem korekty. Szerszy opis funkcji systemu zawiera artykuł oprogramowanie do obsługi reklamacji, a role i integracje omawia tekst o aplikacji RMA online.

Zestawienia terminów oraz zaległości dla spraw prowadzonych w takim układzie opisuje artykuł zarządzanie reklamacjami - terminy i raporty. Wersję demonstracyjną formularza i panelu udostępnia strona demo reklamacje, a kontakt telefoniczny z SoftwareStudio to +48 533 322 626.