Multi-view feed
New integrations
As of May 2021, all new integrations are required to use API based catalog feed management to send data and perform index updates.
If you are a B2B customer or a customer operating in multiple markets, Bloomreach recommends that you use a multi-view feed. The purpose of a multi-view feed is to allow you to customize data for specific views without having to repeat large chunks of data. This effectively simulates in the API having multiple individual catalogs with less overhead. The integrations team will advise you on which type of feed is most appropriate for your needs.
XML feed templates
<Products xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- This flat file format is commonly used for catalogs that do not have 'variant' items -
ie. cd / dvd, home, diy tools
This format is not suitable for fashion catalogs where products will often have size and color based variants.
In XML optional fields do not need to be declared if that product record has no value for that field.
This format can be used as a TSV feed where the element names simply become the values for the header row.
*** MULTISITE or B2B SPECIFIC *****
<view_id> must be declared for each product record, choose a common 'view separating character' such as ^ to differentiate views.
View specific fields must also use the same view separating character to differentiate the values per view. These values must be ordered to match their respective view in the view_id field.
Example:
<view_id>gb^ie^au</view_id><price>55.99^63.99^84.99</price>
Represents prices of gb = 55.99, ie = 63.99 and au = 84.99
view_id can be used either for multisite (views are markets / websites) or B2B (views are the same site, but different price lists) but NOT both.
Delta feed has 2 rules for view_id:
1. view_id, pid, availability are the minimum required fields.
2. fields with view specific values must always be reported with all view values
You cannot only update a value in a single view.
-->
<Product>
<!-- Mandatory Fields -->
<availability>true | false OR 'in stock' | 'out of stock' OR 'actual stock count'</availability>
<pid>Product ID -- Each PID is one slot on the API response</pid>
<title>The name of the product</title>
<thumb_image>Fully qualified URL of product thumbnail</thumb_image>
<url>Fully qualified URL of product page</url>
<description>Full description of product</description>
<crumbs>Category names, | separated at each node, and ; separated for different chains</crumbs>
<crumbs_id>Category IDs, | separated at each node, and ; separated for different chains</crumbs_id>
<view_id/>
<price>RRP of product</price>
<sale_price>Current active price</sale_price>
<!-- Optional Fields -->
<size>Size of product - text based field </size>
<color>Color of product - can be multi-valued</color>
<material>Material type of product</material>
<gender/>
<pattern/>
<keywords>Any keywords associated to product - | or , separated is normal</keywords>
<reviews>Star rating - numeric data only</reviews>
<review_count>How many reviews logged - numeric data only</review_count>
</Product>
<!-- Example Product -->
<Product>
<!-- Mandatory Fields -->
<availability>true</availability>
<pid>585864</pid>
<title>Ryobi Cordless Drill</title>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/585864.jpg</thumb_image>
<url>https://example.co.uk/product/585864</url>
<description>This Ryobi cordless combi drill is the perfect tool for diy'ers and professionals alike. With multiple speed and torque settings no job is too tough. Additionally due its lightweight and large battery capacity (4 hours of continuous usage) this drill can keep doing all day.</description>
<crumbs>home|tools and equipment|newin;home|tools and equipment|drills</crumbs>
<crumbs_id>1|197|211;1|197|221</crumbs_id>
<view_id>gb^ie</view_id>
<price>80.99^90.99</price>
<sale_price>64.99^70.99</sale_price>
<!-- Optional Fields -->
<size/>
<color>Green|Black</color>
<material/>
<gender/>
<pattern/>
<keywords> Drill, Combi Drill, Cordless</keywords>
<reviews>4.5</reviews>
<review_count>65</review_count>
<weight_kg>1.1</weight_kg>
<battery_life>4 hours</battery_life>
</Product>
<Product>
<!-- Mandatory Fields -->
<availability>true</availability>
<pid>585865</pid>
<title>Ryobi Corded Drill</title>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/585865.jpg</thumb_image>
<url>https://example.co.uk/product/585865</url>
<description>This Ryobi corded combi drill is the perfect tool for diy'ers and professionals alike. With multiple speed and torque settings no job is too tough. </description>
<crumbs>home|tools and equipment|newin;home|tools and equipment|drills</crumbs>
<crumbs_id>1|197|211;1|197|221</crumbs_id>
<view_id>gb^ie^au</view_id>
<price>80.99^90.99^120.99</price>
<sale_price>64.99^70.99^85.99</sale_price>
<!-- Optional Fields -->
<size/>
<color>Green|Black</color>
<material/>
<gender/>
<pattern/>
<keywords>Drill, Combi Drill, Corded</keywords>
<reviews>4.5</reviews>
<review_count>65</review_count>
<weight_kg>1.1</weight_kg>
</Product>
</Products>
<Products xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- This variant based format is usually required for fashion catalogs where size and color versions of products exist.
This format is also to applicable to any catalog where a product is configurable in a dimension or pack size that effects pricing.
In XML optional fields do not need to be declared if that product record has no value for that field.
This format can be used as a TSV feed where the element names simply become the values for the header row.
Values declared within the <product> section will be applied to all variants. Product section requires unique <pid> values.
Values declared within the <variant> tag will be applied to that specific variant only. Variant section requires unique <skuid> values.
If a value is declared at <product> level - it should always be done so for all records.
If a value is declared at <variant> level - it should always be done so for all records.
This ensures that the mapping for the product feed can collapse back to a simple XSD - which ensures consistent, faster processing and expected outputs in the API
The two most common reporting methods are -
Option 1 - Rolled Up Products
<pid> = style / master id. There is 1 product in the API response regardless of total number of size / color variants.
<skuid> = size AND color id. Often this directly equals the ecommerce sku id. Size M Red, Size L Red, Size M Blue - are all unique entries in the variants array.
Option 2 - Color Split Products
<pid> = the specific Color and Style Id. If a tshirt had 3 different colors, it is reported as three different products in the feed and displays as 3 different products in the API...
<skuid> = Size ID. This again is usually directly equal to the ecommerce sku id. The difference to option is that all variants are the same color, and that other colors are reported in different <product> records.
<availability> must always be reported at the variant level to track variant stock status.
<view_id> is normally reported per <variant> this lets you exclude certain variants per view (market / price list).
<view_id> can only be reported at <product> level if all products in the feed have universal fulfillment and never have different variant availability per view.
*** MULTISITE or B2B SPECIFIC *****
<view_id> must be declared for each product record, choose a common 'view separating character' such as ^ to differentiate views.
View specific fields must also use the same view separating character to differentiate the values per view. These values must be ordered to match their respective view in the view_id field.
Example:
<view_id>gb^ie^au</view><price>55.99^63.99^84.99</price>
Represents prices of gb = 55.99, ie = 63.99 and au = 84.99
view_id can be used either for multisite (views are markets / websites) or B2B (views are the same site, but different price lists) but NOT both.
Delta feed has 2 rules for view_id:
1. view_id, pid, skuid, availability are the minimum required fields.
2. all variant information must always be recorded in full
a) This allows you to put variants in and out of stock
b) Report in full to ensure that view_id information is always correctly updated.
You cannot only update a single 'view' or 'variant' in this feed type.
-->
<Product>
<!-- Mandatory Fields -->
<pid>Product ID -- Each PID is one slot on the API response</pid>
<title>The name of the product</title>
<url>Fully qualified URL of product page</url>
<description>Full description of product</description>
<crumbs>Category names, | separated at each node, and ; separated for different chains</crumbs>
<crumbs_id>Category IDs, | separated at each node, and ; separated for different chains</crumbs_id>
<!-- In variants array you report attributes that will change by variant.
Some clients have different prices for variants - so price moves there,
for other variants do not change prices so should stay at pid level -->
<variants>
<variant>
<skuid>Unique ID for variant 1</skuid>
<availability>true | false OR 'in stock' | 'out of stock' OR 'actual stock count'</availability>
<view_id>site 1 ^ site 2 ^ etc</view_id>
<color>Color of item</color>
<price>RRP of variant</price>
<sale_price>Current variant price</sale_price>
<size>Available sizes</size>
<thumb_image>Specific variant image</thumb_image>
<swatch_image>URL or hex code for color swatch</swatch_image>
</variant>
<variant>
<skuid>Unique ID for variant 2</skuid>
<availability>true | false OR 'in stock' | 'out of stock' OR 'actual stock count'</availability>
<view_id>site 1 ^ site 2 ^ etc</view_id>
<color>Color of variant</color>
<price>RRP of variant</price>
<sale_price>Current variant price</sale_price>
<size>Available sizes</size>
<thumb_image>Specific variant image</thumb_image>
<swatch_image>URL or hex code for color swatch</swatch_image>
</variant>
</variants>
<material>Material type of product</material>
<gender/>
<pattern/>
<keywords>Any keywords associated to product - | or , separated is normal</keywords>
<reviews>Star rating - numeric data only</reviews>
<review_count>How many reviews logged - numeric data only</review_count>
</Product>
<!-- Example Product -->
<Product>
<!-- Mandatory Fields -->
<pid>585864</pid>
<title>Skinny Check Tuxedo Trousers</title>
<url>https://example.co.uk/product/585864</url>
<description>Looking for a modern, edgy take on the traditional tuxedo, then look no further than these delightful skinny check trousers. Available in a range of colors to truly stand out!</description>
<crumbs>home|mensclothing|newin;home|mensclothing|suits;home|mensclothing|trousersandchinos;home|mensclothing|allmens</crumbs>
<crumbs_id>1|197|211;1|197|221;1|197|223;1|197|254</crumbs_id>
<!-- Variants array - noting price can be different for different colors.
Example below assumes price has been reduced for the blue check trousers as they are least popular color -->
<variants>
<variant>
<skuid>58564-blue-8-r</skuid>
<availability>true</availability>
<view_id>gb^au^ie</view_id>
<size_type>Regular</size_type>
<color>Blue</color>
<price>80.99^70.99^95.00</price>
<sale_price>65.00^70^80</sale_price>
<size>8^AU8^EU8</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-blue.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/blue.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-blue-10-r</skuid>
<availability>true</availability>
<view_id>gb^au</view_id>
<size_type>Regular</size_type>
<color>Blue</color>
<price>80.99^70.99</price>
<sale_price>65.00^70</sale_price>
<size>10^10</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-blue.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/blue.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-blue-8-t</skuid>
<availability>true</availability>
<view_id>gb^au^ie</view_id>
<size_type>Tall</size_type>
<color>Blue</color>
<price>80.99^70.99^95.00</price>
<sale_price>65.00^70^80</sale_price>
<size>8^AU8^EU8</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-blue.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/blue.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-blue-10-t</skuid>
<availability>true</availability>
<view_id>gb^au</view_id>
<size_type>Tall</size_type>
<color>Blue</color>
<price>80.99^70.99</price>
<sale_price>65.00^70</sale_price>
<size>10^10</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-blue.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/blue.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-red-8-r</skuid>
<availability>true</availability>
<view_id>gb^au^ie</view_id>
<size_type>Regular</size_type>
<color>Red</color>
<price>80.99^70.99^95.00</price>
<sale_price>80.99^70.99^95.00</sale_price>
<size>8^AU8^EU8</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-red.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/red.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-red-10-r</skuid>
<availability>true</availability>
<view_id>gb^au</view_id>
<size_type>Regular</size_type>
<color>Red</color>
<price>80.99^70.99</price>
<sale_price>80.99^80</sale_price>
<size>10^10</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-red.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/red.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-red-8-t</skuid>
<availability>true</availability>
<view_id>gb^au^ie</view_id>
<size_type>Tall</size_type>
<color>Red</color>
<price>80.99^70.99^95.00</price>
<sale_price>80.99^70.99^95.00</sale_price>
<size>8^AU8^EU8</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-red.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/red.jpg</swatch_image>
</variant>
<variant>
<skuid>58564-red-10-t</skuid>
<availability>true</availability>
<view_id>gb^au</view_id>
<size_type>Tall</size_type>
<color>Red</color>
<price>80.99^70.99</price>
<sale_price>80.99^80</sale_price>
<size>10^10</size>
<thumb_image>https://example.co.uk/Common/Items/Default/Default/ItemImages/AltItemThumb/58586-red.jpg</thumb_image>
<swatch_image>https://example.co.uk/swatching/red.jpg</swatch_image>
</variant>
</variants>
<!-- additional values can then be reported at PID level again, if they are the same for all variants -->
<material>Cotton</material>
<gender>Men</gender>
<pattern>Checked</pattern>
<keywords> Check Trousers, Tuxedo Trousers, Skinny Tuxedo Trousers, Tuxedo Sale</keywords>
<reviews>4.5</reviews>
<review_count>65</review_count>
</Product>
</Products>
View ID field
The view ID allows Bloomreach to filter the catalog to only show the products and versions of products that you want a particular site visitor or subsite within your account to see. Multi-view feeds are required to include a view_id field, which must always be declared with values. Values must be separated using a special character such as ^.
The values for view_id should be consistent across the feed, API, and pixel. B2B customers will normally provide an alphanumeric ID to represent their users catalogs. For multi market customers, we recommend using ISO 3166 country codes.
Multi-view field values
In addition to declaring view_id, you need to decide which of your other fields will contain view specific information. View specific values must be provided in the same order as the view IDs declared in the view_id field. Once you have made a field view specific, it must always be view specific in the feed.
<product>
<pid>1</pid>
<view_id>ac1^ac2^ac3</view_id>
<price>25^30^30</price>
<sale_price>20^25^30</sale_price>
</product>
This product has three view IDs: ac1, ac2, and ac3. The following table contains the prices and sale prices for each view:
View ID | Price | Sale price |
---|---|---|
ac1 | 25 | 20 |
ac2 | 30 | 25 |
ac3 | 30 | 30 |
Variants in multi-view feeds
If your catalog has variants, such as SKUs, you will have to declare view_id values for each variant. This allows you to include or exclude certain variants for different views.
Read more details about variants in the feed templates above.
Designing multi-view feeds for multimarket accounts
For multimarket accounts, multi-view feeds can get more complicated as many product attributes can change between different territories, such as sizes, definitions, urls, and prices. Before creating your feed, you should first decide which fields and values need to be view specific, and identify ways to avoid complicating the feed.
For URL and image URLs
Consider declaring only the URL and image URLs for the main market. You could then drop the domain from the URLs in your API response, keeping them relative to the local market view.
You could also create fields for “rel_url” and “rel_image”, which are the URL and image URL respectively minus the domains and market subfolders if they exist. In your API, you would use rel_url and rel_image in place of url and image.
Once you have decided which fields need to be view specific, we suggest placing the view specific fields inside the variants section of your product feed. This allows you to inform the API that certain sizes or colours are only in stock for specific markets. You must also inform the Bloomreach integrations team which fields you have decided to be view specific so that the correct handling of these fields can be set during feed processing.
Multi-view delta feeds
For multi-view delta feeds, you must include the following fields:
- view_id
- pid
- skuid
- availability
You must also include all variant information, that is, all product variants and view specific values. You cannot only update a single view value or variant.
Updated about 1 year ago