---
name: set-up-and-optimize-product-feed
description: >-
  Establishes the product feed that every Shopping and PMax campaign stands on: export from the
  ecommerce platform, attribute mapping and title/description optimization, identifier and image
  compliance, custom-label plumbing for later segmentation, Merchant Center upload, and
  approval-rate validation. Most of the build is human work in the feed tool and Merchant Center;
  VigilDog's role is linking Merchant Center to Google Ads and verifying feed health from the ads
  side with performance queries. Use it for a new store, a new market, or a ground-up rebuild of a
  weak feed. Do not use it for routine feed tweaks during maintenance
  (run-shopping-campaign-optimization-cycle), for tier labeling logic
  (set-up-performance-based-shopping-segmentation, set-up-scoring-model-segmentation), or for the
  campaign builds that come after (launch-standard-shopping-campaign,
  launch-pmax-feed-only-campaign).
---
# Build and Optimize the Product Feed

## Purpose
Get a complete, compliant, well-optimized product feed flowing into Merchant Center on a schedule,
linked to Google Ads, with disapprovals under control and custom labels ready for segmentation.
Feed quality caps everything downstream, titles decide which queries products match, identifiers
decide eligibility, and price/availability accuracy decides whether items serve at all. This is
predominantly a human/feed-tool procedure; VigilDog executes the account link and all ads-side
verification.

## When to run
- Onboarding a new ecommerce account that has never run Shopping.
- Expanding an existing store into a new country or language (new feed per market).
- Rebuilding a feed that underperforms structurally: chronic disapprovals, generic titles, missing
  identifiers.
- Before any Shopping or PMax launch when feed quality is unverified.

## When NOT to run
- The feed is live and broadly healthy; specific products need touch-ups ->
  run-shopping-campaign-optimization-cycle handles marginal feed flags.
- The task is assigning performance or score labels to an already-good feed ->
  set-up-performance-based-shopping-segmentation or set-up-scoring-model-segmentation.
- The feed is done and the next step is a campaign -> launch-standard-shopping-campaign,
  launch-pmax-feed-only-campaign, or launch-pmax-full-assets-ecommerce-campaign.

## Prerequisites
- Ecommerce platform access (Shopify, WooCommerce, Magento, or similar) with exportable catalog
  data: titles, descriptions, images, prices, stock.
- A Merchant Center account for the target market.
- GTINs/barcodes where they exist; brand and MPN data otherwise.
- A decision on feed tooling: a feed management tool (Channable, DataFeedWatch, Feedonomics or
  similar) for catalogs that need transformation at scale; a spreadsheet feed only for small stable
  catalogs (<50 products); direct API integration when inventory changes many times a day.

## Procedure
1. **Session guardrail.** Before the first Google Ads write of this session, call
   `gads_policy_guardrail` and honor its output.
2. **HUMAN STEP (outside VigilDog), export and import.** Connect the ecommerce platform to the feed
   tool (or platform-native channel app) and import the catalog. Verify the raw import: every
   product present; `id` unique and stable (SKU-based, changing IDs later erases performance
   history); title, description, link, image, price, availability all populated.
3. **HUMAN STEP (outside VigilDog), map and optimize attributes.** In the feed tool:
   - *Titles:* lead with the highest-signal attributes since only roughly the first 70-100
     characters display, but use the full 150-character allowance for query matching. Order varies
     by vertical (brand-led for fashion/electronics, spec-led for consumables); include brand,
     product type, and the variant attributes buyers filter on (size, color, model). No promo
     phrases, no all-caps.
   - *Descriptions:* key details in the first ~160 characters; materials, features, use cases; no
     links, HTML, or promotional copy.
   - *Identifiers:* GTIN where it exists; brand + MPN when it does not; `identifier_exists = false`
     only for genuinely custom/handmade goods, never fabricate a GTIN.
   - *Images:* main image on a clean background, product filling most of the frame, at least
     100x100px and ideally 1500x1500; map additional and lifestyle image fields where available.
   - *Price and availability:* currency-qualified prices that exactly match the landing page;
     sale-price fields for promotions; availability synced at least daily, hourly or API-driven for
     fast-moving stock.
   - *Categorization:* a `product_type` hierarchy mirroring the store's own taxonomy; override
     Google's auto category only when it is plainly wrong.
4. **HUMAN STEP (outside VigilDog), reserve custom labels.** Decide the label plan BEFORE launch so
   campaigns can filter on it later: one slot for performance tier (fed by a labeling tool once
   data accrues, see set-up-performance-based-shopping-segmentation), and optional slots for
   margin band, seasonality, stock level, and strategic priority. New catalogs without history set
   a placeholder value; recompute after ~30 days of data.
