Przejdź do treści
megapromotingPorozmawiajmy

Ekspertyza · Automatyzacje marketingu

Środowisko pracy, w którym agent zajmujący się waszymi kampaniami Google Ads i Meta czyta raporty, proponuje zmianę z zapisanym uzasadnieniem i wykonuje tylko w granicach, które zostały mu dane.

Usługa jest ofertą, nie realizacją, i mówimy to jako pierwsi: nie mamy dziś systemu, który zmienia budżety lub licytacje w Google Ads albo Meta. Mamy zbudowane i uruchomione elementy, z których taki system się składa — wysyłkę sygnału rzeczywistej konwersji do Google, silnik, który kupuje płatną promocję z włączonym domyślnie dry-run, rejestr, który zapisuje każdą czynność generującą koszt, oraz wyłącznik, który zatrzymuje orchestrator bez drogi obejścia.

Oferta, z warunkami„offer”, nie „delivered”, i powód można sprawdzić w kilka sekund. Przeszukaliśmy ponad 150 własnych repozytoriów pod kątem pól, przez które API reklamowe przesuwają pieniądze — `budget_micros`, `campaignBudget`, `target_cpa`, `target_roas`, `bid_strategy` — i nie występują nigdzie, ani w Google, ani w Meta. Dziś nie zarządzamy budżetami reklamowymi. To, co się pojawia i co można otworzyć plik po pliku, to elementy, które oddzielają automatyzację od wypadku: wysyłanie konwersji offline do Google przez Data Manager API, 264 linie w naszym produkcyjnym projekcie; silnik promocji płatnej, który kupuje boostery, etykiety i pakiety z włączonym domyślnie dry-run; bayesowski tester A/B, który odmawia ogłoszenia zwycięzcy poniżej 100 wyświetleń na wariant, oraz orkiestrator kampanii w MEGA CRM z wyłącznikiem bez `--force`. Usługa jest opisana z tych elementów. Nie z panelu, który nie istnieje.

Agent, który zajmuje się kampaniami, nie jest przyciskiem z napisem „optimizuj”. To program, który ma prawo czytać określone raporty, prawo zapisywać określone pola i poza tym nie ma żadnych praw. Trudna część nie polega na zaproponowaniu zmiany — modele robią to dobrze i szybko. Trudna część polega na tym, by zapisać, gdzie się zatrzymuje, jak udowadnia to, co zrobił, i co dzieje się, gdy się pomyli. O tym jest ta praca i od tego zaczynamy rozmowę.

Mówimy od początku, czego nie mamy, żeby nie dowiedzieć się tego od kogoś innego. Dziś nie uruchamia się u nas system, który podnosi budżet w Google Ads albo zmienia stawkę w Meta. To, co działa i można pokazać linia po linii, to mechanizmy bezpieczeństwa, które napisaliśmy dla innych automatyzacji wydających realne pieniądze: dry-run włączony domyślnie, licznik dla każdej płatnej akcji, opóźnienie przy błędzie, żeby nie powtarzać pomyłki w pętli, próg dowodu przed decyzją i przełącznik, który odmawia uruchomienia orchestratora.

Część, którą mamy już zbudowaną, nie jest zmianą budżetu, lecz sygnałem — i od niej proponujemy zacząć. Google uczy się z tego, co powiesz mu, że jest konwersją. Jeśli powiesz „formularz wysłany”, będzie szukać osób, które wysyłają formularze. Napisaliśmy integrację, która mówi mu „wniosek dotarł rzeczywiście do systemu klienta”, z identyfikatorem kliknięcia i identyfikatorami użytkownika przepuszczonymi przez SHA-256, przez Data Manager API. To można zacząć od razu, bo to istniejący kod, a nie obietnica.

Reszta środowiska pracy — warstwa, która czyta raporty, warstwa, która proponuje, warstwa, która wykonuje — buduje się według tego samego wzorca, którego użyliśmy tam, gdzie już wydawaliśmy pieniądze przez kod. Zaczyna się wyłącznie od odczytu, przechodzi do propozycji bez wykonania, a dopiero na końcu otwiera się wykonanie, pole po polu, z limitem zapisanym przy każdym.

Co obejmuje

Praca, komponent po komponencie

Czytaj raporty, nie panel

