> For the complete documentation index, see [llms.txt](https://docs.omnata.com/omnata-product-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.omnata.com/omnata-product-documentation/omnata-sync-for-snowflake/apps/google_ads.md).

# Google Ads

## Prerequisites

Connecting to the Google Ads API requires:

1. Obtain a Google Ads Developer token
2. A Google Cloud project with the Google Ads API enabled
3. Create or use a Google Cloud OAuth App

#### Obtaining a Google Ads Developer Token

Follow the [Google documentation](https://developers.google.com/google-ads/api/docs/get-started/dev-token) which takes you through two steps:

1. Select or create a **Google Ads Manager** account
2. Apply for access to the Google Ads API\
   A newly-issued token starts on **Test Access**, which only permits calls against test accounts. To sync production Google Ads data you need to apply for **Basic Access** — see Developer Token access levels below.

#### Developer Token access levels

Google issues every new Developer Token at **Test Access** by default. The access level determines which Google Ads customer accounts the token can call:

| Access level        | Can sync                                                                                     | When to use                                                                                                                |
| ------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Test Access**     | Only Google Ads **test** accounts (created inside your MCC via **+ Create → Test account**). | Validating the plugin setup before you have production access. Production customers return `DEVELOPER_TOKEN_NOT_APPROVED`. |
| **Basic Access**    | Production Google Ads accounts                                                               | Real-world reporting. Apply for this before you go live.                                                                   |
| **Standard Access** | Production accounts with higher API quotas                                                   | Only needed if you're hitting Basic Access's quota ceiling.                                                                |

**To apply for Basic Access:** sign in to your **manager account** in Google Ads → **Admin → API Center** → find the **Access Level** section → click **Apply for Basic Access** and fill out Google's application form (tool name, intended use, estimated daily request volume, contact email). Google typically responds within 1 – 3 business days.

{% hint style="info" %}
Google collects information about how you will use the developer token. Since Omnata is a native app that runs inside your Snowflake account, you should apply for the token as if **you are developing the app** and its use will be **Internal only.** From the perspective of Google, API calls from the Omnata Native App appears from Snowflake which is your environment. If you designate Omnata as a third party app developer, Google assumes that API calls will originate from Omnata infrastructure which requires a different token process.&#x20;
{% endhint %}

#### Enable the Google Ads API

You can see if your access is complete by searching 'Google Ads API' in the Google Cloud universal search bar

<figure><img src="/files/1Y2733MW9b3IHvqwNi1q" alt=""><figcaption></figcaption></figure>

## Authentication methods

The plugin uses a single connection method: **OAuth (User Created)**. You bring your own Google Cloud OAuth client, which gives you full control over consent screens, scope grants, and credential rotation.

The flow has four steps: enable the API, configure the consent screen, create the OAuth client, and then connect Omnata.

#### Step 1: Enable the Google Ads API

In Google Cloud Console → **APIs & Services → Library** → search **Google Ads API** → click **Enable**. Skip this step if it's already enabled.

#### Step 2: Configure the OAuth consent screen

1. Go to **APIs & Services → OAuth consent screen** (sometimes labelled **Audience** on the newer Cloud console UI).
2. Choose a **User type → Internal**\
   This means that only users from your Google workspace can authorise the connection. External types mean any Google account holder which is used for third party access.&#x20;
3. Add the Google Ads scope. Click **Add or Remove Scopes** under the **Scopes** section, paste `https://www.googleapis.com/auth/adwords` into the filter, tick it (it'll show as **Google Ads API**), and **Update**.

{% hint style="warning" %}
If you edit the consent screen (adding scopes, changing the user type, etc.) **after** Omnata has already authorised a connection, the existing refresh token is immediately invalidated. You'll need to re-authorise the Omnata connection to mint a fresh token.
{% endhint %}

#### Step 3: Create an OAuth client in Google Cloud

1. Go to **APIs & Services → Credentials** → click **Create Credentials** → **OAuth Client ID**.
2. Choose **Web Application** as the application type.
3. Leave **Authorized JavaScript origins** blank — Omnata uses a server-side OAuth flow, so this field doesn't apply.
4. Add a redirect URI under **Authorized redirect URIs**. This is provided to you in the Omnata UI, Connectivity step. &#x20;

<figure><img src="/files/YEtadaFdFUZtKH38iIwR" alt=""><figcaption><p>Copy these values and store them in a password manager</p></figcaption></figure>

#### Step 4: Create the connection in Omnata

In the Omnata App, create a new Google Ads connection and select the **OAuth** method. The connection form requires the following:

| Field           | Value                                                                                                               |
| --------------- | ------------------------------------------------------------------------------------------------------------------- |
| Developer Token | The Developer Token from your Google Ads manager account (**Admin → API Center**). Stored as a secret in Snowflake. |
| Client ID       | The OAuth Client ID generated in Step 3 (Google Cloud Console → APIs & Services → Credentials).                     |
| Client Secret   | The OAuth Client Secret paired with the Client ID above. Stored as a secret in Snowflake.                           |

After submitting, you'll be redirected to Google to complete the OAuth authorisation flow. Sign in with a Google account that has access to the Google Ads customer(s) you intend to sync.

On save, the plugin connects to `googleads.googleapis.com` using the issued OAuth token + your Developer Token and confirms the credentials work.

## Inbound Syncs

Omnata fetches campaign performance metrics.&#x20;

Each inbound sync is scoped to a single Google Ads **customer** (account). The configuration form has one required field. To sync from more than one customer, create one Omnata sync per customer on the same connection.

#### Streams

The plugin exposes a single stream that combines campaign attributes, daily metrics, and segments into one row per campaign per day. This shape is intentionally denormalised for analytics, since the most common use case for Google Ads data in Snowflake is daily performance reporting.

<table><thead><tr><th>Stream</th><th>Notes</th><th data-hidden>Sync strategies</th><th data-hidden>Primary key</th><th data-hidden>Cursor</th></tr></thead><tbody><tr><td><code>report_campaign</code></td><td>One row per campaign per day. Top-level fields: <code>id</code>, <code>campaign</code> (campaign attributes), <code>metrics</code> (all supported daily metrics), <code>segments</code> (currently <code>segments.date</code>).</td><td>Full Refresh, Incremental</td><td><code>id</code> (constructed as <code>&#x3C;campaign_id>_&#x3C;YYYY-MM-DD></code>)</td><td><code>segments.date</code></td></tr></tbody></table>

#### What's inside a row

* **`campaign`** — campaign attributes for the campaign that the row's metrics belong to (campaign ID, name, status, type, channel, dates, etc.).
* **`metrics`** — every daily metric the Google Ads API supports for `campaign`, except those that are incompatible with the `segments.date` segmentation. Metric names are returned in camelCase (e.g. `metrics.absoluteTopImpressionPercentage`).
* **`segments`** — the segmentation that produced this row. Currently always `segments.date` (one row per date), which is what gives the stream its daily granularity.

#### Supported Sync Strategies

* Incremental
* Full-refresh

## Outbound Syncs

Not yet supported


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.omnata.com/omnata-product-documentation/omnata-sync-for-snowflake/apps/google_ads.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
