EXACTING Porozmawiajmy

Case study · Aplikacja Shopify

Data Engine dla Shopify

Masowy import i eksport katalogu w klasie Matrixify, zbudowany pod sklepy z dziesiątkami tysięcy produktów, wariantów i metapól. Zanim cokolwiek trafi do sklepu, widać każdą zmianę pole po polu.

Produkt
Aplikacja osadzona w panelu administracyjnym Shopify
Zakres
Produkt od zera: architektura, silnik importu, aplikacja Shopify, infrastruktura
Technologie
Java 21, Spring Boot, Remix, Shopify Polaris, PostgreSQL
Status
Działa, aktywnie rozwijany
Podgląd zmian przed importem: 312 nowych produktów, 14 086 aktualizacji, 4022 bez zmian i rozwinięty diff obecnej i nowej wartości dla jednego produktu
Data Engine na telefonie: jakość katalogu z wynikiem 86 na 100 i listą wykrytych problemów
500MB
maksymalny plik CSV lub XLSX, czytany strumieniowo
46
pól produktu plus wszystkie metapola sklepu
7
reguł walidacji przed zapisem
96
endpointów API silnika
190
testów automatycznych
30dni
na rollback zmian w polach produktów
Wyzwanie

Duży katalog w Shopify żyje w plikach CSV.

Cenniki od dostawców, nowe kolekcje, parametry w metapolach. Przy dziesiątkach tysięcy produktów nikt nie poprawia tego ręcznie w panelu. Każda zmiana to plik, a każdy plik to ryzyko.

  1. 01Import na ślepoPlik trafia do sklepu bez porównania z tym, co już w nim jest. Błąd w kolumnie z ceną widać dopiero wtedy, gdy widzą go klienci.
  2. 02Aktualizacja, która kasujePlik z samymi cenami nie może ruszać wariantów, zdjęć ani metapól, których w nim nie ma.
  3. 03Metapola bez kontroliWartość niezgodna z typem pola wraca jako niezrozumiały błąd API albo przepada bez śladu.
  4. 04Godziny importu, zero marginesuLimity API Shopify, restart serwera albo jeden zły wiersz nie mogą oznaczać zaczynania od nowa.
Co zbudowaliśmy

Import, który najpierw pokazuje, potem zapisuje.

Źródła danych

CSV, XLSX, Google Sheets i link

Pliki do 500 MB czytane strumieniowo. Arkusz Google można podpiąć na stałe, a zmiana w nim odświeża dane przed importem.

Mapowanie

Kolumny dopasowują się same

Dopasowanie po nazwie, aliasach i podobieństwie, z oceną pewności. Rozpoznaje nagłówki metapól w stylu Matrixify i natywnego eksportu Shopify.

Podgląd zmian

Diff pole po polu przed zapisem

Każdy produkt dostaje operację: nowy, aktualizacja albo bez zmian, z obecną i nową wartością. Wiersze bez zmian w ogóle nie idą do Shopify.

Bezpieczne aktualizacje

Plik z cenami nie kasuje reszty

Aktualizacja zmienia tylko to, co jest w pliku. Warianty, zdjęcia i metapola spoza pliku zostają nietknięte.

Walidacja

Błędy, zanim dotkną sklepu

Brakujące pola, handle, wartości słownikowe, liczby, adresy URL, duplikaty SKU i typy metapól. Komunikat wskazuje wiersz i kolumnę.

Wykonanie

Odporne na limity i awarie

Budżet punktów API liczony per sklep, ponowienia z narastającym odstępem, wznawianie przerwanych importów i raport błędów w CSV.

Eksport

Cały katalog, bez stronicowania

Shopify Bulk Operations do CSV lub XLSX: warianty, zdjęcia i metapola, z filtrami i wyborem kolumn. Plik wraca do importu bez poprawek.

Kontrola

Rollback i jakość katalogu

Przez 30 dni można przywrócić poprzednie wartości pól produktów. Skan jakości ocenia katalog w skali 0–100 i pokazuje braki.

Jak przepływa import