Od początku ustala się, co agent czyta i skąd: wydatki na kampanię i grupę reklam, przypisane konwersje, koszt pozyskania, utracony udział w wyświetleniach z powodu budżetu w porównaniu z utraconym z powodu pozycji — dwie różne liczby wymagające różnych decyzji. Odczyt odbywa się przez API, z oddzielnym kontem usługi, a nie przez zrzuty ekranu z interfejsu. Warstwa odczytu jest dostarczana i uruchamiana jako pierwsza, samodzielnie, bez żadnych uprawnień do zapisu na koncie.

Zaproponuj zmianę z powodem zapisanym obok

Propozycja nie jest liczbą. To pole, które się zmienia, stara wartość, nowa wartość, okno danych, na podstawie którego podjęto decyzję, i powód. Propozycje zbiera się w raporcie czytanym przez osobę, w formie „podniósłbym dzienny budżet kampanii X z A do B, ponieważ w ostatnich N dniach był ograniczany przez budżet w M% aukcji, przy koszcie pozyskania poniżej uzgodnionego progu”. Jeśli nie da się zapisać powodu, propozycja nie jest tworzona.

Trzy progi: co robi samodzielnie, co wymaga osoby, czego nigdy nie robi

Każde pole trafia do jednej z trzech kategorii, zapisanych przed uruchomieniem czegokolwiek. Samodzielnie: zmiany poniżej uzgodnionego procentu, w granicach dziennego limitu, na kampaniach oznaczonych jako otwarte. Za zgodą: każde przekroczenie limitu, każda nowa kampania, każda nowa grupa odbiorców, każda zmiana stawki. Nigdy: zatrzymanie kampanii, której nie uruchomił, zmiana metody płatności, dotykanie kont rozliczeniowych. Lista jest zapisana w umowie, nie w kodzie, a kod ją czyta.

Dry-run włączony domyślnie — wzorzec, który przynosimy ze sobą

W naszym silniku płatnej promocji na 999.md funkcja decydująca, czy wydać pieniądze, jest napisana odwrotnie niż zwykle: dry-run jest aktywny, jeśli zmienna środowiskowa nie ma dokładnie wartości `false`. Nieustawiona, pusta, `true`, zapisana błędnie — wszystko utrzymuje dry-run włączony. To świadomy wybór: błąd konfiguracji nie może otworzyć zaworu, może go tylko utrzymać zamkniętym. Ta sama funkcja istnieje w dwóch niezależnych miejscach, silniku promocji i executorze republikiacji.

Każda płatna akcja jest zapisywana w rejestrze

W systemie promocji każde wykonanie trafia do tabeli `agent_costs` z ogłoszeniem, użytkownikiem, typem akcji, kwotą w lei, informacją, czy się powiodło, surową odpowiedzią dostawcy i znacznikiem `dry_run`. Zapis odbywa się w tej samej transakcji co aktualizacja harmonogramu, więc nie może istnieć wydatek bez śladu ani ślad bez wydatku. Gdy jest dry-run, zarejestrowana kwota wynosi zero, ale wiersz istnieje — dokładnie widać, co by się wydarzyło.

Prawdziwy sygnał konwersji — element, który już istnieje

Gdy ktoś trafia z płatnego kliknięcia i wysyła zapytanie, sygnał trafia do Google dopiero po tym, jak zapytanie wejdzie do systemu klienta, a nie po naciśnięciu przycisku. Integracja używa `https://datamanager.googleapis.com/v1/events:ingest`, wysyła identyfikator kliknięcia, moment, wartość i walutę, a także identyfikatory użytkownika przepuszczone przez SHA-256 — znormalizowany adres zapisany małymi literami, telefon doprowadzony do formatu międzynarodowego. Bez identyfikatora kliknięcia wysyłka zatrzymuje się sama i jest oznaczana jako pominięta, bo nie byłaby przypisywalna.

Zgoda jest ustawiana przed tagami, nie po nich

Consent Mode v2 inicjalizuje się ze wszystkimi celami marketingowymi i analitycznymi ustawionymi na `denied`, zanim uruchomi się jakikolwiek skrypt Google, z oknem oczekiwania 500 ms na aktualizację. Przejście na `granted` następuje tylko przy interakcji osoby z banerem, bez przeładowania strony. Przechowywanie funkcjonalne i związane z bezpieczeństwem pozostaje włączone, ponieważ bez nich strona nie działa. Jest napisane raz i działa przy każdej wizycie.

