Hasta ahora, la gestión de gastos de viaje en Dynamics 365 FnO incluía la posibilidad de extraer información de tickets escaneados, pero esta funcionalidad nunca llegó a ser lo suficientemente precisa ni práctica como para convertirse en una herramienta habitual. Con la llegada del nuevo Agente de Gastos, todo cambia: el proceso se vuelve más intuitivo y simple, ya que basta con enviar un correo electrónico o subir un recibo para que el informe de gasto se genere automáticamente. Y, por las pruebas que he realizado, la extracción de datos desde tickets escaneados es ahora mucho más eficiente y fiable.
Microsoft ha liberado esta capacidad como vista previa lista para producción, con un enfoque de automatización e IA que integra Copilot Studio, Power Automate, Dataverse y conectores de Outlook/Teams para reducir la intervención manual en el ciclo de gestión de gastos en FnO, lo que significa que está solución es extensible y permite usarla como base de soluciones más específicas.
¿Qué es Expense Agent y por qué es relevante?
Expense Agent automatiza el flujo de gastos de extremo a extremo: recepciona los recibos (por email o subida en FnO), extrae los datos con IA, genera líneas de gasto y compone informes listos para revisión. Se apoya en:
– Microsoft Copilot Studio para la extracción de datos del recibo.
– Power Automate para la orquestación de procesos.
– Dataverse y virtual entities para integrar con FnO.
– Conectores de Outlook y Teams para captar recibos y permitir la revisión con tarjetas adaptativas.
¿Cómo funciona?
La solución se articula alrededor de tres flujos orquestadores en Power Automate:
1. Process Emails: escanea de forma programada una carpeta del buzón compartido y guarda los adjuntos como recibos no vinculados en FnO.
2. Extract Receipt IDs: invoca al agente para extraer los datos del recibo y generar líneas de gasto no adjuntas.
3. Process Expense Report: agrupa las líneas y compone los informes según la configuración (por viaje o por proyecto) para su revisión.
Si tienes habilitada la integración con Microsoft Teams, la revisión/confirmación del informe se realiza mediante tarjetas adaptativas antes de enviarlo a aprobación.
Requisitos previos
– Versión mínima de FnO: 10.0.44.
– Roles: System Administrator (FnO y Power Platform), Exchange Administrator (buzón) y Teams Administrator si habilitas Teams.
– Licencias: Dynamics 365 Teams Members, Microsoft 365 (con Outlook/Teams) y Power Apps Premium.
Pasos para configurarlo
1. Instalar “Copilot for finance and operations apps” desde Power Platform Admin Center.
2. Activar funcionalidades en FnO: en Feature Management, habilita Agent Management e Immersive Home.
3. Configurar parámetros en Expense Management > Setup > Expense Management parameters, pestaña Expense Entry Agent (frecuencia y criterio de agrupación).

4. Crear el usuario del agente (identidad dedicada en Microsoft Entra ID) y asignar licencias/roles.
5. Configurar el buzón compartido (carpeta de entrada de recibos) y conexiones en Power Automate.
6. (Opcional) Habilitar Teams para revisar y confirmar informes mediante tarjetas adaptativas.
Casos de uso
Una vez configurado, el Expense Agent ofrece dos formas muy prácticas de trabajar:
- Subir un ticket directamente en FnO: el agente procesa la imagen, extrae los datos y genera la línea de gasto. El usuario confirma antes de enviar.
- Enviar un correo con el recibo adjunto: el agente capta el adjunto, extrae los datos y crea la línea correspondiente.
En ambos casos y con Teams habilitado, el usuario recibe una tarjeta adaptativa para confirmar antes de enviar:


Problemas durante la instalación:
Script de instalación:
Durante la instalación encontré errores en el script oficial a la hora de conectar con Azure. Como los errores eran confusos le pasé a Copilot el script y los errores y conseguí después de un par de intentos corregirlo para mi Tenant. Obviamente esto depende mucho de como tienes configurada la seguridad y dependerá de cada uno, pero en mi caso finalmente solo tuve que añadirle -AuthScope «$DataverseUrl» a Connect-AzAccount y modificar la función Get-AccessToken De esto:
$accessToken = (Get-AzAccessToken -ResourceUrl «$DataverseUrl» -AsSecureString).Token
Write-Host «Access token for $userId retrieved successfully.»
return $accessToken
A esto:
$psToken = (Get-AzAccessToken -ResourceUrl $DataverseUrl).Token
if (-not $psToken) { throw «No se pudo obtener el token…» }
Write-Host «Access token retrieved successfully for $((Get-AzContext).Account.Id).»
return $psToken
FLOWS
Una vez instalado, por más que enviaba mails al buzón, nada ocurría. Sin embargo, al subir el ticket directamente a FO el proceso se ejecutaba correctamente. Así que investigando los flujos de trabajo descubrí lo siguiente:
La solución crea los siguientes flujos:
| Nombre del flujo | Propósito | Dependencias |
|---|---|---|
| expense entry retry check | Reintenta la creación de entradas de gasto que fallaron previamente. | Dataverse |
| expense configuration | Configura variables y parámetros necesarios para el agente. | Dataverse |
| get expense outlook folder | Localiza la carpeta de Outlook donde se buscarán correos con recibos. | Outlook |
| generate expense report | Genera un informe de gastos a partir de las líneas capturadas. | Dataverse |
| send expense report adaptive card | Envía una tarjeta adaptativa a Teams para revisión/aprobación del informe. | Microsoft Teams, Adaptive Cards |
| process emails | Procesa correos electrónicos para extraer recibos y datos relevantes. | Outlook |
| extract unattached receipt ids for copilot invocation | Identifica recibos no asociados a informes para que Copilot los procese. | Dataverse, Copilot |
| extract unattached receipt output using dataverse plugin | Usa un plugin de Dataverse para extraer datos de recibos no vinculados. | Dataverse |
| generate expense line | Crea líneas de gasto a partir de la información procesada. | Dataverse |
| generate expense line without project id and status id | Variante para generar líneas cuando faltan datos de proyecto o estado. | Dataverse |
| identify project ids | Busca y asigna IDs de proyecto a las líneas de gasto. | Dataverse |
| user calender events | Consulta eventos del calendario del usuario para sugerir gastos relacionados. | Outlook Calendar |
| process expense report using copilot | Invoca a Copilot para procesar y completar el informe de gastos. | Copilot, Dataverse |
Estos flujos son los que utiliza el Agente de Gastos:

