Pagar a un desarrollador en Lagos, a una diseñadora en Buenos Aires y a un redactor en Manila desde un único saldo en USD parece un problema de pagos. No lo es, en realidad. El rail de pago es un commodity ya resuelto. La parte que silenciosamente pierde dinero y genera tickets de soporte es la conversión de divisas en pagos a contratistas internacionales: decidir en qué moneda pagar, qué tipo de cambio aplicar, cuándo fijar esa tasa y cómo almacenarla para que tus cuentas cuadren meses después. Esta guía es para el ingeniero de backend que es dueño del código de pagos y acaba de recibir un ticket como "que los contratistas cobren en su moneda local".
Lo que está en juego es real y va en aumento. Para 2027, se estima que 86,5 millones de personas en EE. UU. trabajarán como freelancers, y se proyecta que la fuerza laboral independiente global alcance los 1.570 millones. Al mismo tiempo, las comisiones ocultas en los pagos transfronterizos pueden inflar los costes un 20–40%: solo las transferencias SWIFT añaden entre 15 y 45 USD por pago más un margen de cambio del 2–4%, y algunas plataformas de freelancers acumulan comisiones de hasta el 10%. La mayor parte de ese margen se esconde en el tipo de cambio. Si controlas tú mismo la capa de conversión con una currency API limpia, controlas el número que más les importa a tus contratistas y a tu equipo financiero.
Por qué los pagos a contratistas son en realidad un problema de datos de divisas
Cuando envías 1.000 USD a un contratista que factura en pesos filipinos, ocurren tres cosas distintas: tu plataforma decide cuántos pesos representan esos 1.000 USD, un proveedor de pagos mueve el dinero y el banco del contratista acredita su cuenta. Solo el paso intermedio es "pagos". El primer paso —la conversión— es un problema de datos, y es del que tu aplicación es responsable.
Si lo haces mal, los modos de fallo son concretos. Muestra a un contratista una estimación de pago de ₱58.000 en tu panel y luego liquida ₱56.200 dos días después porque la tasa se movió, y habrás creado un problema de confianza. Aplica una tasa opaca e inflada y tus contratistas acabarán comparándola con la tasa media de mercado y sentirán que les cobras de más. Si no almacenas la tasa exacta que usaste, tu equipo financiero no podrá conciliar el lote de pagos con tu libro mayor a fin de mes. Cada uno de estos es una decisión sobre el tipo de cambio que toma tu código, de forma deliberada o por accidente.
Las tres decisiones de FX que todo sistema de pagos debe tomar
Antes de escribir código, ten claras tres decisiones. La mayoría de los sistemas de pago con errores los tienen porque una de ellas se tomó de forma implícita.
- ¿En qué moneda pagas? La moneda local del contratista (mejor experiencia, tú asumes el FX), una moneda fuerte como USD o EUR (trasladas el FX a su banco, normalmente a una tasa peor para él) o una stablecoin. Almacena un
payout_currencypor contratista en lugar de asumirlo. - ¿Qué tasa aplicas? La tasa media de mercado es el punto de referencia honesto. Sobre ella puedes añadir un margen transparente para cubrir el diferencial del proveedor. Lo que nunca debes hacer es aplicar una tasa inflada y llamarla "el tipo de cambio".
- ¿Cuándo fijas la tasa? En la aprobación de la factura, en la creación del lote o en la ejecución. El intervalo entre estos momentos es donde muerde la volatilidad. Sea cual sea tu elección, la tasa fijada debe ser la que muestras, la que liquidas y la que almacenas.
Construyendo la capa de conversión, paso a paso
Construyamos el núcleo de un servicio de conversión de pagos. El patrón es el mismo tanto si pagas a un contratista como a diez mil: obtén una tasa fiable, aplica un margen transparente, calcula el importe y persiste la tasa que usaste.
Paso 1: Obtén una tasa media de mercado fiable
Empieza por la tasa base. Aquí tienes una llamada directa a la API de Finexly con cURL:
curl "https://api.finexly.com/v1/latest?base=USD&symbols=PHP,ARS,NGN&apikey=YOUR_API_KEY"Una respuesta típica:
{
"base": "USD",
"timestamp": 1755072000,
"rates": {
"PHP": 58.12,
"ARS": 1287.40,
"NGN": 1531.75
}
}En Python, envuélvela en una pequeña función que devuelva un decimal con el que hacer aritmética monetaria:
import requests
from decimal import Decimal
API_KEY = "YOUR_API_KEY"
def get_rate(base: str, quote: str) -> Decimal:
resp = requests.get(
"https://api.finexly.com/v1/latest",
params={"base": base, "symbols": quote, "apikey": API_KEY},
timeout=10,
)
resp.raise_for_status()
return Decimal(str(resp.json()["rates"][quote]))Usa siempre Decimal, nunca float, para la aritmética de divisas. Los errores de redondeo de coma flotante son invisibles en un pago y muy visibles a lo largo de un lote de 5.000.
Paso 2: Aplica un margen transparente
Si necesitas cubrir el diferencial de un proveedor, añádelo como un recargo explícito y auditable en lugar de esconderlo dentro de la tasa:
def payout_amount(usd_amount: Decimal, base: str, quote: str,
margin_pct: Decimal = Decimal("0.5")) -> dict:
mid = get_rate(base, quote)
applied = mid * (1 - margin_pct / 100) # margin works against the payee
gross = (usd_amount * applied).quantize(Decimal("0.01"))
return {
"mid_market_rate": mid,
"margin_pct": margin_pct,
"applied_rate": applied.quantize(Decimal("0.000001")),
"payout_local": gross,
}Devolver por separado la tasa media de mercado, el margen y la tasa aplicada significa que un contratista (o un auditor) siempre puede ver exactamente cómo se construyó el número. La transparencia aquí es una ventaja competitiva: es lo opuesto a las "comisiones de hasta el 10%" que alejan a los contratistas de las plataformas opacas.
Paso 3: Fija y almacena la tasa
La tasa que muestras en la aprobación debe ser igual a la tasa que liquidas. Persístela en el momento en que la fijas:
quote = payout_amount(Decimal("1000.00"), "USD", "PHP")
# store alongside the payout record
save_payout(
contractor_id=4471,
usd_amount=Decimal("1000.00"),
payout_currency="PHP",
applied_rate=quote["applied_rate"],
mid_market_rate=quote["mid_market_rate"],
locked_at=datetime.utcnow(),
)Esa applied_rate almacenada es el campo más importante de tu tabla de pagos. Es lo que hace que el pago sea auditable, aquello contra lo que concilias y lo que muestras al contratista si pregunta por qué recibió exactamente ese importe.
Convertir todo un lote de pagos de una sola vez
Pagar a los contratistas de uno en uno satura la API e invita a la inconsistencia: dos contratistas del mismo lote obtienen tasas USD/EUR distintas porque sus solicitudes se dispararon con un minuto de diferencia. En su lugar, obtén todas las tasas que necesitas en una sola llamada y aplícalas a todo el lote para que cada pago use la misma instantánea de tasas:
from decimal import Decimal
import requests
def batch_convert(payouts: list[dict], base: str = "USD") -> list[dict]:
symbols = ",".join(sorted({p["currency"] for p in payouts}))
rates = requests.get(
"https://api.finexly.com/v1/latest",
params={"base": base, "symbols": symbols, "apikey": API_KEY},
timeout=10,
).json()["rates"]
out = []
for p in payouts:
rate = Decimal(str(rates[p["currency"]]))
local = (Decimal(str(p["usd"])) * rate).quantize(Decimal("0.01"))
out.append({**p, "rate": rate, "local_amount": local})
return out
run = batch_convert([
{"contractor_id": 4471, "usd": "1000.00", "currency": "PHP"},
{"contractor_id": 5522, "usd": "750.00", "currency": "ARS"},
{"contractor_id": 6033, "usd": "1200.00", "currency": "NGN"},
])Una instantánea de tasas por lote te da una historia de conciliación limpia y defendible: cada pago del lote #8821 usó las tasas capturadas en un único instante. Cuando escalas a miles de pagos por ciclo, este patrón también te mantiene dentro de límites de tasa razonables; consulta los planes de precios para ver los volúmenes de solicitudes que admite cada nivel.
Gestionar la volatilidad entre la aprobación y la ejecución
El intervalo peligroso es el tiempo entre cuando prometes un importe y cuando el dinero realmente se mueve. En divisas volátiles, esa ventana puede desplazar el pago un punto porcentual o más. Tres estrategias defendibles:
- Fijar en la aprobación. Captura la tasa cuando se aprueba el pago y respétala en la ejecución, absorbiendo tú los pequeños movimientos. Mejor experiencia para el contratista; tú asumes el riesgo de FX.
- Fijar en la ejecución. Calcula el importe en el momento del desembolso. No asumes riesgo, pero el importe final del contratista puede diferir de la estimación que vio.
- Fijar con una banda de tolerancia. Fija en la aprobación pero vuelve a comprobar en la ejecución; si la tasa se ha movido más de, por ejemplo, un 1,5%, marca el pago para revisión en lugar de liquidar silenciosamente un importe distinto.
Una comprobación rápida de tolerancia en JavaScript:
async function withinTolerance(currency, lockedRate, tolerancePct = 1.5) {
const res = await fetch(
`https://api.finexly.com/v1/latest?base=USD&symbols=${currency}&apikey=YOUR_API_KEY`
);
const { rates } = await res.json();
const drift = Math.abs((rates[currency] - lockedRate) / lockedRate) * 100;
return { ok: drift <= tolerancePct, drift: drift.toFixed(2) };
}Elijas el modelo que elijas, documéntalo en tu contrato con el contratista para fijar expectativas antes de que alguien dispute un número.
Almacena la tasa que usaste: conciliación y cumplimiento
Semanas después de un pago, alguien de finanzas necesitará responder "¿qué tasa pagamos al contratista 4471 el 6 de agosto?" o un contratista consultará su importe. Si solo almacenaste el importe local, no puedes reconstruir la respuesta. Si almacenaste la tasa, sí puedes, y puedes verificarla contra una fuente independiente usando el endpoint histórico:
curl "https://api.finexly.com/v1/historical?date=2026-08-06&base=USD&symbols=PHP&apikey=YOUR_API_KEY"Esta es la misma disciplina que rige la nómina transfronteriza y los pagos de marketplace: la tasa es un dato financiero de primera clase, no un valor intermedio desechable. Almacena, por cada pago, la moneda base, la moneda de pago, la tasa media de mercado, el margen, la tasa aplicada y la marca de tiempo de fijación. Todos los detalles de la API están en la documentación de la API de Finexly.
Errores comunes que evitar
- Usar
floatpara el dinero. La deriva de redondeo se acumula a lo largo de un lote. Usa decimales de coma fija en todas partes. - Obtener tasas por pago en un bucle. Tasas inconsistentes dentro de un lote y carga innecesaria de la API. Obtén una instantánea por lote.
- Esconder tu margen dentro de la tasa. Los contratistas lo descubrirán. Muestra la tasa media de mercado y tu margen por separado.
- No almacenar la tasa aplicada. Pierdes la capacidad de conciliar o explicar un pago después.
- Ignorar el intervalo entre aprobación y ejecución. En divisas volátiles esto cambia silenciosamente lo que reciben los contratistas. Fija la tasa de forma deliberada.
- Asumir que todo contratista quiere moneda local. Algunos prefieren USD o una stablecoin. Almacena una preferencia por contratista.
Preguntas frecuentes
¿Qué tipo de cambio debería usar para pagar a contratistas internacionales? Parte de la tasa media de mercado —el punto medio real entre los precios de compra y venta— como tu referencia honesta. Si necesitas cubrir costes del proveedor, añade un margen pequeño y claramente revelado por encima, en lugar de inflar la tasa en sí. Los contratistas confían mucho más en cálculos transparentes que en un único número opaco.
¿Debería pagar a los contratistas en su moneda local o en USD? Pagar en moneda local ofrece la mejor experiencia al contratista porque sabe exactamente cuánto llega a su cuenta, pero implica que tu plataforma asume la conversión de FX. Pagar en USD traslada la conversión a su banco, que suele darle una tasa peor. Los mejores sistemas almacenan una preferencia de moneda por contratista y admiten ambas.
¿Cómo mantengo el importe del pago consistente en un lote grande? Obtén todas las tasas de divisas que necesitas en una sola llamada a la API al inicio del lote y luego aplica esa única instantánea a cada pago. Esto garantiza que dos contratistas del mismo lote obtengan la misma tasa USD-EUR y te da una única marca de tiempo contra la que conciliar.
¿Cómo evito las comisiones ocultas que inflan los pagos a contratistas un 20–40%? La mayor parte de esa inflación vive en el margen de FX y en los cargos por transferencia. Ser dueño de la capa de conversión con una fuente de tasas transparente te permite mostrar a los contratistas la tasa media de mercado y exactamente qué margen aplicas, si aplicas alguno, en lugar de los recargos del 2–4% de las transferencias y las comisiones de hasta el 10% de plataforma incluidas en muchas herramientas prefabricadas.
¿Qué datos debería almacenar por cada pago a un contratista? Como mínimo: la moneda base, la moneda de pago, la tasa media de mercado, cualquier margen aplicado, la tasa aplicada final, el importe local y la marca de tiempo en que fijaste la tasa. Ese registro es lo que hace que el pago sea auditable y conciliable meses después.
¿Listo para construir una capa de conversión de pagos en la que confíen tanto tus contratistas como tus auditores? Consigue tu clave API gratuita de Finexly — sin tarjeta de crédito. Empieza con 1.000 solicitudes gratis al mes, obtén tasas en tiempo real e históricas de más de 170 divisas y escala a medida que crece tu volumen de pagos. También puedes probar una conversión rápida en nuestro conversor de divisas para ver los datos de primera mano.
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 →