Checkout Multimoeda no Shopify: Guia Completo para Desenvolvedores 2026
Se você está construindo uma loja Shopify — ou um app que serve uma — o checkout multimoeda deixou de ser opcional. Compradores internacionais esperam ver preços na própria moeda desde a página do produto até o botão final "Pagar agora". Quando essa experiência quebra, os abandonos de carrinho sobem, chargebacks aumentam e os tickets de suporte se acumulam. Este guia mostra como o sistema multimoeda do Shopify realmente funciona, onde suas ferramentas nativas param, e como conectar uma API de câmbio dedicada como a Finexly para preencher as lacunas.
Seja você construindo um storefront headless, um app Shopify personalizado ou ajustando um tema Liquid em uma loja Shopify Plus madura, este guia cobre as decisões de arquitetura, integrações de API e casos limite que separam um checkout multimoeda que funciona de um que silenciosamente perde receita.
Por que o checkout multimoeda importa no Shopify em 2026
O e-commerce internacional já representa fatia significativa do varejo online. Compradores que caem em um produto com preço em moeda estrangeira — ou pior, na moeda deles mas com conversões malfeitas — abandonam o checkout muito mais. A fricção não é só psicológica: transações em moeda estrangeira disparam taxas bancárias, totais inesperados e até alertas de fraude.
Estudos de conversão mostram consistentemente o mesmo padrão: lojas que apresentam preços em moeda local, respeitam convenções de arredondamento e cobram nessa moeda convertem materialmente melhor que lojas monomoeda. O esforço técnico antes era grande — hoje resume-se a algumas chamadas de API e uma boa estratégia de atualização de taxas.
Entendendo shop currency vs. presentment currency
O modelo multimoeda do Shopify gira em torno de dois conceitos:
- Shop currency — a moeda base que o lojista usa para preços, relatórios e repasses.
- Presentment currency — a moeda que o comprador vê no storefront, no carrinho e no checkout.
Quando um cliente brasileiro visita uma loja com shop currency USD, o produto pode aparecer como R$ 495,00 (presentment currency) enquanto o Shopify registra internamente a venda a $ 99,00 (shop currency). Pedidos, reembolsos e transações armazenam ambos os valores. Na GraphQL Admin API você os vê como shopMoney e presentmentMoney.
O erro comum é supor que um preço lido da API está sempre em uma delas. Não está. Nas versões recentes, todas as leituras do Refund API usam presentment currency por padrão, e criar uma transação de reembolso sem passar currency explicitamente retorna erro. Regra rígida: sempre leia o código de moeda anexo ao valor.
Opções nativas do Shopify (e onde elas param)
Duas funcionalidades principais:
1. Shopify Payments com conversão automática. Se sua loja é elegível, você habilita várias presentment currencies e o Shopify converte com taxas atualizadas a cada 15 minutos aproximadamente. Uma pequena taxa de conversão (1,5–2%) é aplicada e o arredondamento por moeda é tratado.
2. Taxas manuais via Shopify Markets. Você define as taxas e o Shopify aplica:
converted_price = (product_price × conversion_rate) × (1 + conversion_fee)Essas opções cobrem o básico, mas ficam aquém em vários cenários:
- Storefronts headless. Com Storefront API, Hydrogen ou frontend próprio, você precisa de dados de taxa mais ricos (históricos, cross-rates, casos não-pagamento como faturamento de fornecedores).
- Lojistas sem Shopify Payments. Stripe, PayPal, Adyen ou processadores locais não têm pipeline automático.
- Lógica de preço customizada. Marketplaces, B2B com tiers, promoções localizadas.
- Apps que agem pós-checkout. Sync contábil, antifraude, fidelização e agregadores precisam normalizar pedidos multimoeda contra uma moeda de reporte — com taxas históricas confiáveis ao timestamp exato.
Em todos esses casos, é preciso uma API de câmbio dedicada junto ao Shopify.
Quando usar uma API externa de câmbio
Regra prática: se algo abaixo for verdade, adote uma API externa como a Finexly:
- Você opera storefront headless ou híbrido e precisa de acesso programático a taxas vivas.
- Você suporta moedas não autoconvertidas pelo Shopify Payments na sua região.
- Você constrói apps que processam pedidos históricos e precisam da taxa exata no momento do pedido.
- Você quer exibir preços em moedas sem se comprometer a cobrar nelas.
- Você precisa de atualizações mais rápidas que os 15 minutos do Shopify.
Mais contexto na nossa comparação de APIs de câmbio e no artigo sobre REST vs WebSocket para dados FX.
A Finexly fornece taxas em tempo real e históricas para mais de 170 moedas via uma interface REST limpa, sem taxas ocultas embutidas nas cotações.
Construindo um checkout multimoeda com Finexly e Shopify
Arquitetura mínima:
- Detecte a moeda do comprador — por geolocalização, locale do navegador ou seletor explícito.
- Busque a taxa atual na Finexly (cacheada no edge, atualizada a cada poucos minutos).
- Converta preços — aplicando regras de arredondamento e margem.
- No checkout, passe a presentment currency para que o pedido seja criado na moeda correta.
- Armazene a taxa usada como metadado do pedido para conciliação.
Passo 1: Buscar a taxa atual na Finexly
Node.js:
// Fetch live rates from Finexly
async function getRates(base = 'USD') {
const url = `https://api.finexly.com/v1/latest?base=${base}&apikey=${process.env.FINEXLY_KEY}`;
const res = await fetch(url);
if (!res.ok) throw new Error(`Finexly error: ${res.status}`);
const data = await res.json();
return data.rates; // { EUR: 0.9234, GBP: 0.7891, JPY: 151.42, ... }
}Python:
import os, requests
def get_rates(base="USD"):
url = "https://api.finexly.com/v1/latest"
params = {"base": base, "apikey": os.environ["FINEXLY_KEY"]}
r = requests.get(url, params=params, timeout=5)
r.raise_for_status()
return r.json()["rates"]cURL para teste rápido:
curl "https://api.finexly.com/v1/latest?base=USD&apikey=YOUR_KEY"Em produção, envolva em uma camada de cache — Redis, Cloudflare KV ou cache em processo com TTL de 60–300 s. Veja nosso guia de cache e tratamento de erros.
Passo 2: Converter preços no storefront
function convertPrice(amountInBase, rate, roundingRule = 0.99) {
const raw = amountInBase * rate;
return Math.floor(raw) + roundingRule;
}
const rates = await getRates('USD');
const eurPrice = convertPrice(49.00, rates.EUR, 0.99);
// => e.g., 45.99Passo 3: Repassar ao checkout do Shopify na moeda correta
Com a Storefront API, passe a presentment currency ao criar o cart. No GraphQL Cart API, buyerIdentity.countryCode dirige qual presentment currency é aplicada:
mutation CreateCart {
cartCreate(input: {
buyerIdentity: { countryCode: BR }
lines: [{ merchandiseId: "gid://shopify/ProductVariant/123", quantity: 1 }]
}) {
cart { id checkoutUrl
cost { totalAmount { amount currencyCode } }
}
}
}O Shopify então mostra preços na presentment currency apropriada, e o checkoutUrl cobra nessa moeda — desde que seu gateway esteja configurado.
Em storefront clássico (não-headless) você não cria carts via API. Use o app de Geolocation ou o parâmetro ?currency=EUR. Filtros Liquid como {{ product.price | money }} respeitam a presentment currency ativa.
Passo 4: Armazenar a taxa usada com cada pedido
await admin.graphql(`
mutation AddRateMetafield($orderId: ID!, $rate: String!, $ts: String!) {
orderUpdate(input: {
id: $orderId
metafields: [
{ namespace: "fx", key: "rate", value: $rate, type: "single_line_text_field" }
{ namespace: "fx", key: "rate_timestamp", value: $ts, type: "single_line_text_field" }
{ namespace: "fx", key: "source", value: "finexly", type: "single_line_text_field" }
]
}) { order { id } userErrors { field message } }
}
`, { variables: { orderId, rate: String(rates.EUR), ts: new Date().toISOString() } });O "você do futuro" agradecerá quando três meses depois um contador perguntar por que o total EUR do pedido #10042 não bate com USD × taxa atual.
Exibindo preços convertidos: Liquid vs Headless
Liquid (temas clássicos)
<!-- Respects presentment currency -->
<p class="price">{{ product.price | money }}</p>
<!-- Explicit formatting -->
<p class="price">{{ product.price | money_with_currency }}</p>Headless (Hydrogen, Next.js, custom)
// app/lib/fx.ts - server-side rate fetcher with caching
export async function getFxRates(base = 'USD') {
const res = await fetch(
`https://api.finexly.com/v1/latest?base=${base}&apikey=${process.env.FINEXLY_KEY}`,
{ next: { revalidate: 120 } }
);
return res.json();
}
export default async function Product({ params }) {
const [product, fx] = await Promise.all([
getProduct(params.handle),
getFxRates('USD'),
]);
const userCurrency = getUserCurrency();
const displayPrice = product.priceUsd * fx.rates[userCurrency];
return <ProductView product={product} price={displayPrice} currency={userCurrency} />;
}Veja nosso tutorial de conversor de moedas em Next.js.
Lidando com as partes difíceis: arredondamento, taxas, frescor
Regras de arredondamento. Iene japonês não tem decimais. Franco suíço arredonda tradicionalmente ao 0,05 mais próximo. Clientes esperam preços terminados em ,99 ou ,95:
const ROUNDING = {
JPY: (v) => Math.round(v),
CHF: (v) => Math.round(v * 20) / 20,
default: (v) => Math.floor(v) + 0.99,
};
function round(value, currency) {
return (ROUNDING[currency] || ROUNDING.default)(value);
}Margem de conversão. Sem Shopify Payments, adicione uma margem pequena (1–3%) à taxa exibida para cobrir o spread do processador. Explícita e configurável por mercado.
Frescor da taxa. Taxas se movem. Durante anúncios de bancos centrais, podem variar 1–2% em minutos. A Finexly atualiza a cada 60 s; com edge cache de 2 minutos você tem preços quase ao vivo. Veja lidando com volatilidade cambial.
Rastreando e conciliando pedidos multimoeda
Três abordagens:
- Taxa no momento do pedido — fiel à realidade econômica.
- Taxa no momento do payout — condiz com o que chegou ao seu banco.
- Taxa média mensal — mais suave para contabilidade; via endpoint histórico da Finexly.
curl "https://api.finexly.com/v1/historical/2026-03-15?base=USD&apikey=YOUR_KEY"
curl "https://api.finexly.com/v1/timeseries?start=2026-03-01&end=2026-03-31&base=USD&symbols=EUR&apikey=YOUR_KEY"Times financeiros preferem #1 para reconhecimento de receita e #2 para conciliação de caixa. Armazene ambos.
Armadilhas comuns
- Cachear taxas para sempre. 24 horas é demais. TTL de 5–10 minutos com circuit breaker.
- Confiar no cliente. Nunca calcule preço final só em JavaScript — revalide no servidor ou em Shopify Function.
- Arredondar só o total. Arredonde por linha para evitar "total não bate com soma dos itens".
- Esquecer reembolsos. Em reembolso multimoeda, passe
currencyexplicitamente. - Pular observabilidade. Logue todo fetch com fonte, timestamp e latência.
Perguntas frequentes
O Shopify Payments suporta todas as moedas? Não. A lista de presentment currencies é finita e depende da região. Para moedas não suportadas, route por outro processador ou mostre conversões sem cobrar na moeda alvo.
Posso usar a Finexly para dirigir os tipos de conversão do Shopify diretamente? Não diretamente — o Shopify Payments usa fonte interna. Você pode alimentar taxas da Finexly na configuração manual de Markets via Admin API, substituindo efetivamente as taxas automáticas.
Com que frequência atualizar as taxas? Edge cache de 2–5 minutos sobre atualizações por minuto da Finexly é o ponto ideal. Para AOV alto ou margem baixa, 30–60 s; para bens rápidos de AOV baixo, até 15 minutos.
Preciso de API multimoeda se uso Shopify Payments? Em geral sim — para tudo adjacente ao checkout: conciliação contábil, analytics de marketing, faturamento de fornecedores e mercados fora da cobertura do Shopify. Veja nosso guia de integração contábil.
Qual a melhor forma de testar? Use o Bogus Gateway em loja de desenvolvimento, troque seu IP por VPN para simular diferentes países e verifique se confirmação, recibo e Admin mostram valores presentment consistentes. Então teste um reembolso — ali a maioria das integrações quebra silenciosamente.
Entregue mais rápido com a Finexly
O checkout multimoeda no Shopify parece simples por fora e esconde muitos casos limite. Com uma API de câmbio sólida por baixo, a maioria vira padrões conhecidos — cache, arredonde, armazene, concilie.
Pronto para integrar taxas confiáveis na sua loja ou app Shopify? Obtenha sua chave API Finexly gratuita — sem cartão. Comece com 1.000 requisições grátis por mês e escale conforme sua loja cresce.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →