Dr J's Binding Protocol — Document 12

Product Distribution & Feed Management

Multi-channel product feed generation, per-product channel selection, feed format specifications, data quality rules, and a repeatable onboarding playbook for every new site.

Version 1.1 February 2026 Automotive · Off-Road · E-Commerce

Table of Contents

Channels & Formats

Architecture & Quality

Industry-Specific

Operations

Repeatability

Appendices

1. Distribution Channel Overview

Product distribution for automotive and off-road e-commerce spans four major channel categories. Not every product belongs on every channel. A chassis frame cannot be sold on Amazon with free two-day shipping, but a bolt-on air shock kit absolutely can. This section maps the full distribution landscape and defines a phased rollout strategy that prioritizes high-impact channels first.

1.1 Channel Categories

Distribution channels fall into four categories based on how they connect products to buyers. Each category has distinct feed requirements, audience behavior, and cost structures.

CategoryHow It WorksCost ModelBest For
Search/Shopping EnginesProducts appear in search results and shopping tabsCPC (cost-per-click)High-intent buyers actively searching for specific parts
Social CommerceProducts displayed in social feeds, shops, and pinsCPC/CPM (impression or click)Discovery, lifestyle branding, visual products
MarketplacesProducts listed on third-party storefrontsCommission per sale (8-15%)Commodity parts, accessories, high-volume items
Affiliate NetworksPublishers promote products for a commissionCPA (cost-per-acquisition)Niche audiences, off-road forums, build blogs

1.2 Complete Channel Registry

The following table defines every distribution channel in the system. Each channel has a unique key used in the database, a human-readable label, and an assigned implementation phase.

KeyLabelCategoryFeed FormatPhase
googleGoogle ShoppingSearch/ShoppingXML (Atom)1
bingBing ShoppingSearch/ShoppingXML (Atom)1
metaMeta (Facebook/Instagram)Social CommerceCSV / TSV1
pinterestPinterest ShoppingSocial CommerceCSV / TSV1
youtubeYouTube ShoppingSocial CommerceXML (via Google Merchant)2
tiktokTikTok ShopSocial CommerceCSV / API2
ebayeBay MotorsMarketplaceCSV / API2
amazonAmazon MarketplaceMarketplaceFlat File (XLSX/TSV)2
walmartWalmart MarketplaceMarketplaceAPI / Flat File2
shareasaleShareASaleAffiliate NetworkCSV / XML2

1.3 Phase Roadmap

Phase 1 — Owned Traffic & Discovery (Launch)

Phase 1 channels drive traffic back to your own website. You own the customer relationship, collect the email, and control the checkout experience. These channels require product feeds but do not handle fulfillment or take a sales commission. Implementation cost is low: create the feed files, submit them to each platform, and monitor for errors.

Phase 2 — Marketplace Expansion (Growth)

Phase 2 channels place products on third-party storefronts where the platform controls checkout, payment processing, and often fulfillment expectations. Commission rates range from 8% to 15%. These channels require more operational overhead: inventory sync, order management, returns processing, and platform-specific compliance. Deploy Phase 2 only after Phase 1 feeds are stable and generating consistent traffic.

1.4 Channel Decision Tree by Product Type

Not every product belongs on every channel. Use this decision tree to determine which channels apply.

Product TypeGoogleBingMetaPinteresteBayAmazon
Complete chassisYesYesYesYesNoNo
Modular chassis kitsYesYesYesYesMaybeNo
Suspension componentsYesYesYesYesYesYes
Air shock kitsYesYesYesYesYesYes
Bolt-on accessoriesYesYesYesYesYesYes
Turnkey buildsYesYesYesYesNoNo
Custom fabricationNoNoYesYesNoNo
Rule of Thumb: If a product has a fixed price, a SKU, and can be boxed and shipped via common carriers (UPS, FedEx, freight), it can go on marketplaces. If it requires a quote, custom fabrication, or oversized freight coordination, limit it to search and social channels that drive traffic to your own site.

2. Feed Format Specifications

Each distribution channel requires product data in a specific format. While Google and Bing use similar XML schemas, social platforms prefer CSV/TSV flat files. This section provides the complete field mapping for every Phase 1 format, plus notes on Phase 2 marketplace differences.

2.1 Google Merchant XML

Google Shopping feeds use an Atom XML format with the g: namespace for Google-specific fields. This is the most comprehensive feed format and serves as the foundation for Bing and YouTube Shopping feeds.

Field Mapping

FieldRequiredMax LengthNotes
g:idYes50 charsUnique product identifier; must match across feed updates
g:titleYes150 chars~70 chars displayed in ads; front-load keywords
g:descriptionYes5,000 charsPlain text only; no HTML tags
g:linkYesAbsolute URL to product page; must match verified domain
g:image_linkYesAbsolute URL; min 800x800px; no watermarks or text overlays
g:additional_image_linkNoUp to 10 additional images; same quality requirements
g:priceYesFormat: 99.99 USD; must match landing page price exactly
g:sale_priceNoActive sale price; original price shown with strikethrough
g:availabilityYesin_stock, out_of_stock, preorder, backorder
g:brandYes70 charsRequired for all branded products
g:gtinConditional50 charsUPC/EAN/ISBN; required if manufacturer-assigned
g:mpnConditional70 charsRequired when GTIN not available; manufacturer part number
g:identifier_existsConditionalSet to false for custom/handmade products without GTIN or MPN
g:conditionYesnew, refurbished, used
g:google_product_categoryRecommendedGoogle taxonomy ID or full path; e.g., Vehicles & Parts > Vehicle Parts & Accessories
g:product_typeRecommended750 charsYour own category hierarchy; e.g., Chassis > Modular Kits > Front Clip
g:shippingRecommendedCountry, service, price; or configure account-level shipping
g:shipping_weightRecommendedFormat: 45.5 lb; critical for freight items
g:shipping_lengthNoFormat: 96 in; required for oversized items
g:shipping_widthNoFormat: 48 in
g:shipping_heightNoFormat: 12 in
g:custom_label_0No100 charsCampaign segmentation; e.g., best-seller, clearance

