---
title: "Twitter Ads to Google Sheets Connector | OWOX"
canonical: "https://www.owox.com/connectors/free-x-ads-connector-to-google-sheets"
updated: "2026-09-21"
---

# Connect Twitter Ads Data to Google Sheets

Use Google Sheets as a reporting destination for Twitter Ads data collected with OWOX Data Marts. Collect X Ads Data into any data warehouse, then reuse it in Sheets (or Looker Studio) for reporting. Or enable AI Insights and deliver ads performance & alerts into chat tools or by email.

[Get Started Free](https://www.owox.com/app-signup)

## Endpoints

## X Ads endpoints

10 X Ads endpoints you can import. Each lands in its own table in your warehouse.

*   ### Accounts

    Advertising accounts — name, business, country, timezone, and approval status.

    12 fields`x_ads_accounts`
*   ### Ad Performance

    Daily ad performance by placement — impressions, clicks, spend, engagements, and social actions.

    20 fieldsTime series`x_ads_stats`
*   ### Ad Performance by Country

    Daily ad performance broken down by country — impressions, clicks, spend, engagements, and social actions.

    21 fieldsTime series`x_ads_stats_by_country`
*   ### All Cards

    All card types with full creative details — type, title, destination URL, call to action, and media.

    28 fields`x_ads_cards_all`
*   ### Campaigns

    Your campaigns — status, budget optimization, daily and total budget, and currency.

    19 fields`x_ads_campaigns`
*   ### Cards

    Website and app cards — type, URI, and components.

    8 fields`x_ads_cards`
*   ### Line Items

    Line items within campaigns — bid strategy, goal, product type, budget, and schedule.

    33 fields`x_ads_line_items`
*   ### Promoted Tweets

    Tweets promoted as ads — status, approval, and links to their tweets and line items.

    8 fields`x_ads_promoted_tweets`
*   ### Targeting Locations

    Reference table of location IDs with names and country codes — join targeting\_value with the country field in Ad Performance by Country.

    4 fields`x_ads_targeting_locations`
*   ### Tweets

    Original tweets used as ad creatives — text, type, language, engagement counts, and card URI.

    34 fields`x_ads_tweets`

## Data schema

## X Ads data schema

**Accounts** 12 fields · x\_ads\_accounts

| Field | Type | Description |
| --- | --- | --- |
| `name` | STRING | The name of the account |
| `business_name` | STRING | The business name associated with the account |
| `timezone` | STRING | The timezone of the account |
| `timezone_switch_at` | DATETIME | When the timezone was last switched |
| `country_code` | STRING | The country code of the account (e.g. SI) |
| `id` | STRING | The unique identifier for the account |
| `created_at` | DATETIME | When the account was created |
| `updated_at` | DATETIME | When the account was last updated |
| `industry_type` | STRING | The industry type of the account |
| `business_id` | STRING | The business identifier associated with the account |
| `approval_status` | STRING | The approval status of the account (e.g. ACCEPTED) |
| `deleted` | BOOLEAN | Whether the account is deleted |

**Ad Performance** 20 fields · x\_ads\_stats

| Field | Type | Description |
| --- | --- | --- |
| `id` | STRING | The unique identifier for the stats record. |
| `date` | STRING | The date for which the statistics were collected. |
| `placement` | STRING | The placement type (ALL\_ON\_TWITTER or PUBLISHER\_NETWORK). |
| `impressions` | INTEGER | Number of impressions. |
| `tweets_send` | INTEGER | Number of tweets sent. |
| `billed_charge_local_micro` | INTEGER | Billed amount in micros. |
| `qualified_impressions` | INTEGER | Number of qualified impressions. |
| `follows` | INTEGER | Number of follows. |
| `app_clicks` | INTEGER | Number of app clicks. |
| `retweets` | INTEGER | Number of retweets. |
| `unfollows` | INTEGER | Number of unfollows. |
| `likes` | INTEGER | Number of likes. |
| `engagements` | INTEGER | Number of engagements. |
| `clicks` | INTEGER | Number of clicks. |
| `card_engagements` | INTEGER | Number of card engagements. |
| `poll_card_vote` | INTEGER | Number of poll card votes. |
| `replies` | INTEGER | Number of replies. |
| `url_clicks` | INTEGER | Number of URL clicks. |
| `billed_engagements` | INTEGER | Number of billed engagements. |
| `carousel_swipes` | INTEGER | Number of carousel swipes. |

**Ad Performance by Country** 21 fields · x\_ads\_stats\_by\_country

| Field | Type | Description |
| --- | --- | --- |
| `id` | STRING | The unique identifier for the stats record. |
| `date` | STRING | The date for which the statistics were collected. |
| `placement` | STRING | The placement type (ALL\_ON\_TWITTER or PUBLISHER\_NETWORK). |
| `country` | STRING | Location ID from X Ads (hex string, e.g. 96683cc9126741d1). Join with the targeting\_locations node to get the human-readable name and country code. |
| `impressions` | INTEGER | Number of impressions. |
| `tweets_send` | INTEGER | Number of tweets sent. |
| `billed_charge_local_micro` | INTEGER | Billed amount in micros. |
| `qualified_impressions` | INTEGER | Number of qualified impressions. |
| `follows` | INTEGER | Number of follows. |
| `app_clicks` | INTEGER | Number of app clicks. |
| `retweets` | INTEGER | Number of retweets. |
| `unfollows` | INTEGER | Number of unfollows. |
| `likes` | INTEGER | Number of likes. |
| `engagements` | INTEGER | Number of engagements. |
| `clicks` | INTEGER | Number of clicks. |
| `card_engagements` | INTEGER | Number of card engagements. |
| `poll_card_vote` | INTEGER | Number of poll card votes. |
| `replies` | INTEGER | Number of replies. |
| `url_clicks` | INTEGER | Number of URL clicks. |
| `billed_engagements` | INTEGER | Number of billed engagements. |
| `carousel_swipes` | INTEGER | Number of carousel swipes. |

**All Cards** 28 fields · x\_ads\_cards\_all

| Field | Type | Description |
| --- | --- | --- |
| `id` | STRING | The unique identifier for the card |
| `name` | STRING | The name of the card |
| `card_type` | STRING | Type of the card (e.g. IMAGE\_APP\_DOWNLOAD, VIDEO\_WEBSITE) |
| `card_uri` | STRING | URI of the card |
| `created_at` | DATETIME | ISO-8601 timestamp when the card was created |
| `updated_at` | DATETIME | ISO-8601 timestamp when the card was last updated |
| `deleted` | BOOLEAN | Whether the card is deleted |
| `googleplay_app_id` | STRING | Google Play application ID |
| `country_code` | STRING | Country code associated with the app or destination |
| `wide_app_image` | STRING | URL to the wide-aspect-ratio image used by the app card |
| `image_display_width` | STRING | Width (in pixels) of the primary image displayed with the card |
| `image_display_height` | STRING | Height (in pixels) of the primary image displayed with the card |
| `app_cta` | STRING | Call-to-action used on the app card (e.g. INSTALL, OPEN) |
| `title` | STRING | Title shown on the card |
| `website_url` | STRING | Canonical website URL |
| `website_dest_url` | STRING | Destination URL used for clicks |
| `website_display_url` | STRING | Display URL shown on the card |
| `website_shortened_url` | STRING | Shortened (t.co) URL placed in the card |
| `video_url` | STRING | URL of the video file or VMAP |
| `video_hls_url` | STRING | HLS streaming URL |
| `video_poster_url` | STRING | Poster image displayed before video playback |
| `video_content_id` | STRING | Internal content identifier of the video |
| `video_owner_id` | STRING | User ID of the video owner |
| `content_duration_seconds` | STRING | Video duration in seconds |
| `video_width` | STRING | Original width of the video |
| `video_height` | STRING | Original height of the video |
| `video_poster_width` | STRING | Width of the video poster image |
| `video_poster_height` | STRING | Height of the video poster image |

**Campaigns** 19 fields · x\_ads\_campaigns

| Field | Type | Description |
| --- | --- | --- |
| `name` | STRING | The name of the campaign |
| `budget_optimization` | STRING | Budget optimization strategy (e.g. LINE\_ITEM) |
| `reasons_not_servable` | ARRAY | Reasons why the campaign is not servable |
| `servable` | BOOLEAN | Whether the campaign is servable |
| `purchase_order_number` | STRING | Purchase order number |
| `effective_status` | STRING | Effective status of the campaign (e.g. PAUSED) |
| `daily_budget_amount_local_micro` | INTEGER | Daily budget amount in micros (nullable) |
| `funding_instrument_id` | STRING | ID of the funding instrument |
| `duration_in_days` | INTEGER | Duration of the campaign in days (nullable) |
| `standard_delivery` | BOOLEAN | Whether standard delivery is enabled (nullable) |
| `total_budget_amount_local_micro` | INTEGER | Total budget amount in micros (nullable) |
| `id` | STRING | The unique identifier for the campaign |
| `entity_status` | STRING | Entity status of the campaign |
| `frequency_cap` | INTEGER | Frequency cap (nullable) |
| `currency` | STRING | Currency code (e.g. USD) |
| `created_at` | DATETIME | Timestamp when the campaign was created |
| `updated_at` | DATETIME | Timestamp when the campaign was last updated |
| `deleted` | BOOLEAN | Whether the campaign is deleted |
| `account_id` | STRING | ID of the account |

**Cards** 8 fields · x\_ads\_cards

| Field | Type | Description |
| --- | --- | --- |
| `id` | STRING | The unique identifier for the card. |
| `name` | STRING | The name of the card. |
| `card_type` | STRING | Type of the card. |
| `card_uri` | STRING | URI of the card. |
| `created_at` | DATETIME | When the card was created. |
| `updated_at` | DATETIME | When the card was last updated. |
| `deleted` | BOOLEAN | Whether the card is deleted. |
| `components` | ARRAY | Card components including media and buttons. |

**Line Items** 33 fields · x\_ads\_line\_items

| Field | Type | Description |
| --- | --- | --- |
| `advertiser_user_id` | STRING | ID of the advertiser user |
| `name` | STRING | Name of the line item |
| `placements` | ARRAY | List of placement targets (e.g. ALL\_ON\_TWITTER) |
| `start_time` | DATETIME | Line item start time |
| `bid_amount_local_micro` | INTEGER | Bid amount in micro-currency units |
| `advertiser_domain` | STRING | Domain of the advertiser |
| `target_cpa_local_micro` | INTEGER | Target CPA (cost per action) in micro-currency units |
| `primary_web_event_tag` | STRING | Primary web event tag identifier |
| `goal` | STRING | Line item goal/objective (e.g. APP\_INSTALLS) |
| `daily_budget_amount_local_micro` | INTEGER | Daily budget in micro-currency units |
| `product_type` | STRING | Product type (e.g. PROMOTED\_TWEETS) |
| `end_time` | DATETIME | Line item end time (nullable) |
| `funding_instrument_id` | STRING | ID of the funding instrument |
| `bid_strategy` | STRING | Bidding strategy (e.g. AUTO) |
| `duration_in_days` | INTEGER | Duration in days (nullable) |
| `standard_delivery` | BOOLEAN | Whether standard delivery is enabled |
| `total_budget_amount_local_micro` | INTEGER | Total budget in micro-currency units (nullable) |
| `objective` | STRING | Campaign objective (duplicate of goal in some APIs) |
| `id` | STRING | Unique identifier of the line item |
| `entity_status` | STRING | Status of the line item (e.g. ACTIVE, PAUSED) |
| `automatic_tweet_promotion` | BOOLEAN | Whether automatic tweet promotion is enabled |
| `frequency_cap` | INTEGER | Frequency cap for ad serving |
| `android_app_store_identifier` | STRING | Android app store identifier |
| `categories` | ARRAY | Array of category labels |
| `currency` | STRING | Currency code (e.g. USD) |
| `pay_by` | STRING | Payment method (e.g. IMPRESSION) |
| `created_at` | DATETIME | Timestamp when the line item was created |
| `ios_app_store_identifier` | STRING | iOS app store identifier |
| `updated_at` | DATETIME | Timestamp when the line item was last updated |
| `campaign_id` | STRING | ID of the parent campaign |
| `creative_source` | STRING | Source of the creative (e.g. MANUAL) |
| `audience_expansion` | STRING | Audience expansion setting (e.g. EXPANDED) |
| `deleted` | BOOLEAN | Whether the line item is marked as deleted |

**Promoted Tweets** 8 fields · x\_ads\_promoted\_tweets

| Field | Type | Description |
| --- | --- | --- |
| `line_item_id` | STRING | ID of the parent line item |
| `id` | STRING | Unique identifier for the promoted tweet |
| `entity_status` | STRING | Status of the promoted tweet (e.g., ACTIVE, PAUSED) |
| `created_at` | DATETIME | Timestamp when the promoted tweet was created |
| `updated_at` | DATETIME | Timestamp when the promoted tweet was last updated |
| `approval_status` | STRING | Approval status of the promoted tweet (e.g., ACCEPTED, REJECTED) |
| `tweet_id` | STRING | ID of the original tweet |
| `deleted` | BOOLEAN | Flag indicating whether the promoted tweet has been deleted |

**Targeting Locations** 4 fields · x\_ads\_targeting\_locations

| Field | Type | Description |
| --- | --- | --- |
| `targeting_value` | STRING | Unique hex ID for this location (e.g. 96683cc9126741d1). Use this to join with the country field in stats\_by\_country. |
| `name` | STRING | Human-readable location name (e.g. United States, California). |
| `location_type` | STRING | Type of location: COUNTRIES, REGIONS, CITIES, METROS, or POSTAL\_CODES. |
| `country_code` | STRING | ISO 2-letter country code (e.g. US, DE, NL). |

**Tweets** 34 fields · x\_ads\_tweets

| Field | Type | Description |
| --- | --- | --- |
| `coordinates` | OBJECT | The geographic coordinates (latitude/longitude) of the tweet, if available. |
| `retweeted` | BOOLEAN | Whether this tweet is a retweet of another tweet. |
| `name` | STRING | A custom name or label for the tweet. |
| `conversation_settings` | STRING | Who can reply or interact with the tweet (e.g. EVERYONE). |
| `source` | STRING | HTML markup indicating the client or interface used to post the tweet. |
| `entities` | OBJECT | Parsed entities in the tweet (mentions, hashtags, URLs, media, etc.). |
| `display_text_range` | ARRAY | Start/end indices for which portion of the tweet text to display. |
| `favorite_count` | INTEGER | Number of times the tweet has been liked. |
| `in_reply_to_status_id_str` | STRING | ID (as string) of the tweet this one is replying to. |
| `geo` | OBJECT | Deprecated geographic information, if present. |
| `id_str` | STRING | The tweet’s unique identifier, as a string. |
| `scopes` | OBJECT | Visibility scopes (e.g. { followers: false }). |
| `in_reply_to_user_id` | INTEGER | Numeric ID of the user this tweet is replying to. |
| `truncated` | BOOLEAN | Whether the tweet text has been truncated. |
| `retweet_count` | INTEGER | Number of times this tweet has been retweeted. |
| `scheduled_status` | STRING | Scheduled status (e.g. pending scheduling), if any. |
| `id` | INTEGER | The tweet’s unique identifier, as a number. |
| `in_reply_to_status_id` | INTEGER | Numeric ID of the tweet this one is replying to. |
| `possibly_sensitive` | BOOLEAN | Whether the tweet may contain sensitive content. |
| `nullcast` | BOOLEAN | Whether the tweet is nullcast (not shown on timeline). |
| `created_at` | STRING | Creation timestamp of the tweet. |
| `place` | OBJECT | Place (location) associated with the tweet, if any. |
| `scheduled_at` | STRING | When the tweet was scheduled for posting. |
| `tweet_type` | STRING | Type of tweet (e.g. PUBLISHED). |
| `favorited` | BOOLEAN | Whether the authenticated user has liked the tweet. |
| `card_uri` | STRING | URI of the associated Twitter Card. |
| `full_text` | STRING | The full text content of the tweet. |
| `lang` | STRING | Language code of the tweet (e.g. en). |
| `contributors` | ARRAY | Array of contributors to the tweet, if any. |
| `in_reply_to_screen_name` | STRING | Screen name of the user this tweet is replying to. |
| `in_reply_to_user_id_str` | STRING | ID (as string) of the user this tweet is replying to. |
| `user` | OBJECT | The user object of the author (contains id, id\_str, etc.). |
| `tweet_id` | STRING | Duplicate of id\_str (the tweet’s ID as a string). |
| `extended_entities` | OBJECT | Extended media entities (e.g. video variants, additional media info). |

## S01 · Step 1

## Step 1: Select a Data Storage

All data should have its home. Start by connecting a data storage where your X Ads data will be stored & processed.

*   Choose a supported data warehouse such as BigQuery, Snowflake or Redshift.
*   Store raw X Ads data in one central place so you can blend them later on with other ads data or with conversions data from GA4
*   Keep full ownership and control over your data

[Connect Data Warehouse](https://www.owox.com/app-signup)

![Step 1: Select a Data Storage](https://cdn.owox.ai/www/portfolio-management-connectors/free-x-ads-connector-to-google-sheets/body/1.png/public)

## S02 · Step 2

## Step 2: Create X Ads Data Mart

Click on + New Data Mart, choose Connector as the definition type.

*   Select X Ads as the data source
*   Specify the Advertiser ID that you want to collect data from
*   Authorize access to your X Ads account

[Create Data Mart](https://www.owox.com/app-signup)

![Step 2: Create X Ads Data Mart](https://cdn.owox.ai/www/portfolio-management-connectors/free-x-ads-connector-to-google-sheets/body/2.png/public)

## S03 · Step 3

## Step 3: Select API Endpoint &amp; Fields

Choose exactly which X Ads data should be collected.

*   Select the appropriate API endpoint (for example, statistics)
*   Choose metrics such as clicks, impressions, spend, engagements, video views, etc.
*   Define the dataset and table where data will be stored

[Collect X Ads Data](https://www.owox.com/app-signup)

![Step 3: Select API Endpoint & Fields](https://cdn.owox.ai/www/portfolio-management-connectors/free-x-ads-connector-to-google-sheets/body/3.png/public)

## S04 · Step 4

## Step 4: Create X Ads Report in Google Sheets

Now it’s time to enable your X Ads data in Google Sheets.

*   Add Google Sheets as a Destination
*   Create a new Google Sheets Document, share it, then Create & Run your report
*   Check the box for regular updates to keep data fresh

[Enable X Ads Data](https://www.owox.com/app-signup)

![Step 4: Create X Ads Report in Google Sheets](https://cdn.owox.ai/www/portfolio-management-connectors/free-x-ads-connector-to-google-sheets/body/4.png/public)

## S05 · Step 5

## Step 5: Get more from your X Ads Data

Your X Ads data is now available for analysis in Google Sheets. But why stop at just this? You can reuse the same X Ads Data Mart to:

*   Enable X Ads AI Insights delivered on a schedule to Slack, MS Teams or by Email
*   Visualize X Ads Data in Looker Studio. Just tick the box on the destinations tab
*   Blend X Ads data with GA4, CRM, or other ad platforms

[Schedule X Ads Insights](https://www.owox.com/app-signup)

![Step 5: Get more from your X Ads Data](https://cdn.owox.ai/www/portfolio-management-connectors/free-x-ads-connector-to-google-sheets/body/5.png/public)

## Related connectors

[Athena Connector to Google Sheets Reporting System](/connectors/aws-athena-connector-to-google-sheets)

[Azure Synapse Connector to Google Sheets](/connectors/azure-synapse-connector-to-google-sheets)

[Bank of Canada Connector to Google Sheets](/connectors/bank-of-canada-connector-to-google-sheets)

## What users are saying

## Every claim has a receipt.

Real things real customers said — each quote pinned to a specific claim, straight from the quotes database.

A3re: trusting AI

![Nodari Rizun](https://cdn.owox.ai/www/webflow/6a7b298b2ca5055443187566_nodari-headshot.png/public)Nodari RizunFounder & CEO, Pürblack®

> _“AI, by the nature of the models, will hallucinate. And because of that, you need something which will create guardrails to ensure that there are no hallucinations, that you can trust your data.”_

C9re: one source of truth

![Mark Simmons](https://cdn.owox.ai/www/webflow/6a7b298b2b9daab0ade631d7_mark-headshot.png/public)Mark SimmonsCMO, Pürblack®

> _“We had six or seven different channels and no single source of truth — it was almost impossible, a lot of guesswork.”_

E7re: getting time back

![Nodari Rizun](https://cdn.owox.ai/www/webflow/6a7b298b2ca5055443187566_nodari-headshot.png/public)Nodari RizunFounder & CEO, Pürblack®

> _“We regained time. And time is the one resource that never comes back.”_

## Turn Twitter Ads Data into Actionable AI Insights

See how OWOX Data Marts helps you analyze Twitter Ads data in Google Sheets, blend it with other sources, and scale reporting without rebuilding logic.

[Get Started Free](https://www.owox.com/app-signup)

## References

Pages this page links to, on this site and on docs.owox.com. Where the page has a Markdown twin, its address follows the link.

- [Get Started Free](https://www.owox.com/app-signup)
- [Athena Connector to Google Sheets Reporting System](https://www.owox.com/connectors/aws-athena-connector-to-google-sheets) — /connectors/aws-athena-connector-to-google-sheets.md
- [Azure Synapse Connector to Google Sheets](https://www.owox.com/connectors/azure-synapse-connector-to-google-sheets) — /connectors/azure-synapse-connector-to-google-sheets.md
- [Bank of Canada Connector to Google Sheets](https://www.owox.com/connectors/bank-of-canada-connector-to-google-sheets) — /connectors/bank-of-canada-connector-to-google-sheets.md
