# Sync Audiences to Google Ads Remarketing Lists (Customer Match)

<p>This guide lists the steps to configure Google Ads Remarketing Lists (Customer Match) as a destination in RudderStack and sync the created audiences to it.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="prerequisites-google-ads-permissions">Prerequisites: Google Ads permissions</h2><p>This integration relies on the authorizing Google Ads user&rsquo;s <a href="https://support.google.com/google-ads/answer/9978556" >underlying permissions</a>.</p>
<p>Note that the API calls to Google Ads will fail if you authorize this integration without the <a href="#what-are-the-account-permissions-required-for-the-google-ads-remarketing-lists-integration" ><strong>Standard</strong> or <strong>Admin</strong> permissions</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="setup">Setup</h2><ol>
<li>Set up an audience in RudderStack using the <a href="https://www.rudderstack.com/docs/audiences/audience-builder/create-audience/" >Audience Builder</a>.</li>
<li>Go to the <strong>Syncs</strong> tab of the audience page and click <strong>Add sync</strong>. Then, select <strong>Google Ads Remarketing Lists</strong>.</li>
<li>Click <strong>New destination</strong> — you can also select an already-configured destination here.</li>
<li>Specify a unique name to identify this destination in RudderStack.</li>
<li>In the <strong>Event delivery account</strong> section, click <strong>Select</strong> to choose from an existing Google Ads account from the list. You can also click <strong>Add account</strong> and authenticate via OAuth, by specifying the following settings:</li>
</ol>
<table>
  <thead>
      <tr>
          <th>Setting</th>
          <th><div>Description</div></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Account Name</td>
          <td>Specify a unique account name</td>
      </tr>
      <tr>
          <td>oAuth settings</td>
          <td>Click <strong>Connect account</strong>, sign in with Google, and give RudderStack the required permissions to access your Google Ads account.</td>
      </tr>
  </tbody>
</table>
<ol start="6">
<li>The <strong>Custom ID</strong> is pre-populated associated with your Google Ads account — select the ID from the dropdown.</li>
<li>Turn on the <strong>Subaccount</strong> setting if you are using a Google Ads subaccount. <br /><br /><strong>Note</strong>: See this <a href="https://support.google.com/campaignmanager/answer/2829448?hl=en#zippy=%2Cwhat-are-subaccounts" >guide</a> for more information on subaccounts.</li>
<li>If <strong>Subaccount</strong> is toggled on, enter the <strong>Login Customer ID</strong> of the parent (manager) account associated with the subaccount. See the <a href="#when-do-i-need-to-provide-a-login-customer-id" >FAQ</a> for guidance on when this field is required.</li>
<li>Proceed to configure the mapping settings.</li>
</ol>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="mapping-settings">Mapping settings</h2><p>This section lists the settings to correctly map data from your audience to the Google Ads Remarketing Lists destination.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="select-user-list">Select user list</h3><p>In this section, you can create a new user list or use an existing one.</p>
<ul>
<li><strong>Create new list</strong>: Use this option to create a new list in Google Ads. You can specify the name and description of the new list.</li>
<li><strong>Use existing list</strong>: Select an existing list in Google Ads. This field is populated based on your <a href="#setup" >connection settings</a>.</li>
</ul>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="sync-mode">Sync mode</h3><p>RudderStack supports only <a href="https://www.rudderstack.com/docs/data-pipelines/reverse-etl/developer-guides/sync-modes/#mirror-mode" >Mirror mode</a> for this integration.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="select-list-type">Select list type</h3><p>If you select the <strong>Create new list</strong> option, you need to select the <a href="https://developers.google.com/google-ads/api/reference/rpc/v23/CustomerMatchUploadKeyTypeEnum.CustomerMatchUploadKeyType" >type of list</a> where you want to sync the data. Three options are available:</p>
<table>
  <thead>
      <tr>
          <th>List type</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CONTACT_INFO</td>
          <td>You can send email, phone number, and address information in this list</td>
      </tr>
      <tr>
          <td>CRM_ID</td>
          <td>You can send internal customer IDs in this list</td>
      </tr>
      <tr>
          <td>MOBILE_ADVERTISING_ID</td>
          <td>You can send mobile advertising IDs (IDFA/GAID) in this list <br /><br /><strong>Note</strong>: If selected, specify the <strong>App ID</strong> of the mobile app the data was collected from. <br /><br /><ul><li>For iOS, it is the 9-digit number at the end of the App Store URL, for example, <code>123456789</code>.</li><li>For Android, it&rsquo;s the package name, for example, <code>com.sampleapp.samplename</code>.</li></ul></td>
      </tr>
  </tbody>