XML Structure Example

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:g="http://base.google.com/ns/1.0">
  <title>Patriot Chassis Product Feed</title>
  <link href="https://patriotchassis.com" rel="alternate"/>
  <entry>
    <g:id>PC-AIR-001</g:id>
    <g:title>Patriot Chassis Air Shock Kit - GM 10-Bolt</g:title>
    <g:description>Bolt-on air shock conversion kit...</g:description>
    <g:link>https://patriotchassis.com/product.html?id=PC-AIR-001</g:link>
    <g:image_link>https://patriotchassis.com/images/products/air-shock-kit-gm.jpg</g:image_link>
    <g:price>849.99 USD</g:price>
    <g:availability>in_stock</g:availability>
    <g:brand>Patriot Chassis</g:brand>
    <g:mpn>PC-AIR-001</g:mpn>
    <g:identifier_exists>false</g:identifier_exists>
    <g:condition>new</g:condition>
    <g:google_product_category>Vehicles &amp; Parts > Vehicle Parts &amp; Accessories > Motor Vehicle Parts > Motor Vehicle Suspension Parts</g:google_product_category>
    <g:product_type>Suspension > Air Shock Kits</g:product_type>
    <g:shipping_weight>22.5 lb</g:shipping_weight>
  </entry>
</feed>

2.2 Meta (Facebook/Instagram) CSV

Meta Commerce Manager accepts product data as CSV or TSV files. The format is simpler than Google XML but has strict column naming requirements. Column headers must match exactly.

Column Specification

ColumnRequiredNotes
idYesUnique identifier; max 100 chars
titleYesMax 200 chars; no ALL CAPS
descriptionYesMax 9,999 chars; plain text
availabilityYesin stock, out of stock, preorder (space-separated, lowercase)
conditionYesnew, refurbished, used
priceYesFormat: 849.99 USD
linkYesProduct page URL; must use HTTPS
image_linkYesMin 600x600px; 1024x1024px recommended; no text overlays
brandYesBrand name
google_product_categoryRecommendedGoogle taxonomy accepted by Meta
sale_priceNoActive sale price
sale_price_effective_dateNoISO 8601 date range
additional_image_linkNoComma-separated URLs; up to 20 additional images
product_typeNoYour own category path
shippingNoFormat: US::Standard:9.99 USD
custom_label_0NoFor ad campaign segmentation
Meta-Specific Difference: Meta uses space-separated values for availability (in stock not in_stock) and requires HTTPS for all URLs. The feed generator must transform these fields when producing Meta-format output from the same source data.

2.3 Pinterest CSV

Pinterest accepts CSV/TSV feeds through its Catalogs feature. The format closely mirrors Google's field naming but adds Pinterest-specific fields for rich pin display.

Column Specification

ColumnRequiredNotes
idYesUnique product identifier
titleYesMax 500 chars; descriptive and keyword-rich
descriptionYesMax 10,000 chars
linkYesProduct URL; must be on verified domain
image_linkYesMin 800x800px; 1000x1500px (2:3) preferred for pin display
priceYesFormat: 849.99 USD
availabilityYesin stock, out of stock, preorder
brandNoRecommended for brand attribution
google_product_categoryRecommendedGoogle taxonomy; used for discovery categorization
product_typeNoYour category hierarchy
conditionNonew, refurbished, used
additional_image_linkNoUp to 10 additional images
sale_priceNoShows original + sale price on pin
shippingNoFree shipping badge if 0 USD
Pinterest Image Tip: Vertical images (2:3 ratio, 1000x1500px) get 67% more engagement on Pinterest than square images. For automotive builds, use lifestyle/install photos rather than white-background product shots. Pinterest users browse for inspiration, not specifications.

2.4 Bing Shopping XML

Microsoft Advertising accepts Google Shopping feeds directly with minimal modification. Bing processes the same Atom XML format and recognizes the g: namespace fields. The primary differences are operational, not format-based.

Key Differences from Google

AspectGoogleBing
Feed formatAtom XMLSame Atom XML accepted directly
Merchant IDNumeric (Google Merchant Center)Microsoft Merchant Center store ID
Processing time~30 minutesUp to 3 business days for new feeds
Image minimum800x800px recommended220x220px minimum (800x800 recommended)
UET TagNot required (uses Google Tag)Required on all pages; min 50 events for verification
Auto-importN/ACan auto-import from Google Merchant Center
Recommendation: Use the same XML feed file for both Google and Bing. Submit the identical URL to both platforms. Bing's auto-import from Google Merchant Center is convenient but adds a delay. Direct feed submission gives you faster updates and independent control.

3. Per-Product Channel Selection

A single "publish to all channels" toggle is inadequate for automotive and off-road e-commerce. A complete rolling chassis cannot be listed on Amazon — it requires freight shipping coordination, has no UPC, and needs customer consultation before purchase. Meanwhile, a bolt-on air shock kit is a perfect Amazon product: fixed price, standard box, UPC-assignable, and shippable via common carriers. Per-product channel selection ensures each product appears only on channels where it can actually be sold and fulfilled.

3.1 Why Per-Product Matters

Automotive products span an enormous range of complexity, price, and fulfillment requirements. Listing a $45,000 turnkey build on Amazon would generate support tickets, bogus orders, and immediate policy violations. Listing a $12 bolt pack only on Google Shopping wastes marketplace potential. Per-product channel assignment prevents three categories of problems:

3.2 Product Type Decision Matrix

The following matrix maps product characteristics to eligible channels. Products must meet ALL criteria in a column to be eligible for that channel.

CriteriaGoogle/BingMeta/PinteresteBay/AmazonAffiliate
Has fixed price (not quote-based)YesRecommendedRequiredYes
Has SKU/MPNRequiredRequiredRequiredRequired
Shippable via standard carrierNot requiredNot requiredRequiredNot required
Under marketplace weight limitN/AN/ARequired (150 lb typical)N/A
Has GTIN/UPC or can set identifier_exists=falseYesYesGTIN preferredN/A
Product images meet platform spec800x800600x6001000x1000Any

3.3 Channel Assignment in the Database

Each product's channel assignments are stored in the portal_product_channels table. This table links a product to its enabled channels and stores per-channel overrides.

portal_product_channels
├── id (INT AUTO_INCREMENT PK)
├── product_id (INT FK → portal_products.id)
├── channel_id (INT FK → portal_feed_channels.id)
├── enabled (TINYINT(1), default 1)
├── custom_title (VARCHAR(255), nullable — override for this channel)
├── custom_description (TEXT, nullable — override for this channel)
├── custom_category (VARCHAR(255), nullable — platform-specific category)
└── UNIQUE(product_id, channel_id)

3.4 Per-Channel Overrides

Some products need different titles, descriptions, or categories depending on the platform. Override fields allow customization without duplicating the entire product record.

When to Use Overrides

