Template
Pinterest catalog feed template
Pinterest ingests a product data source once a day and rejects the whole file if a required field is missing or misnamed. This page is the template: the required fields with their limits, the optional fields that turn rows into good product Pins, example rows from four stores, a CSV to download, and a plan to keep the hosted file current from your own catalog.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Required fields: id, title, description, link, image_link, price and availability, plus item_group_id when a product has variants. A missing or misnamed required field fails the entire catalog.
- The main image must be at least 1000 × 1500 pixels; Pinterest is portrait-first, so square product shots that pass Google and Meta are rejected here.
- availability uses in stock, out of stock or preorder; price is numeric with an optional ISO 4217 currency and no zero values.
- Accepted formats are TSV, CSV, XML (RSS 2.0 or Atom 1.0) and Google Sheets, UTF-8, hosted on an HTTP(S), FTP or SFTP URL that Pinterest fetches daily.
- We set up Textfinity's Pinterest channel template, which pre-fills the field names, and publish the file on a stable URL the daily fetch can read.
What goes in a Pinterest catalog feed template
Pinterest's data source spec names eight required fields and insists they be spelled exactly as listed. The limits are generous on text (a title may run to 500 characters, a description to 10,000) and strict on images. The table is the required set plus the identifiers and categories Pinterest uses for matching and for the shopping tab.
| Column | Requirement | Limit / format | Example |
|---|---|---|---|
| id | Required | Max 127 characters, unique | SOFA-220-BE |
| title | Required | Max 500 characters | Linen 3-Seater Sofa, Beige, 220 cm |
| description | Required | Max 10,000 characters, plain text, no HTML | Solid beech frame with removable washable linen covers. |
| link | Required | Max 511 characters, starts with http | https://store.example/products/linen-sofa-220 |
| image_link | Required | Max 2,000 characters; image at least 1000 × 1500 px | https://cdn.example/sofa-220-beige-portrait.jpg |
| price | Required | Numeric, optional ISO 4217 code, no zero, no symbol | 1199.99 USD |
| availability | Required | in stock, out of stock, preorder | in stock |
| item_group_id | Required when a product has variants | Max 127 characters, same across variants | SOFA-220 |
| brand | Optional | Max 100 characters | Nordhem |
| google_product_category | Optional | Google taxonomy path or ID | Furniture > Sofas |
| product_type | Optional | Up to five levels, 1,000 characters total | Living room > Sofas > 3-seater |
| gtin | Optional | UPC, EAN, JAN or ISBN | 7350012345678 |
| mpn | Optional | Max 70 alphanumeric characters | SOFA-220-BE |
| condition | Optional | new, used, refurbished | new |
Field names and limits from Pinterest's Before you get started with catalogs help page, checked 2026-10-27.
Optional fields that make product Pins and shopping ads work
The optional group is where Pinterest differs from other channels: portrait images, alt text, a video field with a 2 GB limit, free-shipping labels that render on the Pin, and five custom labels at 511 characters each for building product groups in ads. Variant attributes are short (30 characters) so write Navy, not a sentence.
| Column | Use | Limit / format | Example |
|---|---|---|---|
| color / size / material / pattern | Variant attributes | Max 30 characters each | Beige / 220 cm / Linen / Solid |
| gender / age_group | Apparel targeting | male, female, unisex / adult, kids… | unisex / adult |
| sale_price | Discounted price | Numeric, below price | 999.99 USD |
| additional_image_link | Up to 10 more images | Each at least 75 × 75 px | https://cdn.example/sofa-220-side.jpg |
| video_link | Product video | .mp4, .mov or .m4v, max 2 GB | https://cdn.example/sofa-220.mp4 |
| alt_text | Accessibility and matching | Plain text | Beige linen three-seater sofa in a bright living room |
| shipping / tax / shipping_weight | Checkout details | Per Pinterest format | US::Standard:49.00 USD |
| free_shipping_label / free_shipping_limit | Free-shipping badge | TRUE / threshold | TRUE / 500.00 USD |
| custom_label_0 … custom_label_4 | Product groups in ads | Max 511 characters each | bestseller |
| custom_number_0 … custom_number_4 | Numeric groups (margin, stock) | Integer 0 to 4294967295 | 42 |
| excluded_destination | Hide from a surface | shopping ads, free listings | free listings |
| ad_link | Tracked URL for ads | URL | https://store.example/products/linen-sofa-220?utm_source=pinterest |
Pinterest product feed template: CSV, TSV, XML or Google Sheets
Pinterest reads TSV, CSV, XML (RSS 2.0 or Atom 1.0) and Google Sheets. Files must be UTF-8 and can be compressed, but not encrypted or password-protected, and not hosted on Dropbox. For a hosted data source the URL is HTTP(S), FTP, SFTP or WebDAV on port 80 or 443, with no IP allow-listing on your side. Pinterest fetches it once every 24 hours; there is no on-demand fetch, and manually uploaded files must be re-uploaded within 30 days or products stop distributing organically. The CSV from the download below starts like this:
pinterest-catalog.csv
id,title,description,link,image_link,price,availability,item_group_id,brand,google_product_category
SOFA-220-BE,"Linen 3-Seater Sofa, Beige, 220 cm","Solid beech frame with removable washable linen covers.",https://store.example/products/linen-sofa-220,https://cdn.example/sofa-220-beige-portrait.jpg,1199.99 USD,in stock,SOFA-220,Nordhem,Furniture > SofasFixing the two things Pinterest rejects that other channels accept
Image size is the first. Pinterest wants a main image of at least 1000 × 1500 pixels, taller than wide, and will not display a 800 × 800 product shot that Google and Meta accept without comment. Most stores have a lifestyle or portrait image somewhere in the gallery; the fix is a mapping rule that picks it. In Textfinity that is a rename from a second image attribute, a merged Google Sheet of portrait URLs keyed on SKU, or a conditional mapping that falls back to the main image when no portrait exists. Pinterest also caches images by URL, so a replaced photo needs a new URL to be picked up.
The whole-file failure is the second. One misnamed header, such as Image Link or price_usd, fails the entire catalog rather than the row. The channel template in Textfinity writes the exact field names; the feed hygiene profile then shows per-column completeness so you see before the fetch that, say, 14% of items have no description, which would also fail ingestion.
Examples
Worked examples, by situation
Four stores, four Pinterest rows, each with the rule that produces it from the store's own data.
Portrait image from the gallery
Before
Handle,Image Src,Image Position linen-sofa-220,https://cdn.example/sofa-220-square.jpg,1 linen-sofa-220,https://cdn.example/sofa-220-portrait.jpg,3
After
id,image_link,additional_image_link SOFA-220-BE,https://cdn.example/sofa-220-portrait.jpg,https://cdn.example/sofa-220-square.jpg
How we set it up
image_link is one conditional rule: image_url_3 matches regexp ^\s*$ → rename the main image, otherwise rename image_url_3, the third gallery image. additional_image_link is a rename of the main image so nothing is lost. Shopify's versioned image URLs change when a photo is replaced, which is what Pinterest needs.
Variants with 30-character attributes
Before
sku,parent,title,colour,size DRS-2210-BLK-M,DRS-2210,Linen Wrap Dress,Black / Midnight (seasonal),M
After
id,item_group_id,title,color,size DRS-2210-BLK-M,DRS-2210,"Linen Wrap Dress, M",Black,M
How we set it up
replace from regexp on color: \s*/.*$ → empty, which trims the store's "Black / Midnight (seasonal)" to the 30-character limit. item_group_id is a rename of parent; the title is combine (title, size). Each column reads the raw source, so putting colour in the title would bring back the long store value; trim it in the store or a merged sheet if the title should carry it.
Free-shipping badge from the price
Before
sku,name,price VAS-33,Stoneware Vase 33 cm,54.00 LMP-02,Rattan Floor Lamp,189.00
After
id,price,free_shipping_label,free_shipping_limit VAS-33,54.00 USD,FALSE,75.00 USD LMP-02,189.00 USD,TRUE,75.00 USD
How we set it up
free_shipping_label is an advanced rule: if calc{[price]} >= 75 then "TRUE" else "FALSE" (calc{} reads the number in the price; the plugin export names the column price, because advanced expressions cannot read a name with a space such as Regular price); free_shipping_limit is add static value "75.00 USD". The badge renders on the Pin without any change in the store.
Sale price in the catalog's currency
Before
sku,name,price_gbp,promo_price SER-30,Vitamin C Serum 30 ml,29.00,23.20
After
id,title,price,sale_price,availability SER-30,Vitamin C Serum 30 ml,29.00 GBP,23.20 GBP,in stock
How we set it up
add suffix " GBP" on both price columns; sale_price is a conditional rule: promo_price matches regexp ^\s*$ → leave empty, otherwise add suffix " GBP". The UK catalog is a separate Pinterest data source because country, language and currency are fixed when a source is created, so this is its own feed in Textfinity with a filter on the GB market.
Copy this plan
From template to a catalog Pinterest fetches every day
Six steps. The Pinterest side is creating the data source once; after that the daily fetch does the work.
01
Connect the store
Shopify directly, or a CSV or Google Shopping XML export URL from WooCommerce, Magento, PrestaShop or BigCommerce. Textfinity profiles the columns and shows which image attributes exist.
What we set up: We connect your Shopify store, or read the CSV or XML export URL you send us, and check which image attributes exist.02
Start from the Pinterest channel template
The template creates the required columns with Pinterest's spelling and the optional ones ready to map.
What we set up: We create the feed from the Pinterest channel template.03
Map the required fields
rename for id, link and description; combine for title; add suffix for the currency on price; replace from regexp or advanced for availability. Map item_group_id from the parent product id for anything with variants.
What we set up: We add " USD" to price as a suffix and write availability as an advanced rule.04
Pick a portrait image
Map image_link from the gallery position or metafield that holds a tall image, with the main image as fallback, and put the rest in additional_image_link.
What we set up: We give image_link a condition: where image_url_3 matches regexp ^\s*$ it renames the main image, otherwise image_url_3.05
Filter and check hygiene
Exclude gift cards, items without a description and anything with a zero price, which Pinterest rejects. Run the hygiene profile for URL validity and completeness before the first fetch.
What we set up: We add exclude filters where the source description is blank and where the source price is equal to 0 (product.description and variant.price on Shopify).06
Publish and add the data source in Pinterest
Copy the feed URL. In Pinterest Business Hub: Ads → Catalogs → Add data source → hosted URL, set country, language and currency (these cannot be changed later), and save. Pinterest fetches once a day; diagnostics appear after the first ingestion.
What we set up: We publish the feed and add the hosted URL in your Business Hub with access you give us, or walk you through it on a call.
Customization tips
Make it yours
One data source per country and language
Country and language are locked when a Pinterest data source is created, so a UK and a US catalog are two sources with two feed URLs. Build them as two feeds on one shop in Textfinity, each with a market filter and the right currency suffix, rather than one feed with mixed prices.
Use custom_number for anything you want to sort by
Pinterest's custom_number_0 to 4 take integers, which lets you build product groups by margin band, stock level or days since launch without string tricks. An advanced rule can compute a margin percentage from price and cost: round(calc{([price] - [cost]) / [price] * 100}, 0).
Keep description plain and front-load it
The limit is 10,000 characters but the Pin shows the first line. Put the product type, material and dimensions in the first sentence; strip HTML with remove from regexp since Pinterest treats tags as plain text and shows them.
Do not reuse ids across data sources
Pinterest flags ids that already exist in another of your data sources as errors. If you run a regional feed alongside a main one, prefix the ids per source (uk-SER-30) with add prefix rather than sharing them.
Downloads
Take the files
FAQ
Questions about pinterest catalog feed template
What fields are required in a Pinterest catalog feed?
id, title, description, link, image_link, price and availability for every product, and item_group_id for any product with variants. Pinterest requires the exact field names; a missing or misnamed required field fails ingestion of the whole catalog rather than the single row.
What image size does Pinterest need for product Pins?
The main image_link must be at least 1000 × 1500 pixels, taller than wide, reachable by Pinterest's crawler and not a placeholder. Additional images only need 75 × 75 pixels. If you replace an image, change its URL, or Pinterest keeps showing the cached one.
What file formats does Pinterest accept for a product feed?
TSV, CSV, XML in RSS 2.0 or Atom 1.0 form, and Google Sheets, all UTF-8. Compressed files are fine; encrypted, password-protected or Dropbox-hosted files are not. A hosted file lives on an HTTP(S), FTP, SFTP or WebDAV URL on port 80 or 443.
How often does Pinterest update a catalog feed?
A hosted data source is fetched once every 24 hours; there is no on-demand refresh. A manually uploaded file is processed at upload and must be refreshed within 30 days or its products stop showing organically. Up to 20 million products per data source and 50 data sources per account after the first is approved.
Set up for you
Have us host a Pinterest catalog feed from your store
Send us your store or export URL. We map the eight required columns and a portrait image once, and Textfinity keeps the URL current for Pinterest's daily fetch.
Tell us your store and channels. We reply within 24 hours.