</table>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="map-identifiers">Map identifiers</h3><p>In this section, you can map your warehouse columns to specific Google Ads fields that represent your audience&rsquo;s identity.</p>

<html lang="en">
<blockquote class="info">
  <div class="tip-quote">
    
    <div class="tip-text">The fields available for mapping depend on the <a href="#select-list-type" >list type</a> you select.</div>
  </div>
</blockquote>

</html>

<figure class="image--main "  >
    <a 
         href="/docs/images/audiences/destinations/garl/sync-map-identifiers.webp"
        
        >
        <img src="/docs/images/audiences/destinations/garl/sync-map-identifiers.webp" 
         
         
         
        decoding="async" loading="lazy" class="img-shortcode"/>
    </a>
    
</figure>

<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="advanced-settings">Advanced settings</h3><table>
  <thead>
      <tr>
          <th>Setting</th>
          <th><div>Description</div></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Automatically hash PII data</td>
          <td>When set to <strong>Yes</strong>, Sensitive user data is hash-encoded like email, phone, first name, and last name in the SHA-256 format. <br /><br />See <a href="#data-hashing" >Data hashing</a> section for more information.</td>
      </tr>
      <tr>
          <td>Specify user consent</td>
          <td>Specify the consent type for the  uploaded users for using their data in Google Ads. Four options are available:<br /><br /><ul><li><strong>Unspecified</strong></li><li> <strong>Unknown</strong></li><li><strong>Granted</strong></li><li><strong>Denied</strong></li></ul>Note that if you do not set this field, The default is  <strong>Unspecified</strong>, by default.</td>
      </tr>
      <tr>
          <td>Specify ad personalization consent</td>
          <td>Specify consent for uploaded users for personalizing ads. Four options are available:<br /><br /><ul><li><strong>Unspecified</strong></li><li> <strong>Unknown</strong></li><li><strong>Granted</strong></li><li><strong>Denied</strong></li></ul>Note that if you do not set this field, The default is <strong>Unspecified</strong> by default.</td>
      </tr>
  </tbody>
</table>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="sync-settings">Sync settings</h2>

<p>Two options are available to schedule your audience syncs:</p>
<ul>
<li><strong>Run syncs automatically</strong> based on a specified frequency (every 5 minutes, 10 minutes, 15 minutes, 30 minutes, 1 hour, 3 hours, 6 hours, 12 hours, or 24 hours) and a specific time (in UTC).</li>
<li><strong>Run syncs manually</strong> — trigger a sync from the sync details page. You will need to run the sync each time.</li>
</ul>

<figure class="image--main "  >
    <a 
         href="/docs/images/audiences/destinations/fb-custom-audience/run-sync.webp"
        
        >
        <img src="/docs/images/audiences/destinations/fb-custom-audience/run-sync.webp" 
         
         
         
        decoding="async" loading="lazy" class="img-shortcode"/>
    </a>
    
</figure>

<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="sync-observability-settings">Sync observability settings</h4>

<table>
  <thead>
      <tr>
          <th>Setting</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Retain sync logs</td>
          <td>This setting is toggled on by default and instructs RudderStack to store the sync logs in your warehouse. You can also configure the below settings: <br /><br /><table><tr><th width="20%">Setting</th><th width="80%">Description</th></tr><tr><td>Sync log retention</td><td>Specify the retention period of the <a href="https://www.rudderstack.com/docs/data-pipelines/reverse-etl/developer-guides/sync-observability/#sync-logs" >sync logs</a> in your warehouse. <br /><br />If you set it to 1, then RudderStack deletes any sync log older than a day (in UTC time). </td></tr><tr><td>Snapshot table retention</td><td>Specify the number of <a href="https://www.rudderstack.com/docs/data-pipelines/reverse-etl/developer-guides/sync-observability/#snapshot-table-schema" >snapshot tables</a> to retain. </td></tr></table></td>
      </tr>
      <tr>
          <td>Retry failed records</td>
          <td>This setting is toggled on by default and causes RudderStack to continually <a href="https://www.rudderstack.com/docs/data-pipelines/reverse-etl/developer-guides/sync-observability/#retry-failed-records" >retry sending the failed records</a>.</td>
      </tr>
      <tr>
          <td>Retain and show failures</td>
          <td>This setting is toggled off by default. Turn it on to have RudderStack write the error recorded for every failed record to a <a href="https://www.rudderstack.com/docs/data-pipelines/reverse-etl/developer-guides/rudderstack-schema/#failed-records-table" >failed records table</a> in your warehouse and show it in the sync&rsquo;s <a href="https://www.rudderstack.com/docs/data-pipelines/reverse-etl/developer-guides/sync-observability/#failed-records" >failed records view</a>. It applies from the next sync and can take up to a minute to reach your data plane. <br /><br /><table><tr><th width="20%">Setting</th><th width="80%">Description</th></tr><tr><td>Failure retention</td><td>Number of days RudderStack keeps each sync&rsquo;s failed records in your warehouse. The default is 30 and the minimum is 7.</td></tr></table></td>
      </tr>
  </tbody>
