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.
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 fieldsx_ads_accountsAd Performance
Daily ad performance by placement — impressions, clicks, spend, engagements, and social actions.
20 fieldsTime seriesx_ads_statsAd Performance by Country
Daily ad performance broken down by country — impressions, clicks, spend, engagements, and social actions.
21 fieldsTime seriesx_ads_stats_by_countryAll Cards
All card types with full creative details — type, title, destination URL, call to action, and media.
28 fieldsx_ads_cards_allCampaigns
Your campaigns — status, budget optimization, daily and total budget, and currency.
19 fieldsx_ads_campaignsCards
Website and app cards — type, URI, and components.
8 fieldsx_ads_cardsLine Items
Line items within campaigns — bid strategy, goal, product type, budget, and schedule.
33 fieldsx_ads_line_itemsPromoted Tweets
Tweets promoted as ads — status, approval, and links to their tweets and line items.
8 fieldsx_ads_promoted_tweetsTargeting Locations
Reference table of location IDs with names and country codes — join targeting_value with the country field in Ad Performance by Country.
4 fieldsx_ads_targeting_locationsTweets
Original tweets used as ad creatives — text, type, language, engagement counts, and card URI.
34 fieldsx_ads_tweets
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). |
Data Partner You Can Trust
users
175K
Executives and data analysts across 20+ industries
G2 rating
4.9★
“A trusted data analytics partner” — verified review
Customers
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

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

Step 3: Select API Endpoint & 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

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

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

Every claim has a receipt.
Real things real customers said — each quote pinned to a specific claim, straight from the quotes database.
“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.”
“We had six or seven different channels and no single source of truth — it was almost impossible, a lot of guesswork.”
“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

