> ## Documentation Index
> Fetch the complete documentation index at: https://oneviewhub.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Ads

> Understand how Google Ads works on OneView

export const RevokeAccessFAQ = ({platformName, oauthDashboardUrl, autoRevoke}) => {
  if (autoRevoke) {
    return <Accordion title={`Q: How do I revoke access to my ${platformName} data?`}>
        <Danger>
          Revoking access <strong>will stop OneView from sending conversions to your {platformName} account</strong>.
        </Danger>
        <p>
          You need to revoke access to your {platformName} data on both ends:
        </p>
  
        <ol>
          <li>
            <strong>From OneView</strong>: Navigate to <a href="https://oneviewhub.com/workspace/settings/ad-accounts">Ad Accounts settings</a> and disconnect your {platformName} account.
          </li>
          <li>
            <strong>From {platformName}</strong>: Use your dashboard at (<a href={oauthDashboardUrl}>{oauthDashboardUrl}</a>) and remove <strong>OneView Platform</strong> from your account.
          </li>
        </ol>
        <p>
      When you disconnect your {platformName} account from your OneView workspace, <strong>all credentials are deleted</strong> (on OneView) and <strong>access revocation is requested</strong> (to {platformName}) automatically on your behalf.
    </p>
      </Accordion>;
  }
  return <Accordion title={`Q: How do I revoke access to my ${platformName} data?`}>
      <Danger>
        Revoking access <strong>will stop OneView from sending conversions to your {platformName} account</strong>.
      </Danger>
      
      <p>
          You need to revoke access to your {platformName} data on both ends:
        </p>

      <ol>
        <li>
          <strong>From OneView</strong>: Navigate to <a href="https://oneviewhub.com/workspace/settings/ad-accounts">Ad Accounts settings</a> and disconnect your {platformName} account.
        </li>
        <li>
          <strong>From {platformName}</strong>: Use your dashboard at (<a href={oauthDashboardUrl}>{oauthDashboardUrl}</a>) and remove <strong>OneView Platform</strong> from your account.
        </li>
      </ol>
    </Accordion>;
};

export const IntegrationDataFields = ({platformName, clickIdentifiers, includeCommonFields = false}) => {
  return <>
      {clickIdentifiers && clickIdentifiers.length > 0 && <>
          <p>
            Click identifiers are automatically captured from URL parameters when users click on your {platformName} ads. When click identifiers are missing or expired, OneView uses <a href="/docs/platform/features/delivery/enhanced-conversions">Enhanced Conversions</a> with identifiers from your <a href="/docs/platform/features/processing/identity-resolution">Identity Graph</a> to maintain attribution accuracy.
          </p>
          {clickIdentifiers.map((identifier, index) => <ParamField key={index} path={identifier.name} type="string">
              <strong>{identifier.displayName || identifier.name}</strong> - {identifier.description}
            </ParamField>)}
        </>}

      {includeCommonFields && <>
          <ParamField path="conversion_date_time" type="string" required>
            <strong>Conversion Timestamp</strong> - The date and time when the conversion occurred.

            <p>
              OneView automatically converts timestamps to the timezone of your {platformName} account for accurate cross-dashboard reporting comparisons.
            </p>
          </ParamField>

          <ParamField path="transaction_id" type="string">
            <strong>Transaction ID</strong> - Unique identifier for idempotency and deduplication.

            <p>
              OneView automatically uses the <code>Idempotency-Key</code> of your event as the Event ID, or, if absent, generates a <Tooltip tip="The same payload will always generate the same Event ID.">deterministic</Tooltip> one based on the event payload.
            </p>
          </ParamField>

          <ParamField path="consent" type="object">
            <strong>Consent Information</strong> - Consent information for the conversion, using the <strong>Google Consent Mode</strong> framework.

            <p>
              OneView automatically sets consent information using the <strong>Google Consent Mode</strong> framework, with <code>ad_user_data</code> and <code>ad_personalization</code> values to enforce <a href="/docs/platform/compliance/consent">consent compliance</a>.
            </p>
          </ParamField>
        </>}
    </>;
};

export const IntegrationOverview = ({platformName}) => {
  return <>
      <p>
        {platformName} is configured as a <strong>Conversion API integration</strong> in OneView. OneView automatically sends <a href="/docs/platform/concepts/conversions">conversion data</a> to {platformName}'s API for campaign optimization.
      </p>

      <p>
        OneView automatically handles data mapping, <a href="/docs/platform/features/processing/merit-based-routing">routing rules</a>, and API communication with {platformName}. You simply need to select your <strong>Conversion Events</strong> on OneView, and OneView will take care of the rest.
      </p>
    </>;
};