</table>

<blockquote class="warning">
  <div class="tip-quote">
    
    <div class="tip-text">Storing sync logs, snapshot tables, and failed records may incur additional warehouse costs.</div>
  </div>
</blockquote>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="enable-sync">Enable sync</h2>

<p>Once the setup is complete, enable the sync.</p>

<figure class="image--main "  >
    <a 
         href="/docs/images/audiences/destinations/tiktok/enable-sync.webp"
        
        >
        <img src="/docs/images/audiences/destinations/tiktok/enable-sync.webp" 
         
         
         
        decoding="async" loading="lazy" class="img-shortcode"/>
    </a>
    
</figure>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="data-normalization">Data normalization</h2><p>By default, data is cleaned and standardized as prescribed by Google Ads.</p>
<p>After normalization, each field is validated before sending to Google Ads:</p>
<ul>
<li>Invalid fields are <strong>not</strong> sent to Google Ads.</li>
<li>If all fields in a row are invalid, then the entire row is rejected and marked as failed</li>
</ul>

<html lang="en">
<blockquote class="info">
  <div class="tip-quote">
    
    <div class="tip-text">Data is first normalized, then validated (skipping invalid rows), then <a href="#data-hashing" >hashed</a> before sending to Google Ads.</div>
  </div>
</blockquote>

</html>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="data-hashing">Data hashing</h2><p>The <a href="#advanced-settings" >Automatically hash PII data</a> setting lets you hash your user data before sending it to Google Ads. This setting is enabled by default.</p>
<ul>
<li>Configure the setting to <strong>Yes</strong> if your incoming data is not pre-hashed</li>
<li>Configure this setting to <strong>No</strong> if your data is already hashed</li>
</ul>

<blockquote class="warning">
  <div class="tip-quote">
    
    <div class="tip-text"><p>Incorrect configuration of the <strong>Automatically hash PII data</strong> setting will result in failures.</p>
<ul>
<li>If the <strong>Automatically hash PII data</strong> setting is configured to <strong>Yes</strong> and your data is pre-hashed, the event will fail.</li>
<li>If the <strong>Automatically hash PII data</strong> setting is configured to <strong>No</strong> and your data is not pre-hashed, the event will fail.</li>
</ul></div>
  </div>
</blockquote>
<p>Such events are rejected with a clear error message, for example:</p>
<div class="rs-code">
  <div class="rs-code__head"><button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-text" data-lang="text">Hashing is disabled but the value for field EMAIL appears to be unhashed. Either enable hashing or send pre-hashed data.</code></pre></div>
</div>
<p>You will also see errors in the <strong>Events</strong> tab for cases that were previously marked as successful but resulted in no matches, helping you identify and fix data quality or configuration issues.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="faq">FAQ</h2><!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="what-are-the-account-permissions-required-for-the-google-ads-remarketing-lists-integration">What are the account permissions required for the Google Ads Remarketing Lists integration?</h4><p>Make sure the customer account used for OAuth verification adheres to Google&rsquo;s <a href="https://support.google.com/google-ads/answer/6299717" >Customer Match policy</a> and has <strong>Standard</strong> or higher (<strong>Administrative</strong>) access level permissions.</p>
<p>For more information on the access level permissions, refer to this <a href="https://support.google.com/google-ads/answer/9978556?visit_id=637611563637058259-4176462731&amp;rd=1" >Google Ads support page</a>.</p>
<p>Follow these steps to set the access level:</p>
<ol>
<li>Sign into to your Google Ads account and go to <strong>TOOLS AND SETTINGS</strong> &gt; <strong>Access and security</strong>:</li>
</ol>

<figure class="image--main "  >
    <a 
         href="/docs/images/event-stream-destinations/gads-access-security.webp"
        
        >
        <img src="/docs/images/event-stream-destinations/gads-access-security.webp" 
         alt="Access and Security option in Google Ads dashboard"  
         
         
        decoding="async" loading="lazy" class="img-shortcode"/>
    </a>
    