ScenarioOverride FieldExample
Google title too long for displaycustom_titleShorten "Patriot Chassis Heavy-Duty Adjustable Air Shock Conversion Kit for GM 10-Bolt Rear Axle" to "Patriot Air Shock Kit - GM 10-Bolt Rear"
Pinterest needs lifestyle-focused descriptioncustom_descriptionReplace spec-heavy description with build inspiration copy
Amazon requires specific category pathcustom_category"Automotive > Replacement Parts > Shocks, Struts & Suspension > Shocks & Struts"
Pinterest prefers vertical imagecustom_image_urlUse 1000x1500px lifestyle photo instead of square product shot
Override Priority: The feed generator checks for a channel override first. If the override field is NULL, it falls back to the product's standard field. This means the base product data must always be complete and feed-ready, even if overrides exist for specific channels.

4. Feed Generation Architecture

Feed generation transforms product data stored in the portal database into platform-specific output files. The system supports multiple sites, multiple channels, and per-product channel selection through a single generation pipeline.

4.1 Data Flow

The feed generation pipeline reads from three primary tables and produces output files for each enabled channel per site.

portal_products (master product data)
    │
    ├── portal_product_channels (per-product channel assignments + overrides)
    │
    └── portal_sites (site configuration: domain, feed URLs, brand info)
          │
          ▼
    Feed Generator (PHP)
          │
          ├── google-feed.xml     (Google Shopping + Bing)
          ├── meta-feed.csv       (Facebook / Instagram)
          ├── pinterest-feed.csv  (Pinterest Catalogs)
          └── generation-log.json (timestamp, counts, errors)

4.2 Multi-Site Support

The portal manages products across multiple sites. Each site has its own domain, brand name, and product catalog. The feed generator produces separate feed files for each site because each platform merchant account is tied to a specific domain.

SiteDomainFeed Base Path
Patriot Chassispatriotchassis.com/feeds/patriotchassis/
Advanced Offroadadvancedoffroadtrailer.com/feeds/advancedoffroad/
The High Road Mfgthehighroadmfg.com/feeds/highroad/
Phillips Ranchphillipsranch.com/feeds/phillipsranch/
Pit Innovationspitinnovations.com/feeds/pitinnovations/

4.3 File Output & Naming Conventions

Feed files follow a strict naming convention for predictable URLs and automated submission.

/{site-slug}/feeds/
├── google-feed.xml           ← Google Shopping / Bing Shopping
├── meta-feed.csv             ← Facebook / Instagram Commerce
├── pinterest-feed.csv        ← Pinterest Catalogs
├── feed-log.json             ← Generation metadata
└── archive/
    ├── google-feed-2026-02-25.xml    ← Daily archive
    └── meta-feed-2026-02-25.csv

Feed URL Pattern

Each feed is accessible at a predictable URL for platform submission:

https://{domain}/feeds/google-feed.xml
https://{domain}/feeds/meta-feed.csv
https://{domain}/feeds/pinterest-feed.csv

4.4 Generation Process

The feed generator follows a strict sequence to ensure data integrity and traceability.

  1. Query eligible products — SELECT products WHERE status = 'approved' AND site_id matches AND channel is enabled in portal_product_channels
  2. Apply channel overrides — For each product-channel pair, check for custom_title, custom_description, custom_category, custom_image_url; use override if not NULL, otherwise use base product field
  3. Validate required fields — Verify all required fields are present and formatted correctly for the target format; skip products with validation errors and log the reason
  4. Transform data — Convert field values to platform-specific formats (e.g., in_stock for Google vs in stock for Meta)
  5. Generate output file — Write XML or CSV to the output path
  6. Archive previous version — Move the previous feed file to the archive/ directory with a date suffix
  7. Write generation log — Record timestamp, product count, error count, and skipped product IDs with reasons

4.5 Generation Logging

Every feed generation run produces a log entry in feed-log.json for debugging and monitoring.

{
  "generated_at": "2026-02-25T14:30:00-07:00",
  "site": "patriotchassis",
  "feeds": {
    "google": { "products": 67, "skipped": 3, "file_size": "48.2 KB" },
    "meta":   { "products": 64, "skipped": 6, "file_size": "22.1 KB" },
    "pinterest": { "products": 58, "skipped": 12, "file_size": "19.8 KB" }
  },
  "errors": [
    { "product_id": 42, "channel": "google", "reason": "Missing image_link" },
    { "product_id": 71, "channel": "meta", "reason": "Price is 0.00" }
  ]
}

5. Feed Quality Requirements

Feed quality directly determines product visibility. Google Merchant Center, Meta Commerce Manager, and Pinterest Catalogs all run automated validation on submitted feeds. Products with missing required fields, invalid images, or price mismatches are disapproved — often silently. This section defines the minimum quality bar for every feed field across all platforms.

5.1 Required Fields by Platform

FieldGoogleBingMetaPinterest
idRequiredRequiredRequiredRequired
titleRequiredRequiredRequiredRequired
descriptionRequiredRequiredRequiredRequired
linkRequiredRequiredRequiredRequired
image_linkRequiredRequiredRequiredRequired
priceRequiredRequiredRequiredRequired
availabilityRequiredRequiredRequiredRequired
brandRequiredRequiredRequiredRecommended
conditionRequiredRequiredRequiredOptional
gtin or mpnConditionalConditionalOptionalOptional
google_product_categoryRecommendedRecommendedRecommendedRecommended
shipping_weightRecommendedRecommendedOptionalOptional

5.2 Image Specifications by Platform

Image quality is the single most common reason for feed disapprovals. Every platform has specific minimum dimensions, format requirements, and content restrictions.

SpecificationGoogleBingMetaPinterest
Minimum dimensions800 x 800 px220 x 220 px600 x 600 px800 x 800 px
Recommended1200 x 1200 px800 x 800 px1024 x 1024 px1000 x 1500 px
Max file size16 MB16 MB8 MB10 MB
Aspect ratioSquare preferredSquare preferred1:1 in shops2:3 vertical preferred
FormatsJPEG, PNG, WebPJPEG, PNGJPEG, PNGJPEG, PNG
BackgroundWhite recommendedWhite recommendedNo requirementNo requirement
No text/watermarksProhibitedProhibitedLimited (<20% image area)Limited
No placeholder imagesProhibitedProhibitedProhibitedProhibited
Critical Image Rule: Produce all product images at a minimum of 1200 x 1200 px (square) plus a 1000 x 1500 px (vertical) variant for Pinterest. JPEG format at 85% quality. Store the highest-resolution original and generate platform-specific sizes programmatically. Never upscale a small image to meet minimum requirements — platforms detect this and may disapprove the listing.