export const IntegrationHero = ({logoSrc, alt = "Integration logo", maxHeight = 160}) => {
  const containerStyle = {
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'center',
    width: '100%',
    height: '220px'
  };
  const imgStyle = {
    maxHeight: `${maxHeight}px`,
    maxWidth: '100%'
  };
  return <Frame>
      <div style={containerStyle}>
        <img noZoom src={logoSrc} alt={alt} style={imgStyle} />
      </div>
    </Frame>;
};

<IntegrationHero logoSrc="/assets/logos/integrations/GoogleAds.svg" alt="Google Ads" />

<Tip>
  To access this integration, you'll a **Google Ads** account with `ADMIN` or `STANDARD` access.

  You **are not required** to provide your own developer token, as OneView is a **Data Provider** for Google Ads API.
</Tip>

<IntegrationOverview platformName="Google Ads" />

## What gets sent to Google Ads

<IntegrationDataFields
  platformName="Google Ads"
  clickIdentifiers={[
{
  name: 'gclid',
  displayName: 'Google Click ID',
  description: 'Captured from URL parameters when users click on your ads and navigate to your website.'
},
{
  name: 'gbraid',
  displayName: 'Google App Bridging Ad ID (gbraid)',
  description: 'Present when a user clicks on an ad on the web and is directed to your iOS app.'
},
{
  name: 'wbraid',
  displayName: 'Web Bridging Ad ID (wbraid)',
  description: 'Present when a user clicks on an ad in an iOS app and is directed to your webpage.'
}
]}
/>

### Conversion Details

<p>
  OneView automatically processes conversions through <a href="/docs/platform/features/processing/deduplication">deduplication</a> and <a href="/docs/platform/features/processing/merit-based-routing">attribution</a> before sending them to Google Ads.
</p>

<ParamField path="conversion_date_time" type="string" required>
  <strong>Conversion Timestamp</strong> - The date and time when the conversion occurred.

  <Check>
    OneView automatically converts timestamps using DST-aware conversion to the timezone of your Google Ads account for accurate cross-dashboard reporting comparisons.
  </Check>

  <Info>
    <strong>Format:</strong> <code>yyyy-mm-dd HH:mm:ss+|-HH:mm</code><br />
    <strong>Example:</strong> <code>2022-01-01 19:32:45-05:00</code>
  </Info>
</ParamField>

<ParamField path="transaction_id" type="string">
  <strong>Transaction ID</strong> - Unique identifier for idempotency and deduplication.

  <Check>
    OneView automatically uses the <code>Idempotency-Key</code> of your event as the Event ID, or, if absent, generates a <Tooltip tip="The same payload will always generate the same Event ID.">deterministic</Tooltip> one based on the event payload.
  </Check>

  <Info>
    Google Ads uses different identifiers to handle idempotency. Depending on the type of <strong>Conversion Action</strong>, OneView automatically chooses between:

    <ul>
      <li>the <strong>Transaction ID</strong> (in the context of Online Conversions)</li>
      <li>the <strong>Order ID</strong> (in the context of Offline Conversions)</li>
      <li>the <code>timestamp</code> - <code>gclid</code> pair whenever an ID is not accepted by Google Ads</li>
    </ul>
  </Info>
</ParamField>

<ParamField path="consent" type="object">
  <strong>Consent Information</strong> - Consent information for the conversion, using the <strong>Google Consent Mode</strong> framework.

  <Check>
    OneView automatically sets consent information using the <strong>Google Consent Mode</strong> framework, with <code>ad\_user\_data</code> and <code>ad\_personalization</code> values to enforce consent compliance.
  </Check>
</ParamField>

<IntegrationProcessing platformName="Google Ads" />

## Google Ads-Specific Details

### User Identifiers

<Info>
  Google Ads supports a maximum of **five identifiers** per conversion. OneView automatically includes email and phone number when available from your [Identity Graph](/docs/platform/features/processing/identity-resolution).
</Info>

## Enhanced Conversions

OneView can automatically send **Enhanced Conversions** to Google Ads, along with regular conversions for better matching. You can disable this feature under "**Settings**" → "**Accounts**" → "**Google Ads**" → "**PII Handling**" → "**None**".

