> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adriel.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Data integration FAQs

> Common questions on blending, conversion, join types, mapping defaults, and known caveats.

This page complements the [Data blending walkthrough](/data-sources/data-integration/data-blending) and the [Data conversion guide](/data-sources/data-integration/data-conversion) with answers to the questions that come up most often.

## Basics

<AccordionGroup>
  <Accordion title="What's the difference between Data Blending and Data Conversion?">
    Both live on the **Data integration** tab of every data source's settings page, gated by the same on/off toggle.

    **Data Blending** layers complementary data with advertising data. Use it when a non-ad source — for example, GA4, a CRM, or an MMP — should sit alongside ad data in the same widget. The ad rows stay primary; the non-ad source adds columns.

    **Data Conversion** turns a non-ad source into a standalone ad channel. Once converted, the source shows up in ad data filters and can have other data sources blended onto it the same way they would blend onto Meta Ads or Google Ads. Use it when a channel Adriel doesn't natively support is tracked in a spreadsheet, CSV, or database.
  </Accordion>

  <Accordion title="Why are blend settings required at all?">
    Ad-platform data sources and non-ad data sources have different shapes. The dashboard cannot guess how a custom field aligns with the ad-data schema, so the configuration tells it how to do the join. Without it, the non-ad source has no anchor to the ad rows.
  </Accordion>

  <Accordion title="How is the Data integration tab accessed?">
    Open the **Connections** menu, pick the data source, open **Data source settings**, and switch to the **Data integration** tab. From there, turn the toggle on and pick **Data Blending** or **Data Conversion**.

    Earlier versions also allowed editing blend settings from the pencil icon on a widget's settings panel. That pencil icon now redirects to the data source settings page — blend and conversion configuration live on the data source, not on individual widgets.
  </Accordion>
</AccordionGroup>

## Data Blending: join types

<AccordionGroup>
  <Accordion title="What is the difference between Left Join and Full Join?">
    **Left Join** keeps the ad rows and adds matching columns from the non-ad source. Rows from the non-ad source that have no ad match are dropped.

    **Full Join** does everything Left Join does, plus it keeps non-ad source rows that have no ad match — adding them as new rows.

    Worked example. Two datasets:

    * Google Ads with **Campaign ID** and **Link Click**.
    * A Google Sheet with **Sheet: Campaign ID** and **Sheet: Link Click**.

    Mapping: **Campaign ID** to **Sheet: Campaign ID**, **Link Click** to **Sheet: Link Click**.

    | Scenario                                  | Left Join                        | Full Join                        |
    | ----------------------------------------- | -------------------------------- | -------------------------------- |
    | ID exists in Google Ads, not in the sheet | Ad row kept, sheet columns empty | Ad row kept, sheet columns empty |
    | ID exists in the sheet, not in Google Ads | Row dropped                      | Row kept, ad columns empty       |

    In short: **Left Join** adds columns; **Full Join** adds columns and rows.
  </Accordion>

  <Accordion title="Left Join was selected but rows behave as Full Join">
    **Left Join** is only honored for these 10 standard marketing breakdowns:

    * Channel
    * Ad account
    * Campaign
    * Campaign name
    * Ad set
    * Ad set name
    * Ad
    * Ad name
    * Keyword
    * Keyword text

    Any other breakdown — custom dimensions, custom architecture fields, organic breakdowns — defaults to **Full Join** behavior even when **Left Join** is selected. The note that appears in the panel confirms this.
  </Accordion>

  <Accordion title="Full Join was selected but rows behave as Left Join">
    A filter on a marketing dimension that is not present in any breakdown mapping or metric mapping is partially or totally ignored. The fix is either to add the filtered dimension to the mapping, or to refine the filter to use a dimension that is included.
  </Accordion>

  <Accordion title="Why does a blended widget show fewer rows or zero values than the raw source?">
    Blending uses **Left Join** by default, which scopes the blended source to values that also appear in a marketing source. When no marketing source is added, or the join keys don't overlap, the blended metrics collapse to nothing. Attaching a Google Sheet budget onto existing campaigns is the intended **Left Join** case.

    Switch to **Full Join** only when the blended source should contribute rows of its own. Note that **Full Join** can slow dashboards significantly and enforces every mapped filter on both sides simultaneously.
  </Accordion>
</AccordionGroup>

## Data Blending: mapping strategies

