El libro conserva cada importe en su moneda original y lo convierte a USD usando el dato fechado que eliges. Las facturas contabilizadas permanecen reproducibles porque la fecha, la fuente, data_updated_at y el tipo se guardan juntos.
- Descarga el libro de facturas con datos fechados y fórmulas.
- rate_per_usd son unidades de moneda por 1 USD.
- Conserva fecha, fuente, sesión y data_updated_at de cada fila contabilizada.
- Power Query añade snapshots nuevos sin sustituir los congelados.
- Los tipos son indicativos y no constituyen asesoramiento fiscal o contable.
Descarga el libro
Descarga el libro de control de facturas y ábrelo en Excel. Incluye diez facturas ilustrativas, datos EUR/GBP/JPY/IDR, columnas USD y una bitácora. Sustituye los ejemplos por tus propios registros.
Entiende las cuatro hojas
Invoice Tracker contiene las facturas y fórmulas. FX Snapshots guarda una observación fechada por moneda. Audit Trail registra la decisión de congelar una fila. Read Me explica el flujo y sus límites.
Añade una factura en su moneda original
Escribe ID, cliente, fechas, moneda, neto, impuesto, fecha del tipo y estado en las celdas azules. Mantén Net, Tax y Gross en la moneda de la factura.
Añade el tipo de cambio fechado
Añade la observación histórica exacta que usaste. Guarda fecha, moneda, source, market_session, data_updated_at y tipo. El tipo significa unidades de la moneda de la factura por 1 USD. Usa un Snapshot ID único como EUR-20260602-v1. Valida exactamente una fila para ese ID y que la moneda del snapshot coincida con la factura. Si corriges una observación, añade v2; no sobrescribas v1. data_updated_at describe cuándo se actualizó el dato histórico; no lo sustituyas por effective_at.
{ "result": "success", "base": "USD", "date": "2026-06-02", "source": "ecb_daily", "sources": { "EUR": "ecb_daily" }, "market_session": "open", "timestamp": "2026-09-08T11:52:18Z", "data_updated_at": "2026-06-02T00:00:00Z", "is_forward_filled": false, "rates": { "EUR": 0.85844 }, "notice": "Indicative rates, not for settlement."}Revisa las columnas USD calculadas
El libro relaciona la fecha y moneda con FX Snapshots y divide cada importe por FX Rate / USD. Gross es Net + Tax; las columnas USD quedan vacías si falta el dato. Las fórmulas llegan hasta la fila 100 de facturas y la fila 100 de snapshots; amplía ambos rangos juntos. El estado Posted es una etiqueta y no bloquea celdas.
=IF(OR(F6<0,G6<0,H6<0,K6="",L6="Missing snapshot ID",L6="Duplicate snapshot ID",L6="Currency mismatch",L6="Invalid rate"),"",F6/K6)Congela los valores contabilizados
Cuando contabilices una factura, conserva su fila de snapshot. Si la fuente cambia después, añade una nueva fila para una corrección y explica el motivo en Audit Trail.
Añade un dato nuevo con Power Query
El script de Power Query consulta una fecha y moneda explícitas. Carga el resultado como una fila nueva y no pongas una clave en un libro compartido. Power Query devuelve exactamente nueve columnas A:I. Carga primero una hoja de staging, copia solo la fila de datos sin encabezados y pégala como valores desde la fila 7. Refresh All vuelve a cargar la salida de la consulta: no añade automáticamente una fila inmutable. En Windows usa Data → Get Data → From Other Sources → Blank Query; en Microsoft 365 para Mac usa Data → Get Data → Launch Power Query Editor. Elige Anonymous; usa un proxy de servidor si necesitas una clave.
let SnapshotDate = "2026-06-02", Currency = Text.Upper(Text.Trim("EUR")), Revision = "v1", SelectedDate = Date.FromText(SnapshotDate, [Format = "yyyy-MM-dd", Culture = "en-US"]), RelativePath = "v1/" & Date.ToText(SelectedDate, "yyyy-MM-dd") & "/USD", Endpoint = "https://api.exchangerate.dev/" & RelativePath & "?symbols=" & Currency, Payload = Json.Document(Web.Contents("https://api.exchangerate.dev", [ RelativePath = RelativePath, Query = [symbols = Currency], Timeout = #duration(0, 0, 0, 10) ])), Source = if Payload[base] <> "USD" or Payload[date] <> SnapshotDate then error "Unexpected response base or date" else Payload, RawRate = Record.Field(Source[rates], Currency), Rate = if not Value.Is(RawRate, type number) or RawRate <= 0 then error "Expected a positive numeric rate" else RawRate, SnapshotId = Currency & "-" & Text.Replace(SnapshotDate, "-", "") & "-" & Revision, Notes = "Response timestamp=" & Source[timestamp] & "; is_forward_filled=" & (if Source[is_forward_filled] then "true" else "false"), Snapshot = #table( {"Snapshot ID", "Snapshot Date", "Currency", "Source", "Market Session", "Data Updated At (UTC)", "Rate / USD", "API Endpoint", "Notes"}, {{SnapshotId, SelectedDate, Currency, Record.Field(Source[sources], Currency), Source[market_session], Source[data_updated_at], Rate, Endpoint, Notes}} )in SnapshotConserva la trazabilidad
Registra cuándo se contabilizó, qué snapshot se usó, su fuente/sesión y por qué está congelado. Conserva la respuesta original si tu proceso exige más evidencia. En Notes conserva el timestamp de la respuesta y is_forward_filled. Registra el Snapshot ID, la fuente, la sesión y el motivo de cualquier corrección.
Usa el resultado solo para informes
Es una herramienta ilustrativa para informes y análisis. No determina impuestos, contabilidad, cumplimiento, liquidación ni el importe que cobrará un proveedor de pagos. La capacidad de ejemplo termina en la fila 100; extiende las fórmulas y las búsquedas conjuntamente.