Od pliku do sklepu w sześciu krokach.

  1. 01PlikCSV, XLSX, arkusz Google albo link do pliku na serwerze dostawcy.
  2. 02MapowanieKolumny przypisane do pól i metapól automatycznie, z możliwością poprawki.
  3. 03WalidacjaSiedem reguł sprawdza dane. Błąd blokuje import, ostrzeżenie tylko informuje.
  4. 04PodglądObecna i nowa wartość dla każdego produktu. Nic się jeszcze nie zapisuje.
  5. 05ImportZapis przez Admin GraphQL API z kontrolą limitów i postępem na żywo.
  6. 06RaportRaport błędów w CSV, ponowienie tylko nieudanych wierszy, rollback przez 30 dni.
Ekrany

Narzędzie dla ludzi od katalogu, nie dla programistów.

Mapowanie kolumn: kolumny z pliku przypisane do pól Shopify z przykładem danych dla każdej kolumny
Mapowanie

Plik od dostawcy nie musi wyglądać jak eksport Shopify.

Silnik sam dopasowuje kolumny do pól produktu, wariantu i metapól pobranych ze sklepu. Chcesz zmienić tylko ceny? Zostawiasz aktywne dwie kolumny i reszta produktu zostaje bez zmian.

Kreator eksportu: wybór encji i formatu, filtry, kolumny pogrupowane na produkt, wariant i zdjęcia oraz lista eksportów z postępem
Eksport

Cały sklep w jednym pliku, bez limitu rekordów.

Eksport idzie przez Shopify Bulk Operations, więc nie ma stronicowania ani urwanych plików. Filtry, wybór kolumn i wszystkie metapola, a postęp widać na żywo.

Jakość katalogu: wynik 86 na 100, liczba produktów aktywnych, szkiców i archiwalnych, wykryte problemy i historia skanów
Jakość danych

Braki w katalogu widać, zanim zobaczy je klient.

Skan liczy produkty bez opisu, bez zdjęcia, bez opisu SEO i z ceną zero. Historia skanów pokazuje, czy katalog robi się lepszy z tygodnia na tydzień.

Pulpit Data Engine: liczba zadań, zadania zakończone i w trakcie oraz lista ostatnich importów ze statusami
Historia

Każdy import ma swój ślad.

Plik, liczba rekordów, status i wynik każdego uruchomienia. Import częściowy można ponowić tylko dla wierszy, które nie przeszły.

Zrzuty ekranu z danymi demonstracyjnymi.

Pod maską

Silnik zaprojektowany pod limity Shopify.

Ciężka praca dzieje się w osobnym silniku. Aplikacja w panelu Shopify jest tylko interfejsem, więc import trwający godziny nie zależy od otwartej karty przeglądarki.

SilnikJava 21 i Spring Boot 3, architektura heksagonalna. 96 endpointów REST w 23 kontrolerach, wirtualne wątki do długich importów.
AplikacjaRemix, React i Shopify Polaris, osadzona w panelu przez App Bridge. Cały interfejs po polsku.
ShopifyWyłącznie Admin GraphQL API: 14 mutacji i Bulk Operations do eksportu. Ponowione tworzenie produktu nie robi duplikatów.
DanePostgreSQL 16 z migracjami Flyway, pliki na dysku albo w magazynie zgodnym z S3, lokalna kopia katalogu do szybkich porównań.
OdpornośćBudżet punktów API per sklep, do 12 ponowień przy limitach, backoff z losowym rozrzutem, heartbeat i automatyczne wznawianie zawieszonych importów.
Jakość190 testów, w tym 41 dla metapól i test eksport → import na tym samym pliku. CI buduje i testuje silnik na prawdziwej bazie.
UtrzymanieObrazy Docker bez uprawnień roota, healthchecki, metryki Prometheus i Sentry z filtrem danych wrażliwych.
Efekt

Masowe zmiany bez strachu przed przyciskiem „Importuj”.

  1. 01Import bez niespodzianekPrzed zapisem widać, co zmieni się w każdym produkcie. Decyzję podejmuje człowiek, nie skrypt.
  2. 02Dane, które nie znikająAktualizacje nie usuwają wariantów, zdjęć ani metapól spoza pliku.
  3. 03Przerwany import to nie katastrofaPo restarcie import wznawia się sam, a ponowienie obejmuje tylko wiersze, które nie przeszły.
  4. 04Cały katalog w obie stronyEksport całego sklepu bez limitu rekordów i import tego samego pliku z powrotem, bez ręcznych poprawek.

Masz duży katalog i dość ręcznych importów?

Opowiedz, co chcesz zautomatyzować