5.3 Product Identifier Rules

Product identifiers (GTIN, MPN, brand) tell platforms whether your product matches known catalog entries. Incorrect identifier handling is a leading cause of silent disapprovals.

ScenarioGTINMPNidentifier_exists
Reselling a manufacturer's product with UPCRequiredRecommendedOmit (defaults true)
Selling a product you manufacture (has MPN, no UPC)OmitRequiredOmit (defaults true)
Custom/handmade product (no UPC, no established MPN)OmitOmitSet to false
Bundle or kit with mixed componentsOmitCreate a kit MPNOmit
Automotive Note: Most custom chassis, fabrication work, and purpose-built suspension kits do not have GTINs (UPCs). Set identifier_exists to false for these products. However, off-the-shelf components (shocks, springs, hardware kits) from major manufacturers DO have UPCs — you must provide them. Google will cross-reference your brand + MPN against its catalog and flag mismatches.

5.4 Price Formatting Requirements

RuleRequirement
Format{amount} {currency} — e.g., 849.99 USD
Decimal placesAlways 2 decimal places, even for whole dollar amounts (100.00 USD)
Currency codeISO 4217 (USD, CAD, EUR, etc.)
No symbolsDo not include $, ,, or other formatting characters
Landing page matchFeed price must exactly match the price displayed on the product page
Zero pricesNever submit 0.00 USD — skip the product or use a minimum price
Sale pricesMust be lower than the regular price; include sale_price_effective_date

5.5 Availability Status Mapping

Each platform uses slightly different availability values. The feed generator must translate the portal's internal status to the correct platform format.

Portal StatusGoogle/Bing ValueMeta ValuePinterest Value
In Stockin_stockin stockin stock
Out of Stockout_of_stockout of stockout of stock
Pre-Orderpreorderpreorderpreorder
Backorderbackorderavailable for orderin stock
DiscontinuedExclude from all feeds

6. Automotive & Niche Considerations

Automotive aftermarket e-commerce has industry-specific data standards, fitment requirements, and marketplace conventions that do not apply to general retail. This section covers the standards and integrations that matter for chassis, suspension, and off-road product distribution.

6.1 ACES — Aftermarket Catalog Exchange Standard (Phase 2)

ACES is the industry standard for expressing vehicle fitment data — which parts fit which vehicles. It maps products to Year/Make/Model/Submodel (YMMS) combinations using standardized vehicle configuration codes maintained by the Auto Care Association.

Why ACES Matters

ACES Data Structure

FieldDescriptionExample
BaseVehicleIDStandardized Year/Make/Model code32987 (2015 Chevrolet Silverado 1500)
SubModelIDTrim/submodel identifier1 (LT)
PartTerminologyIDWhat the part is (standardized category)12680 (Shock Absorber)
PositionWhere it mountsRear
QualifierAdditional fitment notes4WD Only
Phase 2 Implementation: ACES data is complex and requires access to the VCdb (Vehicle Configuration Database) from the Auto Care Association. For Phase 1, use free-text fitment descriptions in product descriptions and structured data. Plan for ACES integration when expanding to eBay Motors and Amazon Automotive.

6.2 PIES — Product Information Exchange Standard (Phase 2)

PIES is the companion standard to ACES. While ACES defines fitment (what vehicles a part fits), PIES defines the product itself — attributes, descriptions, images, dimensions, and marketing content in a standardized format.

PIES Attribute Categories

CategoryFieldsRelevance
DescriptionsShort (80 char), Medium (200), Long (2000), MarketingMaps to feed title/description fields
DimensionsLength, Width, Height, Weight (product and package)Required for shipping calculations
Digital AssetsImages (6 types), PDFs, Videos, 360-degreeMaps to feed image fields
AttributesMaterial, finish, color, warranty, country of originEnhances filtering and search
PackagingUPC, package dimensions, quantity per packRequired for marketplace fulfillment

6.3 eBay Vehicle Compatibility Lists

eBay Motors uses its own vehicle compatibility format derived from ACES. Sellers provide fitment data as a compatibility list attached to each listing. This powers the "This item fits your vehicle" badge that dramatically increases conversion rates.

eBay Compatibility Format

Year | Make | Model | Trim | Engine | Notes
2014 | Chevrolet | Silverado 1500 | LT | 5.3L V8 | 4WD Only
2015 | Chevrolet | Silverado 1500 | LT | 5.3L V8 | 4WD Only
2015 | GMC | Sierra 1500 | SLE | 5.3L V8 | 4WD Only
2016 | Chevrolet | Silverado 1500 | All | 5.3L V8 | 2WD & 4WD

For products without ACES data, build compatibility lists manually from your fitment knowledge. Even a basic list covering the most common applications significantly improves search ranking within eBay Motors. Products with compatibility data receive priority placement in "Parts that fit" search results.

6.4 Amazon Part Finder Integration

Amazon Automotive uses a proprietary fitment system called "Part Finder" that lets buyers enter their vehicle details and see only compatible parts. To participate, sellers must submit fitment data through Amazon's Part Finder template — a flat file mapping each product to Year/Make/Model/Submodel/Engine combinations.

Part Finder Requirements

6.5 Shipping Dimensions for Oversized Items

Chassis frames, roll cages, and complete suspension kits are oversized freight items. Accurate shipping dimensions are not optional — they directly affect feed approval, shipping cost calculations, and marketplace compliance.

Product CategoryTypical DimensionsTypical WeightShipping Class
Complete chassis120" x 48" x 18"800-1,500 lbLTL Freight
Modular chassis section72" x 36" x 12"150-400 lbLTL Freight
Suspension kit (complete)48" x 24" x 18"80-200 lbOversized parcel / LTL
Air shock kit24" x 12" x 8"15-30 lbStandard parcel
Bolt-on accessory18" x 12" x 6"5-20 lbStandard parcel
Hardware kit8" x 6" x 4"1-5 lbStandard parcel
Feed Impact: Google Shopping uses shipping_weight, shipping_length, shipping_width, and shipping_height to estimate shipping costs. If these fields are missing for heavy items, Google may show inaccurate shipping estimates that either deter buyers (too high) or create losses (too low). Always provide accurate dimensions in your feed for items over 20 lb.

7. Feed Monitoring & Validation

