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

# Attribute mapping

> Map Google Merchant Center attributes to your Shopify product fields, metafields or a fixed value, with fallbacks for the gaps.

An **attribute** is a field in Google's product data specification. A **mapping** says where that field's value comes from in your Shopify catalog.

Rogus fills in every mapping it can work out when you create the feed. This page explains what you are looking at and what to change.

Open the feed and stay on the **Feed configuration** tab.

## How Google groups attributes

Rogus follows Google's own requirement levels, because they mean genuinely different things.

| Level           | What it means                                                     | What happens if it is missing                                       |
| --------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------- |
| **Required**    | Google rejects the item without it                                | The variant is **skipped** and listed on the Feed health tab        |
| **Identifier**  | `brand`, `gtin`, `mpn` — Google wants products to be identifiable | The item still publishes. Google may show it less often             |
| **Conditional** | Required, but only for some products, categories or countries     | Nothing is skipped. Rogus warns when your data suggests one is owed |
| **Recommended** | Improves how often and how well your products show                | Nothing is skipped, and no warning                                  |

### Required

`id`, `title`, `description`, `link`, `image_link`, `availability`, `price`.

These seven decide whether an item exists in the feed at all. All of them are pre-mapped for you.

### Identifiers

`brand`, `gtin`, `mpn`.

`brand` defaults to your product vendor. `gtin` defaults to the variant barcode — it resolves per item, so only variants that actually have a barcode publish one.

<Note>
  Rogus does not map `mpn` to your SKU. An MPN is the part number the *manufacturer* uses; a SKU is your own code. Sending one as the other claims an identifier you do not have, which causes rejections later. Map it only if you genuinely hold manufacturer part numbers.
</Note>

### Conditional

`condition`, `availability_date`, `age_group`, `gender`, `color`, `size`, `material`, `pattern`, `item_group_id`, `adult`.

Google requires these for particular cases — apparel needs `age_group` and `gender`, a preorder needs `availability_date`. Rogus cannot know which rule applies to your catalog, so it never skips an item over one. Where your other values suggest one is owed, you get a warning on the **Feed health** tab.

`item_group_id` is what ties the variants of one product together, so Google shows them as a single listing with options. Rogus fills it in for you.

### Recommended

`google_product_category`, `product_type`, `sale_price`, `additional_image_link`.

`sale_price` matters more than "recommended" suggests — see the warning about prices below.

## Where a value can come from

Each attribute takes one **source**:

* **A product or variant field** — the usual choice
* **A metafield** — for data you keep in a custom field
* **A fixed value** — the same text on every item, for something that never varies
* **Nothing** — leave the attribute out of the feed entirely

You can also set a **fallback**: a second source used only when the first one is empty for that item.

### Product fields

| Source                                    | Value                                                            |
| ----------------------------------------- | ---------------------------------------------------------------- |
| Product title                             | The title as written in Shopify                                  |
| Product title + variant options           | Title with the variant's options appended — "T-shirt — Blue / M" |
| Product description (HTML stripped)       | The description as plain text                                    |
| Product vendor                            | Your vendor field                                                |
| Product type                              | Your Shopify product type                                        |
| Shopify category → Google category        | Your Shopify category, translated to Google's                    |
| Shopify category (full name)              | Your Shopify category as text                                    |
| Product handle · Product ID · Product URL | Identifiers and the storefront link                              |
| Product featured image                    | The first image                                                  |
| Product images after the first            | Everything else, for `additional_image_link`                     |

### Variant fields

| Source                                            | Value                                                 |
| ------------------------------------------------- | ----------------------------------------------------- |
| Variant ID · Variant SKU · Variant barcode        | Identifiers                                           |
| Variant title                                     | The variant's own name                                |
| Regular price (compare-at when discounted)        | The full price before any discount                    |
| Variant price (always the current price)          | What the shopper pays today                           |
| Sale price (only when discounted)                 | The discounted price, empty when there is no discount |
| Variant compare-at price                          | The compare-at field as-is                            |
| Variant image, else product image                 | The variant's image, falling back to the product's    |
| Availability from inventory                       | `in_stock` or `out_of_stock`, from stock and policy   |
| Variant option: Color / Size / Material / Pattern | Your variant options                                  |

## Three things worth getting right

### Prices are named the other way round from Shopify

**Google's `price` is the full, regular price. The discounted amount goes in `sale_price`.** Shopify uses the opposite convention: its `price` field is what the shopper pays today.

Map Google's `price` to Shopify's price on a discounted product and you advertise a sale from £20 to £20 — Google sees the same number twice and the discount does nothing for you.

Rogus therefore defaults `price` to **Regular price (compare-at when discounted)** and `sale_price` to **Sale price (only when discounted)**. Leave both alone unless you know why you are changing them.

### A Shopify category is not a Google category

They are two different systems with different names and different codes. Sending your Shopify category where Google expects its own makes Google treat the attribute as missing.

Use **Shopify category → Google category**, which is the default. Rogus does the translation. **Shopify category (full name)** is the raw text, and is the right answer only for `product_type`, which is your own labelling and not Google's.

If a product has no Shopify category, nothing is sent. Set the category on the product in Shopify, or map `google_product_category` to a fixed value if the whole feed is one category.

### A fallback is a stopgap, not a fix

A fallback keeps an item in the feed, which is worth a lot. But it publishes substitute data, and substitute data is usually weaker.

The common example is using the product title as the description. The item publishes instead of being skipped — but Google reads descriptions for relevance, and a title repeated as a description tells it very little. Rogus marks these items **Fallback** on the Feed health tab so they stay visible rather than looking solved.

## Saving

Changes are held until you press **Save**. Saving does not rebuild the file — press **Generate** to publish the change. See [Generating a feed](/feeds/generating).