Y yo tenía problemas con 3 de ellos:
process emails
Este flujo se encarga de validar que el usuario exista, obtener el buzón y la configuración necesaria antes de procesar los correos. Sin embargo, hay un detalle que la documentación no menciona: si el empleado pertenece a varias empresas, el sistema siempre selecciona la empresa predeterminada, incluso aunque en el cuerpo del correo se indique explícitamente la empresa y el proyecto.
En mi caso, esto provocaba errores porque el flujo ignoraba la empresa indicada en el email y usaba la que estaba marcada como predeterminada en FnO.
user calender events
Este flujo es especialmente interesante: consulta el calendario del usuario y, con esa información, la IA deduce a qué viaje corresponde el gasto y en qué proyecto se debe imputar.
Esto significa que, si quieres que el sistema asigne automáticamente el proyecto, debes incluirlo en la agenda. La logica que sigue el Agente es la siguiente:
- Lista de proyectos candidatos
Primero, el agente obtiene una lista de proyectos posibles llamando a Dataverse, filtrando por:- ExpenseCategory (categoría del gasto detectada en el recibo)
- LegalEntity (empresa del empleado).
- WorkerId (empleado que envía el gasto).
- Detalles del comerciante (Merchant)
Luego, utiliza el nombre y dirección del comerciante extraídos del recibo para intentar encontrar coincidencias con proyectos que tengan relación con ese proveedor o ubicación. - Eventos del calendario del usuario
Aquí entra la parte más interesante: el flujo User Calendar Events.- Usa la fecha del ticket (TransactionDate) como rango de búsqueda (desde ese día hasta el siguiente).
- Busca en el calendario del usuario eventos que contengan información clave: ubicación, nombre del proyecto o incluso el Project Id.
- Si encuentra un evento que coincide con la fecha y contiene datos del proyecto, lo usa como pista principal.
- Lógica de coincidencia
Con toda esta información (lista de proyectos, detalles del comerciante y eventos del calendario), el agente:- Busca la mejor coincidencia entre los proyectos candidatos y los datos del recibo.
- Si encuentra un match razonable, devuelve el Project Id y el Project Status Id.
- Si no hay coincidencia, devuelve cadena vacía (no pregunta al usuario, porque el prompt indica que nunca debe pedir input humano)
El inconveniente es que para que esto funcione, el calendario debe estar compartido con la cuenta del agente. Si el agente está configurado como un buzón compartido, esto no es posible.
La solución fue cambiar el buzón del agente a uno estándar de Exchange, lo que permitió que el flujo accediera al calendario y la IA pudiera hacer su trabajo.
generate expense line with or out project id and status id
Este flujo aplica a ambos procesos de generación de líneas. En mi caso, me encontré con un error que al principio no entendía: el problema no era el flujo, sino la falta de tipo de cambio para la fecha del ticket entre la moneda de la sociedad y la del recibo. Esto me pasó por hacer pruebas con gastos en pesos colombianos…
Lo negativo es que el error solo aparece en el flujo de Power Automate, no se notifica por Teams ni por ningún otro canal.
Sería muy recomendable que, en escenarios reales, se implementara un mecanismo para enviar alertas al usuario cuando FnO devuelve errores estándar. Dado que el flujo devuelve esta información al Agente, bastaría con modificar ligeramente el flujo y el Prompt del agente para que lo hiciera.
Conclusión
Expense Agent transforma la gestión de gastos en FnO en un modelo “asistido por IA”, donde el usuario solo revisa y confirma, reduciendo tareas repetitivas y mejorando la calidad de los datos. Si ya trabajas con Expense Management, esta funcionalidad es la evolución natural para ganar eficiencia y control. Además, puede convertirse en la base perfecta para construir soluciones personalizadas con automatismos más avanzados adaptados a las necesidades de cada cliente.
¡Muchas gracias por leerme!


Deja un comentario