Submitting feeds is only the beginning. Every platform runs ongoing validation against submitted product data and will disapprove individual products or suspend entire feeds when issues are detected. Monitoring is not a launch task — it is an ongoing operational responsibility.

7.1 Google Merchant Center Diagnostics

Google Merchant Center provides the most detailed diagnostics of any platform. It categorizes issues by severity and provides specific fix instructions for each disapproved product.

Common Disapprovals & Fix Strategies

DisapprovalCauseFix
Missing GTINProduct has manufacturer UPC but feed omits itAdd GTIN or set identifier_exists=false for custom products
Price mismatchFeed price differs from landing page priceRegenerate feed after price update; ensure feed and page use same data source
Image too smallMain image under 800x800pxReplace with minimum 1200x1200px image
Promotional overlay on image"SALE" or "FREE SHIPPING" text on product imageRemove text overlays; use clean product photos only
Automatic item disapproval (policy)Product violates Google Shopping policiesReview Shopping policies; common for weapons-adjacent products
Landing page not found (404)Product URL is broken or page is not yet publishedFix URL or exclude product until page is live
Mismatched availabilityFeed says "in_stock" but page shows "out of stock"Sync availability between database, feed, and product page
Missing shipping informationNo shipping configured at account or product levelAdd g:shipping to feed or configure account-level shipping in Merchant Center

Severity Levels

LevelImpactResponse Time
Account suspensionAll products removed from ShoppingImmediate — fix within 24 hours, request review
Item disapprovalIndividual product removedFix within 1 week
WarningProduct may be demoted or disapproved soonFix within 2 weeks
SuggestionOptimization opportunityAddress during next feed update cycle

7.2 Meta Commerce Manager Validation

Meta's validation is less granular than Google's but equally strict on required fields. The Commerce Manager dashboard shows feed health with a percentage score and categorizes issues by type.

Common Meta Feed Issues

7.3 Pinterest Catalog Validation

Pinterest Catalogs provides a feed health dashboard showing processing status, active pins, and errors. Pinterest is generally more lenient than Google or Meta but still requires core fields.

7.4 Scheduled Regeneration

Feed freshness matters. Platforms penalize stale feeds and reward frequent updates. The following schedule balances server load with data freshness.

TriggerFrequencyReason
Price changesWithin 1 hourPrice mismatch between feed and landing page causes disapproval
Availability changesWithin 1 hourShowing "in stock" for unavailable products violates all platform policies
New product addedNext scheduled runNew products appear in feeds on the next generation cycle
Routine regenerationDaily (2:00 AM)Catches any data drift and signals freshness to platforms
Full catalog rebuildWeekly (Sunday 3:00 AM)Rebuilds all feeds from scratch; catches orphaned entries
Best Practice: Configure Google Merchant Center to fetch your feed URL on a daily schedule. Use the Content API for Shopping for real-time price and availability updates on high-velocity products. For most automotive parts (stable pricing, limited inventory churn), daily feed fetches are sufficient.

8. Implementation Checklist

This checklist covers every step from initial setup through ongoing maintenance. Complete each section in order. Do not submit feeds to platforms until all pre-launch items are verified.

8.1 Pre-Launch Verification

8.2 Channel Account Setup

Google Shopping

Bing Shopping

Meta Commerce

Pinterest Shopping

8.3 Feed URL Submission

Each platform needs to know where to fetch your feed. Submit the following URLs after your feed generator is deployed and producing valid output.

PlatformFeed URLFetch Schedule
Google Merchant Centerhttps://{domain}/feeds/google-feed.xmlDaily (set in Merchant Center)
Bing Merchant Centerhttps://{domain}/feeds/google-feed.xmlDaily (or auto-import from Google)
Meta Commerce Managerhttps://{domain}/feeds/meta-feed.csvDaily (set in Catalog settings)
Pinterest Catalogshttps://{domain}/feeds/pinterest-feed.csvDaily (set in Catalog source)

8.4 Ongoing Maintenance

Zero Tolerance: A feed with a single account-level suspension removes ALL products from that platform — not just the offending item. Treat Merchant Center warnings as urgent. Fix within 24 hours. A pattern of repeated violations escalates to permanent suspension, which is extremely difficult to reverse.

9. New Site Onboarding Playbook

This section is the repeatable playbook for bringing a brand-new site into the feed distribution system. Every site — whether it sells chassis, trailers, ranch equipment, or fabrication tools — follows the same sequence. The system is designed so that a new site can go from zero to live feeds in a single working session once its products are in the portal.

Prerequisite: The site must already exist in the portal_sites table with a valid domain, slug, and name. All 5 DominionPort sites are pre-seeded. If adding a 6th+ site, insert the row first.

9.1 Step 1 — Build Process Discovery (Q9b)

During the Build Process Discovery phase (Question 9b), the client selects which distribution channels apply to their business. The Build Process form (/build-process/index.html) presents all 10 channels organized by category:

CategoryChannelsDefault State
Search / Shopping EnginesGoogle Shopping, Bing / Microsoft ShoppingChecked (recommended for all sites)
Social CommerceFacebook & Instagram (Meta), Pinterest, YouTube Shopping, TikTok ShopMeta checked; others unchecked
MarketplaceseBay Motors, Amazon Automotive, WalmartAll unchecked (requires evaluation)
AffiliateShareASaleUnchecked

The client's channel selections during Discovery determine which channels get enabled at the site level in Step 3. Phase 2 channels (YouTube, TikTok, eBay, Amazon, Walmart, ShareASale) can be selected during Discovery for planning purposes — they appear dimmed in the portal UI until implementation is ready.

9.2 Step 2 — Product Pipeline Completion

Products must pass through the portal workflow before they can appear in feeds. The feed generator only includes products with status = 'approved' or status = 'live'. The minimum viable product record for feed eligibility requires:

FieldPortal TabRequired For FeedsNotes
Name / TitleOverviewYesUnder 150 chars; front-load keywords
Short DescriptionDescriptionYes (50+ chars)If under 50 chars, generator falls back to full description
Full DescriptionDescriptionRecommendedUsed as fallback; also shown on product page
SKUOverviewYesUsed as feed id; must be unique per site
BrandOverviewYesFalls back to site name if empty
CategoryOverviewRecommendedMaps to google_product_category and product_type
Price (fixed, in cents)PricingYesQuote-based products are excluded from all feeds
ConditionOverviewYesDefaults to new if empty
AvailabilityOverviewYesDefaults to in_stock if empty
At least 1 imageImagesYesProducts with no images are silently excluded from all feeds
GTIN/UPCOverviewConditionalRequired for resold products; omit for custom fabrication
MPNOverviewConditionalRequired when no GTIN; identifier_exists=false if neither
Weight (lbs)SpecsRecommendedRequired for items over 20 lb; omitted from feed if empty
Gating Rule: A product will NOT appear in any feed until (a) its status is approved or live, (b) it has a fixed price, (c) it is marked active = 1, AND (d) it has at least one image. All four conditions must be met. The feed generator enforces this in the SQL query and the image-skip logic — there is no manual override.

