Skip to content
Published Authored byBilly Reiner

Glossary · Defined term

Shopify currency format (the money format)

Shopify's currency format, which theme developers call the money format, is a short template string such as ${{amount}}. Shopify swaps the placeholder for the price and prints the result wherever a theme uses a money filter3. There are four format fields and eight placeholders1. There is also one limit that international stores run into sooner or later: the setting only formats your base currency.

Shopify documents this in two halves. The Help Center covers the admin setting and shopify.dev covers the Liquid filters. This page puts both on one screen, then explains what changes once you sell in more than one currency.

Definition

Shopify's currency format is the store setting that controls how prices print: the currency symbol, the thousands and decimal separators, and whether decimals show. You change it under Settings > General > Store defaults > Change currency formatting, and Liquid's money filters read it.

A format string is plain text with one placeholder in double curly braces. Everything around the placeholder prints as written, so {{amount_with_comma_separator}} € turns a price of 1134.65 into 1.134,65 €. The placeholder decides the separators and the rounding. The text around it decides the symbol, where it sits, and whether a currency code follows1.

Where to change the currency format

In the Shopify admin, go to Settings > General. In the Store defaults section, open the ⋯ menu and choose Change currency formatting. Edit the fields and click Save. The mobile app uses the same path.

The dialog holds four format strings1. Two drive the storefront and two drive email:

FieldUsed forRead by
HTML with currencyOnline storemoney_with_currency
HTML without currencyOnline storemoney, money_without_currency, money_without_trailing_zeros
Email with currencyNotifications and Shopify Order Printer templatesNotification templates
Email without currencyNotifications and Shopify Order Printer templatesNotification templates

Older tutorials describe a Store currency section with a Change formatting link. In the admin as Shopify documents it today, the link sits under Store defaults.

The eight placeholders

Shopify accepts eight placeholders. Each one prints the same price, 1,134.65, with different separators, and three of them round to whole units.

PlaceholderPrintsRounded
{{amount}}1,134.65No
{{amount_no_decimals}}1,135Yes
{{amount_with_comma_separator}}1.134,65No
{{amount_no_decimals_with_comma_separator}}1.135Yes
{{amount_with_apostrophe_separator}}1'134.65No
{{amount_no_decimals_with_space_separator}}1 135Yes
{{amount_with_space_separator}}1 134,65No
{{amount_with_period_and_space_separator}}1 134.65No

Rounding goes half up: a decimal part of 50 or more rounds up, anything under 50 rounds down1. Seventeen currencies start on amount_no_decimals by default, among them JPY, KRW, ISK, CLP and VND. You can switch any of them to another placeholder.

Checkout ignores the decimals part of your choice. Whatever format you pick, Shopify's checkout always shows decimal places, so a storefront price of 1,135 can still read 1,134.65 at checkout.

The four money filters

Four Liquid filters print a price through the store's format. All four take an amount in the currency's subunit, so a product.price of 1000 means $10.00 in a USD store.

FilterFormat field it readsOutput for 1000
money3HTML without currency$10.00
money_with_currency4HTML with currency$10.00 CAD
money_without_currency5HTML without currency, symbol removed10.00
money_without_trailing_zeros6HTML without currency, zero decimals dropped$10
Liquid The same price through each filter
{{ product.price | money }}                          → $10.00
{{ product.price | money_with_currency }}            → $10.00 CAD
{{ product.price | money_without_currency }}         → 10.00
{{ product.price | money_without_trailing_zeros }}   → $10

money_without_trailing_zeros only removes zeros. A price of 10.50 prints as $10.50, exactly as money would print it6.

Shopify's advice on when to show the currency code: cart and checkout totals always get it, so nobody is unsure what they are paying in. Itemized, unit and installment prices leave it off, because the surrounding context makes the currency clear2. Themes usually hand the choice to the merchant with a checkbox setting:

Liquid Merchant-controlled currency code, per shopify.dev
{% if settings.currency_code_enable %}
  {{ product.price | money_with_currency }}
{% else %}
  {{ product.price | money }}
{% endif %}

Markets and other currencies

The format only applies to your base currency. In Shopify's words: 'If you're using multiple currencies, then these settings won't affect how other currencies are displayed.' What does follow the customer is the amount, because Liquid price objects come out in the customer's local currency.

product.price, product.compare_at_price and cart.total_price are all expressed in the subunit of the customer's local (presentment) currency78. For currencies with no subunit, Shopify appends two digits, so 1000 yen arrives in Liquid as 100000. The money filters handle that. Any arithmetic you write yourself has to handle it too.

Two objects look alike and aren't. shop.currency is the store's base currency11. cart.currency is the cart's currency, which on a multi-currency store is the customer's local one8. The difference matters most in structured data. Shopify's theme docs say priceCurrency should reflect the cart currency, not the shop's9:

Liquid Inside Product JSON-LD: the currency the shopper actually sees
"priceCurrency": {{ cart.currency.iso_code | json }},

The json filter adds the quotes, so this prints "EUR" for a shopper paying in euros. A theme that writes shop.currency here instead can pair a euro amount with a USD code on every page a euro shopper sees. If you sell into more than one market, check your structured data from a localized URL, not just the default one.

Price rounding is a different control. It changes the converted price itself, rounding it to the most common price ending for that currency, while the format only changes how a price is written. Rounding is set per market in the Markets settings and is only offered to stores on Shopify Payments in supported countries10. The same Markets setup drives the alternate URLs your theme emits, which is covered in hreflang on Shopify.

If your theme updates prices in JavaScript (a variant picker or a cart drawer, say), you'll find the format string in shop.money_format11. That string is your base-currency format. For shoppers in other currencies it's safer to let Liquid render the price on the server and fetch the finished HTML than to rebuild the formatting in the browser.

Common currency format mistakes

Most currency bugs on Shopify come from mixing up the layers: the format writes the price, Markets converts it, and checkout overrides the decimals.

  • Editing only the HTML fields. Order confirmations and other notifications read the two Email fields, so they keep the old format until you change those as well1.
  • Expecting whole prices at checkout. {{amount_no_decimals}} rounds the storefront, and checkout still shows decimals.
  • Feeding a decimal to a money filter. The filters expect subunits, so a number metafield that stores 19.99 is read as 19.99 cents. Convert it to cents before formatting.
  • Typing a currency symbol into a template. A literal $ next to money_without_currency is wrong for everyone who isn't paying in dollars.
  • Changing the format to fix a foreign currency. The settings don't touch other currencies, so the edit does nothing for your euro or yen market.

The currency format sits between the theme's Liquid and the store's Markets setup.

  • Liquid: the template language the four money filters belong to.
  • Structured data: where priceCurrency has to match the price the shopper sees.
  • International domains: one sitemap and one Search Console property per market domain.
  • Shopify API key: the credential names you'll meet if you change prices through the Admin API instead of the admin.