Decyzja między dwoma wariantami zapada na podstawie dowodu, nie wrażenia

Tester A/B, który zbudowaliśmy, modeluje każdą wersję jako Beta-Binomial z priorem jednostajnym i szacuje prawdopodobieństwo, że jedna będzie lepsza, poprzez 10.000 próbek Monte Carlo. Nie ogłasza zwycięzcy poniżej 100 wyświetleń na wersję i poniżej prawdopodobieństwa 0,95. Jeśli po 168 godzinach nie ma decyzji, zamyka eksperyment i mówi, że wygasł, zamiast nazywać zwycięzcę, którego nie może uzasadnić.

Przełącznik, którego nie da się obejść

Orkiestrator kampanii w naszym wewnętrznym systemie sprawdza zmienną środowiskową przed czymkolwiek. Jeśli jest ustawiona, odmawia uruchomienia — nie ma `--force`, nie ma argumentu, który to ominie. Został dodany po rzeczywistym incydencie podwójnych wysyłek, a nie jako dekoracja. Ten sam wzorzec stosuje się też tutaj: przełącznik na poziomie konta, który zatrzymuje wszystkie zapisy, pozostawiając odczyt i raportowanie dalej.

Jak to wygląda

Trasa, krok po kroku.

01

Inwentarz kont i uprawnień

Wyliczane są konta reklamowe, kto ma dziś dostęp i z jaką rolą, jakie konwersje są zdefiniowane i które z nich są w rzeczywistości duplikatami tego samego zdarzenia. Ustalane są trzy listy pól — samodzielnie, po zatwierdzeniu, nigdy. Dostarczamy: spis pisemny, listę konwersji z tym, co każda naprawdę mierzy, oraz uzgodnienie trzech list.

02

Warstwa odczytu, uruchomiona samodzielnie

Łączy się odczyt przez API z kontem bez prawa zapisu i uruchamia raport dzienny. Na tym etapie nic nie zmienia się w kontach — widać tylko to, co widzi agent. To moment, w którym wychodzą na jaw konwersje liczące błędnie, kampanie ograniczone budżetem bez wiedzy kogokolwiek oraz nakładające się grupy odbiorców. Dostarczamy: raport dzienny i listę tego, co znaleziono podczas odczytu.

03

Sygnał rzeczywistej konwersji

Identyfikator kliknięcia jest przechwytywany na stronie docelowej, łączony z zapytaniem w waszym systemie i wysyłany do Google dopiero wtedy, gdy zapytanie zostanie potwierdzone dalej, a nie po naciśnięciu przycisku. Uruchamiana jest ponowna próba dla nieudanych wysyłek, w oknie 90 dni. Dostarczamy: działającą integrację, tryb weryfikacji, który wysyła bez rejestrowania, oraz dziennik z tym, co zostało wysłane, co pominięto i dlaczego.

04

Warstwa propozycji, bez wykonania

Agent zaczyna pisać propozycje: pole, stara wartość, nowa wartość, powód, okno danych. Nic nie jest wykonywane. Działa to tak długo, aż propozycje staną się nudne — to znaczy aż osoba, która je czyta, i tak kliknęłaby „tak” przy prawie wszystkich. Dostarczamy: przepływ propozycji, ze wszystkim, co zaproponowano, oraz tym, co zostało zatwierdzone lub odrzucone, aby było widać, gdzie się myli.

05

Uruchomienie wykonania, pole po polu

Uruchamiane jest wykonanie dla pierwszego pola z listy „samodzielnie”, z dry-run włączonym domyślnie i z limitem dziennym. W rejestrze sprawdzane jest, że to, co zapisano, jest tym, co zostało zaproponowane. Potem drugie pole. Dostarczamy: rejestr działań, przełącznik, który zatrzymuje wszystkie zapisy, pozostawiając odczyt włączony, oraz spisaną procedurę postępowania, gdy agent się pomylił.

