Po co łączyć Google Sheets z magazynem i kurierami
Google Sheets może stać się centralnym panelem operacyjnym między sklepem internetowym, magazynem i firmami kurierskimi. Jedno miejsce, w którym widać całe zamówienie: od rezerwacji towaru, przez generowanie etykiety, aż po status „dostarczono”. Przy małym i średnim wolumenie wysyłek to często szybsze i tańsze rozwiązanie niż pełne wdrożenie rozbudowanego WMS.
Arkusz sprawdza się szczególnie dobrze tam, gdzie procesy jeszcze się zmieniają i trzeba często wprowadzać korekty. Zamiast zamawiać każdą modyfikację w systemie, można po prostu dodać kolumnę, formułę lub nową zakładkę. Cały zespół ma od razu dostęp do tych samych danych, a historia zmian jest automatycznie zapisywana.
Najczęściej Google Sheets pełni rolę „mostu” między światem e‑commerce (sklep, marketplace’y), a światem logistyki (magazyn, kurierzy, brokerzy przesyłek). Z jednej strony przyjmuje zamówienia, z drugiej – generuje listy przewozowe i etykiety oraz zbiera statusy paczek z API przewoźników.
Główne zalety stosowania Google Sheets jako centrum wysyłek
Najważniejsza przewaga arkusza nad typowym panelem w systemie magazynowym to elastyczność. Pola, statusy i raporty można dostosować do swojego procesu niemal od ręki. Jeśli jutro dodajesz nowego kuriera lub nowy typ dostawy, po prostu rozbudowujesz strukturę arkusza, a nie system.
Do kluczowych plusów należą:
- Niski koszt startu – wystarcza konto Google; większość funkcji jest dostępna za darmo lub w ramach Google Workspace.
- Łatwe współdzielenie – magazyn, biuro, obsługa klienta i właściciel firmy mogą pracować na jednym arkuszu, z różnymi uprawnieniami.
- Szybkie poprawki – formuły, filtry, widoki, dodatkowe kolumny tworzy się w minutach, nie w tygodniach.
- Dobra integracja z innymi narzędziami – Zapier, Make, API, Google Apps Script, dodatki z marketplace’u.
- Raportowanie „na żywo” – tabele przestawne, wykresy, dashboardy do monitorowania wysyłek i obciążenia magazynu.
To połączenie szybkości i niskiego progu wejścia sprawia, że Sheets jest świetnym poligonem doświadczalnym: proces można w nim wypracować i dopiero później przenieść do „cięższego” systemu, jeśli taka potrzeba się pojawi.
Ograniczenia arkusza względem klasycznego WMS
Google Sheets nie zastąpi pełnego systemu magazynowego w każdej sytuacji. Przy dużej liczbie zamówień, wielu magazynach, złożonej kompletacji i skomplikowanych procesach logistycznych arkusz może stać się wąskim gardłem.
Typowe ograniczenia:
- Wydajność – przy dziesiątkach tysięcy wierszy i rozbudowanych formułach arkusz zaczyna działać wolno; aktualizacje z integracji trwają dłużej.
- Brak „ciężkich” funkcji WMS – brak natywnej obsługi lokalizacji magazynowych, pickingu falowego, strategii kompletacji, cross-dockingu itp.
- Bezpieczeństwo i uprawnienia – trudniej kontrolować dostęp do fragmentu danych niż w systemach z rozbudowanym modułem ról i uprawnień.
- Brak wsparcia 24/7 – Google zapewnia infrastrukturę, ale cała logika procesu (skrypty, integracje) spoczywa po Twojej stronie.
Dlatego rozwiązania oparte na Google Sheets najlepiej sprawdzają się przy małych i średnich wolumenach lub jako warstwa integracyjna między istniejącym już WMS/ERP a systemami sprzedaży i kurierami.
Typowe scenariusze użycia w e‑commerce i B2B
Google Sheets dobrze radzi sobie z realnymi procesami w firmach, które dopiero rosną lub mają specyficzne wymagania. Kilka powtarzających się scenariuszy:
- Mały e‑commerce – kilkadziesiąt/kilkaset wysyłek dziennie, 1–2 kurierów. Arkusz to główny panel: zamówienia, rezerwacje stanów, generowanie etykiet przez API brokera, śledzenie przesyłek.
- Hurtownia B2B – zamówienia od stałych kontrahentów, często offline (e‑mail, telefon). Sheets pełni rolę pomostu między CRM/mailem a magazynem i kurierem, generując paczki oraz raporty rozliczeniowe.
- Sprzedaż wielokanałowa – marketplace’y (Allegro, Amazon), własny sklep, sprzedaż telefoniczna. Wszystkie zamówienia zbierane są do jednego arkusza, który następnie dystrybuuje dane do magazynu i kurierów.
W każdym z tych modeli kluczowy jest dobrze zaprojektowany proces i struktura arkusza – bez tego nawet najlepsza integracja z kurierem nie uratuje chaosu organizacyjnego.
Proces od zamówienia do „dostarczono” w Google Sheets
Integracja z magazynem i kurierami ma sens dopiero wtedy, gdy cały przepływ jest klarowny. Dobrze zdefiniowane etapy procesu pozwalają zbudować arkusz tak, aby w każdym wierszu zamówienia było widać, gdzie ono jest i co trzeba zrobić.
Mapa procesu wysyłki krok po kroku
Standardowy przepływ wygląda najczęściej tak:
- Klient składa zamówienie w sklepie lub na marketplace.
- Zamówienie trafia do arkusza (bezpośrednio lub przez synchronizację).
- System rezerwuje stan magazynowy dla pozycji z zamówienia.
- Magazyn kompletuje i pakuje towar, potwierdza gotowość paczki.
- Kurier otrzymuje dane przesyłki (API, broker, import pliku).
- Wygenerowany zostaje list przewozowy i etykieta.
- Paczka jest nadana i otrzymuje numer śledzenia.
- Statusy przesyłki wracają do arkusza aż do „dostarczono”.
Google Sheets wchodzi do gry od momentu przyjęcia zamówienia aż po rejestrowanie statusów trackingowych. Kluczowe jest ustalenie, które kroki będą w pełni automatyczne, a w których etapach człowiek nadal będzie podejmował decyzje (np. wybór kuriera w zależności od gabarytu).
Rola Google Sheets w całym łańcuchu
Arkusz może pełnić kilka ról jednocześnie:
- Rejestr zamówień – centralna lista wszystkich zamówień z różnych kanałów, z ich statusem i podstawowymi danymi.
- Interfejs dla magazynu – widok do kompletacji i pakowania, często przefiltrowany do zamówień „gotowych do pakowania”.
- Generator danych dla kurierów – źródło JSON/CSV/żądań API z danymi adresowymi i parametrami paczki.
- Panel śledzenia przesyłek – miejsce, w którym zapisuje się numery listów przewozowych, statusy, daty doręczeń.
- Źródło raportów – czas dostaw, ilość zwrotów, skuteczność poszczególnych kurierów, reklamację itd.
W praktyce oznacza to, że każda integracja (sklep, WMS, kurier) czyta i zapisuje dane do konkretnych zakładek oraz kolumn. Dzięki temu można dokładnie śledzić, kto i kiedy zmienił status, dodał numer listu przewozowego lub zaktualizował stan magazynu.
Systemy, które trzeba spiąć z arkuszem
Typowy zestaw systemów w takim projekcie obejmuje:
- Sklep / marketplace – WooCommerce, Shopify, Baselinker, Allegro, Amazon. Dostarczają dane zamówień, formy dostawy, płatności.
- Magazyn / WMS / ERP – system, który trzyma stany magazynowe i informuje, kiedy towar został spakowany i wydany kurierowi.
- Kurierzy lub brokerzy – DHL, DPD, InPost, UPS, GLS, FedEx oraz pośrednicy typu Furgonetka, Apaczka, Sendit, GlobKurier.
- CRM / księgowość (opcjonalnie) – informacje o płatnościach, korektach, fakturach mogą być powiązane z numerem zamówienia i statusem wysyłki.
Google Sheets jest po środku. Zamówienia zaciągane są z systemów sprzedaży, moduł magazynu synchronizuje stany, a integracja z kurierem generuje listy przewozowe i statusy.
Minimalny zestaw danych do obsługi wysyłki
Zanim pojawi się integracja z kurierami, w arkuszu trzeba ułożyć standard danych. Bez tego trudno poprawnie wygenerować etykietę czy list przewozowy. Minimalny zakres to:
- dane klienta: imię, nazwisko/nazwa firmy, telefon, e‑mail, NIP (B2B),
- dane adresowe: ulica, numer, kod pocztowy, miasto, kraj,
- metoda dostawy: kurier, paczkomat, punkt odbioru, odbiór osobisty,
- parametry paczki: waga, wymiary (opcjonalnie, przy większych gabarytach), ilość paczek,
- informacje o produktach: SKU, nazwa towaru, ilość,
- status wysyłki: np. „do realizacji”, „spakowane”, „etykieta wygenerowana”, „nadane”, „dostarczone”,
- numer listu przewozowego i link do śledzenia paczki.
Te dane pozwalają spiąć w całość praktycznie dowolnego kuriera lub brokera, bo są zbliżone do wymagań większości API przewoźników.
Struktura arkusza do obsługi magazynu i wysyłek
Dobrze zaprojektowana struktura Google Sheets decyduje o tym, czy integracja z kurierami będzie prosta, czy stanie się pasmem wyjątków i ręcznych korekt. Kluczem jest podział na logiczne zakładki i konsekwentne stosowanie identyfikatorów (ID zamówień, SKU).
Proponowany układ zakładek w Google Sheets
Praktyczny układ zakładek wygląda często podobnie, niezależnie od branży:
- Zamówienia – lista wszystkich zamówień z podstawowymi danymi i statusem wysyłki.
- Magazyn – katalog produktów, stany, rezerwacje, braki.
- Etykiety – dane wejściowe i wyjściowe dla integracji z kurierami (API, linki do etykiet).
- Słowniki – listy kurierów, metod dostawy, mapowania statusów.
- Log integracji – historia synchronizacji, błędy, liczba przetworzonych rekordów.
W małych wdrożeniach część z tych ról można połączyć, ale im bardziej proces się rozrasta, tym bardziej opłaca się trzymać osobne zakładki i czytelne granice odpowiedzialności.
Kluczowe kolumny w zakładce „Zamówienia”
Zakładka z zamówieniami jest centrum dowodzenia. Typowy zestaw kolumn to:
- order_id – unikalny identyfikator zamówienia z systemu źródłowego (np. WooCommerce, Baselinker).
- channel – kanał sprzedaży (sklep, Allegro, Amazon itp.).
- customer_name, customer_phone, customer_email – dane klienta.
- shipping_street, shipping_zip, shipping_city, shipping_country – pełny adres dostawy.
- shipping_method – np. „Kurier DPD”, „InPost Paczkomat”, „Odbiór osobisty”.
- pickup_point_id – identyfikator paczkomatu lub punktu odbioru (jeśli dotyczy).
- items_sku – lista SKU z zamówienia (jeden wiersz = całe zamówienie) lub osobne wiersze na pozycje zamówienia.
- items_qty – odpowiadające ilości.
- weight_total – łączna waga paczki lub wyliczana z kartotek produktów.
- shipping_status – aktualny status z punktu widzenia wysyłki.
- tracking_number – numer listu przewozowego.
- tracking_url – link do strony śledzenia paczki.
Na tym poziomie nie trzeba jeszcze przejmować się wszystkimi szczegółami technicznymi kurierów. Istotne jest, aby każde zamówienie miało jednoznaczny identyfikator i komplet danych do nadania paczki.
Powiązanie zakładki „Magazyn” z zamówieniami
Zakładka „Magazyn” powinna zawierać przynajmniej:
- sku – unikalny identyfikator produktu.
- name – nazwa produktu.
- stock_total – fizyczny stan magazynowy.
- stock_reserved – suma sztuk zarezerwowanych pod niezrealizowane zamówienia.
- stock_available – stan dostępny do sprzedaży: np. =stock_total – stock_reserved.
- weight_unit – waga jednostkowa (np. w kg).
- dimensions – wymiary (opcjonalnie) dla większych paczek.
Prosta formuła na obliczanie dostępnego stanu może wyglądać tak (dostosowana do Twojego układu):
stock_available = stock_total – stock_reserved
Rezerwację stanów pod zamówienia można policzyć formułami (np. z wykorzystaniem SUMIF/SUMIFS po SKU w zakładce „Zamówienia”) albo aktualizować automatycznie skryptem przy imporcie nowych zamówień. Klucz to spójne używanie SKU w obu zakładkach – bez tego nie zadziała żadne półautomatyczne wyliczanie dostępności.
Praktyczny schemat wygląda tak: nowe zamówienie trafia do arkusza „Zamówienia”, skrypt lub formuły zwiększają stock_reserved dla odpowiednich SKU, a magazyn przy kompletacji zamówienia aktualizuje stock_total (np. przez skan kodu kreskowego i prosty formularz Google). Po zmianie stanu całkowitego automatycznie przelicza się stock_available, więc dział sprzedaży od razu widzi, czy dany produkt można dalej oferować. Przy zwrotach lub anulacjach warto odwrócić ten proces: zmniejszyć stock_reserved i – po fizycznym przyjęciu towaru – podnieść stock_total.
Jeśli zamówienia przechowujesz w modelu „jedno zamówienie = wiele wierszy (pozycje)”, rezerwację najlepiej liczyć na poziomie pozycji. Dla każdego SKU sumujesz ilości z otwartych zamówień (status np. „do realizacji”, „w kompletacji”), a statusy typu „anulowane”, „zrealizowane” wyłączasz z agregacji. Pozwala to bardzo precyzyjnie kontrolować stany i eliminuje sytuacje, w których jedno zamówienie blokuje zbyt dużo towaru, bo zostało źle zsumowane.
Przy większej skali dobrą praktyką jest dodanie kolumn pomocniczych: data rezerwacji, źródło rezerwacji (np. „sklep”, „hurt”), priorytet. Dzięki temu w razie braków magazyn może szybko zdecydować, które zamówienia obsłużyć w pierwszej kolejności. Tak przygotowana struktura arkusza staje się stabilnym „kręgosłupem” dla integracji z magazynem i kurierami: listy przewozowe da się generować bez ręcznego przepisywania danych, a śledzenie paczek i raportowanie czasu dostaw opiera się na spójnych identyfikatorach i prostych, zautomatyzowanych aktualizacjach.

