Konwersje offline z Arkusza Google do Meta: kolumny, hashowanie i deduplikacja
Jak wysyłać sprzedaż telefoniczną i stacjonarną z Arkusza Google do Meta przez Conversions API: kolumny, format daty i telefonu, hashowanie, limit 7 dni.

Spis treści
- Co to są konwersje offline w Meta?
- Jakie kolumny musi mieć arkusz?
- Jak dane z arkusza są hashowane?
- Jak przypisać statusy do zdarzeń Meta?
- Jak działa deduplikacja przy arkuszu?
- Przykład: jedno zamówienie telefoniczne
- Jak sprawdzić, czy zdarzenia dochodzą?
- Najczęstsze błędy i ich przyczyny
- Kiedy arkusz to zły pomysł?
- Następny krok
Wiele sklepów notuje część sprzedaży w Arkuszu Google: zamówienia przyjęte przez telefon, sprzedaż w sklepie stacjonarnym albo zamówienia firmowe opłacane przelewem. Ktoś dopisuje wiersz, a gdy pieniądze wpłyną, zmienia status na „opłacone”. Meta nic o tym nie wie, bo Pixel widzi tylko stronę, a nie arkusz. Conversions API pozwala przekazać te zmiany do Meta jako konwersje offline, czyli zdarzenia, które wydarzyły się poza stroną. Ten poradnik pokazuje, jak przygotować kolumny, jak dane są hashowane, jak uniknąć podwójnego liczenia i gdzie są granice tego podejścia.
Co to są konwersje offline w Meta?
To zdarzenia, które Twój system zna, a przeglądarka nie: sprzedaż przez telefon, zakup w sklepie stacjonarnym, zamówienie opłacone przelewem po kilku dniach. Meta przyjmuje je dziś przez to samo Conversions API, co zdarzenia ze strony. Dawny osobny interfejs dla konwersji offline Meta opisuje jako starszy i przy nowych wdrożeniach zaleca Conversions API.
Zdarzenie z arkusza ma action_source równe system_generated, czyli „wygenerowane przez system firmy”. Najważniejsze reguły z dokumentacji parametrów zdarzenia:
event_timeto rzeczywisty czas zdarzenia, najwyżej 7 dni wstecz od wysyłki,- jedno za stare zdarzenie w paczce powoduje odrzucenie całego żądania,
- zdarzenie potrzebuje co najmniej jednego identyfikatora osoby.
Jakie kolumny musi mieć arkusz?
Nazwy kolumn możesz mieć własne, bo w panelu przypisujesz je do pól. Liczy się zawartość.
| Kolumna (przykład) | Co zawiera | Na co uważać |
|---|---|---|
id | Co zawieraStały identyfikator rekordu, np. numer zamówienia | Na co uważaćNie numer wiersza: po sortowaniu się zmieni. Bez e-maili i nazwisk |
status | Co zawieraStatus zamówienia, np. PRZYJETE, OPLACONE | Na co uważaćWielkość liter musi zgadzać się z przepływem |
status_changed_at | Co zawieraKiedy rekord wszedł w ten status | Na co uważaćKomórka daty albo ISO 8601 ze strefą. Nie czas synchronizacji |
email | Co zawieraE-mail klienta | Na co uważaćHashowany przed wysyłką |
phone | Co zawieraTelefon z kodem kraju, np. +48600100200 | Na co uważaćKolumna tekstowa, żeby arkusz nie zjadł plusa |
value, currency | Co zawieraKwota i kod waluty ISO 4217, np. PLN | Na co uważaćWymagane dla Purchase |
consent | Co zawieraTRUE, jeśli masz podstawę prawną do przekazania danych | Na co uważaćNie ustawiaj hurtem bez sprawdzenia procesu w firmie |
Wymagane minimum to identyfikator, status, czas, zgoda i co najmniej jeden identyfikator osoby: e-mail albo telefon.
Dlaczego czas zmiany statusu jest tak ważny?
Bo Meta przypisuje konwersję do momentu, w którym się wydarzyła. Gdyby narzędzie wstawiało czas synchronizacji, sprzedaż z piątku wyglądałaby jak sprzedaż z poniedziałku. Dlatego Basketly nie zastępuje brakującej daty czasem odczytu: wiersz bez daty jest odrzucany z komunikatem, który wskazuje numer pierwszego błędnego wiersza (bez danych klienta).
Daty z komórek arkusza są czytane w strefie czasowej arkusza. Daty tekstowe muszą mieć strefę (np. 2026-04-14T10:30:00+02:00).
Jak dane z arkusza są hashowane?
Meta wymaga, żeby e-mail i telefon były znormalizowane i zahashowane SHA-256. Według listy parametrów klienta:
- E-mail: usunięcie spacji z brzegów, małe litery, potem SHA-256.
Anna.Kowalska@Example.comianna.kowalska@example.comdają ten sam skrót. - Telefon: usunięcie spacji, myślników i nawiasów, kod kraju obowiązkowy, potem SHA-256 z samych cyfr.
+48 600-100-200staje się skrótem z48600100200.
Basketly robi to po stronie serwera. Telefon bez kodu kraju jest odrzucany, zamiast zgadywać prefiks, bo źle dopisany prefiks dałby skrót, który nikomu nie odpowiada. Skróty to nadal dane osobowe: o podstawie prawnej i retencji piszemy w artykule o RODO i hashowaniu (to nie jest porada prawna).
Jak przypisać statusy do zdarzeń Meta?
W przepływie mówisz, który status ze źródła ma zostać którym zdarzeniem w Meta. Przykład:
| Status w arkuszu | Zdarzenie Meta |
|---|---|
PRZYJETE | Zdarzenie Metabrak mapowania: nic nie jest wysyłane |
OPLACONE | Zdarzenie MetaPurchase (z wartością i walutą) |
ANULOWANE | Zdarzenie Metabrak mapowania: nic nie jest wysyłane |
Nazwę zdarzenia dobierz do tego, co chcesz potem wykorzystać w kampanii lub konwersji niestandardowej. Jedno źródło może wysyłać do kilku odbiorców (np. dwóch Pixeli), a każdy cel ma osobny status wysyłki.