Trasa decyzji1citire prin API cukonto bez prawa doscriere2propozycja z polem,valoare veche,nowa wartość i powód3filtrul celor treiliste (singur / cuzatwierdzenie / nigdy)4wykonanie z dry-runwłączony domyślnie iplafon zilnic5wiersz w rejestrzekoszty, zapisane wta sama transakcjaPrzełącznik wyłączenia przerywa wykonanie i pozostawia odczyt włączony.
Trasa decyzji

Dane

Czego dotykamy, gdzie to leży i jak długo zostaje

Pytania, które zadaje każdy, kto ma inspektora ochrony danych — postawione tutaj, zanim on je zada.

Jakie dane obejmuje
Raporty kampanii, grup reklam i słów kluczowych odczytywane przez API. Identyfikator kliknięcia reklamy, przechwycony z adresu strony docelowej i zapisany na żądaniu klienta. Zdarzenia konwersji z momentem, wartością i walutą. Na wyraźne żądanie, adres e-mail i telefon osoby, która dokonała konwersji, ale tylko w formie skrótu kryptograficznego.
Co trafia do Google i w jakiej formie
Identyfikator kliknięcia trafia jawnie — taki jest, identyfikator kliknięcia. E-mail i telefon trafiają tylko jako SHA-256, obliczany lokalnie przed wysłaniem: e-mail oczyszczony z odstępów i zamieniony na małe litery, telefon sprowadzony do formatu międzynarodowego. Adres pocztowy nie jest wysyłany wcale, ponieważ schemat Google wymaga go w całości z kodem pocztowym i kodem regionu, a kod pocztowy nie jest spójny w rzeczywistych danych — powód jest zapisany w kodzie, nie założony.
Gdzie są przechowywane i kto je widzi
Dane kampanii i zdarzenia są przechowywane w bazie Waszego projektu, na uzgodnionej infrastrukturze. Poświadczenia kont reklamowych są przechowywane w pliku środowiskowym odczytywanym przez usługę systemową, nie w kodzie i nie w repozytorium źródeł. Token dostępu jest utrzymywany w pamięci maksymalnie 55 minut, choć dostawca nadaje mu ważność 3.600 sekund — margines jest celowy, aby nigdy nie użyć wygasłego tokenu.
Jak długo można jeszcze wysłać zdarzenie
Praktyczne okno wynosi 90 dni od momentu konwersji — tyle akceptuje Google dla konwersji offline. Ponawianie nieudanych wysyłek działa dokładnie w tym oknie, partiami, z maksymalnie pięcioma próbami na żądanie. Po pięciu próbach żądanie zostaje pozostawione w spokoju i pozostaje oznaczone jako niewysłane, zamiast być ponawiane bez końca.
Czego nie robimy z danymi
Nie budujemy publicznie list Waszych klientów bez pisemnej podstawy prawnej i bez tego, aby pojawiło się to w informacji widocznej dla osoby. Nie przenosimy danych między kontami dwóch różnych klientów. Nie przechowujemy kopii raportów kampanii poza uzgodnionym systemem. Rejestr czynności przetwarzania jest uzupełniany przed pierwszą wysyłką, nie po niej.

Przykład

Kampania, która płaciła za formularze, a nie za zapytania

Sytuacja

Platforma z Kiszyniowa, która przyjmuje zapytania online, kupowała ruch z wyszukiwania. Konwersją zdefiniowaną w koncie reklamowym był „wysłany formularz”. Algorytm ustalania stawek robił dokładnie to, o co go proszono: przyprowadzał osoby wysyłające formularze. Ile z nich stawało się rzeczywistymi zapytaniami dalej w łańcuchu, nigdy nie wracało do platformy reklamowej.

Co zbudowaliśmy

Przesunęliśmy moment konwersji później w łańcuchu. Identyfikator kliknięcia jest przechwytywany na stronie docelowej i zachowywany na żądaniu. Żądanie trafia dalej do systemu niżej w łańcuchu; jeśli ten zwróci własny identyfikator — czyli rzeczywiście weszło — dopiero wtedy zdarzenie trafia do Google, przez Data Manager API, z momentem, wartością, walutą i identyfikatorami użytkownika przepuszczonymi przez SHA-256. Bez identyfikatora kliknięcia wysyłka zatrzymuje się sama i zostaje oznaczona jako pominięta. Dodaliśmy zadanie ponawiania, które szuka żądań z identyfikatorem kliknięcia i bez oznaczenia wysyłki, z ostatnich 90 dni, partiami po 50, z najwyżej pięcioma próbami.

