Track TikTok Ads Library with Apify, Google Sheets & Slack/Telegram Notifications
This workflow continuously monitors the TikTok Ads Library for new creatives from specific advertisers or keyword searches, scrapes them via Apify, logs them into Google Sheets, and sends concise notifications to Tele...
Template notes
This workflow continuously monitors the TikTok Ads Library for new creatives from specific advertisers or keyword searches, scrapes them via Apify, logs them into Google Sheets, and sends concise notifications to Telegram or Slack with the number of newly discovered ads. It is built as a safe, idempotent loop that can run on a schedule without creating duplicates in your sheet.
Use Case Manually checking the TikTok Ads Library for competitor creatives is time-consuming, and it's easy to lose track of which ads you've already seen. This workflow is ideal if you want to: - Track competitor creatives over time in a structured Google Sheet. - Avoid duplicates by matching ads via their unique adId field. - Get lightweight notifications in Telegram or Slack that tell you how many new ads appeared, without spamming you with full ad lists. - Run the process on autopilot (daily, weekly, etc.) with a single schedule. - Monitor by advertiser ID or keywords with flexible search parameters.
How it Works
The workflow is organized into four logical blocks:
1. Configuration & Date Conversion - Configuration: The Set Parameters Set node stores all key request variables: - Ad target country (e.g., all or specific ISO country codes), - Ad published date From (automatically set to yesterday by default), - Ad published To (automatically set to today by default), - Advertiser name or keyword (for keyword-based searches), - advbizids (advertiser business IDs for specific advertiser tracking), - Ad limit (optional limit on the number of results to scrape). - Date Conversion: Convert Dates to Unix transforms the human-readable date format (DD/MM/YYYY) into Unix timestamps in milliseconds, which are required by the TikTok Ads Library API.
2. Request Building & Data Fetching - Body Construction: Build Apify Body creates the JSON request body for the Apify actor: - Builds the TikTok Ads Library URL with all search parameters (region, date range, advertiser name/keyword, advertiser IDs). - Conditionally adds resultsLimit to the request body only if the Ad limit field is not empty, allowing you to scrape all results or limit them as needed. - Data Fetching: Get TT Ads through Apify executes the Apify actor (Tiktok Ads Scraper) and retrieves all matching ads from the TikTok Ads Library.
3. Data Preparation & De-duplication - Data Extraction: Prepare Data for Sheets safely extracts nested data from the API response: - Extracts the first video URL from the videos array (if available). - Extracts the cover image URL from the first video object. - Extracts the TikTok username from the tiktokUser object (if available). - Handles cases where arrays are empty or objects are missing without throwing errors. - Load Existing IDs: - Read existing IDs pulls the existing adId column from your Google Sheet (configured to read a specific column/range, e.g., column K). - Collect ID list converts these into a unique, normalized string array existingIds, which represents all ads you have already logged. - Attach State: - Attach existing ids (Merge node) combines, for each execution, the freshly fetched TikTok response with the historical existingIds array from Sheets. - Filter New Creatives: - Filter new creatives Code node compares each ad's adId (string) against the existingIds set and builds a new array containing only ads that are not yet present in the sheet. - It also protects against duplicates inside the same batch by tracking seen IDs in a local Set.
4. Data Logging & Notification - Write New Ads: - Append or update row in sheet performs an appendOrUpdate into Google Sheets, mapping core fields such as adId, adName, advertiserName, advertiserId, paidBy, impressions, regionStats, targeting, tiktokUser, startUrl, videos, and coverImageURL (using the =IMAGE() formula to display images directly in the sheet). - The column mapping uses adId as the matching column so that existing rows can be updated if needed. - Count: - In parallel with the write step, Filter new creatives also feeds into Count new ads. - This Code node returns a single summary item with newCount = items.length, i.e., the total number of new creatives processed in this run. - Guard: - Any new ads? checks whether newCount is greater than 0. If not, the workflow ends silently and no message is sent, avoiding noise. - Notify: - When there are new creatives, both Send a text message (Telegram) and Send a message (Slack) send notifications to the configured channels. - The message includes {{$json.newCount}} and a fixed link to the Google Sheet, giving you a quick heads-up without listing individual ads.