Biznesowo
Cele
- Utrzymanie marży per kampania x ssp na zadanym poziomie na koniec miesiąca, z uwzględnieniem tego, że w trakcie miesiąca marża może się wahać. Marża ta jest zdefiniowana na podstawie wydatków w danym miesiącu i przychodów w danym miesiącu, a nie na podstawie przychodów atrybuowanych do wydatków w danym miesiącu.
- Gdy klient zwiększa stawkę, na kampanię będziemy mogli wydać więcej pieniędzy (zboostować ją), ponieważ dostaliśmy nieplanowane przychody z konwersji z nową stawką, ale atrybuowanych do aukcji wycenianych ze starą stawką.
Założenia
- Konwersja będzie rozliczana ze stawką obowiązującą w chwili skonwertowania, a nie, jak do tej pory, ze stawką obowiązującą w chwili trwania aukcji.
- Bidder nie wie jaka stawka będzie obowiązywać w przyszłości (wie jedynie o stawce obowiązującej w momencie aukcji), więc bidder wycenia wartość oczekiwaną przychodu z aukcji przy założeniu, że stawka nie zmieni się w przyszłości.
- Do optymalizacji wliczamy ruch retargetingowy (w tym retargeting po IP) oraz ruch prospectingowy kampanii ROAS. Marża ma być na wybranym poziomie dla tych źródeł branych łącznie.
- Przecięcia w jakich ma być ustawiana marża to (klient x medium x ssp)
- Nie mamy założeń co do wielkości oraz długości trwania boostu spowodowanego zmianą stawki.
- Źródłem prawdy dla przychodów jest tabela uber_all, źródłem prawdy dla wydatków jest tabela bidData. Jeśli mechanizm zasilający te tabele ulegnie awarii to kontrolowana marża może być niepoprawna i wymagana będzie ręczna interwencja. Ręczne interwencja mogłaby być wprowadzona np. poprzez:
- możliwość wykluczenia dni, z których statystyki są niepoprawne
- ręczne wprowadzanie wydatków/przychodów w poszczególne dni
- Przychody brane do liczenia marży to przychody emisyjne (tj. przychody po naszych statystykach).
- Na wydatki organizacji składają się:
- wydatki będące sumą biddów z wygranych aukcji
- prowizje od wydatków z pkt 1., płacone na koniec miesiąca (dla pośrednika / agencji) Marżę liczoną z 1. nazwijmy marżą emisyjną, natomiast marżę liczoną na podstawie 1. + 2. nazwijmy marżą rzeczywistą. Utrzymywanie docelowej marży odbywa się dla marży rzeczywistej, czyli z uwzględnieniem prowizji płaconych na koniec miesiąca. Przykładem jest wpartner, tam mamy marżę emisyjną ustawioną +15%, ale marża rzeczywista wynosi 0%.
- Obecnie liczone wydatki emisyjne nie uwzględniają sytuacji, w których płacimy za niewyrenderowaną reklamą. Takie sytuacje mają miejsce na sspbc na platformach innych niż wplatform oraz prebidserver. Marża, którą będziemy kontrolować powinna uwzględniać te sytuacje.
Dodatkowe założenia
- Testy rozwiązania zaczniemy od kilku kampanii, które:
- Są największe
- Rozliczają się w atrybucji last-click
- Są w display
Technicznie
Wymagane zmiany:
- Kontroler (nowy mechanizm liczący poprawkę)
- Implementacja powinna wyglądać tak jak implementacja kontrolera w CPA - tworzymy obraz dockera, który jest odpalany jako feature zdockeryzowany hopping w Feature Store. Bidder otrzymuje wartość , która jest uwzględniana w wycenie. Wartość powinna być logowana w nowej kolumnie w bidData.
- Bidder
- Uwzględnienie w wycenie poprawki wyliczoną przez kontroler. Kontroler powinien być łatwo wyłączalny (growthbook)
- Zmiana w sposobie uwzględniania prowizji pośrednika - trzeba dodać dodatkową kolumnę w bidData z prowizją pobieraną na koniec miesiąca. Rzeczywiste wydatki biddera będą wtedy wynosić myPrice + prowizja. Będzie to wymagać dodatkowe GB do ustalania prowizji.
- Metrics
- W metricsie powinno powstać rozróżnienie pomiędzy wydatkami emisyjnymi (marżą emisyjną) a wydatkami rzeczywistymi (marżą rzeczywistą).
- Uber_all:
- w wpclid powinniśmy mieć dostęp do stawki z chwili konwersji, nie z chwili bidowania
- Utworzenie panelu do ustawiania docelowej marży rzeczywistej.
- Modele:
- Model CTR powinien liczyć wydatki i marżę z uwzględnieniem, że na niektórych platformach płacimy za event iFrameCreated, a nie za delivery.
- Optymalizacja bidData. Obecna bidData nie pozwala analizować wyników testów A/B dłużej niż z kilku dni, a w przypadku zmian, które szykujemy będziemy musieli prowadzić test dłużej. Dlatego proponuję:
- zmigrować dane z bidData do nowej tabeli z poprawnie założonymi indeksami, co pozwoli znacząco szybciej odpytywać bazę
- założyć tabelę agregującą dane z bidData
- Monitoring:
- Na marżę kontrolowaną przez kontroler składa się marża, która może być liczona w różnych przecięciach, np. retargeting/prospecting, display/applications, roas-po-ip/roas-zwykły, przeglądarka, mobile/desktop itp. Powinniśmy stworzyć mechanizm, który pozwoli analitykowi łatwo przejrzeć czy w którymś z tych przecięć marża odbiega od założonej. W dodatku taki monitoring powinien nas informować o takiej sytuacji.
Co zostaje bez zmian:
- Sposób wyceny modeli:
- Modele estymują wartość oczekiwaną przychodu ze stawką obowiązującą w chwili aukcji.
- Modele oceniane są (i trenowane) na danych, w których atrybuujemy konwersję do konkretnego klika oraz klik do konkretnej aukcji.
- Kalibracja online modeli (oraz inne narzędzia online, np. bayesian) koryguje wyceny na podstawie danych spływających z produkcji, ale w swojej korekcji nie próbuje nadrobić niepoprawnych wycen z przeszłości, tj. wprowadza korektę taką, która od teraz spowoduje lepsze wyceny
Kontroler
Nowy mechanizm, który musimy napisać od zera. Wprowadzamy mechanizm kontrolujący wydatki i przychody pojedynczej kampanii, patrzący na wydatki i przychody od początku miesiąca, niezależnie do jakiej konkretnie aukcji została zatrybuowana konwersja.
Wejście:
- - wydatki rzeczywiste kampanii dla ssp na moment czasu
- - przychód kampanii dla ssp ; przychód liczony jest ze wszystkich konwersji w danym miesiącu na moment czasu
- - czas do końca okresu optymalizacji (tj. do końca miesiąca)
- - oczekiwana marża
Wyjście:
- - wartość przez jaką powinniśmy pomnożyć wyliczony wcześniej (przez modele) oczekiwany przychód z aukcji dla kampanii oraz ssp . Tzn. odpowiedzią biddera będzie wartość . Uwaga: dla pewnych ustalonych oraz
Zadanie: Ustalić takie aby zminimalizować , czyli zminimalizować odchylenie marży faktycznej od marży oczekiwanej na koniec miesiąca.
Uzasadnienie podejścia
Kalibracja modeli online poprawia wyceny zawsze od obecnej chwili, nie korygując dotychczasowego błędu. Nowy kontroler będzie korygował dotychczasowy błąd, próbując w przyszłych aukcjach nadrobić dotychczasowe manko lub nadwyżkę. Stąd w mojej ocenie oba mechanizmy nie będą sobie wzajemnie przeszkadzać.
Jak będzie wyglądać wycena
Wycena kampanii w aukcji :
gdzie
Zmienne losowe:
- - zmienna binarna informująca o tym, czy wygraliśmy aukcję ; wygranie aukcji jest równoznaczne z zapłatą kwoty, którą wcześniej licytowaliśmy aukcję
- - zmienna ciągłe informująca o przychodach biddera z aukcji
- - zmienna binarna informująca o tym, czy reklama z aukcji została kliknięta przynajmniej jeden raz
- - zmienna binarna informująca o tym, czy z aukcji powstała przynajmniej jedna konwersja zatrybuowana do naszego biddera
- - zmienna ciągła informująca o tym jaka jest suma wartości zakupów konwersji powstałych z aukcji
Pozostałe oznaczenia:
- - cena, którą bidder odpowiada w aukcji
- - stawka prowizji od ceny bida, w przedziale , jaką bidder musi zapłacić pośrednikom na koniec miesiąca
- - maksymalna cena, którą bidder może wysłać (capping)
- - stawka kampanii , w przedziale
- - kalibracja online odpowiednio modeli CTR i CVR
- - bezpośrednie wyjście z modelu
- oraz - mnożniki modelu CVR, ustawiane w GB cvr-score-coeffs
- - wszystkie pozostałe mnożniki zmieniające wycenę
Kolumny w bidData:
| oznaczenie | kolumna |
|---|---|
| myPrice | |
| billingModelValue |
Dodatki
Dlaczego optymalizacja per godzina jest trudna?
Przykładem jest Sinsay, który jest sklepem z TOP 10 klientów. Sinsay ma 700 konwersji na miesiąc, czyli średnio 1 konwersja na godzinę. Przy takiej liczbie konwersji na godzinę nie jesteśmy w stanie zrobić optymalizacji na godzinę, bo dane będą za bardzo zaszumione.