Un asistent care citește prețul și disponibilitatea din magazinul tău în secunda în care întreabă clientul.
Legăm asistentul de catalogul magazinului prin poarta lui publică, îl punem pe canalele pe care scriu deja clienții și îi dăm o regulă pe care nu o poate încălca: nu spune un preț care nu e publicat în magazin. Când depășește rolul, predă discuția unui om, cu evidență.
Construit dejaSe poate verifica din exterior, fără să ne întrebi pe noi. Punctul nostru de catalog livrat unui distribuitor răspunde 200 și spune „154 rezultate”, iar interfața publică a magazinului lui, interogată direct, întoarce antetul `x-wp-total: 154` — aceeași cifră, două surse independente, 06.09.2026. A doua implementare e funcția de catalog din platforma de asistenți: `storeCatalog.service.js` plus trei unelte încorporate pe care agentul le poate chema în timpul conversației. Rezerva pe care o spunem înainte de contract: mesajele din șablon WhatsApp nu există în codul platformei, deci nu promitem niciun mesaj proactiv în afara ferestrei de 24 de ore; iar traseul de catalog stă pe o ramură de dezvoltare care nu e unificată în trunchi — e livrat pentru magazinele pe care le-am conectat, nu pornit implicit pentru toți.
Un asistent de magazin nu se strică pentru că nu înțelege întrebarea. Se strică pentru că răspunde dintr-o copie a catalogului. Cineva a exportat produsele o dată, le-a lipit într-un fișier, iar de atunci asistentul citește o fotografie veche a magazinului: prețul de acum trei săptămâni, stocul de dinaintea weekendului. Merge perfect până la prima schimbare de preț și până la primul produs epuizat — și atunci greșește cu convingere, ceea ce e mai rău decât să tacă. În comerț asta nu e o eroare de nuanță: clientul vine în magazin cu prețul pe care i l-a spus botul.
Alegerea noastră e simplă și are consecințe: catalogul nu se copiază, se citește. Pentru magazinele pe WooCommerce, interfața Store API e publică — deci conectarea se face cu adresa site-ului, fără cheie de consumator și fără secret. Când clientul întreabă de un produs, agentul cheamă o unealtă, unealta întreabă magazinul, magazinul răspunde cu prețul și disponibilitatea de acum. Ce apare în conversație e ce e în magazin, nu ce era când s-a făcut integrarea.
Costul acestei alegeri e vizibil în cod, nu ascuns: catalogul se încarcă paginat, până la treizeci de pagini de câte o sută de produse, se ține într-o memorie temporară de zece minute per site și se normalizează într-o singură formă, citită fără modificări de toți consumatorii — inclusiv de carusela de produse din mesagerie, care are nevoie de preț numeric, și de widgetul din pagină. Zece minute e compromisul: o schimbare de preț făcută acum se vede în cel mult zece minute, nu instantaneu. Spunem cifra, ca să o poți contesta.
Restul limitelor nu vin de la noi, ci de la canale, și e mai onest să le știi înainte: Meta refuză text liber în afara ferestrei de 24 de ore de la ultimul mesaj al clientului, Instagram nu are carusele de produse deloc, iar o poză trimisă de client se marchează în conversație, nu se atașează automat la o comandă. Fiecare dintre aceste propoziții e citată mai jos cu fișier și linie.
Ce cuprinde
Ce se schimbă concret în comerț online
Întrebarea devine o căutare în catalogul tău, nu o ghicitoare
Agentul are trei unelte încorporate peste un serviciu comun de catalog: `store_catalog_search` pentru căutare, `store_catalog_match` pentru potrivirea unei formulări de client cu un produs anume, `store_catalog_product` pentru fișa completă. Nu sunt unelte scrise separat pentru fiecare magazin — sunt funcție de platformă. Diferența practică: când reparăm ceva la potrivire, se repară pentru toate magazinele conectate deodată.
Prețul și stocul se citesc din magazin la momentul întrebării
Rezultatul uneltei vine din magazinul tău, nu dintr-un fișier de la noi. Memoria temporară e de zece minute per site, iar catalogul se parcurge paginat — până la 30 de pagini de câte 100 de produse. Consecința pe care trebuie s-o accepți: o schimbare de preț apare în conversație cu o întârziere de cel mult zece minute. Consecința pe care o câștigi: nu există scenariul în care agentul repetă luni de zile un preț scos din magazin.
Răspunsul iese pe canalul pe care a scris clientul
Șase canale au cod propriu în platformă: Messenger, Instagram Direct, Telegram, widgetul din pagină, o platformă locală de anunțuri și WhatsApp prin Cloud API pe Graph v22.0. Nu e un singur „chat” redenumit de șase ori: fiecare canal are propriile reguli de format și propriile moduri de a cădea, iar noi verificăm și cazul urât — un token de pagină expirat oprește canalul în tăcere dacă nu e monitorizat.
Conectarea magazinului pe WooCommerce se face cu adresa lui, fără chei
Store API este publică, deci nu-ți cerem `consumer_key` și `consumer_secret`. Nu e o comoditate, e o decizie de risc: uneltele scrise de mână pe care le-a înlocuit acest traseu țineau, unele dintre ele, chei de magazin scrise în clar în baza de date. Traseul nou a înlocuit 109 unelte scrise manual, dintre care 28 erau scrapere peste HTML — adică integrări care se rupeau la prima schimbare de temă a magazinului.
Caruselul de produse are condiții, și ele diferă de la un canal la altul
Pe Messenger, caruselul se afișează doar când sunt îndeplinite trei condiții simultan; dacă una lipsește, răspunsul rămâne text, nu se rupe. Pe Instagram nu există carusel de produse — Meta nu are șabloane generice pe Instagram, deci nimeni nu poate livra asta acolo, indiferent ce scrie în ofertă. E genul de propoziție pe care preferăm să o auzi de la noi înainte de contract.
Fereastra de 24 de ore pe WhatsApp, spusă cu numărul erorii
În afara ferestrei de 24 de ore de la ultimul mesaj al clientului, Meta respinge textul liber cu eroarea 131047, iar mesajul rămâne marcat eșuat în platformă. Mesajele din șablon — singura cale legitimă de a scrie primul după fereastră — nu există în codul platformei: o căutare după tipul `template` întoarce zero rezultate, se trimite doar tipul `text`. Deci: recuperare de coș abandonată pe WhatsApp la 48 de ore nu îți putem promite azi.
Rafalele de mesaje și mesajele duble sunt tratate, nu ignorate
Webhookul Meta chiar retrimite același mesaj: dedublarea se face pe identificatorul mesajului, cu 120 de secunde de memorie. Iar clientul care scrie „bună”, „aveți”, „modelul negru” pe trei rânduri primește un singur răspuns la tot ce a scris, nu trei răspunsuri parțiale — mesajele se adună într-un tampon de 15 secunde. În comerț asta contează mai mult decât pare: trei răspunsuri parțiale la o singură intenție arată exact ca un robot.
Predarea către om are stare, nu e o promisiune
Firul de discuție are stare explicită `bot` sau `human`. Jurnalul de preluare cunoaște trei acțiuni: preluare de către un om, revenire la bot, reactivare automată. Separat, firul are stare de respectare a timpului de răspuns — `ok`, `warning`, `breached` — deci se vede care conversație a rămas fără răspuns omenesc, nu doar câte au fost.
Ce nu rezolvă un asistent de magazin
Nu încasează plata. Nu creează comanda în magazin dacă magazinul nu are o cale de scriere — citirea e publică, scrierea nu. Nu atașează poza trimisă de client la o comandă: fotografia primită se marchează în conversație, atât, iar generarea de PDF nu există în platformă. Și nu repetă comanda anterioară a unui client fără acces autorizat la istoricul lui. Fiecare dintre acestea se poate construi, dar ca lucrare separată, nu ca bifă în ofertă.
Traseul
Cum trece o cerere prin sistem.
01
Verificăm întâi ce poartă publică are magazinul tău
Prima verificare, nu ultima: cerem catalogul din exterior și numărăm ce vine înapoi. Dacă magazinul e pe WooCommerce cu Store API activă, integrarea nu are nevoie de chei. Dacă nu, trecem la autentificare — și atunci cheia devine o piesă care se administrează, cu tot ce înseamnă asta. Livrăm rezultatul acestei verificări în scris, inclusiv când răspunsul e că nu se poate.
02
Conectăm catalogul și canalele, cu cazul urât testat
Conectarea Meta se face prin Embedded Signup. La fiecare canal verificăm nu doar primul mesaj reușit, ci și ce se întâmplă când tokenul expiră sau când magazinul nu răspunde. Livrăm canalele conectate și lista scrisă a comportamentului la fiecare mod de cădere.
03
Scriem rolul, uneltele și limita
Fiecare unealtă are descriere scrisă pentru model, parametri tipizați și termen propriu de execuție — implicit 15 secunde. Rolul agentului spune explicit ce nu are voie să afirme: preț nepublicat, termen de livrare, disponibilitate pe care nu a citit-o. Livrăm configurația agentului și lista de unelte atașate lui — nu toate uneltele platformei, doar cele de care are nevoie.
04
Pornim cu preluare umană activă și reglăm pragurile
Pornim cu predarea către om configurată și cu jurnalul de interogări pornit, ca să se vadă ce fragmente a folosit agentul și cu ce scoruri. De acolo se reglează pragul de similitudine și numărul de fragmente pe întrebare. Livrăm un raport de conversații cu deciziile de reglaj, nu doar un asistent pornit.
Traseul, în 5 pași
Datele
Ce atingem, unde stau și cât rămân
Regulile diferă de la o industrie la alta. Acestea sunt cele care se aplică în comerț online.
Catalogul nu se copiază la noi
Produsele, prețurile și stocul rămân la tine. Ce trece prin platformă e răspunsul la o întrebare, ținut în memorie temporară zece minute. Nu există la noi o bază cu catalogul tău pe care cineva să o poată exporta, pentru că nu există un export de făcut.
Unde stau conversațiile
MySQL, pe serverul propriu din Microsoft Azure. Schema are peste 80 de tabele modelate în Prisma, cu tabele separate pentru firele Meta, firele Telegram, firele de pe platforma de anunțuri, comentarii, etichete, note interne și jurnal de audit. Tokenul de canal se păstrează criptat Fernet.
Datele de comandă intră în câmp liber
Într-o conversație de magazin ajung nume, telefon, adresă de livrare și, uneori, mărimea sau problema medicală pentru care clientul cumpără produsul. Nu se poate opri tehnic. Se poate trata: se stabilește ce se păstrează, cât, cine are acces și ce e instruită echipa să nu ceară pe canal. Registrul de prelucrări al implementării se scrie la implementare, nu după.
Widgetul din pagină și lista de origini
Widgetul are o listă de origini permise per asistent, dar comportamentul implicit trebuie știut: dacă lista e goală, verificarea trece. E o alegere de compatibilitate cu instalările vechi, scrisă ca atare în cod. Practic, restricționarea pe domeniul magazinului tău se configurează explicit la fiecare implementare — nu vine gata pusă.
Termenul de păstrare
Se stabilește per implementare și se scrie în politica publicată de tine. Regula pe care o aplicăm la noi și o cerem și în proiecte: dacă o modificare de cod schimbă ce se colectează, cui ajunge sau cât se păstrează, politica publicată se modifică în același commit.
Un caz
Un catalog de 154 de produse, verificat din două direcții
Situația
Un distribuitor din Chișinău vindea printr-un magazin WooCommerce și răspundea la întrebări de produs pe canale de mesaje. Integrarea evidentă — un export de produse pus în baza de cunoștințe a agentului — ar fi funcționat până la prima campanie de reduceri.
Ce am construit
Am conectat catalogul prin interfața publică de magazin, care nu cere chei, și am pus peste el trei unelte pe care agentul le cheamă în conversație: căutare, potrivire și fișă de produs. Rezultatele se normalizează într-o formă unică, citită la fel de caruselul din mesagerie și de widgetul din pagină, ca să nu existe două adevăruri despre același preț.
Ce a ieșit
Verificarea se poate face din exterior, fără să ne crezi pe cuvânt: punctul nostru de catalog răspunde 200 și raportează 154 de rezultate, iar interfața publică a magazinului, interogată direct, întoarce antetul `x-wp-total: 154`. Aceeași cifră, două surse independente, în aceeași zi.
Ce nu spune cazul
Cifra e a acelei zile, 06.09.2026, și se schimbă când distribuitorul adaugă produse — asta e ideea. Nu e o măsurătoare de performanță și nu spune nimic despre vânzări; spune doar că agentul citește catalogul real.
Întrebări
Ce întreabă cineva din comerț online
De unde știu că nu spune un preț vechi?
Pentru că nu are de unde să-l ia. Prețul vine din răspunsul magazinului tău la momentul întrebării, ținut în memorie temporară cel mult zece minute. Nu există la noi o copie a catalogului din care să citească. Verificarea o poți face singur: întrebi agentul de un produs, schimbi prețul în magazin, aștepți zece minute și întrebi din nou.
Ce răspunde când produsul e epuizat?
Ce spune magazinul. Disponibilitatea vine din același răspuns ca prețul. Ce nu face — și e o decizie, nu o scăpare — e să inventeze o dată de reaprovizionare. Dacă vrei ca agentul să propună alternative când un produs lipsește, asta e o regulă pe care o scriem explicit în rolul lui și o testăm, nu ceva ce se întâmplă de la sine.
Poate să finalizeze comanda?
Nu din citirea catalogului. Store API publică e o poartă de citire; scrierea unei comenzi cere o cale autentificată către magazin, deci o lucrare separată, cu chei care se administrează. Ce face azi: duce clientul până la produsul corect, cu prețul corect, și îi dă legătura sau predă discuția unui om.
Poate scrie el primul unui client care a abandonat coșul?
Pe WhatsApp, nu, în afara ferestrei de 24 de ore. Meta respinge textul liber cu eroarea 131047, iar mesajele din șablon nu există în codul platformei. Pe Telegram și pe Messenger, în limitele regulilor fiecărui canal, există automatizări programate care reiau conversațiile rămase fără răspuns, cu contoare vizibile pentru câte au plecat și câte au fost sărite.
Merge cu carusel de produse pe Instagram?
Nu. Meta nu are șabloane generice pe Instagram, deci caruselul nu există acolo pentru nimeni. Pe Messenger există, dar cere trei condiții simultane; când una lipsește, răspunsul rămâne text. Preferăm să auzi asta acum, nu la a treia săptămână de implementare.
Magazinul meu nu e pe WooCommerce. Ce se schimbă?
Se schimbă prima etapă: în loc să conectăm adresa, verificăm ce interfață publică are platforma ta și dacă răspunde suficient de repede pentru o conversație. Dacă nu are niciuna, ori scriem un conector autentificat — și atunci discutăm cine administrează cheia — ori spunem că nu se poate face onest catalog viu și rămânem la o bază de cunoștințe actualizată periodic, marcată ca atare.
Clientul trimite poza produsului pe care îl vrea. Ce se întâmplă?
Fotografia se marchează în conversație și rămâne acolo pentru omul care preia. Nu se atașează automat la o comandă și nu se generează niciun document din ea — nu există cod pentru asta. Un agent care ar pretinde că a înregistrat comanda din poză ar minți, iar asta se descoperă la livrare.
Ce se întâmplă când clientul scrie patru mesaje unul după altul?
Primește un singur răspuns, la tot ce a scris. Mesajele se adună într-un tampon de 15 secunde înainte de a fi trimise modelului. Separat, dacă platforma Meta retrimite același mesaj — și o face — dedublarea pe identificatorul mesajului, cu 120 de secunde de memorie, împiedică al doilea răspuns.
Cine răspunde când agentul nu știe?
Un om din echipa ta, iar predarea se vede în sistem: firul trece din starea `bot` în `human`, jurnalul de preluare notează cine și când, iar starea de respectare a timpului de răspuns arată dacă firul a rămas atârnat. Fără mecanismul ăsta, „predă la un operator” e o promisiune pe care nimeni nu o poate verifica luni mai târziu.