Join your creative export with your performance data in BigQuery, to see the images and videos from your ads next to their cost, clicks and impressions. You can then use the results in a BI tool, such as Looker Studio, Looker, Tableau or Power BI.
Creative exports are a private beta feature. To get access, contact your Funnel representative.
Features and products used: Exports, Google Cloud Storage and Google BigQuery
Before you begin
You have access to creative exports.
Your data sources have the configuration that creative exports require.
You have a Google Cloud project with BigQuery and a Cloud Storage bucket, and you can give Funnel access to them.
You can create exports.
Your workspace is on the Business plan or the Enterprise plan.
Step 1: Export your creatives to Google Cloud Storage
Create a creative export with a CSV manifest file. You load the manifest into BigQuery in step 3.
Go to Export > Destinations, find Google Cloud Storage and click Create Export.
Connect to Google Cloud Storage, and enter your bucket and a bucket path, for example
images/.
Under Data type, select Creatives.
Under Data, add filters to choose which creatives to export, for example only some data sources.
Click Show advanced settings. For Manifest file, select CSV manifest, and keep manifest as the Manifest file name template.
Under Schedule, choose when the export runs, and click Save.
Click Start to turn on the export. To run it right away, open the actions menu (⋮) and select Run now.
Funnel saves your creatives and a manifest.csv file in your bucket path. To change other settings, such as the file name template or the manifest fields, follow the steps to set up a creative export.
Step 2: Export your performance data to BigQuery
Create a BigQuery export with the fields that link your performance data to your creatives.
Go to Export > Destinations, find Google BigQuery and click Create Export.
Connect to Google BigQuery, and enter your Google Cloud project ID and a BigQuery dataset ID. Funnel creates the dataset for you.
Under Data, select the fields to export:
Data Origin Identifier and the ad ID for each platform, such as Ad ID. You join on these fields in step 4.
The metrics to compare, such as Cost, Clicks and Impressions.
Fields that make the results easier to read, such as Date and Ad name.
Under Schedule, choose when the export runs and which date range it exports, and click Save.
Click Start to turn on the export. To run it right away, open the actions menu (⋮) and select Run now.
The examples below use the default table name, funnel_data. The Google BigQuery export guide describes the other settings.
If you export data from more than one platform, each platform has its own ad ID column, such as Ad_ID__Facebook_Ads and Ad_ID__Google_Ads. You can join each platform on its own column, or map the ad IDs into one common dimension so that you can join all platforms in one query.
Step 3: Load the manifest into BigQuery
In BigQuery, run this LOAD DATA query to load the manifest from Cloud Storage into a table. Replace my-gcp-project, my_dataset, my-bucket and images with your own values.
LOAD DATA OVERWRITE `my-gcp-project.my_dataset.creative_manifest` FROM FILES ( format = 'CSV', uris = ['gs://my-bucket/images/manifest.csv'], skip_leading_rows = 1 );
Then create a table from the manifest with a column for the public URL of each creative:
CREATE OR REPLACE TABLE `my-gcp-project.my_dataset.creative_manifest_urls` AS
SELECT
*,
CONCAT('https://storage.googleapis.com/my-bucket/', fileName) AS creative_url
FROM `my-gcp-project.my_dataset.creative_manifest`;If the file names in the manifest don't start with your bucket path, add the path after the bucket name in the URL.
Run both queries again after each creative export run, so that the table includes new creatives. You can schedule the queries in BigQuery.
Step 4: Join your creatives to your performance data
Match each row of performance data to its creatives on two keys:
Data Origin Identifier in your performance data matches the manifest's connector ID and remote ID, combined as
connectorId:remoteId. For Facebook Ads, Data Origin Identifier starts withfacebook:instead.The ad ID in your performance data matches Mapping ID in the manifest.
In BigQuery, run this query to join Facebook Ads data. Your column names can differ, depending on your export settings, so check them in the table schema.
WITH one_creative_per_ad AS (
SELECT * EXCEPT (row_num)
FROM (
SELECT
m.*,
ROW_NUMBER() OVER (
PARTITION BY connectorId, remoteId, mappingId
ORDER BY mappingField, fileName
) AS row_num
FROM `my-gcp-project.my_dataset.creative_manifest_urls` AS m
)
WHERE row_num = 1
)
SELECT
d.Date,
d.Ad_ID__Facebook_Ads,
d.Ad_Name__Facebook_Ads,
d.Cost,
d.Clicks,
d.Impressions,
m.creative_url
FROM `my-gcp-project.my_dataset.funnel_data` AS d
LEFT JOIN one_creative_per_ad AS m
ON d.Data_Origin_Identifier = CONCAT(
IF(m.connectorId = 'facebookads', 'facebook', m.connectorId), ':', m.remoteId)
AND d.Ad_ID__Facebook_Ads = CAST(m.mappingId AS STRING)
WHERE d.Date BETWEEN '2026-10-01' AND '2026-10-31';The left join keeps every row of performance data. Rows for ads without an exported creative have an empty creative_url.
Filtering on Mapping field lets you choose a type of creative, such as a full-size image instead of a thumbnail, but it doesn't guarantee one creative per ad. Several files can have the same Mapping field. If your BI results need one creative per ad so performance metrics aren't repeated, first keep one manifest row per connector, account and item. The queries use ROW_NUMBER() partitioned by connectorId, remoteId (the account ID) and mappingId, then keep one row. The ORDER BY chooses a stable row; change it to match your preferred creative. If you want a specific Mapping field, filter for it before numbering the rows. To see the available fields, run SELECT DISTINCT mappingField on the manifest table.
Step 5: Use the results in a BI tool
In BigQuery, save the join as a view:
CREATE OR REPLACE VIEW `my-gcp-project.my_dataset.ads_with_creatives` AS
WITH one_creative_per_ad AS (
SELECT * EXCEPT (row_num)
FROM (
SELECT
m.*,
ROW_NUMBER() OVER (
PARTITION BY connectorId, remoteId, mappingId
ORDER BY mappingField, fileName
) AS row_num
FROM `my-gcp-project.my_dataset.creative_manifest_urls` AS m
)
WHERE row_num = 1
)
SELECT
d.Date,
d.Data_Origin_Identifier,
d.Ad_ID__Facebook_Ads,
d.Ad_Name__Facebook_Ads,
d.Cost,
d.Clicks,
d.Impressions,
m.creative_url
FROM `my-gcp-project.my_dataset.funnel_data` AS d
LEFT JOIN one_creative_per_ad AS m
ON d.Data_Origin_Identifier = CONCAT(
IF(m.connectorId = 'facebookads', 'facebook', m.connectorId), ':', m.remoteId)
AND d.Ad_ID__Facebook_Ads = CAST(m.mappingId AS STRING);Then connect your BI tool to the ads_with_creatives view, for example by connecting Looker Studio to BigQuery.
Note: The query in step 3 creates a URL for a public bucket. For a private bucket, supply the actual signed URLs as creative_url in the table used by the join and view. Generating signed URLs elsewhere isn't enough unless you replace the values in creative_url. Refresh the URLs before they expire.
Result
You have a view in BigQuery with your ads, their metrics and a link to each creative. Use creative_url as an image field in your BI tool to compare how your creatives perform.
If the results don't look right
No rows match: Check that you join on the advertising platform's ad ID, not a Funnel ID. Also check the
facebook:exception for Facebook Ads.Some rows have no creative: The creative export didn't export a creative for those ads, for example because the creative is older than the export. With a left join, those rows stay in the results.
The manifest isn't found: The creative export hasn't finished a run yet. Run it, and check Run history on the export page.
Images don't load in your BI tool: Check that
creative_urlcontains a working public URL or an actual signed URL for a private bucket. Refresh signed URLs that have expired.
