Skip to main content

Community

Campaign-Level Geographic Exclusion Support for Google Ads and Microsoft Advertising

Answered

Please sign in to leave a comment.

Comments

2 comments

  • Official comment

    Hi Ujwal!

    Thanks for the detailed write-up. Since you already have this working internally, I’d love to understand how you’d expect this to show up in Activations.

    A few questions that would help us map this cleanly:

    1. What destination object would you expect to choose in the sync setup?

    2. What would one row in your source table represent? Can you share what your source data looks like?

    3. How would you expect Activations to identify each exclusion record? (For example, when the sync sees a row that was previously sent, how should it know whether that row represents the same exclusion as before versus a new exclusion?)

    4. What fields would you expect to map from the warehouse?

    5. What should happen when rows are added, updated, or removed from the source table?

    Thanks,

    Jeremy

    1. What destination object would you expect to choose in the sync setup?

    We would expect Fivetran to support campaign-level exclusion updates for both Google Ads and Microsoft Advertising. A suitable approach would be to introduce Campaign Exclusion Updates under the Google and Microsoft destinations.


    2. What would one row in your source table represent? Can you share what your source data looks like?

    Our source table contains exclusion data at a campaign level. A single row can represent up to 10,000 location exclusions (ZIP codes and/or cities) for a campaign.

    Sample source data:

    TASK_ID GEO_CODE ZIP_EXCLUSION CITY_EXCLUSION CALC_DTTM PLATFORM CAMPAIGN_ID ACCOUNT_ID
    100008 1 02351;02352;02353 Abbeville,Louisiana,United States;Adair,Iowa,United States 2026-06-14 03:00:00.000 GOOGLE 123 123-
    40072 5 83637 Aberdeen Proving Ground,Maryland,United States 2026-06-14 03:00:00.000 GOOGLE 123 123-
    55310 3 10001;10002   2026-06-14 03:00:00.000 BING 99 999

    Expected Google Payload

    {
      "customerId": "1234567890",
      "partialFailure": true,
      "operations": [
        {
          "create": {
            "campaign": "customers/123/campaigns/20987654321",
            "negative": true,
            "location": {
              "geoTargetConstant": "geoTargetConstants/9031985"
            }
          }
        },
        {
          "create": {
            "campaign": "customers/123/campaigns/20987654321",
            "negative": true,
            "location": {
              "geoTargetConstant": "geoTargetConstants/1014221"
            }
          }
        },
        {
          "create": {
            "campaign": "customers/123/campaigns/20987654321",
            "negative": true,
            "location": {
              "geoTargetConstant": "geoTargetConstants/1018862"
            }
          }
        }
      ]
    }

    Expected Microsoft Payload

    {
      "accountId": 123,
      "campaignCriterions": [
        {
          "type": "NegativeCampaignCriterion",
          "campaignId": 123,
          "criterion": {
            "type": "LocationCriterion",
            "locationType": "PostalCode",
            "locationId": 78649
          }
        },
        {
          "type": "NegativeCampaignCriterion",
          "campaignId": 123,
          "criterion": {
            "type": "LocationCriterion",
            "locationType": "PostalCode",
            "locationId": 123
          }
        }
      ]
    }

    3. How would you expect Activations to identify each exclusion record?

    Currently, our process is diff-based.

    1. We ingest the ZIP codes and cities to be excluded from the feed.
    2. We retrieve the current exclusions from Google Ads or Microsoft Advertising, including their corresponding location IDs.
    3. We build the desired exclusion set from the feed data.
    4. We compare the desired exclusion set with the current exclusion set on the advertising platform.

    The synchronization logic is straightforward:

    • Add exclusions that exist in the feed but not on the platform.
    • Remove exclusions that exist on the platform but are no longer present in the feed.
    • Retain exclusions that exist in both sets.

    We see two possible implementation approaches:

    Option 1 – Mirror Sync

    • We always populate the table with the latest complete exclusion dataset.
    • Fivetran sends the entire dataset and mirrors the destination state to match the source.

    Option 2 – Incremental Sync

    • Exclusions are loaded incrementally.
    • Fivetran identifies records using a primary key and processes only newly added or updated records.

    4. What fields would you expect to map from the warehouse?

    Google Ads

    • Campaign ID
    • Customer ID
    • Geo Location ID
    • Action (create or remove)

    Microsoft Advertising

    • Campaign ID
    • Account ID
    • Location ID
    • Action (create or remove)

    5. What should happen when rows are added, updated, or removed from the source table?

    Mirror Sync Approach

    • No special handling is required.
    • The destination should always be synchronized to match the latest state of the source table.

    Incremental Sync Approach

    • Only the most recent data should be processed.
    • New and updated records should be applied based on the configured primary key and incremental logic.