FeedMender/Errors/Price and currency
Common rejections
Price and currency
The price attribute looks simple and is one of the more exacting fields in the specification. A comma in the wrong place, a missing three-letter code, or a sale price that is not actually lower are all enough to change what Google does with the product.
What Google requires
A number, a point, and a currency
Google expects a price written with a point as the decimal separator and no thousands separator, with
the ISO 4217 currency code, for example 119.95 EUR. The sale_price, when
present, has to be in the same currency as price and lower than it, and a
sale_price_effective_date is exactly two ISO 8601 dates, start before end. Where a product
is sold on subscription, the subscription cost carries its own required shape, and the presence of a
subscription makes google_product_category mandatory, the one place that otherwise optional
attribute is required.
What happens if you do not
Silent repricing, or a disapproval
A comma decimal is the dangerous one, because it is ambiguous rather than merely wrong.
1.234 is one thousand two hundred and thirty-four in continental notation and one and a
bit in English, and nothing in the file settles which. Read the wrong way, a catalogue is repriced by a
factor of a thousand without a single error message. A missing currency code, a
sale_price in the wrong currency, or a subscription with a malformed cost tends to produce
a disapproval instead: the product stops being shown until the field is corrected. A sale price that is
not lower than the price is quieter again, the product still serves, but the strikethrough sale
annotation is lost.
How to fix it by hand
Format first, then the relationships
- Replace comma decimals with points, and remove any thousands separators, so
1.234,56becomes1234.56. - Append the ISO 4217 currency code to every price and sale price, matched to the country you sell in.
- Leave a genuinely ambiguous value such as
1.234alone until you know its intended magnitude; do not guess it into either reading. - Confirm each
sale_priceshares the currency of itspriceand is lower, and that any sale window contains a sale price. - Where a subscription cost is present, add a valid
google_product_categoryand check the period, length and amount are well formed.
Which of our checks apply
The price fields FeedMender reads
These are read straight from the scanner's own registry. Each names the attribute it inspects and the severity we assign it.
price_formatprice, blocksprice_missingprice, blocksprice_unparseableprice, blocksprice_zeroprice, blocksloyalty_price_in_price_fieldprice, at risksale_price_formatsale_price, blockssale_price_currency_mismatchsale_price, blockssale_price_not_lowersale_price, at risksale_window_without_sale_pricesale_price_effective_date, at risksale_price_effective_date_formatsale_price_effective_date, blockssale_price_effective_date_partssale_price_effective_date, blockssale_price_effective_date_reversedsale_price_effective_date, blocksunit_pricing_measure_formatunit_pricing_measure, blocksunit_pricing_unit_mismatchunit_pricing_base_measure, blocks
The price, sale-price and subscription checks together form the Prices and currency family on the full checks list; the unit-pricing checks are filed there under EU compliance, since that is where the pricing directive lives.
The quicker way
Let the scan find them
Working through prices by hand is exactly the kind of repetitive checking a scan does in one pass, without repricing anything by guesswork. The free scan lists every price fault it finds against the product it belongs to before you decide anything.