---
title: Microsoft Ads
description: Connect Microsoft Ads, understand its sync behavior, and query every table and column it writes.
species: reference
---
# Microsoft Ads

Connect Microsoft Ads with OAuth, your app credentials, a developer token, and an account id. The source writes 6 fixed tables under `titan.microsoft_ads`.
```sql
select
  id,
  account_id,
  name
from titan.microsoft_ads.campaigns
limit 10
```

## Connect Microsoft Ads

1. Open **Apps**, choose **Connect app**, and select **Microsoft Ads**.
2. Enter OAuth, your app credentials, a developer token, and an account id.
3. Review the tables, then save the source.
4. Watch **Sync history** until the first run completes.

Credentials are stored as secrets. They never become lake columns or appear in query results.

## Sync behavior

Entity tables and performance reports use the account chosen during setup.

A new source syncs when you connect it and then follows its schedule. The default recurring interval is 4 hours. An interrupted run keeps its completed progress and retries safely.

Every lake table also has the [system columns](/v2/docs/concepts/your-lake#the-system-columns) `_synced_at` and `_deleted`; the column reference below lists source columns only.

## Table reference

### `campaigns`

`titan.microsoft_ads.campaigns` has 8 source columns.

```columns table=microsoft_ads.campaigns
id                                      string pk           Source field `id`.
account_id                              string              Source field `accountId`.
name                                    string              Source field `name`.
status                                  string              Source field `status`.
budget_type                             string              Source field `budgetType`.
daily_budget                            float               Source field `dailyBudget`.
start_date                              string              Source field `startDate`.
end_date                                string              Source field `endDate`.
```

### `ad_groups`

`titan.microsoft_ads.ad_groups` has 7 source columns.

```columns table=microsoft_ads.ad_groups
id                                      string pk           Source field `id`.
campaign_id                             string              Source field `campaignId`.
name                                    string              Source field `name`.
status                                  string              Source field `status`.
cpc_bid                                 float               Source field `cpcBid`.
start_date                              string              Source field `startDate`.
end_date                                string              Source field `endDate`.
```

### `ads`

`titan.microsoft_ads.ads` has 7 source columns.

```columns table=microsoft_ads.ads
id                                      string pk           Source field `id`.
ad_group_id                             string              Source field `adGroupId`.
type                                    string              Source field `type`.
title                                   string              Source field `title`.
description                             string              Source field `description`.
status                                  string              Source field `status`.
final_urls                              json                Source field `finalUrls`.
```

### `campaign_performance`

`titan.microsoft_ads.campaign_performance` has 8 source columns.

```columns table=microsoft_ads.campaign_performance
campaign_id                             string pk           Source field `campaignId`.
time_period                             date pk             Source field `timePeriod`.
impressions                             integer             Source field `impressions`.
clicks                                  integer             Source field `clicks`.
spend                                   float               Source field `spend`.
average_cpc                             float               Source field `averageCpc`.
ctr                                     float               Source field `ctr`.
conversions                             integer             Source field `conversions`.
```

### `ad_group_performance`

`titan.microsoft_ads.ad_group_performance` has 8 source columns.

```columns table=microsoft_ads.ad_group_performance
ad_group_id                             string pk           Source field `adGroupId`.
time_period                             date pk             Source field `timePeriod`.
impressions                             integer             Source field `impressions`.
clicks                                  integer             Source field `clicks`.
spend                                   float               Source field `spend`.
average_cpc                             float               Source field `averageCpc`.
ctr                                     float               Source field `ctr`.
conversions                             integer             Source field `conversions`.
```

### `keyword_performance`

`titan.microsoft_ads.keyword_performance` has 9 source columns.

```columns table=microsoft_ads.keyword_performance
keyword_id                              string pk           Source field `keywordId`.
time_period                             date pk             Source field `timePeriod`.
keyword_text                            string              Source field `keywordText`.
ad_group_id                             string              Source field `adGroupId`.
impressions                             integer             Source field `impressions`.
clicks                                  integer             Source field `clicks`.
spend                                   float               Source field `spend`.
average_cpc                             float               Source field `averageCpc`.
quality_score                           integer             Source field `qualityScore`.
```

## Deletes and history

Rows are merged by their source key. When the source can prove that a row was deleted, Supernova keeps the row and sets `_deleted` so queries can choose whether to include history. Filter current-state queries with `where not _deleted`.