9.3 Step 3 — Enable Site Channels

After products are loaded, enable the channels selected during Discovery at the site level via the Hub Feeds dashboard (/hub/feeds.html).

  1. Open Hub → select the site from the site picker
  2. The Channels tab shows all 10 channels with toggle switches
  3. Enable the channels chosen during Discovery (Q9b)
  4. For each enabled channel, optionally set:
  5. Site-channel configuration is stored in portal_site_channels

9.4 Step 4 — Assign Products to Channels

Use the Distribution tab (10th tab) in the Product Editor for per-product channel assignment.

  1. Open the portal → select the site → open a product
  2. Navigate to the Distribution tab
  3. Check/uncheck channels for this product (only site-enabled channels are interactive; others are dimmed)
  4. Optionally expand "Customize" on any channel to set:
  5. Save — assignments are stored in portal_product_channels
Bulk Assignment Tip: For a new site where most shippable products go on all Phase 1 channels, assign channels to 3-5 products first, verify the generated feeds look correct, then bulk-assign the remainder. This catches data issues early before they scale.

9.5 Step 5 — Generate & Verify Feeds

  1. Open Hub → Feeds → select the site
  2. Click "Generate" on each enabled channel
  3. Verify the product count matches expectations
  4. Download and spot-check the generated file:
  5. Check the Generation Log tab for any errors

9.6 Step 6 — Deploy Feed Files to Production

Feed files must be accessible at public URLs on the site's production domain for platforms to fetch them. Deploy using the standard DevHub → Production pipeline.

# Feed output directory structure on production:
/{site-docroot}/feeds/
├── google-merchant.xml
├── bing-shopping.xml
├── facebook-catalog.csv
└── pinterest-catalog.csv

# URLs submitted to platforms:
https://{domain}/feeds/google-merchant.xml
https://{domain}/feeds/bing-shopping.xml
https://{domain}/feeds/facebook-catalog.csv
https://{domain}/feeds/pinterest-catalog.csv

9.7 Step 7 — Platform Account Setup

For each enabled channel, create the platform merchant account and submit the feed URL. See Section 8.2 for the detailed checklist per platform. The sequence is always:

  1. Create merchant/business account on the platform
  2. Verify domain ownership (HTML meta tag, DNS TXT record, or file upload)
  3. Install tracking pixel/tag on all site pages (Google Tag, Meta Pixel, Pinterest Tag, UET Tag)
  4. Configure shipping and tax settings
  5. Submit feed URL for scheduled fetching (daily recommended)
  6. Wait for initial processing (Google: ~30 min, Bing: up to 3 days, Meta: ~1 hour, Pinterest: ~24 hours)
  7. Review diagnostics for disapprovals and fix any issues

9.8 Onboarding Checklist (Copy Per Site)

Timeline Expectation: Steps 1-5 (portal side) can be completed in one session if products are already loaded. Steps 6-7 (production + platform accounts) depend on domain availability and platform verification timelines. Budget 1-2 weeks for all platforms to fully process and approve a new feed.

10. Data Quality & Sanitization Rules

Product data in the portal database often contains HTML entities, formatting artifacts, and inconsistent whitespace that would pollute feed output. The feed generator applies automatic sanitization to every text field before writing it to any feed format. These rules are enforced in code and documented here so they are consistently applied across all sites.

10.1 Text Sanitization Pipeline

Every text field (title, description, category, brand) passes through the sanitize_for_feed() function before being written to any feed output. The pipeline runs in this exact order:

  1. Strip HTML tags — Remove all HTML tags (<strong>, <em>, <br>, etc.). Feed platforms require plain text and will reject or misrender HTML.
  2. Decode HTML entities — Convert all numeric and named entities to their UTF-8 characters:
    EntityCharacterCommon Source
    &#8243;″ (double prime / inch mark)WordPress smart quotes on measurements like 4″
    &#8217;’ (right single quote / apostrophe)WordPress smart apostrophes in possessives
    &#8220; / &#8221;“ / ” (smart double quotes)WordPress content editor
    &nbsp;(non-breaking space)Rich text editors, copy-paste from Word
    &amp;&Double-encoded ampersands
    &#8211;– (en dash)WordPress auto-typography
    &#8212;— (em dash)WordPress auto-typography
  3. Normalize whitespace — Collapse all runs of spaces, tabs, newlines, and non-breaking spaces into a single space character.
  4. Trim — Remove leading and trailing whitespace.
Why This Matters: Raw HTML entities in feed descriptions cause two problems: (1) Google sees &#8243; as literal text rather than an inch mark, hurting relevance matching, and (2) platform validation may flag descriptions containing HTML as malformed. The sanitizer runs automatically — no manual cleanup needed per product.

10.2 Description Length Rules

Each platform has minimum and maximum description length requirements. Descriptions that are too short get flagged or reduce product visibility. The feed generator enforces these rules automatically:

RuleThresholdGenerator Behavior
Short description under minimum< 50 charactersFalls back to full_description (truncated to 5,000 chars)
Full description availableAny lengthUsed as fallback; sanitized and truncated
Custom channel description setAny lengthTakes priority over both short and full descriptions
No description at all0 charactersProduct still included but may be disapproved by platform

Description Cascade Priority

1. custom_description (per-channel override from Distribution tab)
      ↓ if NULL
2. short_description (if ≥ 50 characters after sanitization)
      ↓ if under 50 chars
3. full_description (truncated to 5,000 characters)
      ↓ if also empty
4. Empty string (product may be disapproved)

Platform Minimum Recommendations

PlatformMinimumRecommendedMaximum
Google ShoppingNone (but penalizes short)150–500 chars5,000 chars
Bing ShoppingNone150–500 chars10,000 chars
Meta CommerceNone (flags < 30 chars)100–500 chars9,999 chars
PinterestNone100–500 chars10,000 chars

10.3 Image Validation Rules