<AccordionGroup>
  <Accordion title="Case 1 — ID mapping (recommended when possible)">
    Use IDs (campaign ID, ad ID) as the join key. IDs are unique across ad accounts and channels, so this is the most accurate option. Default to this whenever the non-ad source includes IDs.
  </Accordion>

  <Accordion title="Case 2 — Name mapping">
    Use names (campaign name, ad set name) as the join key when IDs are not available. To avoid duplication when the same name exists across different ad accounts or channels, include parent-level names (for example, map both **Ad Account** and **Campaign** together).
  </Accordion>

  <Accordion title="Case 3 — Date-only / total matching">
    For pure visual side-by-side comparison without a dimension join:

    * Step 1: Select a date dimension.
    * Step 2: Select **Full Join**.
    * Step 3: Leave the widget dimension mappings empty.
    * Step 4: Set **Total Mapping** to **No grouping**.

    This stacks the non-ad data alongside ad data using only the date and total breakdowns.
  </Accordion>

  <Accordion title="The data source has no ad-account dimension. How can ad accounts still be mapped?">
    Tracking sources often omit ad account names. Use unique identifiers further down the hierarchy — campaign IDs and names — as the join key. The ad account dimension then aggregates across all child campaigns from those IDs.
  </Accordion>

  <Accordion title="Why don't blended rows merge when the campaign or ad account looks the same?">
    Blend joins are literal string matches on every mapped key. Common breakers:

    * A leading or trailing space on a Reddit campaign name.
    * An `act_` prefix on a Facebook ad account ID that doesn't appear on the other side.
    * A typo in a Google Sheet ID.
    * A differing column name inside a custom-metric formula.
    * A mapping that includes both Campaign ID and Campaign Name when one side only has the name.

    **Full Join** blends require every mapped key to match. If one side has extra keys mapped, either remove them or add the corresponding value on the other side.
  </Accordion>
</AccordionGroup>

## Limits and defaults

<AccordionGroup>
  <Accordion title="How many mapping rows and pairs are allowed?">
    Up to **15** widget-dimension rows per blend configuration. Each row supports up to **5** target-to-source pairs. The same widget dimension can only be selected in one row.
  </Accordion>

  <Accordion title="A data source was already blended at creation time">
    Several connectors ship with default blend settings — **GA4** uses UTM-based defaults (forced Left Join), and **HubSpot Deals** uses first-touch UTM defaults. The defaults are visible in the **Data integration** tab and can be edited or replaced anytime.
  </Accordion>

  <Accordion title="Why did the widget return an empty result?">
    The most common cause is **No grouping** as **Total Mapping** combined with a widget dimension that has no explicit mapping. The **default** fallback row is intentionally ignored in this case. Add a row that matches the widget's current dimension, or pick a different **Total Mapping**.
  </Accordion>
</AccordionGroup>

## Filtering

<AccordionGroup>
  <Accordion title="Can blended data be filtered?">
    Yes. Two paths work:

    * Filter directly using a dimension from the non-ad source.
    * Filter using a marketing dimension that is included in at least one breakdown-mapping condition (Step 3) or in the metric mapping (Step 4).
  </Accordion>
</AccordionGroup>

## Data Conversion

<AccordionGroup>
  <Accordion title="Which sources can be converted into ad channels?">
    Non-ad sources where columns are user-defined: **Google Sheets**, **CSV File Import**, the database connectors (for example, **BigQuery**, **PostgreSQL**, **Redshift**, **MySQL**), and **Amazon S3** file imports. Marketing connectors (Meta Ads, Google Ads, etc.) are already ad channels and cannot be converted.
  </Accordion>

  <Accordion title="Can a converted source be filtered, grouped, or charted the same way as Meta Ads?">
    Yes. Once a source is converted, it appears in the channel filter and contributes to channel-level totals (spend, impressions, clicks). The same breakdowns and metrics apply, provided the mapping covers them.
  </Accordion>

  <Accordion title="Can other data sources be blended onto a converted source?">
    Yes — that is the main reason to convert rather than blend. After conversion, treat the source like any ad channel: blend HubSpot Deals onto it for attribution, blend a goal-tracking sheet onto it for budget comparison, and so on.
  </Accordion>
</AccordionGroup>

## Blending with GA4

<AccordionGroup>
  <Accordion title="Why do GA4 blended rows appear duplicated across campaigns or drop out of the widget?">
    GA4 blend data aggregates at the ad-account level and groups only by **UTM Source**, **UTM Campaign**, and **UTM Medium**. Campaigns that share those three values (differing only in UTM Content) return the same GA4 numbers under each custom breakdown row.

    When **GA4 Session Campaign Name** is mapped to a marketing breakdown, the campaign name is applied as a filter — but a Facebook UTM value doesn't equal Facebook's own campaign name, so GA4 rows fall out as separate rows named by the session campaign name.

    Fixes:

    * Add a lower-level condition such as UTM Content to separate the campaigns.
    * Reconsider the campaign-name mapping if it's forcing unwanted rows.

    See also the [GA4 connector FAQ](/data-sources/g-n/google-analytics-4/faqs) for the same behavior.
  </Accordion>
</AccordionGroup>

Related: [Data blending](/data-sources/data-integration/data-blending) · [Data conversion](/data-sources/data-integration/data-conversion) · [Refresh strategies](/data-sources/how-data-works/refresh-strategies)