<Tabs>
  <Tab title="Enhanced Conversions for Leads">
    <Note>
      **Enhanced Conversions for Leads** requires you to preemptively send lead data (i.e. *email*, *phone number*) from your website contact forms using the [**Google Ads User-Provided Data Event**](https://support.google.com/google-ads/answer/11347292) tag on Google Tag Manager (Web Container).

      **OneView** will then upload the complete `ClickConversion` to **Google Ads API** at conversion time.
    </Note>

    [Enhanced Conversions for Leads](https://support.google.com/google-ads/answer/15713840) are sent for Conversion Actions whose type is **Offline**.

    To use Enhanced Conversions for Leads, you need to:

    * Enable User-Provided Data in your Google Tag.

    <AccordionGroup>
      <Accordion title="Q: How do I fix the No user-provided data matches alert?">
        <Info>
          **Understanding the alert**: This alert appears when Google Ads receives Enhanced Conversions for Leads but cannot match the hashed user data to any known users in their system. This typically happens when:

          * The frontend Lead Form isn't sending Enhanced Conversion data to Google Ads
          * The two-step process required by Google Ads isn't being followed correctly
        </Info>

        You need to set up a **Lead Form** capturing customer data on your website. [How to](https://support.google.com/google-ads/answer/11347292). If you already have a **Lead Form**, make sure you are capturing the same data as the **Conversion Action**.

        **How Google Ads processes Enhanced Conversions for Leads:**

        Google Ads uses a two-step process for Enhanced Conversions for Leads:

        1. **Frontend submission**: When a user submits a lead form, the Google Ads tag (gtag.js or Google Tag Manager) must send the Enhanced Conversion data (email, phone) to Google Ads from the frontend
        2. **Backend confirmation**: Later, when the conversion is complete, OneView sends the conversion event with the same user data to "confirm" the conversion

        <Warning>
          If step 1 is missing, Google Ads cannot match the user data in step 2, even though the conversion is still tracked correctly via `gclid`. This is why conversions appear in your reports but trigger the "No user-provided data matches" alert.
        </Warning>

        **Solution:**

        Implement Google Ads Enhanced Conversions on your frontend lead forms using one of these methods:

        * [Google Tag Manager](https://support.google.com/tagmanager/answer/10005469)

        <Note>
          Google Tag Manager Server-side containers do not satisfy this requirement. The Enhanced Conversion data must be sent from the client-side (browser) to Google Ads before OneView sends the conversion event.
        </Note>
      </Accordion>

      <Accordion title="Q: How do I fix the Importing limited user-provided data alert?">
        <Info>
          **Why this happens**: Enhanced Conversions for Leads were designed to improve attribution when click identifiers are missing or unreliable (such as offline conversions). When OneView consistently provides a `gclid`, Google Ads doesn't need the Enhanced Conversion data for matching, triggering this alert.
        </Info>

        **Technical context:**

        Similar to Microsoft Ads' behavior with `msclkid`, Google Ads prioritizes click identifiers over user-provided data when both are available. When a `gclid` is present, Google Ads:

        * Matches the conversion directly to the click using the `gclid`
        * Ignores the Enhanced Conversion user data for attribution purposes
        * Generates this alert because the Enhanced Conversion setup appears unnecessary

        **When this alert matters:**

        This is typically a low-priority alert. Your conversions are being tracked correctly via `gclid`. However, Enhanced Conversion data becomes valuable when:

        * Privacy-focused browsers (Safari, Brave) remove click identifiers
        * Users navigate across devices between click and conversion
        * Cookie deletion occurs before conversion

        <Tip>
          **Recommendation**: Keep Enhanced Conversions enabled. As browser privacy features become more prevalent, having Enhanced Conversions configured ensures OneView can still attribute conversions when click identifiers are unavailable.
        </Tip>

        **No action required** unless you want to disable Enhanced Conversions entirely via **Settings** → **Accounts** → **Google Ads** → **PII Handling** → **None**.
      </Accordion>

      <Accordion title="Q: How do I fix the Identifiers or iOS URL parameters are too old alert?">
        <Info>
          **Understanding the alert**: This alert appears when Google Ads receives conversion data with click identifiers that are outside the acceptable time window for attribution.
        </Info>

        **Why this happens:**

        This alert occurs when the <Tooltip tip="The click-through window is the time period which Google Ads accepts conversions after a user clicks on an ad and before they convert. It is typically set to 30, 60, or 90 days.">click-through window</Tooltip> of your Conversion Action has expired. Common scenarios include:

        * **Expired click-through window**: The conversion occurred after your Conversion Action's click-through window
        * **Bookmarked URLs**: Users bookmark or share landing page URLs containing `gclid` parameters, only to convert much later

        **How OneView handles this:**

        OneView automatically marks these conversions as `SKIPPED` when Google Ads rejects them due to expired click-through windows.

        <Check>
          **OneView-created Conversion Actions** always have a click-through window of **90 days**, which is the maximum allowed by Google Ads.
        </Check>

        **What you can do:**

        * **No action required**: OneView handles this automatically by marking conversions as `SKIPPED`, even though the conversion will not appear in Google Ads reporting.
        * **Monitor patterns**: If you see frequently `SKIPPED` conversions, you may simply experience longer customer journeys than Google Ads expects.
        * **Attribution model**: For repeatable conversions, you may want to use a `last_touch` attribution model, which will credit the last touchpoint before the conversion (e.g. a "*Black Friday*" sale), and not the first touchpoint (i.e. whenever the user made their first `purchase` with you).
      </Accordion>
    </AccordionGroup>
  </Tab>

  <Tab title="Enhanced Conversions for Web">
    <Warning>
      OneView does not support Enhanced Conversions for Web, as they are not compliant with [Apple LTP](/docs/platform/guides/sending-events/advanced-setup/intelligent-tracking-prevention) (which removes `gclid` from URLs).
      OneView achieves full LTP compliance by using Offline Conversions API and Enhanced Conversions for Leads, which are compliant with [Apple LTP](/docs/platform/guides/sending-events/advanced-setup/intelligent-tracking-prevention).
    </Warning>

    [Enhanced Conversions for Web](https://support.google.com/google-ads/answer/13261987) are sent for Conversion Actions whose type is **Online**. This is not supported by OneView.
  </Tab>
</Tabs>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Q: How do I populate UTM parameters for my Google Ads campaigns?">
    To automatically populate UTM parameters from your Google Ads campaigns, you need to configure **tracking templates** at the campaign or account level in your Google Ads interface.

    **Recommended Tracking Template**

    ```
    {lpurl}?utm_source=google_ads&utm_medium=cpc&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={keyword}
    ```

    **Parameter Breakdown**

    | UTM Parameter  | Google Ads Variable   | Description                   |
    | -------------- | --------------------- | ----------------------------- |
    | `utm_source`   | `google_ads` (static) | Traffic source                |
    | `utm_medium`   | `cpc` (static)        | Marketing medium              |
    | `utm_campaign` | `{campaignid}`        | Campaign identifier           |
    | `utm_content`  | `{adgroupid}`         | Ad group identifier           |
    | `utm_term`     | `{keyword}`           | Keyword that triggered the ad |

    Learn more: [Google Ads Tracking Template Guide](https://support.google.com/google-ads/answer/10070427?hl=en)
  </Accordion>

  <Accordion title="Q: Why OneView and Google Ads reports do not match?">
    <Tip>
      Google Ads and OneView show the **same data**, but from **different perspectives**:

      * **Google Ads** reports conversions based on the timestamp of the **ad click**. So "yesterday's" reported conversions are those where the ad was **clicked** yesterday.
      * **OneView** reports conversions based on the timestamp of the **conversion event itself**. So "yesterday's" reported conversions are those that **happened** yesterday.

      Also, if you operate in multiple regions, make sure you use the same **timezone**:

      * OneView uses **UTC**, but reports use the **timezone** you choose
      * Google Ads uses **UTC**, but reports use your **ad account timezone**
    </Tip>

    If the above doesn't resolve your issue, consider these common delays in Google Ads reporting:

    * **Recent conversions (\< 15 hours ago)** Most conversion statistics appear in Google Ads within 3 hours. However, OneView uses Google Ads' most accurate `EXTERNAL` attribution model, which can sometimes be delayed by up to 15 hours in reporting.
    * **Campaigns not using `gclid`** When your campaigns use `gbraid` or `wbraid` tracking, Google Ads can take up to 72 hours (3 days) to process conversions, regardless of your attribution model.
    * **New conversion actions** After creating a new conversion action, you need to wait 4-6 hours before Google Ads can accept conversions for it.

    If you're still experiencing issues, these Google Ads limitations might be the cause:

    * **Conversions outside the lookback window** Google Ads only accepts conversions within its lookback window of up to **90 days**. Conversions outside this window are rejected and won't appear in Google Ads reporting (they'll show as `SKIPPED` in OneView Conversion API logs). OneView has an unlimited lookback window, so it can attribute all conversions as long as data is retained.

    * **Missing click identifiers** In rare cases, privacy-focused browsers remove Google's click identifiers altogether (`gclid`, `gbraid`, `wbraid`). Without these, Google Ads cannot accept the conversion. OneView can still recover this traffic if you've configured partner-specific `utm_source` parameters.

    Learn more: [https://support.google.com/google-ads/answer/13321563](https://support.google.com/google-ads/answer/13321563)
  </Accordion>

  <RevokeAccessFAQ platformName="Google Ads" oauthDashboardUrl="https://myaccount.google.com/connections" autoRevoke={true} />
</AccordionGroup>