The feed generator enforces image requirements at the product level. These rules ensure no feed entry is submitted without the required image data.

RuleGenerator Behavior
Product has no images at allProduct excluded from all feeds (silently skipped)
Product has images but no primary flagFalls back to hero role, then lowest sort_order
Image path is relative (e.g., images/product.jpg)Prepends https://{site_domain}/ automatically
Image path is already absolute URLUsed as-is
Additional images availableUp to 10 included per product in all feed formats

Image URL Construction

# Relative path in database:
images/gallery/air-shock-hero.jpg

# Constructed feed URL:
https://patriotchassis.com/images/gallery/air-shock-hero.jpg

# Resolution priority for primary image:
1. is_primary = 1 flag on portal_product_images row
      ↓ if no primary flag set
2. role = 'hero' on any image row
      ↓ if no hero role
3. Lowest sort_order value (first image uploaded)

10.4 Price Validation

ConditionGenerator Behavior
price_type != 'fixed'Product excluded (quote-based items cannot have feed prices)
price_cents IS NULLProduct excluded
price_cents = 0Product included but will likely be disapproved — platforms reject $0 products
Valid priceFormatted as XX.XX USD (2 decimal places, ISO currency code, no $ symbol)

10.5 Identifier Fallback Logic

# Identifier resolution for each product:
IF gtin IS NOT NULL → output g:gtin
IF mpn IS NOT NULL  → output g:mpn
IF both NULL        → output g:identifier_exists = false

# Brand fallback:
IF brand IS NOT NULL → use brand
ELSE                 → use site_name from portal_sites
ELSE                 → "Unknown"
Custom Fabrication Note: Most automotive fabrication products (chassis, custom brackets, weld-on kits) legitimately have no GTIN or MPN. Setting identifier_exists=false is the correct approach — not inventing fake identifiers. Google and Bing explicitly support this for custom/handmade products. However, if you later obtain UPCs (e.g., from GS1 for high-volume shippable items), adding them will improve ranking.

10.6 Data Quality Audit Query

Run this query against any site to identify feed-readiness gaps before generating feeds. Replace ? with the site_id.

SELECT
  COUNT(*) as total_products,
  SUM(CASE WHEN status IN ('approved','live') THEN 1 ELSE 0 END) as feed_eligible,
  SUM(CASE WHEN price_type = 'fixed' AND price_cents IS NOT NULL THEN 1 ELSE 0 END) as has_price,
  SUM(CASE WHEN gtin IS NOT NULL AND gtin != '' THEN 1 ELSE 0 END) as has_gtin,
  SUM(CASE WHEN mpn IS NOT NULL AND mpn != '' THEN 1 ELSE 0 END) as has_mpn,
  SUM(CASE WHEN weight_lbs IS NOT NULL THEN 1 ELSE 0 END) as has_weight,
  SUM(CASE WHEN LENGTH(short_description) >= 50 THEN 1 ELSE 0 END) as desc_adequate,
  SUM(CASE WHEN LENGTH(short_description) < 50 THEN 1 ELSE 0 END) as desc_thin
FROM portal_products
WHERE site_id = ? AND active = 1;

-- Image coverage:
SELECT p.id, p.name, COUNT(i.id) as image_count
FROM portal_products p
LEFT JOIN portal_product_images i ON i.product_id = p.id
WHERE p.site_id = ? AND p.active = 1
GROUP BY p.id
HAVING image_count = 0;
When to Run: Run this audit (a) when products are first loaded into the portal, (b) before the first feed generation for a new site, and (c) monthly as part of the ongoing maintenance cycle. The queries run in under 1 second on databases with up to 10,000 products.

Appendix A: Quick Reference

Feed Field Matrix — At a Glance

FieldGoogle XMLMeta CSVPinterest CSVBing XML
Product IDg:idididg:id
Titleg:titletitletitleg:title
Descriptiong:descriptiondescriptiondescriptiong:description
Product URLg:linklinklinkg:link
Image URLg:image_linkimage_linkimage_linkg:image_link
Priceg:pricepricepriceg:price
Availabilityg:availabilityavailabilityavailabilityg:availability
Brandg:brandbrandbrandg:brand
Conditiong:conditionconditionconditiong:condition
Categoryg:google_product_categorygoogle_product_categorygoogle_product_categoryg:google_product_category
In Stock Valuein_stockin stockin stockin_stock

Image Requirements — At a Glance

PlatformMinimumRecommendedPreferred Ratio
Google Shopping800 x 8001200 x 12001:1 (square)
Bing Shopping220 x 220800 x 8001:1 (square)
Meta Commerce600 x 6001024 x 10241:1 (square)
Pinterest800 x 8001000 x 15002:3 (vertical)
Amazon1000 x 10002000 x 20001:1 (square)
eBay500 x 5001600 x 16001:1 (square)

Appendix B: Database Schema Reference

All feed distribution tables live in the jj_wordpress database (or the site-specific database for the current DevHub user) alongside the other portal_ tables. The schema is designed for multi-site operation — every table references portal_sites.id or portal_products.id as the site/product foreign key.

B.1 portal_feed_channels (Master Channel Registry)

Seeded with 10 channels. Rarely modified after initial creation. Shared across all sites.

ColumnTypeNotes
idINT AUTO_INCREMENT PKReferenced by all other feed tables
channel_keyVARCHAR(50) UNIQUEgoogle-shopping, bing-shopping, facebook-instagram, pinterest, etc.
labelVARCHAR(100)Display name: "Google Shopping", "Facebook & Instagram"
categoryENUM('search','social','marketplace','affiliate')Groups channels in UI
feed_formatVARCHAR(50)google-xml, bing-xml, meta-csv, pinterest-csv, custom
format_shared_withVARCHAR(50) NULLchannel_key this mirrors (e.g., bing → google)
iconVARCHAR(10) NULLEmoji for UI display
base_urlVARCHAR(255) NULLPlatform dashboard URL for quick access
phaseTINYINT DEFAULT 11 = built now, 2 = future (dimmed in UI)
activeTINYINT(1) DEFAULT 1Soft-disable a channel system-wide
sort_orderINT DEFAULT 0Display order within category
created_atDATETIME

B.2 portal_site_channels (Per-Site Channel Config)

Which channels are enabled for each site, plus platform-specific credentials.

