El software de gestión de gastos vive o muere por una sola cifra: el total convertido que tu equipo de finanzas ve en la moneda base de la empresa. Si te equivocas en el tipo de cambio para la gestión de gastos aunque sea por una fracción de un punto porcentual, cada recibo en moneda extranjera se desincroniza de tu libro contable, tus reembolsos pagan de más o de menos a los empleados, y tu conciliación de fin de mes se convierte en una búsqueda manual de céntimos. Esta guía explica cómo construir correctamente una capa de gastos multidivisa con una API de tipos de cambio, incluida la regla que separa un conversor de juguete de un sistema que tus auditores aceptarán de verdad.
Si estás creando una herramienta de gastos, una plataforma de tarjetas corporativas, una función de viajes y gastos (T&E) o simplemente añadiendo captura de recibos a un producto existente, la lógica de conversión de divisas es engañosamente complicada. El enfoque ingenuo —llamar a un endpoint de "tipos actuales" y multiplicar— produce números que parecen correctos en una demo y se desmoronan en producción. Hagámoslo bien.
Por qué la gestión de gastos necesita una API de tipos de cambio
Un flujo de gastos moderno rastrea a un empleado que gasta en una moneda, una empresa que reporta en otra y, a veces, un reembolso pagado en una tercera. Un consultor con base en Berlín vuela a Tokio, paga un hotel en JPY, trabaja para una empresa que reporta en USD y recibe el reembolso en una cuenta bancaria en EUR. Tres monedas, un recibo.
Codificar tipos de cambio fijos o pedir a los empleados que conviertan manualmente no es viable. La conversión manual es propensa a errores, invita al fraude de gastos mediante el "rate shopping" y crea brechas de conciliación en el momento en que un tipo se mueve. Herramientas como Expensify, Ramp y Zoho Expense obtienen automáticamente los tipos de cambio precisamente porque los tipos obsoletos o manuales introducen imprecisiones que complican la conciliación.
Una API de tipos de cambio resuelve esto dándote acceso programático a tipos precisos para cualquier fecha y cualquier par de divisas, de modo que la conversión ocurre automáticamente en el momento en que se captura un recibo y permanece consistente para siempre.
Las tres monedas que todo sistema de gastos debe rastrear
Antes de escribir una línea de código, modela tus datos en torno a tres roles de moneda distintos:
- Moneda de la transacción: aquella en la que el empleado pagó realmente (la moneda impresa en el recibo o cargada a la tarjeta). Almacénala siempre, intacta, junto con el importe original.
- Moneda base / de reporte: la moneda funcional de tu empresa, usada para el libro mayor, los informes y los presupuestos. Cada gasto se convierte a esta para las consolidaciones.
- Moneda de reembolso: la que recibe el empleado. A menudo es la misma que la moneda de la transacción (la mejor práctica, para que el empleado no asuma ninguna pérdida cambiaria), pero a veces es su moneda de nómina local.
El pecado capital es destruir el original. Nunca sobrescribas el importe de la transacción con un valor convertido. Almacena el importe y la moneda originales de forma permanente, y luego calcula las conversiones como valores derivados. Esto preserva la pista de auditoría y te permite volver a generar informes si alguna vez se corrige un tipo.
La regla crítica: usa el tipo de la fecha de la transacción, no el de hoy
Esta es la regla que la mayoría de los tutoriales de "conversor de divisas" se equivocan y que hará que falles una auditoría: debes convertir cada recibo usando el tipo de cambio que estaba vigente en la fecha de la transacción, no el tipo de hoy.
No es una preferencia estilística. Es un requisito de los dos marcos contables principales. Según la NIC 21 (IFRS), una transacción en moneda extranjera se registra inicialmente aplicando el tipo de cambio al contado en la fecha de la transacción. Según la ASC 830 (US GAAP), cada activo, pasivo, ingreso o gasto se registra en la moneda funcional usando el tipo de cambio vigente en esa fecha. En ambas normas, la fecha de la transacción determina el tipo, no una fecha de contabilización posterior ni "cuando se envió el informe".
Por qué los tipos en vivo rompen tu contabilidad
Imagina que un empleado paga una cena de 500 € el 15 de marzo, envía el informe de gastos el 20 de abril y tu sistema lo convierte usando el tipo del 20 de abril. Si EUR/USD se movió un 2 % en esas cinco semanas, tu gasto reportado está ahora equivocado en 10 $ frente a lo que realmente se cargó en el extracto de la tarjeta corporativa. Multiplica eso por miles de recibos y tu submayor de gastos ya no cuadra con tu flujo bancario. La conciliación se convierte en una pesadilla y tus auditores lo señalan.
La solución es sencilla: llama a un endpoint de tipos históricos con la fecha de la transacción del recibo. Así se ve con Finexly:
curl "https://api.finexly.com/v1/historical?date=2026-03-15&base=JPY&symbols=USD&apikey=YOUR_KEY"{
"success": true,
"base": "JPY",
"date": "2026-03-15",
"rates": {
"USD": 0.006712
}
}Conviertes el recibo con el tipo del 2026-03-15, almacenas ese tipo en el registro del gasto y el número no vuelve a cambiar nunca, exactamente lo que necesitan tus contables. Para profundizar en el manejo de fechas y las consultas de series temporales, consulta nuestra guía de la API de tipos de cambio históricos.
Construir la capa de conversión
Construyamos la función de conversión central. Las entradas clave son el importe original, la moneda de la transacción, tu moneda base y, fundamentalmente, la fecha de la transacción.
Python: convertir un recibo al tipo de la fecha de la transacción
import requests
from datetime import date
FINEXLY_KEY = "YOUR_KEY"
def convert_receipt(amount, from_currency, to_currency, txn_date):
"""Convert a receipt amount using the rate on the transaction date."""
if from_currency == to_currency:
return round(amount, 2), 1.0
url = "https://api.finexly.com/v1/historical"
params = {
"date": txn_date.isoformat(),
"base": from_currency,
"symbols": to_currency,
"apikey": FINEXLY_KEY,
}
resp = requests.get(url, params=params, timeout=5)
resp.raise_for_status()
rate = resp.json()["rates"][to_currency]
converted = round(amount * rate, 2)
return converted, rate
# A ¥48,000 hotel in Tokyo on March 15, reported in USD
converted, rate = convert_receipt(48000, "JPY", "USD", date(2026, 3, 15))
print(f"Converted: ${converted} at rate {rate}")
# Store BOTH the converted value AND the rate on the expense recordObserva que la función devuelve también el tipo, además del importe convertido. Persistir el tipo junto al gasto es lo que hace que la conversión sea reproducible y auditable meses después.
JavaScript: la misma lógica en Node.js
async function convertReceipt(amount, from, to, txnDate) {
if (from === to) return { converted: Number(amount.toFixed(2)), rate: 1 };
const url = new URL("https://api.finexly.com/v1/historical");
url.search = new URLSearchParams({
date: txnDate, // "2026-03-15"
base: from,
symbols: to,
apikey: process.env.FINEXLY_KEY,
});
const res = await fetch(url);
if (!res.ok) throw new Error(`Finexly ${res.status}`);
const data = await res.json();
const rate = data.rates[to];
return { converted: Number((amount * rate).toFixed(2)), rate };
}Almacenar en caché los tipos diarios para mantener velocidad y bajo coste
Los tipos históricos de una fecha dada nunca cambian, lo que los hace perfectamente cacheables. Cuando importas un lote de recibos, agrúpalos por fecha y par de divisas para obtener cada tipo una sola vez en lugar de por recibo. Una caché simple (fecha, base, símbolo) -> tipo, en Redis o incluso en una tabla de base de datos, elimina llamadas redundantes y te mantiene cómodamente dentro de los límites de tu plan. Para patrones de caché y manejo de fallos de nivel de producción, consulta nuestra guía sobre mejores prácticas de caché y manejo de errores en APIs.
rate_cache = {}
def get_cached_rate(from_currency, to_currency, txn_date):
key = (txn_date.isoformat(), from_currency, to_currency)
if key not in rate_cache:
_, rate = convert_receipt(1, from_currency, to_currency, txn_date)
rate_cache[key] = rate
return rate_cache[key]Manejar los recargos de tarjetas corporativas y las comisiones por transacción extranjera
Hay un matiz que confunde a los equipos que concilian gastos alimentados por tarjeta: el tipo de un extracto de tarjeta corporativa no es el tipo medio del mercado. Las redes de tarjetas aplican su propio tipo de cambio más una comisión por transacción extranjera, frecuentemente en el rango del 1 al 3 %. Así que la cifra que publica Visa o Mastercard diferirá ligeramente del tipo medio del mercado que devuelve tu API.
Tienes dos opciones sólidas:
- Para transacciones alimentadas por tarjeta, confía en el importe que la red de tarjetas realmente cobró en tu moneda base. El extracto de la tarjeta es la fuente de verdad para el dinero que ya se movió: no lo vuelvas a convertir. Usa el tipo de la API solo para mostrar al empleado una comparación informativa con el tipo medio del mercado.
- Para recibos de bolsillo (en efectivo) que se reembolsarán a un empleado, el tipo medio del mercado de tu API en la fecha de la transacción es la base justa y defendible para el reembolso.
Ser explícito sobre qué tipo se aplica a cada tipo de gasto evita los tickets de soporte del estilo "¿por qué esto no coincide con mi factura de la tarjeta?" que plagan las implementaciones ingenuas. El tipo medio del mercado es el punto medio honesto, y puedes leer más sobre por qué importa en nuestra guía de integración con software de contabilidad.
Informes multidivisa y conciliación
Una vez que cada gasto lleva un valor en moneda base almacenado y el tipo utilizado, los informes se vuelven sencillos. Las consolidaciones, el seguimiento del presupuesto y los resúmenes por departamento operan sobre la columna en moneda base precalculada, sin conversión en vivo en el momento del informe, lo que significa que los informes son rápidos y nunca cambian porque un tipo se haya movido.
Un registro de gasto limpio se ve así:
{
"expense_id": "exp_8842",
"original_amount": 48000,
"original_currency": "JPY",
"base_amount": 322.18,
"base_currency": "USD",
"rate_used": 0.006712,
"rate_date": "2026-03-15",
"rate_source": "finexly:historical"
}Cada campo que un auditor podría preguntar —qué se pagó, en qué moneda, a cuánto se convirtió, a qué tipo, en qué fecha, de qué fuente— queda registrado. Esta es la diferencia entre un sistema de gastos que escala internacionalmente y uno que genera crisis de fin de mes.
Lista de verificación de arquitectura para gastos multidivisa
Antes de lanzar, verifica tu implementación con esta lista:
- Almacena el importe y la moneda originales de forma inmutable: nunca sobrescribas con un valor convertido.
- Convierte usando el tipo de la fecha de la transacción, obtenido de un endpoint histórico, no el tipo de hoy.
- Persiste el tipo y la fecha del tipo en cada registro de gasto para la auditabilidad.
- Cachea los tipos por (fecha, par) para mantener la velocidad y respetar los límites del plan.
- Distingue los importes alimentados por tarjeta de los reembolsos de bolsillo y aplica la fuente de tipo correcta a cada uno.
- Maneja el caso de la misma moneda sin una llamada a la API (tipo = 1).
- Falla con elegancia: si una obtención de tipo falla, pon el recibo en cola en lugar de bloquear el envío, y rellena el tipo después.
- Elige una API que cubra todas las monedas en las que tus empleados puedan gastar: una plantilla global te sorprenderá con monedas exóticas.
Finexly cubre más de 170 monedas con datos tanto en tiempo real como históricos, que es exactamente la cobertura que necesita una herramienta de gastos global. A medida que crece tu volumen de transacciones, los planes de precios escalan contigo sin forzar una reescritura de la arquitectura.
Preguntas frecuentes
¿Qué tipo de cambio debe usar un informe de gastos, el de la fecha de la transacción o el de la fecha de envío? Siempre el de la fecha de la transacción. Tanto las IFRS (NIC 21) como los US GAAP (ASC 830) exigen registrar una transacción en moneda extranjera al tipo al contado vigente en la fecha en que ocurrió la transacción. Usar la fecha de envío o de aprobación distorsionará el gasto y romperá la conciliación con los extractos de la tarjeta.
¿Por qué el importe convertido no coincide exactamente con mi extracto de tarjeta corporativa? Las redes de tarjetas aplican su propio tipo de cambio más una comisión por transacción extranjera (a menudo del 1 al 3 %), por lo que diferirán del tipo medio del mercado que devuelve una API. Para los gastos alimentados por tarjeta, trata el importe que la tarjeta realmente cobró como la fuente de verdad; usa el tipo de la API solo para una comparación informativa con el tipo medio del mercado.
¿Cómo manejo los reembolsos para que los empleados no pierdan dinero por el cambio? Reembolsa en la misma moneda en que gastó el empleado siempre que sea posible, para que no asuma ninguna pérdida por conversión. Si debes reembolsar en su moneda de nómina local, convierte al tipo medio del mercado de la fecha de la transacción y revela el tipo usado en el comprobante de reembolso.
¿Puedo convertir miles de recibos históricos de forma eficiente? Sí. Los tipos históricos de una fecha pasada son fijos y cacheables. Agrupa los recibos por fecha y par de divisas, obtén cada tipo único una sola vez y almacénalo. Esto te mantiene rápido y cómodamente dentro de los límites de la API incluso al importar grandes lotes.
¿Necesito tipos en tiempo real para la gestión de gastos? Normalmente no para la conversión central: los tipos históricos (de cierre diario) son la base correcta y auditable. Los tipos en tiempo real son útiles para mostrar a los empleados una estimación instantánea en el momento de la captura, pero el registro oficial debe usar el tipo de la fecha de la transacción liquidado.
Empieza ahora
¿Listo para añadir soporte multidivisa preciso y listo para auditoría a tu herramienta de gastos? Obtén tu clave gratuita de la API de Finexly: sin tarjeta de crédito. Empieza con 1.000 solicitudes gratuitas al mes, obtén tipos en tiempo real e históricos para más de 170 monedas y amplía a medida que crece tu volumen de transacciones. Tu equipo de finanzas, y tus auditores, te lo agradecerán.
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 →