E-commerce / Operațiuni

Annette

Un backoffice de operațiuni pentru un magazin Shopify: comenzi, curier, facturare, reconciliere ramburs, seriale de depozit și prețuri de campanie, construit pe un API Symfony și un admin React.

Context

Un magazin Shopify nu este un sistem de operațiuni. Pe măsură ce volumul crește, ambalarea, curierul, facturarea, rambursul, retururile, punctele de loialitate și prețurile de campanie trăiesc în portaluri diferite. Echipa care trimite comenzile nu poate lucra din cinci ecrane, iar o nepotrivire între un AWB, o factură și o linie de decontare este costisitoare de găsit după ce s-a produs.

Problema de inginerie este integrarea cu disciplină: multe sisteme externe, fiecare cu propriile limite de rată și cu eșecuri parțiale, și un model intern care trebuie să rămână reconciliabil zi de zi, nu doar importat o dată.

Ce am construit

Platforma este un API Symfony ca sursă de adevăr pentru operațiuni, cu un backoffice React deasupra. Shopify rămâne magazinul; aici se gestionează fulfilment-ul, zona financiară și excepțiile.

  • Shopify ca sursă comercială — comenzile, clienții, colecțiile, discounturile, decontările și webhook-urile sunt importate incremental, cu ferestre de suprapunere, astfel încât o pagină ratată să nu lase un gol. Magazinul rămâne vitrina; API-ul deține starea operațională.
  • Logistică — AWB-uri, manifeste, geografice și decontări FanCourier, urmărirea stării de livrare, cazuri de retur și o integrare de depozit pentru numere de serie, astfel încât ambalarea și expedierea pornesc dintr-o singură coadă, nu din portalul curierului.
  • Facturare și finanțe — facturi SmartBill și starea plății (cu limite de rată și un verificator care citește înapoi starea și nu retrimite niciodată o plată), evidența cheltuielilor și liniile de decontare atât din Shopify, cât și de la curier.
  • Motor de reconciliere — fiecare comandă este clasificată în raport cu facturile, rambursul, retururile și rambursările. Problemele sunt deschise și închise în loturi, perioadele pot fi blocate, iar pentru o comandă există o interfață de diagnostic atunci când clasificarea automată nu este suficientă.
  • Coordonator de sincronizări — zeci de importuri de business rulează ca joburi Messenger cu lease, suprapunere, întârzieri de siguranță și o interfață de diagnostic, în locul unui crontab de comenzi independente care se pot suprapune sau se pot opri în tăcere. Drain-urile operaționale (reclaim de webhook, marcarea rambursului ca plătit, outbox-ul de notificări) rămân separate de ciclul orar.
  • Prețuri de campanie — un pipeline de living-price calculează discounturile dintr-un feed extern și scrie rezultatul înapoi în metafield-urile Shopify, cu o vizualizare a diferențelor pentru înregistrări orfane și nepotriviri, înainte de publicare.
  • Operațiuni adiacente — certificate de garanție PDF, import de recenzii, sincronizarea punctelor de loialitate, coduri de discount pentru influenceri și un model de roluri și permisiuni, astfel încât depozitul, zona financiară și administrarea să nu împartă același login.

Stack

Symfony 7.4 pe PHP 8.2 cu Doctrine și MariaDB, Symfony Messenger peste Redis pentru importuri și lucrul din outbox, un backoffice React 19 / TypeScript / Vite cu Redux Toolkit, autentificare pe sesiune cookie și permisiuni granulare, AWS S3 pentru documente și Mailgun pentru e-mail transacțional. Împărțirea este aceeași pe care o folosim și în alte proiecte: PHP acolo unde se află domeniul, cozile și integrările; React acolo unde operatorii lucrează zilnic.

Status

Proiect privat. Metricile detaliate și referințele de la clienți sunt disponibile la cerere, sub NDA.

Ai ceva care merită construit?

Începe un proiect