</figure>

<ol start="2">
<li>Enter the email address of the account. From the list of permissions, select <strong>Standard</strong> or <strong>Administrative</strong>. Then, click <strong>SEND INVITATION</strong>:</li>
</ol>

<figure class="image--main "  >
    <a 
         href="/docs/images/event-stream-destinations/gads-specify-access-level.webp"
        
        >
        <img src="/docs/images/event-stream-destinations/gads-specify-access-level.webp" 
         alt="Specifying access levels"  
         
         
        decoding="async" loading="lazy" class="img-shortcode"/>
    </a>
    
</figure>

<p>The account will have the required access-level permissions once the user accepts the invitation.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="when-do-i-need-to-provide-a-login-customer-id">When do I need to provide a Login Customer ID?</h4><p>You need to provide the Manager Account ID (<strong>Login Customer ID</strong> setting in the dashboard) only when:</p>
<ul>
<li>The Manager Account ID is a manager of the Customer ID</li>
<li>The Google account you authenticated with does not have direct user access to the Customer ID.</li>
</ul>
<p>You can leave the <strong>Login Customer ID</strong> field empty if the authenticated Google account has direct access to the Customer ID.</p>
<p>See <a href="https://support.google.com/google-ads/answer/7459399" >About manager accounts</a> for more information.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="how-do-i-know-which-customer-id-and-login-customer-id-combination-applies-to-my-setup">How do I know which Customer ID and Login Customer ID combination applies to my setup?</h4><table>
  <thead>
      <tr>
          <th>Setup</th>
          <th>Customer ID</th>
          <th>Login Customer ID</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Standalone account, direct OAuth access</td>
          <td>The account itself</td>
          <td>Leave empty</td>
      </tr>
      <tr>
          <td>Standalone account, OAuth access via a manager</td>
          <td>The account itself</td>
          <td>The manager</td>
      </tr>
  </tbody>
</table>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="why-am-i-getting-the-user_permission_denied-invalid_customer_id-or-customer_not_accepted_customer_data_terms-errors">Why am I getting the <code>USER_PERMISSION_DENIED</code>, <code>INVALID_CUSTOMER_ID</code>, or <code>CUSTOMER_NOT_ACCEPTED_CUSTOMER_DATA_TERMS</code> errors?</h4><p>These errors usually mean the <strong>Customer ID</strong> or Manager Account ID (<strong>Login Customer ID</strong> setting in the dashboard) is misconfigured or you are hitting the API rate limits.</p>
<table>
  <thead>
      <tr>
          <th>Error</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>USER_PERMISSION_DENIED</code></td>
          <td>The authenticated Google account doesn&rsquo;t have permission to act on the <strong>Customer ID</strong> or you&rsquo;re trying to modify a customer list created by a different account (only the owning account can edit a list).<br /><br /> Verify the <strong>Login Customer ID</strong> is correct, and that this manager is linked to the <strong>Customer ID</strong> in Google Ads.</td>
      </tr>
      <tr>
          <td><code>INVALID_CUSTOMER_ID</code></td>
          <td>Either the <strong>Customer ID</strong> is wrong, or the <strong>Login Customer ID</strong> isn&rsquo;t authorized to access it.</td>
      </tr>
      <tr>
          <td><code>RESOURCE_EXHAUSTED</code></td>
          <td>Too many requests are sent in a short period — this is a quota/rate limit issue rather than a configuration error. Batch your operations and review Google&rsquo;s <a href="https://developers.google.com/google-ads/api/docs/best-practices/quotas" >API limits and quotas</a>.</td>
      </tr>
  </tbody>
</table>
<p>For other Customer Match-specific errors, see Google&rsquo;s <a href="https://developers.google.com/google-ads/api/docs/remarketing/audience-segments/customer-match/troubleshoot" >Customer Match Troubleshooting Guide</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="why-am-i-getting-a-400-bad-request-error-message-while-setting-up-the-google-ads-remarketing-lists-destination">Why am I getting a 400 Bad Request error message while setting up the Google Ads Remarketing Lists destination?</h4><p>If you get a 400 Bad Request error while configuring the destination, make sure your customer account is allowlisted and configured to have <strong>Standard</strong> or <strong>Administrative</strong> access levels in Google Ads.</p>
<p>See the above <a href="#what-are-the-account-permissions-required-for-the-google-ads-remarketing-lists-integration" >FAQ</a> for steps on setting the access level permissions for the account.</p>