Jak działa deduplikacja przy arkuszu?
Arkusz czytany co minutę oznacza, że ten sam wiersz jest widziany setki razy. Gdyby każdy odczyt wysyłał zdarzenie, Meta dostałaby lawinę duplikatów. Są więc dwie warstwy ochrony:
- Zdarzenie biznesowe: para identyfikator + status ze źródła jest konwersją jednorazową. Ponowne wejście w ten sam status nie tworzy nowej konwersji.
- Wysyłka: zdarzenie ma stały
event_id, wyliczony z identyfikatora i statusu, a kolejka nie wyśle drugi raz tego samego zdarzenia do tego samego datasetu Meta w tym samym trybie, także z dwóch różnych połączeń.
Ponowienia po błędach zachowują ten sam event_id, więc nawet gdy odpowiedź Meta zginie po drodze, Meta może zdeduplikować powtórkę. Pixel nie wysyła zdarzeń z arkusza, więc nie trzeba niczego uzgadniać z przeglądarką. Szczegóły w artykule o deduplikacji zdarzeń.
Czego synchronizacja nie odtworzy?
Arkusz pokazuje aktualny stan wiersza, a nie historię. Jeśli ktoś w ciągu minuty zmieni status z PRZYJETE na OPLACONE, odczyt może zobaczyć tylko ten drugi. Gdy kilka zmian statusu może nastąpić szybciej niż odczyt, zapisuj zdarzenia w osobnej zakładce: jeden wiersz na każdą zmianę, z własnym identyfikatorem.
Przykład: jedno zamówienie telefoniczne
Zobacz, co dzieje się z jednym wierszem (dane przykładowe). Obsługa sklepu dopisuje w poniedziałek zamówienie T-1042 przyjęte przez telefon, z numerem +48600100200 i statusem PRZYJETE. Przepływ nie mapuje PRZYJETE, więc nic nie wychodzi.
- Środa, 11:20. Przelew wpłynął. Ktoś zmienia status na
OPLACONE, wpisuje czas zmiany, wartość489i walutęPLN. W ciągu kilku minut odczyt widzi nowy status, a kolejka wysyłaPurchasez zahashowanym telefonem, kwotą i czasem ze środy 11:20. - Czwartek. Ktoś przypadkiem zmienia status z powrotem na
PRZYJETE, a potem znów naOPLACONE. ParaT-1042+OPLACONEjuż była zgłoszona, więc druga konwersja nie powstaje. Jeśli przy okazji zmienił się czas statusu, wiersz dostaje komunikat o konflikcie, bo zgłoszonej konwersji nie da się zmienić. - Piątek. Ktoś poprawia kwotę na
520. Ta zmiana dotyczy już zgłoszonej pary, więc jest odrzucana z komunikatem. Meta zna wartość ze środy.
Wniosek: kwotę i status wpisuj dopiero wtedy, gdy są ostateczne. Najprościej ustalić w zespole, że status „opłacone” trafia do arkusza po zaksięgowaniu płatności.
Jak sprawdzić, czy zdarzenia dochodzą?
- Utwórz odbiorcę Meta w trybie testowym z kodem z Menedżera zdarzeń.
- Zmień status w jednym wierszu z prawdziwymi danymi testowymi.
- W panelu sprawdź wysyłkę: „Przyjęte przez Meta” oznacza odpowiedź z
events_received: 1. - W Menedżerze zdarzeń, w zakładce zdarzeń testowych, sprawdź, czy zdarzenie przyszło z właściwą nazwą i parametrami.
- Dopiero potem utwórz odbiorcę produkcyjnego i przepływ. Testy i produkcja mają osobną deduplikację.