Co z tego wyszło

Sygnał, który otrzymuje platforma reklamowa, opisuje teraz zapytania docierające do celu, a nie naciśnięcia przycisku. Wszystkie operacje są bez efektu, jeśli integracja nie jest skonfigurowana lub jest wyłączona — funkcja sprawdza wszystkie siedem poświadczeń przed czymkolwiek i zwraca „pominięte”, jeśli brakuje któregokolwiek. Błędy są rejestrowane, ale się nie propagują: jeśli Google nie odpowiada, żądanie klienta przechodzi dalej bez zmian.

Czego nie mówi ten przypadek

To jest integracja sygnału, nie zarządzania kampanią. Nie zmienia żadnego budżetu ani żadnej stawki. Wpływ na koszt pozyskania nie został przez nas zmierzony i go nie publikujemy — w kodzie istnieje zapisane oczekiwanie autora, nie pomiar, a między tymi dwoma rzeczami jest cała różnica.

Pytania

O co pytają ludzie, zanim zadzwonią

Kto ponosi odpowiedzialność, gdy agent zwiększa budżet i wydatki rosną?

Wy. I dlatego środowisko jest zbudowane tak, abyście mogli ponosić odpowiedzialność świadomie, a nie zostać zaskoczeni. Konkretnie: agent nie ma żadnych uprawnień do zapisu, których ktoś nie nadałby mu z imienia, na piśmie, pole po polu; każde otwarte pole ma limit, po którego przekroczeniu propozycja trafia do zatwierdzenia przez człowieka; każda wykonana akcja jest zapisywana w rejestrze ze starą wartością, nową wartością i powodem, w tej samej transakcji co wykonanie; oraz istnieje przełącznik, który zatrzymuje wszystkie zapisy bez zatrzymywania odczytu. Odpowiadamy za to, co zbudowaliśmy — że limity, które zapisaliście, są przestrzegane przez kod, że rejestr jest kompletny, że wyłączenie działa. Nie odpowiadamy za wynik komercyjny zmiany, którą zatwierdziliście, tak jak nie odpowiada za to też agencja, która naciska przycisk ręcznie. Jeśli ktoś obiecuje Wam coś innego, zapytajcie, co jest zapisane w umowie w rozdziale ograniczenia odpowiedzialności.

Czy macie dziś system, który zarządza kampaniami Google Ads lub Meta?

Nie. Nigdzie w naszym kodzie nie występuje żadne pole, przez które zmienia się budżet, stawka albo strategia licytacji w Google lub w Meta. Sprawdziliśmy to, szukając dokładnie tych nazw pól we wszystkich repozytoriach. To, co mamy, to przesyłanie konwersji do Google, silnik, który kupuje płatną promocję na innej platformie, oraz mechanizmy bezpieczeństwa wokół tego. Usługa jest budowana właśnie od tego i jest oznaczona jako oferta, żeby nie było nieporozumień.

W takim razie co właściwie już zbudowaliście i wydaje prawdziwe pieniądze?

Nasz silnik płatnej promocji na platformie ogłoszeń drobnych w Mołdawii. Nakłada płatne etykiety, uruchamia boostery z limitem dziennym i ceną za kliknięcie, aktywuje pakiety i ponownie publikuje ogłoszenia po odstępie obliczonym na podstawie rzeczywistej prędkości kategorii. Odmawia uruchomienia boostera, którego limit dzienny nie jest większy niż cena za kliknięcie — mała kontrola, ale dokładnie ten typ kontroli, którego zwykle brakuje. Każda akcja przechodzi przez sprawdzenie dry-run przed jakimkolwiek wywołaniem, które kosztuje.

Co może zmienić samodzielnie, a co wymaga zatwierdzenia?

Decyduje się o tym wspólnie, z wyprzedzeniem, i zapisuje. Nasz punkt wyjścia do rozmowy: samodzielnie — korekty poniżej uzgodnionego procentu dziennego budżetu, w ramach bezwzględnego dziennego limitu, w kampaniach oznaczonych przez Ciebie jako otwarte; po zatwierdzeniu — każde przekroczenie limitu, nowe kampanie, nowe grupy odbiorców, każde naruszenie stawek; nigdy — zatrzymywanie kampanii uruchomionych przez kogoś innego, metody płatności, konta rozliczeniowe. Jeśli na początku chcesz wszystko na zatwierdzenie, to jest poprawny wybór i my go preferujemy.

