Google Ads
Available now Ads
Reads campaign structure, daily spend and conversions so ad spend, pacing and CAC are tracked per campaign.
What we pull
- customer (currency, time zone)
- campaigns and budgets
- ad groups and ads
- daily metrics (cost, impressions, clicks, conversions, value)
Every record lands as a financial event with source_type, external_id (deduplicated on re-sync) and provenance. Mode: live.
Signals and sync
- Webhooks deliver changes in real time; a scheduled sync fills gaps.
- Sync interval: daily after 04:00 in the account time zone.
- Health signals:
auth_expired,silent(no sync for over twice the interval),error. Each becomes an in-app notification for the owner and shows in Integrations.
Permissions and secrets
- Google Cloud OAuth client (Web application)
- Google Ads user with Read only role
- Customer ID (and manager account ID)
Secrets are encrypted at rest (AES-256-GCM, per-owner) and never returned by the API; the panel shows only the last 4 characters and the date. Read-only keys wherever the provider offers them.
Availability
Live: connect it from the panel (Integrations → Connect).
Setup steps
From the Integrator’s owner checklist (Polish; the panel walks you through the same steps).
Potrzebujesz 6 zmiennych (4 obowiązkowe + 2 opcjonalne). Oto ich lista, zanim zaczniesz , wpisz każdą w Railway (projekt operlance-staging → usługa api → Variables, sekcja E) w chwili, gdy ją zdobędziesz, kroki niżej mówią dokładnie kiedy:
| # | Zmienna | Skąd (krok niżej) |
|---|---|---|
| 1 | GOOGLE_ADS_CLIENT_ID | C3 |
| 2 | GOOGLE_ADS_CLIENT_SECRET | C3 |
| 3 | GOOGLE_ADS_CUSTOMER_ID | C4 |
| 4 (opcjonalna) | GOOGLE_ADS_LOGIN_CUSTOMER_ID | C4, tylko jeśli masz konto menedżerskie (MCC) |
| 5 | GOOGLE_ADS_REFRESH_TOKEN | C5 |
| 6 (opcjonalna) | GOOGLE_ADS_RELAY_SECRET | C6 |
Wszystkie sześć trafiają w to samo miejsce: Railway → projekt operlance-staging → usługa api → zakładka Variables. Nigdy nigdzie indziej.
Uwaga (Google, 9 września 2026): tokeny dewelopera Google Ads zostały wycofane, GOOGLE_ADS_DEVELOPER_TOKEN NIE jest już potrzebny (Operlance go nie wysyła). Poziom dostępu do API jest teraz przypisany do projektu Google Cloud z C1, nie do tokena ani do konta menedżerskiego (MCC), a konto MCC nie jest już wymagane do niczego w tym procesie.
C1. Projekt Google Cloud (5 min, bez zmiennej do zapisania)
- https://console.cloud.google.com → menu projektów (góra) → New project → nazwa
Operlance→ Create → wybierz projekt. - APIs & Services → Library → wyszukaj Google Ads API → Enable.
C2. OAuth consent screen (10 min, bez zmiennej do zapisania; weryfikacja Google tylko przy publikacji)
- APIs & Services → OAuth consent screen (nowy widok: Google Auth Platform → Branding).
- User type: External → Create. App name
Operlance, support e-mail = Twój, developer contact = Twój. - Scopes → Add or remove scopes → wpisz ręcznie
https://www.googleapis.com/auth/adwords→ Update → Save and continue. - Test users → + Add users → Twój adres Google, którym logujesz się do Google Ads → Save.
- Zostaw Publishing status: Testing. W tym trybie refresh token wygasa po 7 dniach: na start wystarczy; przed produkcją klikniesz Publish app (bez weryfikacji Google działa, bo scope
adwordsnie jest „sensitive” w rozumieniu przeglądu: ekran ostrzeżenia „unverified app” widzisz tylko Ty).
C3. OAuth client (3 min; stan 2026-09-19: klient i redirect URI https://api.operlance.app/v1/integrations/google_ads/callback już dodane, poniżej opis pierwotny)
- APIs & Services → Credentials → + Create credentials → OAuth client ID.
- Application type: Web application, nazwa
Operlance api. - Authorized redirect URIs → + Add URI:
https://api.operlance.app/v1/integrations/google_ads/callbackoraz (na czas generowania tokena narzędziem)http://localhost:8080. - Create → zobaczysz dwie wartości:
- Client ID → Railway (
operlance-staging→api→ Variables): zmiennaGOOGLE_ADS_CLIENT_ID. - Client secret → Railway (to samo miejsce): zmienna
GOOGLE_ADS_CLIENT_SECRET.
C4. Numer konta i poziom dostępu Google Ads (10 min + ewentualna weryfikacja)
- https://ads.google.com → zaloguj się kontem z C2 pkt 4 → numer konta THARAN w prawym górnym rogu ekranu (10 cyfr, z myślnikami albo bez, obojętne) → Railway (
operlance-staging→api→ Variables): zmiennaGOOGLE_ADS_CUSTOMER_ID. - Poziom dostępu do API (Test/Explorer/Basic) jest przypisany do projektu Google Cloud z C1, ustawiasz go w Cloud Console, nie na koncie menedżerskim: a. Wejdź na https://console.cloud.google.com → wybierz projekt użyty w C1 → Google Ads API Overview. b. Sekcja "Upgrade access level" pokaże Twój aktualny poziom (Test). c. Request access → Explorer: zwykle zatwierdzane automatycznie, od razu. d. Request access → Basic: najpierw wymaga Brand Verification projektu w Cloud Console (nowy wymóg Google), wypełnij tam nazwę firmy i URL (https://operlance.app), potem dopiero wniosek o Basic. Google po kliknięciu Request access dla Basic może przekierować na wspólny formularz supportu "App Conversion Tracking & Remarketing API" z mylącym banerem u góry (to nie jest błąd, Google używa go też do wniosków Basic Access dla Google Ads API). Mimo mylącego nagłówka wypełnij go: w polu 7 (business model) napisz wprost, że to wniosek o standardowy dostęp do Google Ads API (reporting), nie app conversion tracking, żeby recenzent Google poprawnie to zakwalifikował. Pole 11 (link do aplikacji) nie jest dla nas relewantne, jako obejście można wpisać https://operlance.app. Czas weryfikacji Basic: zwykle 1 do 3 dni robocze, bywa do 2 tygodni. Do tego czasu robimy sync na koncie testowym. Ten krok nie daje nowej zmiennej, to tylko wniosek, czekasz na decyzję/e-mail od Google.
- Opcjonalnie, tylko jeśli zarządzasz kontem THARAN przez konto menedżerskie (MCC): numer konta MCC (10 cyfr) → Railway: zmienna
GOOGLE_ADS_LOGIN_CUSTOMER_ID. Jeśli nie masz MCC, pomiń ten krok, nic nie tracisz.
C5. Refresh token (5 min; jednorazowo, na Twoim komputerze) Skrypt jest w repo: packages/integrations/scripts/google-refresh-token.mjs (Node 22, bez zależności, nic nie zapisuje na dysk).
- W C3 dodaj redirect URI
http://127.0.0.1:8085/callback(dokładnie tak, z portem). - W terminalu, w katalogu repo:
node packages/integrations/scripts/google-refresh-token.mjs. Skrypt zapyta o Client ID i Client secret z C3 (secret wpisujesz na ślepo), otworzy przeglądarkę: zaloguj się kontem z C2 pkt 4 i zatwierdź dostęp. - Skrypt wypisze
GOOGLE_ADS_REFRESH_TOKEN=...→ skopiuj samą wartość (bezGOOGLE_ADS_REFRESH_TOKEN=) do Railway (operlance-staging→api→ Variables): zmiennaGOOGLE_ADS_REFRESH_TOKEN. Potem wyczyść terminal (clear). Nie wysyłaj tokena nam. Jeśli skrypt zgłosi brak refresh tokena: cofnij dostęp na https://myaccount.google.com/permissions i uruchom ponownie.
Alternatywa bez skryptu: narzędzie Google OAuth 2.0 Playground (https://developers.google.com/oauthplayground → ⚙ „Use your own OAuth credentials” → wpisz Client ID/Secret z C3 → scope https://www.googleapis.com/auth/adwords → Authorize → Exchange → skopiuj Refresh token → ta sama zmienna GOOGLE_ADS_REFRESH_TOKEN); wtedy w C3 dodaj redirect URI https://developers.google.com/oauthplayground.
C6. Relay webhooków (opcjonalnie, na później, można pominąć teraz): wygeneruj losowy ciąg ≥ 32 znaki (np. w 1Password: Generate Password) → Railway (operlance-staging → api → Variables): zmienna GOOGLE_ADS_RELAY_SECRET. Google Ads nie ma webhooków; bez tej zmiennej wszystko i tak działa przez codzienny sync.
To wszystkie zmienne sekcji C. Jeśli w Railway masz już wszystkie obowiązkowe z tabeli na górze (poza opcjonalnymi, jeśli ją pomijasz), sekcja Google Ads jest gotowa , napisz Mózgowi „sekcja C gotowa”.