En snabb koll i TikTok Ads Library blir lätt ett dagligt kaninhål. Sedan måste du ändå kopiera länkar, namn och skärmdumpar till ett kalkylark, och du kan aldrig vara helt säker på att du inte loggade samma annons två gånger.
Den här automatiseringen för TikTok-annonseringslogg träffar performance marketers först, men byråägare och tillväxtfokuserade operatörer känner också av den. Resultatet är enkelt: ett felfritt, alltid uppdaterat Google Sheet som bara lägger till faktiskt nya creatives, plus en kort ping i Slack eller Telegram när något förändras.
Nedan ser du exakt hur detta n8n-workflow bevakar biblioteket via Apify, avduplicerar på adId, uppdaterar din logg och håller notiser tysta om det inte finns något värt att titta på.
Så fungerar automatiseringen
Hela n8n-workflowet, från trigger till slutresultat:
n8n Workflow Template: Apify + Google Sheets: felfri TikTok-annonslogg
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Parameters", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Convert Dates to Unix"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Build Apify Body"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare Data for Sheets"]
n4@{ icon: "mdi:database", form: "rounded", label: "Read existing IDs", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Collect ID list"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Attach existing ids"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Filter new creatives"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Count new ads"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Any new ads?", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Append or update row in sheet", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Send a message"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send a text message"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get TT Ads through Apify", pos: "b", h: 48 }
n14@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n9 --> n12
n9 --> n11
n8 --> n9
n0 --> n1
n5 --> n6
n2 --> n13
n14 --> n0
n4 --> n5
n6 --> n7
n7 --> n10
n7 --> n8
n1 --> n2
n3 --> n4
n3 --> n6
n13 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n14 trigger
class n9,n13 decision
class n4,n10 database
class n1,n2,n3,n5,n7,n8 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n5,n6,n7,n8,n11,n12 customIcon
Problemet: konkurrentbevakning av annonser blir rörigt slitjobb
Konkurrentbevakning låter enkelt tills du faktiskt gör det i en vecka. Du söker i TikTok Ads Library, öppnar en massa creatives, kopierar detaljer till ett ark och lovar dig själv att du ska “städa upp det senare”. Senare kommer sällan. Loggen blir inkonsekvent (olika namngivning, saknade fält, trasiga länkar), och dubletter smyger sig in eftersom du går på minnet. Värsta delen: du lägger din bästa tanketid på att samla data istället för att lära dig av den.
Friktionen byggs på. Här är var det faller isär.
- Du dubbelkollar annonser du redan sett eftersom det inte finns något pålitligt “redan loggat”-system.
- Manuell copy-paste skapar småfel som förstör analysen senare (fel annonsör, saknade ID:n, datum som inte matchar).
- Ditt ark växer, men det förblir inte användbart, så ingen litar på det när det är dags att fatta beslut.
- Notiser blir brus när du delar uppdateringar, så teamet slutar bry sig.
Lösningen: schemalagd scraping + avduplicering + korrekt loggning
Det här workflowet körs enligt schema och söker i TikTok Ads Library på samma sätt som du skulle göra, men utan manuellt klickande. n8n bygger en förfrågan (land, datumintervall, annonsörs-ID:n eller nyckelordssökningar), sedan scrapar Apify matchande creatives och returnerar strukturerad data. Därefter formaterar workflowet varje resultat för ditt kalkylark, läser befintliga adId-värden som redan loggats och filtrerar bort allt du sett tidigare. Endast nya creatives skrivs till Google Sheets, där adId används som matchnyckel så att omkörningar är säkra. Till sist, om nya annonser finns, får du ett kort Slack- eller Telegram-meddelande med antal och en länk till arket. Om inget ändrats förblir det tyst.
Workflowet startar med en Scheduled Automation Trigger och en enkel nod för “input options” där du definierar vad som ska spåras. Apify hämtar och returnerar annonserna, sedan jämför n8n deras ID:n mot ditt ark innan rader upsertas och en lätt notis skickas.
Det du får: automatisering vs. resultat
| Vad detta workflow automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du följer 8 konkurrenter och gör en snabb koll varje morgon. Om du lägger cirka 10 minuter per konkurrent på att öppna creatives och logga detaljer blir det ungefär 80 minuter per dag, plus den oundvikliga “loggade jag redan den här?”-rundgången. Med det här workflowet blir den dagliga rutinen: ställ in en gång, låt den schemalagda körningen scrape:a och avduplicera, och kika sedan på ett Slack-/Telegram-meddelande som säger “6 nya annonser” och öppna arket när det är värt det. Den mänskliga tiden sjunker till kanske 5 minuter per dag.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Apify för att scrape:a resultat från TikTok Ads Library
- Google Sheets för att lagra din felfria konkurrentlogg
- Slack eller Telegram för notiser om “nya annonser hittade”
- Apify API-token (hämta den i Apify Console-inställningarna)
Kunskapsnivå: Medel. Du kopplar konton, klistrar in en API-token och bekräftar att dina Sheet-kolumner matchar workflowets mapping.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En schemalagd körning drar igång allt. Du väljer en frekvens (varje morgon är vanligt), och workflowet hämtar som standard “igår till idag” så att du alltid skannar det senaste fönstret.
Dina sökparametrar blir korrekt formaterade. n8n sparar dina inputs (land, nyckelord, annonsörens business-ID:n, valfri resultatgräns) och konverterar sedan datum till Unix-tidsstämplar så att förfrågan beter sig likadant varje gång.
Apify hämtar annonsresultaten, sedan filtrerar n8n. Workflowet plockar ut nyckelfält som adId, videolänkar, omslagsbild, annonsörsdetaljer och användarnamn. Därefter läser det adId-kolumnen från Google Sheets, slår ihop den “befintliga ID-listan” med den aktuella körningen och behåller bara annonser som faktiskt är nya. Det förhindrar även dubletter inom samma scrape-batch.
Google Sheets får en upsert, inte en rörig append. Nya creatives läggs till eller uppdateras med adId som matchande kolumn, och omslagsbilder kan visas via en =IMAGE()-formel så att din logg blir bläddringsbar, inte bara “datalagring”.
Du kan enkelt ändra sök-inputs (land, annonsörs-ID:n eller nyckelordslogik) så att det matchar hur du bevakar konkurrenter. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera den schemalagda automationstriggern
Ställ in schemat som startar automationen och matar in standardindata i arbetsflödet.
- Öppna Scheduled Automation Trigger och konfigurera schemaregeln som matchar er övervakningskadens.
- Verifiera att Scheduled Automation Trigger är kopplad till Define Input Options enligt arbetsflödets kopplingar.
Steg 2: Definiera indataparametrar och datumkonvertering
Ange filtren för annonssökningen och konvertera läsbara datum till Unix-tidsstämplar för API-anropet.
- I Define Input Options, ställ in Ad target country till
all. - Ställ in Ad published date From (DD/MM/YYYY) till
{{ $now.minus({ days: 1 }).toFormat('dd/MM/yyyy') }}och Ad published To (DD/MM/YYYY) till{{ $now.toFormat('dd/MM/yyyy') }}. - Uppdatera adv_biz_ids till ert annonsör-ID i formatet
[YOUR_ID], och fyll valfritt i Advertiser name or keyword eller Ad limit. - Bekräfta att Transform Dates to Unix kommer efter Define Input Options för att generera
start_time_unixochend_time_unix.
DD/MM/YYYY kommer Transform Dates to Unix att kasta ett fel och stoppa körningen.Steg 3: Bygg och kör Apify-förfrågan
Skapa den anpassade payloaden för TikTok Ads-aktorn och kör Apify-jobbet.
- Öppna Assemble Apify Payload och behåll logiken som bygger URL:en och JSON-body för actor-förfrågan.
- I Retrieve TikTok Ads, ställ in Operation till
Run actor and get datasetoch mappa Custom Body till{{ $json.customBody }}. - Inloggning krävs: Anslut era apifyApi-uppgifter i Retrieve TikTok Ads.
resultsLimit i JSON-body.Steg 4: Förbered, avduplicera och identifiera nya annonser
Normalisera svaret, ladda befintliga ID:n från Google Sheets och filtrera fram enbart nya creatives.
- Granska Format Rows for Sheets för att säkerställa att
videoUrl,coverImageUrlochtiktokUsernameextraheras säkert för varje annons. - Format Rows for Sheets skickar utdata till både Load Existing IDs och Merge Prior IDs parallellt.
- I Load Existing IDs, ställ in Document ID till
[YOUR_ID]och Range tillK:Kför den befintliga adId-kolumnen. - Inloggning krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Load Existing IDs.
- Bekräfta att Gather ID Catalog matar in i Merge Prior IDs, och att Filter Fresh Creatives sedan tar bort annonser som redan finns i Sheets.
Steg 5: Skriv in nya annonser och skicka notifieringar
Infoga eller uppdatera nya annonser i Google Sheets och avisera era kanaler om några hittades.
- Filter Fresh Creatives skickar utdata till både Upsert Sheet Rows och Tally New Ads parallellt.
- I Upsert Sheet Rows, bekräfta att Operation är
appendOrUpdateoch att kolumnmappningarna använder uttryck som{{ $json.adId }}och{{ $json.coverImageUrl ? `=IMAGE("${$json.coverImageUrl}"; 1)` : '' }}. - Inloggning krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Upsert Sheet Rows.
- Tally New Ads matar in i Check New Ads med ett numeriskt villkor
{{ $json.newCount }} > 0. - Check New Ads skickar utdata till både Send Telegram Update och Post Slack Update parallellt.
- Inloggning krävs: Anslut era telegramApi-uppgifter i Send Telegram Update och ställ in Chat ID till
[YOUR_ID]. - Inloggning krävs: Anslut era Slack-uppgifter i Post Slack Update och välj mål-Channel.
- Behåll meddelandeinnehållet i båda notifieringsnoderna som
Hello! {{$json.newCount}} TikTok ads were found today. Review the list in your spreadsheet..
Steg 6: Testa och aktivera ert arbetsflöde
Kör ett manuellt test för att validera flödet och aktivera sedan schemat för produktion.
- Klicka på Execute Workflow för att köra hela flödet från Scheduled Automation Trigger och framåt.
- Bekräfta att nya rader visas i Google Sheets via Upsert Sheet Rows, och att Tally New Ads skickar ut ett
newCount-värde. - Om
newCountär större än noll, verifiera att både Send Telegram Update och Post Slack Update levererar meddelanden parallellt. - När allt är verifierat, växla arbetsflödet till Active så att Scheduled Automation Trigger kan köras enligt sitt schema.
Vanliga fallgropar
- Apify-inloggningar kan löpa ut eller så kan aktorn kräva rätt åtkomst. Om det skapar fel, kontrollera först din Apify-token och aktörens behörigheter i Apify Console.
- Om du använder Wait-noder eller extern rendering varierar processing-tiderna. Öka väntetiden om nedströmsnoder misslyckas på grund av tomma svar.
- Google Sheets-upsert beror på din matchkolumn. Om adId inte ligger i förväntad kolumn/område (eller om rubrikerna i arket har ändrats) smyger dubletter in även om workflowet “körde lyckat”.
Vanliga frågor
Cirka 30–60 minuter om dina Apify-, Google Sheets- och Slack/Telegram-konton är klara.
Nej. Du kopplar mest konton och klistrar in en Apify-token. Den enda “tekniska” delen är att säkerställa att ditt Google Sheet har de förväntade kolumnerna.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in Apify-kostnader för användning av TikTok Ads Scraper-aktorn.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Ja, och det är en vanlig uppgradering. Du kan göra annonsörens business-ID:n (adv_biz_ids) i noden “Define Input Options” till en lista och sedan loopa över den så att varje körning kontrollerar flera konkurrenter. Ett annat alternativ är att byta från annonsörs-ID:n till nyckelordsbaserade sökningar genom att ändra samma input-nod och sedan låta logiken i “Assemble Apify Payload” bygga rätt URL. De flesta justerar också Slack-/Telegram-meddelandet så att det inkluderar datumintervallet eller annonsörsetiketten.
Oftast beror det på en utgången eller felaktig Apify API-token i n8n. Skapa en ny token i Apify, uppdatera inloggningen som används av “Retrieve TikTok Ads” och testa en manuell körning. Om det fortfarande misslyckas, kontrollera att din Apify-plan/aktörsåtkomst inkluderar TikTok Ads Scraper-aktorn och håll koll på rate limits om du scrapar stora resultatuppsättningar.
Många, så länge din Apify-körning och din n8n-plan hänger med.
Ofta, ja, eftersom det här inte är ett enkelt flöde av typen “om ny rad, skicka meddelande”. Du behöver säkra omkörningar, avduplicering och en upsert-strategi baserad på adId, plus lite lätt databearbetning innan du skriver till Sheets. n8n hanterar branching och kodsteg utan att varje extra filter blir ännu en betald task. Zapier eller Make kan fortfarande fungera om du redan arbetar där, men du kommer sannolikt lägga mer tid på att hantera edge cases som dublettlogik. Om du vill ha hjälp att välja, prata med en automationsexpert och ta med din exakta volym och dina rapporteringsbehov.
Du får en konkurrentlogg som förblir pålitlig, även när du slutar tänka på den. Sätt schemat, ha länken till arket nära till hands och använd tiden du sparade till att faktiskt fatta bättre kreativa beslut.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.