Skąd agent wie, że konwersja jest prawdziwa, a nie pustym formularzem?

Bo sygnał nie jest wysyłany przy kliknięciu przycisku. Jest wysyłany dopiero wtedy, gdy zgłoszenie zostanie potwierdzone downstream, w systemie, który ma dla Was znaczenie — identyfikator zgłoszenia odebrany zwrotnie z CRM albo od partnera. Do tego momentu nic się nie wydarzyło, co warto nazwać konwersją. Różnica nie jest kosmetyczna: algorytm licytacji Google uczy się z tego, co mu wysyłasz, więc jeśli wyślesz formularze, będzie przyciągał osoby wypełniające formularze.

Co dzieje się z danymi osobowymi osób, które dokonują konwersji?

Email i telefon są wysyłane wyłącznie jako skrót kryptograficzny SHA-256, obliczony lokalnie przed wysłaniem, z normalizacją — email bez spacji i małymi literami, telefon sprowadzony do formatu międzynarodowego. Adres pocztowy nie jest wysyłany wcale. Nic nie jest wysyłane, zanim osoba nie zaakceptuje celu marketingowego w banerze, ponieważ Consent Mode startuje w całości z `denied`. Podstawa prawna i informacja są zapisane przed pierwszą wysyłką, a nie po pierwszym pytaniu kogoś.

Co się dzieje, jeśli wywołanie do platformy reklamowej padnie w połowie?

Rejestrowany jest błąd wraz z surową odpowiedzią, a działanie jest odraczane — w naszym executorze ponownej publikacji, na czas równy maksimum z skonfigurowanego cooldownu i pięciu minut, wyraźnie po to, by błąd nie zamienił się w pętlę wywołań. Nieudane wysyłki konwersji są ponawiane przez osobny job, w partiach po 50, z maksymalnie pięcioma próbami na zgłoszenie, w oknie 90 dni. Po piątej próbie jest zatrzymywane i pozostaje oznaczone jako niewysłane, żeby było widać, a nie żeby zniknęło.

Jak to wyłączyć całkowicie i szybko?

Przełącznik zapisu. Odczyt i raportowanie trwają dalej, wykonanie zostaje zatrzymane. W naszych istniejących systemach jest to zaimplementowane na dwa sposoby, oba możliwe do zweryfikowania: zmienna środowiskowa, która musi mieć dokładnie wartość `false`, żeby wydawać pieniądze — wszystko inne trzyma kran zamknięty — oraz przełącznik na orchestratorze kampanii, który odmawia uruchomienia i nie ma `--force`. Nie polegamy na przycisku w interfejsie, który może się nie załadować.

Czy gwarantujecie spadek kosztu pozyskania?

Nie, i warto powiedzieć dlaczego, bo w naszym kodzie istnieje dokładnie taka liczba. W komentarzu na początku integracji konwersji zapisano oczekiwanie — o ile mógłby spaść koszt pozyskania i o ile mógłby wzrosnąć udział wyświetleń. To oczekiwanie zapisane przez osobę, która to zbudowała, a nie pomiar, i dlatego nie znajdziesz go nigdzie na tej stronie jako wyniku. To, co możemy obiecać, to że pomiar będzie możliwy: z konwersjami, które coś znaczą, i z rejestrem każdej zmiany, porównanie przed i po staje się możliwe. Bez tego — nie.

Na czym opierają się powyższe stwierdzenia (20 źródeł)

20 z nich to kod i pliki z naszych repozytoriów. Nie publikujemy ich nazw ani numerów linii: razem, na jednej stronie, opisałoby to zbyt dokładnie, jak zbudowane są systemy, które nie należą tylko do nas. Przechodzimy je razem z Tobą, w repozytorium, na życzenie — weryfikacja pozostaje możliwa, tylko odbywa się w rozmowie.

Co chcesz, żeby działało lepiej?

Opowiedz nam o swoim procesie. Wspólnie ustalimy, co warto zbudować, co da się połączyć i jak sprawdzimy wynik.

Porozmawiajmy