ColumnTypeNotes
idINT AUTO_INCREMENT PK
site_idINT FK → portal_sites
channel_idINT FK → portal_feed_channels
enabledTINYINT(1) DEFAULT 1Toggle this channel on/off for the site
merchant_idVARCHAR(100) NULLGoogle Merchant ID, Meta Catalog ID, etc.
feed_urlVARCHAR(255) NULLPublic URL where feed is served
configJSON NULLChannel-specific config (rare for Phase 1)
UNIQUE(site_id, channel_id)

B.3 portal_product_channels (Per-Product Channel Assignments)

The checkbox data — which products go on which channels, with optional per-channel overrides.

ColumnTypeNotes
idINT AUTO_INCREMENT PK
product_idINT FK → portal_products
channel_idINT FK → portal_feed_channels
enabledTINYINT(1) DEFAULT 1Toggle this product on/off for this channel
custom_titleVARCHAR(255) NULLOverride title for this channel
custom_descriptionTEXT NULLOverride description for this channel
custom_categoryVARCHAR(255) NULLPlatform-specific category path
UNIQUE(product_id, channel_id)

B.4 portal_feed_generations (Generation History/Log)

Every feed generation event is logged here for audit trail and monitoring.

ColumnTypeNotes
idINT AUTO_INCREMENT PK
site_idINT FK → portal_sites
channel_idINT FK → portal_feed_channels
feed_formatVARCHAR(50)e.g., google-xml, meta-csv
filenameVARCHAR(255)Output file path
product_countINT DEFAULT 0Products actually included (after image/validation skip)
file_size_bytesINT NULL
statusENUM('generating','success','error')
error_messageTEXT NULL
generated_byINT NULL FK → portal_users
started_atDATETIME
completed_atDATETIME NULL

B.5 Seed Data (10 Channels)

| channel_key        | label                       | category    | feed_format   | phase |
|--------------------|-----------------------------|-------------|---------------|-------|
| google-shopping    | Google Shopping              | search      | google-xml    | 1     |
| bing-shopping      | Bing / Microsoft Shopping   | search      | bing-xml      | 1     |
| facebook-instagram | Facebook & Instagram        | social      | meta-csv      | 1     |
| pinterest          | Pinterest                   | social      | pinterest-csv | 1     |
| youtube-shopping   | YouTube Shopping             | social      | google-xml    | 2     |
| tiktok-shop        | TikTok Shop                 | social      | google-xml    | 2     |
| ebay-motors        | eBay Motors                 | marketplace | custom        | 2     |
| amazon-auto        | Amazon Automotive           | marketplace | custom        | 2     |
| walmart            | Walmart Marketplace         | marketplace | custom        | 2     |
| shareasale         | ShareASale                  | affiliate   | custom        | 2     |

B.6 Related Schema Modifications

Appendix C: API Endpoint Reference

All feed distribution APIs follow the same patterns as other portal APIs: JSON request/response, same database config (portal/api/config.php), same error format.

C.1 Portal API — Product Channel Assignments

File: /portal/api/product-channels.php

MethodParametersDescription
GET?product_id=NReturns all channels with enabled state for this product (LEFT JOINs portal_product_channels on portal_feed_channels)
PUT?product_id=NBulk save channel assignments. Body: { channels: [{channel_id, enabled, custom_title, custom_description, custom_category}] }. Uses INSERT ON DUPLICATE KEY UPDATE. Auto-updates distribution section status.
GET?site_id=N&summary=1Returns product count per channel for a site (for dashboard stats)

C.2 Hub API — Channel Management

File: /hub/api/feed-channels.php

MethodParametersDescription
GET(none)Returns all channels from portal_feed_channels
GET?site_id=NReturns channels with site-specific enabled state, product counts, and last-generated timestamps
PUT?site_id=NBulk update site-channel config. Body: { channels: [{channel_id, enabled, merchant_id, feed_url, config}] }

C.3 Hub API — Feed Generation

File: /hub/api/feed-generate.php

MethodParametersDescription
POSTBody: { site_id, channel_id }Triggers feed generation for a specific channel+site. Validates channel phase and site existence. Determines output directory from site slug. Logs to portal_feed_generations.
GET?site_id=NReturns latest generation status per channel for dashboard

C.4 Hub API — Generation History

File: /hub/api/feed-history.php

MethodParametersDescription
GET?site_id=NPaginated generation history (most recent first)
GET?site_id=N&latest=1Latest generation per channel (for dashboard stat cards)

C.5 Feed Generator Engine (Internal)

File: /hub/api/feed-generator.php — included by feed-generate.php, never called directly via HTTP.

FunctionOutput FileChannels
generate_google_xml($site_id, $channel_id, $output_dir)google-merchant.xmlGoogle Shopping
generate_bing_xml($site_id, $channel_id, $output_dir)bing-shopping.xmlBing / Microsoft Shopping
generate_meta_csv($site_id, $channel_id, $output_dir)facebook-catalog.csvFacebook & Instagram
generate_pinterest_csv($site_id, $channel_id, $output_dir)pinterest-catalog.csvPinterest

Helper Functions

FunctionPurpose
sanitize_for_feed($text)Strip HTML, decode entities, normalize whitespace
get_channel_products($site_id, $channel_id)Query eligible products with channel overrides and site info
get_product_title($product)custom_title → product name (sanitized)
get_product_description($product)custom_description → short_description (if ≥ 50 chars) → full_description (sanitized, truncated to 5000)
get_product_category($product)custom_category → product category (sanitized)
get_product_image_url($product)is_primary → hero role → lowest sort_order
get_additional_images($product_id)Up to 10 non-primary images
build_image_url($product, $file_path)Resolve relative path to absolute URL using site domain
format_price_feed($cents)Convert cents to XX.XX USD
map_availability_google($availability)Portal status → Google/Bing format
map_availability_meta($availability)Portal status → Meta/Pinterest format
log_feed_generation(...)Write entry to portal_feed_generations

C.6 .htaccess Allowlist

The Hub API directory uses a deny-by-default .htaccess. The following feed-related files are explicitly allowed:

<Files "feed-channels.php">
    Require all granted
</Files>

<Files "feed-generate.php">
    Require all granted
</Files>

<Files "feed-history.php">
    Require all granted
</Files>

feed-generator.php is intentionally NOT in the allowlist — it is an internal include file and must never be accessible via HTTP.

Appendix D: Sources & References

Feed Specifications

Automotive Standards

Platform Setup & Validation

Related Binding Protocol Documents

DominionPort Product Distribution & Feed Management

Version 1.1 — February 2026

This document serves as the binding protocol for all product distribution and feed management across all DominionPort sites.