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

# Google Retail

> Ensure all of your Google Retail listings match your inventory

Google Retail lists your products across Google's shopping surfaces, including Shopping ads, free listings, and vehicle ads. Hightouch writes product listings from your model into a Google Merchant Center account through the [Merchant API](https://developers.google.com/merchant/api), keeping your catalog in sync with your warehouse.

## Supported syncing

| Sync Type | Description | Supported Sync Modes | API Reference |
| - | - | - | - |
| [**Products**](#products) | Sync records from your model as product listings | Upsert | [Insert a product ↗](https://developers.google.com/merchant/api/reference/rest/products_v1/accounts.productInputs/insert) |

For more information about sync modes, refer to the [sync modes](https://docs.hightouch.com/syncs/types-and-modes.md#sync-modes) docs.

## Connect to Google Retail

> [!TIP]
>
> You need access to a [Google Merchant Center
> account](https://www.google.com/retail/) to sync listings.

Go to the [**Destinations** overview page](https://app.hightouch.com/destinations?from=docs) and click the **Add destination** button. Select **Google Retail** and click **Continue**.

For the **Authentication method**, select **Log in to Google Retail** and log into the Google account that has access to your Merchant Center account. Once you're redirected back to Hightouch, enter your **Merchant ID** to complete setup.

### Migrate your Merchant Center account

The Merchant API reads and writes through data sources, and that service is only available to Merchant Center accounts migrated to **single locale feeds and data target split**. If your account hasn't been migrated, complete the migration in Merchant Center before syncing. See Google's [data sources overview](https://developers.google.com/merchant/api/guides/data-sources/overview) for the migration steps.

## Sync configuration

Once you've set up your Google Retail destination and have a [model](https://docs.hightouch.com/getting-started/concepts.md#models) to pull data from, you can set up your sync configuration to begin syncing data. Go to the [**Syncs** overview page](https://app.hightouch.com/syncs?from=docs) and click the **Add sync** button to begin. Then, select the relevant model and the Google Retail destination you want to sync to.

### Products

Each sync writes product listings into one Merchant Center account. Select the **Product category** that your products are listed under. If your model spans several categories, map the category from a model column instead of setting one value for the whole sync.

#### Configure record matching

Select the model column that contains your **Offer ID**, the identifier that uniquely identifies each product within your Merchant Center account.

Google identifies a product by the combination of its offer ID, content language, feed label, and channel, not by offer ID alone. Map **Content language** and **Feed label** on every sync. If you map **Target country** instead of **Feed label**, Hightouch uses the target country as the feed label. Rows missing these values fail, and deletes can't locate the product to remove.

Refer to the [record matching docs](https://docs.hightouch.com/syncs/record-matching.md) for more information.

#### Field mappings

Map model columns to Google's product attributes. Attributes you leave unmapped aren't sent. See Google's [product data specification](https://support.google.com/merchants/answer/7052112) for what each attribute means and which ones your products require.

Use **Custom attributes** for merchant-provided attributes that the API doesn't expose as named fields. Hightouch sends every custom attribute value as a string.

Hightouch converts your mapped values into the formats the Merchant API expects, so you can map values as they're stored in your warehouse:

| Mapped value | Sent to Google as |
| - | - |
| Price value and currency | An amount in micros plus a currency code |
| A date such as `2026-09-18` | A timestamp at midnight UTC |
| A start and end date separated by a `/` | An interval with a start and end time |
| Enum spellings such as `in stock`, `A+++`, or `2 day` | The canonical value the API accepts, such as `IN_STOCK`, `APPP`, or `TWO_DAY` |

A price that's mapped but unusable rejects the row rather than reaching Google. This covers an empty value, a value that isn't a number, and a value with no currency, each of which would otherwise list the product at the wrong price.

Values Hightouch doesn't recognize pass through unchanged, so Google's own error names the attribute.

> [!WARNING]
>
> `kind`, `source`, `taxes`, and `taxCategory` no longer exist in the Merchant
> API and are dropped before the request. Configure tax settings at the account
> level in Merchant Center instead.

#### Vehicle attributes

Products in the **Cars, Trucks & Vans (916)** category have an additional **Vehicle specific options** section for vehicle-only attributes such as fulfillment, mileage, and trim. This section appears only when the sync's product category is 916. Read more about [vehicle ads attributes](https://support.google.com/merchants/answer/11190480) in Google's docs.

#### Configure delete behavior

When a row leaves your model's query results, Hightouch can **Delete the product in Google Retail**, which removes the product listing from Merchant Center.

Deletes are addressed by offer ID, content language, feed label, and channel. Keep those columns mapped and stable, because a row whose identifying values have changed points at a different product.

## Tips and troubleshooting

To see the exact API requests and responses from each sync run, use the [live debugger](https://docs.hightouch.com/syncs/debugger.md). To get notified by Slack, PagerDuty, SMS, or email when a sync fails, set up [sync alerts](https://docs.hightouch.com/syncs/alerting.md). If you run into an issue this page doesn't cover, [contact support](#pylon-chat).

### Behavior and limitations

**Each sync replaces the whole product.** Hightouch writes products with Google's insert operation, which replaces the existing product listing rather than patching it. Any attribute you don't map is cleared in Merchant Center on the next sync. To preserve an attribute Hightouch doesn't manage, map it.

**Hightouch chooses your data source automatically.** The Merchant API requires every product write to name a data source. Hightouch resolves one for your account at the start of each run and never stores it on the sync:

* If the account has the **Content API** data source that Google created for it, Hightouch reuses it. Products written before the Merchant API migration live there, so reusing it keeps them in place.
* If the account has exactly one other writable data source, Hightouch uses that one.
* If the account has no writable data source, Hightouch creates one named **Hightouch**.
* If the account has more than one writable data source, the sync fails rather than guessing. Choosing the wrong one would move products out of the source that currently owns them.

Only data sources with an input type of API are eligible. File, UI, and autofeed sources are managed outside the API and are never written to.

**Local-channel products need their own data source.** Google keeps separate data sources for online and local products. If your model has rows with a **Channel** of `local` and the account has no single local-channel data source, those rows fail. Online-channel rows are unaffected.

> [!NOTE]
>
> For Hightouch platform error codes related to Google Retail, see [Error codes:
> Other destinations](https://docs.hightouch.com/developer-tools/error-codes.md#other-destinations).

### Validate your setup

After a sync run, open **Products > All products** in [Merchant Center](https://merchants.google.com/) and search for one of your offer IDs. Newly written products appear with a **Pending** status while Google processes them, then move to **Active** or surface an item-level issue. Google's processing delay means a product can take several hours to become active even though the Hightouch sync succeeded.

## Common errors

### Multiple writable data sources

```
Google Retail: this Merchant Center account has multiple writable data sources ("...") and Hightouch cannot safely choose one. Contact Hightouch support to set the target data source for this sync.
```

**Cause:** The Merchant Center account has more than one API data source that Hightouch could write products into. Writing through the wrong one moves products out of the data source that currently owns them, so Hightouch stops instead of choosing.

**Solution:** Please [contact Hightouch support](#pylon-chat) with the name of the data source the sync should write to. Support can set it on the sync configuration.

### Failed to access Merchant Center data sources

```
Failed to access Merchant Center data sources: ... The Merchant API data sources service requires the Merchant Center account to be migrated to "single locale feeds and data target split".
```

**Cause:** The Merchant Center account hasn't been migrated to single locale feeds and data target split, so the Merchant API can't list its data sources.

**Solution:** Complete the migration in Merchant Center, then re-run the sync. See Google's [data sources overview](https://developers.google.com/merchant/api/guides/data-sources/overview).

### No local-channel data source

```
Google Retail (Merchant API) sync has no local-channel data source but this sync writes local-channel products.
```

**Cause:** The sync includes rows with a **Channel** of `local`, but the Merchant Center account has either no local-channel API data source or more than one.

**Solution:** Create a single local-channel data source in Merchant Center, or remove local-channel rows from the model. If the account already has several, [contact Hightouch support](#pylon-chat) to set the one this sync should use.

For error codes returned by Google, see the Merchant API's [errors reference](https://developers.google.com/merchant/api/guides/handle-errors).