5. **HUMAN STEP (outside VigilDog), upload to Merchant Center.** Create the data source (scheduled
   fetch from the feed tool's export URL), set target country/language, schedule the fetch after
   the tool's export completes, and enable automatic price/availability updates as a mismatch
   safety net, not as a substitute for accurate data.
6. **Link Merchant Center to Google Ads (write).** Call `gads_link_merchant_center`. Preview first
   (validate_only=true default), confirm the merchant ID with the user, apply only after explicit
   approval. **HUMAN STEP:** accept/confirm the link on the Merchant Center side if prompted.
7. **HUMAN STEP (outside VigilDog), first-fetch triage.** After the first fetch, work the Merchant
   Center diagnostics queue: errors (disapproving) fixed immediately, warnings soon, opportunities
   as backlog. Typical fixes: missing GTIN -> supply it or set `identifier_exists=false`; price
   mismatch -> fix feed timing or rely on auto-updates; undersized images -> higher-resolution
   sources; missing category-required attributes -> add them.
8. **Ads-side verification.** Once products approve, call `gads_run_gaql_query` against
   `shopping_performance_view` to confirm the approved catalog is visible to Google Ads: product
   count in the expected range, custom label values present, no huge silent gaps versus the store
   catalog. Zero rows after 48h means the link (step 6) or feed (step 5) is broken.
9. **Health gate before launch.** Confirm with the user: disapproval rate under ~5% of the catalog,
   titles optimized for at least the top sellers, labels populated, automatic updates on. Only then
   proceed to a launch skill.
10. **Ongoing monitoring.** 24-48h after go-live and weekly thereafter: HUMAN checks the Merchant
    Center diagnostics trend, while `gads_get_shopping_performance` and `gads_run_gaql_query` watch
    for ads-side symptoms of feed rot, impression collapses on previously-serving items, CTR
    cliffs suggesting title/price problems, and item counts drifting from catalog size.

## Decision rules
- **Tooling choice:** need transformation, rules, or scale -> feed management tool; catalog <50
  products and stable -> spreadsheet feed is acceptable; inventory changes intraday -> API-based
  submission or hourly fetch.
- **Fetch frequency:** daily minimum in all cases; match fetch time to sit just after the feed
  tool's export.
- **Identifier matrix:** barcoded branded goods -> GTIN required; unbarcoded branded -> MPN +
  brand; custom goods -> `identifier_exists=false`; never invent GTINs (hard disapproval risk).
- **Title budget:** ~70-100 chars visible, 150 usable, front-load for the human, fill the tail for
  the matcher.
- **Launch gate:** <5% of items disapproved, prices verified against landing pages, required
  attributes complete. Below that bar, fix the feed before spending money on it.
- **One primary feed per market;** exclude items from specific surfaces with exclusion attributes
  rather than maintaining parallel feeds.

## Common failure modes
- **Unstable product IDs.** Re-platforming or a feed-tool change regenerates IDs and silently wipes
  every item's ad history. Pin IDs to SKUs from day one.
- **Generic titles.** "Blue Shirt" matches nothing; the store name in front of every title wastes
  the visible window. Attribute-rich, front-loaded titles are the single highest-leverage feed fix.
- **Price mismatch loops.** Feed exports at 06:00, site reprices at 09:00, Google disapproves at
  noon. Align schedules and keep automatic updates on as the net.
- **Labels as an afterthought.** Campaign segmentation stalls for weeks because labels were never
  mapped. Reserve and populate label slots before the first launch (step 4).
- **Promotional text in feed fields.** "SALE!!" in a title or description is a policy violation
  waiting to disapprove the item. Keep promotions in dedicated fields.
- **Trusting auto-updates completely.** They mask symptoms while the underlying sync drifts; the
  feed still decays. Fix root-cause timing, keep auto-updates as insurance only.

## Related skills
- After (launch paths): launch-standard-shopping-campaign, launch-pmax-feed-only-campaign,
  launch-pmax-full-assets-ecommerce-campaign.
- After (segmentation, once data exists): set-up-performance-based-shopping-segmentation, then
  set-up-scoring-model-segmentation.
- Ongoing: run-shopping-campaign-optimization-cycle (routine feed flags surface there).
- Adjacent: set-up-google-ads-conversion-tracking (must be live before any launch skill).