Przyjęcie zdarzenia nie mówi, jak dobrze Meta dopasowała je do osoby. To pokazuje jakość dopasowania w Menedżerze zdarzeń; jak ją podnieść, opisujemy w poradniku o Event Match Quality.
Najczęstsze błędy i ich przyczyny
| Objaw | Przyczyna | Co zrobić |
|---|---|---|
| Wiersz odrzucony: brak czasu | PrzyczynaPusta kolumna daty albo tekst bez strefy | Co zrobićUzupełnij datę lub dopisz strefę w ISO 8601 |
| Wiersz odrzucony: telefon | PrzyczynaNumer bez kodu kraju | Co zrobićZapisz +48… w kolumnie tekstowej |
| Zdarzenie za stare | PrzyczynaStatus zmieniony ponad 7 dni temu | Co zrobićMeta go nie przyjmie. Aktualizuj arkusz na bieżąco |
| Nic się nie wysyła | PrzyczynaBrak aktywnego przepływu albo status pisany inną wielkością liter | Co zrobićSprawdź mapowanie w przepływie |
| Zmiana danych odrzucona | PrzyczynaEdycja wiersza już zgłoszonego z tym samym statusem | Co zrobićNowe zdarzenie biznesowe wymaga nowego identyfikatora |
Kiedy arkusz to zły pomysł?
- Zmiany wpisujesz raz w tygodniu. Część zdarzeń przekroczy limit 7 dni i przepadnie. Arkusz musi żyć na bieżąco.
- Zamówienia pochodzą ze sklepu internetowego. Wtedy lepiej połączyć sam sklep (Shoper, IdoSell, BaseLinker): Basketly zapisze zamówienie z pozycjami, kupującego i zakup bez przepisywania do arkusza. Jak to działa, opisuje artykuł o zakupach ze Shopera przez Conversions API.
- Masz dziesiątki tysięcy aktywnych wierszy. Odczyt po 500 wierszy na minutę sprawi, że pełne przejście potrwa długo. Lepiej przesyłać zdarzenia przez integrację serwerową.
- Arkusz nie ma żadnego identyfikatora osoby. Bez e-maila albo telefonu Meta nie ma z czym dopasować zdarzenia.
Następny krok
Dodaj do arkusza kolumny z tabeli, połącz go w trybie testowym i zmień status w jednym wierszu. Więcej o arkuszu jako źródle znajdziesz na stronie Integracje, a plany w cenniku.
O autorze
Aleksander
Założyciel Basketly.io, BooksyAudit.pl i SMSPortal.app
Założył Basketly.io, BooksyAudit.pl i SMSPortal.app. W bazie wiedzy opisuje, jak przekazywać do Meta zakupy ze sklepu, jak dbać o katalog produktów i jak liczyć koszt zakupu z reklam.
Wszystkie artykuły autoraNajczęściej zadawane pytania
Czy muszę instalować skrypt w Arkuszu Google?
Nie. Arkusz łączysz przez logowanie kontem Google i wybór pliku w oknie Google. Aplikacja dostaje dostęp tylko do pliku, który wskażesz, a nie do całego Dysku, i wykonuje wyłącznie odczyty.
Jak często dane z arkusza trafiają do Meta?
Serwer sprawdza arkusz co minutę i czyta do 500 wierszy na przebieg. Przy dużych arkuszach pełne przejście trwa kilka minut. Nowy status trafia do kolejki wysyłek, a stamtąd do Meta, zwykle w ciągu kilku minut od zmiany w arkuszu.
Co się stanie, gdy zmienię status w wierszu, który już został wysłany?
Nowy status to nowe zdarzenie, więc zostanie wysłane, jeśli przepływ go mapuje. Ten sam identyfikator z tym samym statusem jest konwersją jednorazową: ponowne wejście w ten sam status nie tworzy drugiej konwersji, a zmiana danych już zgłoszonej pary jest odrzucana.
Dlaczego telefon z arkusza jest odrzucany?
Bo nie ma kodu kraju albo arkusz zjadł plus na początku. Ustaw kolumnę telefonu jako tekst i zapisuj numery jako +48…, zanim zaczniesz synchronizację.
Czy arkusz zastąpi połączenie sklepu?
Nie. Zamówienia ze sklepu internetowego lepiej czytać przez połączenie ze sklepem (Shoper, IdoSell, BaseLinker), bo wtedy Basketly sam zapisuje zamówienie, kupującego i zakup. Arkusz sprawdza się przy sprzedaży spoza sklepu internetowego: przez telefon, w sklepie stacjonarnym albo na fakturę z przelewem.