Integracja z magazynem: jak doprowadzić dane do jednego źródła prawdy
Arkusz z zamówieniami i stanami to jeszcze nie integracja. Dopiero regularny, powtarzalny import danych z systemów zewnętrznych daje efekt „jednego źródła prawdy”. Kluczowe są trzy strumienie: zamówienia, stany magazynowe i informacje o kompletacji.
Import zamówień ze sklepu, marketplace’ów i Baselinkera
Większość sklepów i integratorów (WooCommerce, Shopify, Baselinker, Allegro, Amazon) pozwala wyciągnąć zamówienia na kilka sposobów. W praktyce najczęściej sprawdzają się trzy ścieżki:
- eksport CSV / XLSX – ręczny lub automatyczny eksport do pliku i import do Sheets,
- feed Google Sheets – bezpośredni eksport do arkusza (np. z Baselinkera),
- API + Google Apps Script – skrypt w Apps Script pobiera nowe zamówienia po API i dopisuje je do arkusza.
Ręczne CSV wystarcza przy kilku–kilkunastu wysyłkach dziennie. Przy setkach zamówień dziennie opłaca się automatyzować import tak, aby nowy wiersz w „Zamówieniach” pojawiał się bez udziału człowieka.
Minimalna logika przy imporcie zamówień
Przy pierwszym imporcie, niezależnie od metody, warto zadbać o kilka prostych reguł:
- unikalne ID – nie nadpisuj istniejących zamówień; jeśli
order_idjuż jest w arkuszu, pomiń wiersz albo zaktualizuj tylko wybrane kolumny (np. status płatności), - mapowanie kanałów – kolumnę z systemu źródłowego (np. „source”) zamień na spójne
channelw arkuszu (np. „shop”, „allegro”, „amazon”), - normalizacja adresów – rozbij adres na osobne pola: ulica, numer, kod, miasto, kraj, a nie trzymaj wszystkiego w jednym polu „adres”,
- statusy sprzedażowe ≠ statusy wysyłki – status „opłacone” z WooCommerce nie jest równoznaczny z „nadane”; trzymaj własną kolumnę
shipping_status.
Przykład: sklep wystawia zamówienie „12345” z Allegro. Skrypt pobiera je po API, sprawdza, czy w „Zamówieniach” nie ma jeszcze order_id = 12345. Jeśli nie ma, dodaje wiersz ze statusem wysyłki „do realizacji” i oznacza channel = allegro. Kolejny przebieg skryptu już tego zamówienia nie duplikuje.
Synchronizacja stanów magazynowych z WMS/ERP
Arkusz nie może sam „wiedzieć”, ile jest towaru na półce. Dane o fizycznym stanie zwykle trzyma system WMS/ERP (Subiekt, Comarch, Enova, dedykowane WMS-y). Synchronizację można ułożyć na dwa sposoby:
- magazyn nadrzędny – WMS jest „panem stanów”; Sheets tylko je czyta,
- arkusz nadrzędny – przy prostym magazynie to Sheets jest główną bazą stanów, a zewnętrzne narzędzia tylko podglądają lub aktualizują wybrane pola.
Przy większej skali rozsądniej jest, aby to WMS/ERP był źródłem prawdy, a arkusz synchronizował się według ustalonego harmonogramu (np. co 10–15 minut lub raz na godzinę, zależnie od dynamiki sprzedaży).
Typowy przepływ „magazyn nadrzędny”
Prosty i skuteczny model wygląda tak:
- WMS eksportuje stany do CSV lub udostępnia API z listą produktów i stanami.
- Skrypt w Apps Script pobiera dane, dopasowuje po
skui aktualizuje kolumnystock_totalw zakładce „Magazyn”. - Formuły w arkuszu przeliczają
stock_reserved(z zamówień) istock_available. - Dział sprzedaży korzysta wyłącznie z
stock_available, a nie ręcznie wpisywanych stanów.
W logu integracji zapisujesz datę ostatniej pełnej synchronizacji oraz liczbę zaktualizowanych rekordów. W razie problemów od razu widać, czy ostatni import się wykonał.
Informacje z magazynu o kompletacji i wydaniu towaru
Same stany to za mało. Magazyn musi przekazać, kiedy zamówienie jest spakowane i kiedy realnie wyszło z magazynu. Są na to trzy popularne modele:
- ręczna aktualizacja w arkuszu – pracownik zmienia status wysyłki przy pakowaniu (np. z „do realizacji” na „spakowane”),
- formularz Google – magazynier skanuje kod zamówienia/kreskowy na liście, wysyła formularz; Apps Script aktualizuje odpowiedni wiersz zamówienia,
- integracja z WMS – status kompletacji pobierany automatycznie z systemu magazynowego po API.
Przykład: paczki pakowane są według wydruku z arkusza. Po spakowaniu magazynier skanuje kod kreskowy z listy i w prostym formularzu wybiera „spakowane”. Skrypt po numerze zamówienia wyszukuje wiersz w „Zamówieniach” i ustawia shipping_status = "spakowane" oraz datę kompletacji. Dział obsługi ma od razu podgląd, które zamówienia są gotowe do nadania.
Warianty integracji z kurierami i brokerami
Kurierzy i brokerzy oferują cały wachlarz integracji: od prostych uploadów CSV po pełne API. Wybór zależy od wolumenu przesyłek, kompetencji technicznych i wymagań biznesowych (np. czy potrzebne są automatyczne zmiany statusów).
Integracja przez pliki CSV / XLSX
Najprostsza metoda, często wystarczająca przy małej skali. Większość brokerów (Furgonetka, Apaczka, Sendit, GlobKurier) i części kurierów pozwala załadować plik z danymi przesyłek.
Praktyczny schemat:
- Tworzysz w arkuszu zakładkę „Etykiety” z kolumnami zgodnymi z szablonem brokera/kuriera.
- Dla zamówień o statusie „do nadania” formuły lub skrypt generują wiersze w „Etykietach”.
- Eksportujesz „Etykiety” do CSV/XLSX i wgrywasz do panelu kuriera/brokera.
- Po wygenerowaniu listów przewozowych pobierasz z panelu plik z numerami przesyłek i importujesz go z powrotem do arkusza (kolumny
tracking_number,tracking_url).
Plikowy model daje się wdrożyć w kilka godzin, bez programisty. Minusem jest ręczna praca przy imporcie/eksporcie i brak automatycznego śledzenia statusów.
Integracja przez API z wykorzystaniem Google Apps Script
Przy większym wolumenie lub potrzebie automatycznego śledzenia przesyłek lepiej sięgnąć po API. Google Apps Script pozwala wołać endpointy HTTP bezpośrednio z arkusza.
Podstawowe elementy integracji API
Minimalny zestaw elementów takiej integracji obejmuje:
- konfigurację w zakładce „Słowniki” – klucze API, login, hasło, endpointy (adresy URL), typ usługi (InPost, DPD, Furgonetka itd.),
- skrypt „createShipment” – funkcja w Apps Script, która czyta z „Etykiet” wiersze do nadania i wysyła je do API przewoźnika,
- skrypt „updateTracking” – cykliczna funkcja, która na podstawie
tracking_numberodpyta API o aktualny status i zaktualizuje kolumnęshipping_statusoraz ewentualnie datę dostarczenia, - log integracji – zakładka, w której zapisujesz udane i nieudane wywołania API (numer zamówienia, kurier, data, komunikat błędu).
Dla części brokerów/kurierów nie ma konieczności pisania własnego kodu – dostępne są gotowe skrypty lub dodatki do Sheets. Mimo to warto rozumieć strukturę: co, skąd i dokąd płynie.
Dodatki do Google Sheets i narzędzia pośrednie
Między plikami a „surowym” API są jeszcze narzędzia typu no-code/low-code i dodatki do arkuszy:
- Make (dawniej Integromat), Zapier, n8n – łączą Google Sheets z API kurierów/brokerów; reguła typu „nowy wiersz = utwórz przesyłkę”.
- dodatki z Google Workspace Marketplace – wyspecjalizowane integracje dla poszczególnych firm kurierskich lub systemów e‑commerce.
Taki pośrednik przejmuje część logiki (uwierzytelnianie, obsługę błędów). W arkuszu skoncentrujesz się wtedy na tym, aby struktura danych była spójna i kompletna, a narzędzie pośrednie zajmie się samym „klejeniem” systemów.
Generowanie listów przewozowych i etykiet bezpośrednio z arkusza
Niezależnie od wybranej metody integracji, proces generowania etykiet opiera się na tym samym schemacie: wybranie paczek do nadania, przekształcenie danych do formatu kuriera i zapisanie informacji o wygenerowanych przesyłkach.
Przygotowanie zakładki „Etykiety” pod kurierów
Aby dało się łatwo spiąć arkusz z kilkoma przewoźnikami, warto wystandaryzować zakładkę „Etykiety”. Praktyczny zestaw kolumn może wyglądać tak:
- shipment_id – wewnętrzny identyfikator przesyłki (np.
order_id+ sufiks, gdy jedno zamówienie = kilka paczek), - order_id – powiązanie z zakładką „Zamówienia”.
- carrier – kod kuriera/brokera (np.
inpost,dpd,furgonetka). - service_type – rodzaj usługi (np. „Kurier standard”, „Paczkomat”, „COD”).
- receiver_name, receiver_phone, receiver_email – dane odbiorcy.
- receiver_street, receiver_zip, receiver_city, receiver_country – adres dostawy.
- pickup_point_id – dla paczkomatów/punktów.
- weight, length, width, height – parametry paczki.
- cod_amount, cod_currency – kwota pobrania, jeśli dotyczy.
- reference – np. numer zamówienia dla klienta.
- tracking_number, label_url – wypełnia integracja po wygenerowaniu przesyłki.
- shipment_status – status na poziomie przesyłki („do utworzenia”, „wysłano do API”, „błąd”, „utworzona”).
Formuły w „Etykietach” mogą korzystać z funkcji VLOOKUP/XLOOKUP lub INDEX/MATCH, aby automatycznie zaciągać dane odbiorcy i parametry paczki z „Zamówień” i „Magazynu”. Dzięki temu nie trzeba przepisywać adresów czy wagi.
Półautomatyczne generowanie przesyłek: przycisk + Apps Script
Prosty, a efektywny model pracy w magazynie to „przycisk nadania paczek”. Realizacja w krokach:
- W zakładce „Zamówienia” dodajesz kolumnę
ready_for_shipment(np. checkbox). Magazyn zaznacza zamówienia gotowe do nadania. - Skrypt Apps Script (odpalany przyciskiem w arkuszu) wyszukuje wszystkie zamówienia z zaznaczonym checkboxem i statusem „spakowane”.
- Na ich podstawie tworzy wiersze w „Etykietach” (
shipment_status = "do utworzenia"). - Ten sam skrypt w pętli wywołuje API kuriera/brokera, tworzy przesyłki i uzupełnia
tracking_number,label_urlishipment_status = "utworzona". - Przy sukcesie aktualizuje w „Zamówieniach”
shipping_status = "etykieta wygenerowana".
Magazyn widzi efekt w kilka sekund, a proces jest powtarzalny: codziennie to samo kliknięcie, ta sama logika. Główna praca polega raz na zbudowaniu skryptu i przetestowaniu mapowania pól.
Obsługa kilku kurierów w jednym arkuszu
Firmy, które wysyłają kilkaset paczek dziennie, rzadko korzystają z jednego przewoźnika. Można to sensownie ułożyć w jednym arkuszu, stosując prosty zestaw reguł:
- logika wyboru kuriera – w „Zamówieniach” utrzymujesz reguły: np. dla paczek do 10 kg i paczkomatów – InPost, dla przesyłek zagranicznych – DPD, dla palet – kurier X; wynik zapisujesz w kolumnie
preferred_carrier, - mapowanie usług – w zakładce „Słowniki” trzymasz powiązania
channel + shipping_method → carrier + service_type, - osobne konfiguracje dla każdego przewoźnika – w „Słownikach” definiujesz parametry specyficzne dla kuriera (max waga, obsługiwane kraje, czy wspiera pobranie, wymogi co do formatu telefonu, konieczne pola),
- uniwersalny skrypt „router” – jedna funkcja Apps Script, która na podstawie kolumny
carrierwybiera właściwy moduł integracji (np.createShipmentInpost(),createShipmentDpd()).
Przy takiej konstrukcji magazyn nie zastanawia się, którego kuriera kliknąć. Widzisz listę zamówień, skrypt sam w tle rozrzuca przesyłki po odpowiednich API. Gdy zmieniasz przewoźnika, dopisujesz nowy moduł integracji, a struktura „Etykiet” i reszta procesu zostaje taka sama.
Dobrze jest też od razu założyć sobie „bezpiecznik”. Jeśli dla danego zamówienia żadna reguła nie jest spełniona (np. zbyt duża waga, nietypowy kraj), skrypt wpisuje carrier = "manual" i status, że wymagana jest ręczna decyzja. Dzięki temu problematyczne przesyłki nie blokują wysyłki całej partii paczek.
Przy kilku kurierach przydaje się raport kosztów i jakości. Wystarczy prosty pivot na zakładce z historią wysyłek: przewoźnik, liczba paczek, średni koszt, średni czas doręczenia, liczba reklamacji. Nawet taki arkuszowy raport pozwala szybko zobaczyć, czy warto przełączyć część ruchu na innego dostawcę.
Dobrze ułożony arkusz szybko zamienia się w lekkie centrum logistyczne. Zamówienia wpadają z kanałów sprzedaży, stany magazynowe aktualizują się automatycznie, do kurierów wychodzą kompletne dane, a statusy wracają z powrotem do wiersza klienta. Dzięki temu mniej czasu schodzi na przeklikiwanie paneli, a więcej zostaje na dopracowanie oferty i samej obsługi kupujących.
Drukowanie etykiet: PDF, zlecenia zbiorcze i praca magazynu
Kiedy integracja zwróci label_url lub sam plik PDF, trzeba to jeszcze przełożyć na sprawne drukowanie. Technicznie proste, organizacyjnie często zaniedbane.
Przy większej liczbie paczek dobrze działa model „partii”:
- w „Etykietach” dodajesz kolumnę
batch_id– identyfikator partii wysyłkowej (np. data + numer porządkowy), - przed wywołaniem API skrypt nadaje wszystkim nowym przesyłkom ten sam
batch_id, - druk odbywa się partiami: magazyn otwiera filtr na konkretny
batch_idi pobiera wszystkie etykiety za jednym razem.
Jeśli kurier zwraca etykiety jako pojedyncze PDF-y, możesz w Apps Script zapisywać je w Google Drive w strukturze:
/Kurierzy/<rok>-<miesiąc>/<data>/<batch_id>/<tracking_number>.pdfDo arkusza wpada wtedy nie tylko label_url, ale też ścieżka katalogu. Łatwiej wrócić do starej etykiety, gdy klient zgubi paczkę lub coś pójdzie nie tak na taśmie.
Przy większej skali wysyłek przydaje się też wydzielenie w arkuszu prostej listy „dzisiejsze etykiety do druku”. Wystarczy filtr widoku lub dodatkowa zakładka z formułą FILTER po shipment_status = "utworzona" i bieżącej dacie.
Integracja śledzenia przesyłek z obsługą klienta
Jeżeli statusy paczek są w arkuszu, szkoda ich nie użyć w kontakcie z klientem. Niewielkim nakładem pracy da się powiązać to z obsługą mailową czy systemem ticketowym.
Podstawowe elementy takiego spięcia:
- dodanie w „Zamówieniach” kolumn
last_tracking_status,last_tracking_update– aktualizowane automatycznie z „Etykiet”, - prosta kolumna
is_delayed– formuła, która sprawdza, czy paczka nie ma statusu „dostarczono” po upływie np. liczby dni zdefiniowanej w „Słownikach” dla danego kuriera, - widok „Ryzykowne przesyłki” – zakładka z wykorzystaniem
FILTER, która pokazuje zamówienia zis_delayed = TRUEi aktualnym statusem paczki.
Dalej można iść w automatyzację: Apps Script czy Make/Zapier mogą czytać ten widok i:
- wysyłać automatyczne maile: „Twoja paczka ma opóźnienie, monitorujemy sprawę”,
- tworzyć zgłoszenia w systemie helpdesk (np. przez API) z numerem zamówienia i ostatnim statusem przesyłki,
- oznaczać w CRM klienta tagiem „opóźniona dostawa”.
Obsługa klienta ma wtedy całość kontekstu w jednym miejscu: co klient zamówił, co jest na magazynie, jaki jest status wysyłki i czy wyszła już komunikacja z wyjaśnieniem.
Łączenie arkusza z systemem księgowym i rozliczeniami wysyłek
Wysyłki generują koszty, które zwykle rozlicza się osobno w systemie księgowym. Arkusz może stać się pomostem między fakturą od kuriera a realnymi paczkami, które wyszły z magazynu.
Praktyczny zestaw kolumn w „Etykietach” lub osobnej zakładce „Koszty wysyłek”:
- carrier_billing_id – identyfikator rozliczeniowy paczki po stronie kuriera/brokera (jeśli dostępny),
- shipping_cost_net, shipping_cost_gross, currency – rzeczywisty koszt z faktury,
- billing_period – okres rozliczeniowy, np.
2024-03, - invoice_number – numer faktury, na której była ta paczka.
Jeśli broker umożliwia eksport CSV/Excel z fakturą szczegółową, można ją wgrywać cyklicznie do zakładki „Import faktury kuriera” i użyć VLOOKUP/XLOOKUP po tracking_number lub innym identyfikatorze. Koszt przesyłki dopisze się wówczas automatycznie do historii wysyłek.
Na tym poziomie wychodzą na wierzch błędy procesowe: np. paczki nadane nie przez system, tylko „ręcznie” w panelu kuriera, albo odwrotnie – etykiety wygenerowane w arkuszu, ale nigdy nie podjęte przez przewoźnika. Da się też policzyć rentowność: wysyłka vs marża na produkcie przy konkretnych metodach dostawy.
Bezpieczeństwo danych przy integracjach kurierów i magazynu
Arkusz z danymi wysyłkowymi zawiera adresy, numery telefonów, często e‑maile i informację o wartości zamówień. Taki zestaw wymaga podstawowych zasad bezpieczeństwa, nawet w małej firmie.
Proste, a skuteczne reguły:
- osobne role dostępu – magazyn widzi tylko zakładki potrzebne do pakowania i nadawania (Zamówienia, Magazyn, Etykiety), dział marketingu nie potrzebuje pełnych adresów i telefonów,
- brak danych wrażliwych w komentarzach/notatkach – notatki do zamówień trzymaj w przeznaczonych kolumnach; komentarze trudno potem przeszukać i usunąć,
- log dostępu do integracji – na zakładce z logiem API zapisuj też użytkownika/źródło, które wywołało integrację (np. „Apps Script – harmonogram”, „Ręczne kliknięcie – użytkownik A”),
- minimalny zakres danych – do kuriera nie wysyłasz więcej, niż wymaga API: jeśli nie jest potrzebny e‑mail odbiorcy, nie przesyłaj go.
Przy integracjach zewnętrznych (Make, Zapier, inne narzędzia) trzeba sprawdzić, gdzie fizycznie lądują dane i jakie są ustawienia retencji. W większości przypadków da się skrócić okres przechowywania logów lub wyłączyć przechowywanie payloadów.
Skalowanie: kiedy jeden arkusz to za mało
Z czasem skala sprzedaży rośnie i jeden plik Google Sheets przestaje ogarniać całość. Pojawiają się setki tysięcy wierszy, kilka magazynów, różne kanały sprzedaży. Zanim nastąpi przesiadka na pełne WMS/ERP, można podejść do tematu warstwowo.
Najczęstsze kroki przejściowe:
- podział na kilka plików tematycznych – osobny plik na „Zamówienia i wysyłki”, osobny na „Magazyn i stany”, osobny na „Raporty”; łączysz je przez funkcję
IMPORTRANGElub narzędzia typu Connected Sheets, - archiwizacja starych danych – przesuwanie zamówień dostarczonych np. ponad 6 miesięcy temu do pliku „Archiwum”, dzięki czemu główny arkusz zostaje lekki,
- baza danych jako back-end – arkusz staje się tylko panelem, a dane źródłowe stoją w BigQuery/MySQL; Apps Script lub narzędzia ETL synchronizują wybrane wycinki do Sheets.
Sam proces integracji z kurierami może zostać taki, jak był: skrypt generuje etykiety na podstawie bieżących zamówień. Zmienia się tylko to, skąd bierze dane wejściowe i gdzie zapisuje historię.
Typowe problemy i jak je rozwiązać na poziomie arkusza
Nawet dobrze zaprojektowany arkusz z wysyłkami potrafi zaskoczyć w praktyce. Kilka problemów powtarza się szczególnie często.
1. Błędne adresy i „niekompletne” paczki
Kurier odrzuca przesyłkę z powodu brakującego numeru domu czy złego kodu pocztowego, a magazyn dowiaduje się dopiero przy zamknięciu dnia. Da się to mocno ograniczyć prostą walidacją danych.
- W „Zamówieniach” włącz Data validation dla kodów pocztowych, krajów, numerów telefonów (wzorce REGEX).
- Dodaj kolumnę
is_address_validz formułą sprawdzającą minimalny zestaw pól (ulica, miasto, kod, kraj, telefon). - Skrypt generujący etykiety filtruje tylko zamówienia z
is_address_valid = TRUE; resztę oznacza statusem „błąd danych”.
Magazyn nie traci czasu przy taśmie, a dział obsługi klienta ma jasną listę zamówień wymagających kontaktu z kupującym.
2. Duplikujące się etykiety dla tego samego zamówienia
Częsta sytuacja: ktoś dwa razy kliknął „generuj etykiety” albo odświeżył okno po błędzie. Kurier nalicza wtedy dwa koszty za jedną paczkę.
Minimum zabezpieczeń w skrypcie:
- przed utworzeniem przesyłki sprawdź, czy dla danego
order_idnie istnieje już w „Etykietach” wpis ze statusem innym niż „anulowana”, - jeżeli istnieje, dopisz do logu API wpis z typem „duplikat” i pomiń to zamówienie,
- w „Zamówieniach” trzymaj wersję pól (np.
shipment_version), aby wykrywać, czy ktoś nie próbował wygenerować innej etykiety do dawno wysłanego zamówienia.
3. Ręczne poprawki rozwalające formuły
Im więcej osób pracuje w jednym pliku, tym większe ryzyko, że ktoś nadpisze formułę „na szybko”. Po kilku dniach nikt nie wie, czemu część nowych zamówień nie idzie do kuriera.
Sprawdzone praktyki:
- podział na strefy: osobne kolumny „systemowe” (z formułami, blokowane uprawnieniami) i „do edycji ręcznej”,
- korzystanie z protected ranges na krytycznych kolumnach (
shipping_status,carrier,shipment_status), - regularne kopiowanie struktury formuł do osobnego „szablonu”, aby w razie awarii szybko je przywrócić.
Prosty schemat wdrożenia krok po kroku
Żeby przejść z „robimy wszystko w panelach kurierów” na „mamy wysyłki w Google Sheets”, można użyć krótkiej ścieżki wdrożenia. Nie trzeba od razu budować wszystkiego.
- Ustalenie struktur – najpierw projekt zakładek „Zamówienia”, „Magazyn”, „Etykiety”, „Słowniki”. Szkic w jednym pliku, bez integracji.
- Ręczny import – proste kopiuj/wklej lub eksport CSV z kanałów sprzedaży do „Zamówień”. Ręczne wypełnienie kilku przesyłek w „Etykietach”. Sprawdzenie, czy brakuje jakiejś kolumny.
- Półautomat bez API – pierwszy skrypt: tylko kopiowanie danych z „Zamówień” do „Etykiet” i oznaczanie statusów. Nadal logowanie się do panelu kuriera i wklejanie danych lub używanie plików CSV.
- Jedna integracja API – wybór jednego kuriera/brokera, napisanie
createShipment(), testy na małej liczbie przesyłek, dopracowanie mapowania pól. - Śledzenie statusów – dopiero gdy generowanie etykiet działa stabilnie, dokładanie
updateTracking()i aktualizacji statusów w „Zamówieniach”. - Rozbudowa o kolejnych kurierów i raporty – na końcu logika wyboru przewoźnika, pivoty kosztów, podział na pliki przy większej skali.
Takie stopniowe podejście zmniejsza ryzyko paraliżu magazynu: zawsze można cofnąć się o krok i na dzień czy dwa wrócić do ręcznej obsługi w panelu, jeśli skrypt robi coś nie tak.
Najczęściej zadawane pytania (FAQ)
Jak połączyć Google Sheets z magazynem i kurierem?
Najprościej użyć jednego z trzech podejść: integratora typu Zapier/Make, gotowego dodatku do Arkuszy (z Google Workspace Marketplace) albo własnego skryptu w Google Apps Script, który komunikuje się z API sklepu, WMS i kuriera. Wybór zależy od tego, czy masz programistę i jak bardzo proces ma być „szyty na miarę”.
Standardowy schemat jest taki: zamówienia spływają do jednej zakładki w arkuszu (np. z WooCommerce, Shopify czy Baselinkera), druga zakładka odzwierciedla stany magazynowe, a osobna struktura danych służy do generowania zgłoszeń do API kuriera lub brokera. Każdy system (sklep, magazyn, kurier) czyta i zapisuje dane tylko w swoich wybranych kolumnach.
Czy da się generować etykiety i listy przewozowe bezpośrednio z Google Sheets?
Tak. Kluczowe jest przygotowanie w arkuszu kompletu danych wymaganych przez API kuriera lub brokera (adres, metoda dostawy, waga, parametry paczki, dodatkowe usługi). Skrypt Apps Script lub scenariusz w Zapier/Make wysyła dane o zamówieniu, a w odpowiedzi otrzymuje numer listu przewozowego i link lub PDF etykiety.
W praktyce często robi się tak, że w arkuszu jest kolumna typu „Gotowe do nadania” (TAK/NIE). Po oznaczeniu „TAK” integracja wywołuje API, wpisuje numer listu przewozowego w odpowiednią kolumnę i zapisuje link do etykiety. Magazyn drukuje etykiety już z arkusza lub z panelu brokera.
Jak śledzić statusy paczek w Google Sheets (tracking przesyłek)?
Po nadaniu paczki arkusz musi mieć zapisany numer listu przewozowego. To jego używa się do odpytania API kuriera lub brokera o aktualny status. Zaplanowane zadanie (np. cykliczny trigger w Apps Script lub scenariusz w Make) pobiera statusy co określony czas i aktualizuje kolumny typu „Status przesyłki”, „Data doręczenia”, „Ostatni komunikat”.
Przy małej skali można robić to manualnie, eksportując CSV z panelu kuriera i wczytując go do arkusza. Przy rosnącej liczbie paczek lepiej przejść na w pełni automatyczne trackingi z API, żeby uniknąć ręcznego kopiowania statusów.
Kiedy Google Sheets wystarczy zamiast pełnego WMS, a kiedy to zły pomysł?
Arkusz sprawdza się przy małych i średnich wolumenach (kilkadziesiąt–kilkaset wysyłek dziennie), 1–2 magazynach i prostych procesach kompletacji. Daje szybki start, niskie koszty i łatwe modyfikacje – wystarczy dodać kolumnę albo nową zakładkę, zamiast przebudowywać cały system WMS.
Google Sheets zaczyna być problemem przy dziesiątkach tysięcy wierszy, wielu lokalizacjach magazynowych, rozbudowanych strategiach kompletacji (picking falowy, cross-docking) i złożonych uprawnieniach. Wtedy lepiej traktować arkusz jako warstwę integracyjną między sprzedażą a istniejącym WMS/ERP, a nie jako główny system magazynowy.
Jakie dane muszą znaleźć się w Google Sheets, żeby poprawnie wygenerować etykietę kurierską?
Absolutne minimum to: pełne dane klienta (imię i nazwisko lub nazwa firmy, telefon, e‑mail, ewentualnie NIP), dane adresowe (ulica, numer, kod pocztowy, miasto, kraj) oraz metoda dostawy (kurier, paczkomat, punkt odbioru, odbiór osobisty). Bez tego API kuriera najczęściej zwróci błąd lub odrzuci zgłoszenie.
Drugi blok to parametry przesyłki: waga paczki, wymiary (szczególnie przy większych gabarytach), liczba paczek, typ usługi (standard, ekspres, pobranie, ubezpieczenie). Te pola dobrze wyprowadzić w osobne kolumny w arkuszu i ustandaryzować, aby nie dało się wprowadzić „opisów słownych” zamiast konkretnych wartości.
Jak zorganizować arkusz, żeby magazyn i obsługa klienta mogli na nim wygodnie pracować?
Najczęściej stosuje się podział na kilka zakładek: „Zamówienia (wejście)” – dane z sklepu/marketplace’ów, „Kompletacja” – widok przefiltrowany do zamówień gotowych do pakowania, „Wysyłki” – numery listów przewozowych i statusy paczek, opcjonalnie „Stany magazynowe” oraz zakładki raportowe. Każda rola w firmie pracuje głównie na swoim widoku, nawet jeśli fizycznie jest to ten sam arkusz.
Do tego dochodzą proste statusy w kolumnach (np. „Do kompletacji”, „Spakowane”, „Nadane”, „Dostarczone”) oraz filtry widoków. Magazyn patrzy tylko na „Do kompletacji”, obsługa klienta na przesyłki „W doręczeniu” i „Problem”, a właściciel na dashboard z liczbą wysyłek, zwrotów i czasem dostawy.
Jakie narzędzia integracyjne najczęściej łączy się z Google Sheets przy obsłudze wysyłek?
W praktyce najczęściej pojawia się zestaw: system sprzedaży (WooCommerce, Shopify, Allegro, Amazon, Baselinker) + broker kurierski (np. Furgonetka, Apaczka, Sendit, GlobKurier) + ewentualny WMS/ERP, który trzyma stany magazynowe. Google Sheets jest pomiędzy i spina te światy w jeden proces.
Do automatyzacji używa się integratorów bezkodowych (Zapier, Make), dodatków do Arkuszy oraz Google Apps Script. Przy prostych scenariuszach wystarcza konfiguracja „klikana”, przy niestandardowych zasadach (np. wybór kuriera po gabarycie i kraju) często wchodzi w grę własny skrypt bazujący na API poszczególnych systemów.
Najważniejsze wnioski
- Google Sheets może pełnić rolę centralnego panelu operacyjnego między sklepem, magazynem i kurierami: od rezerwacji towaru, przez generowanie etykiet i listów przewozowych, po śledzenie statusu „dostarczono”.
- Największą przewagą arkusza nad klasycznym panelem WMS jest elastyczność – pola, statusy, widoki i raporty można zmieniać samodzielnie w kilka minut, bez kosztownych wdrożeń i programistów.
- Rozwiązanie oparte na Google Sheets jest szczególnie opłacalne przy małym i średnim wolumenie wysyłek oraz tam, gdzie procesy często się zmieniają; świetnie sprawdza się jako „poligon” przed wdrożeniem cięższego systemu.
- Sheets dobrze integruje się z ekosystemem narzędzi (API, Zapier, Make, Google Apps Script), dzięki czemu może automatycznie pobierać zamówienia, generować etykiety i aktualizować statusy paczek z systemów kurierów i brokerów.
- Arkusz ma istotne ograniczenia względem pełnego WMS: spada wydajność przy dużej liczbie wierszy, brakuje zaawansowanych funkcji magazynowych i precyzyjnego zarządzania uprawnieniami, a cała logika procesu spoczywa po stronie firmy.
- Typowe zastosowania to: mały e‑commerce z 1–2 kurierami, hurtownia B2B z zamówieniami offline oraz sprzedaż wielokanałowa, gdzie arkusz zbiera wszystkie zamówienia i rozsyła dane dalej do magazynu i przewoźników.
- Kluczem do sensownej integracji jest dobrze zaprojektowany proces „od zamówienia do doręczenia” i struktura arkusza; bez tego nawet najlepsze API kuriera nie uporządkuje pracy magazynu ani obsługi wysyłek.






