El aviso que nadie tiene que acordarse de mandar
Cómo avisar automáticamente cuando se libera una nueva versión de un informe, sin depender de que alguien recuerde escribir al equipo. Power BI Pro, Power Automate estándar, sin rol de administrador.
«Nos avisamos antes de publicar» es de esos acuerdos que se cumplen dos semanas. Lo conté en el artículo del método: no falla por dejadez, falla porque el aviso compite con veinte cosas más y pierde. Surge algo urgente, publicas, cierras el portátil, y alguien se pasa la tarde trabajando encima de una copia que ya está vieja.
En aquel artículo, los acuerdos de trabajo terminaban en un paso que decía «avisar al equipo», con una nota al margen: automatizable. Eso es lo que decidí hacer, quitarle ese paso a las personas. Así que esto es lo que monté, con lo que tenía a mano: Power BI Pro, Power Automate estándar, SharePoint y Outlook. Sin Power Automate Premium, sin capacidad Fabric y sin pedir rol de administrador.
En 20 segundos
Sí se puede automatizar el aviso con licencia Pro y conectores estándar. La clave es no intentar detectar directamente la publicación en Power BI Service, sino observar el check-in del archivo .pbix en SharePoint.
El flujo detecta el cambio, comprueba que el archivo ya fue liberado, recupera el comentario de check-in y envía el aviso. Todo lo demás de este artículo son los filtros que hicieron falta para que no acabara siendo ruido.
01 · El resultadoQué vamos a conseguir
Cuando una persona termina de trabajar en el informe, el proceso queda así:
El correo que llega incluye el archivo, la persona que lo modificó, la fecha y hora en horario local, el comentario del cambio y el enlace al archivo.
Una publicación, un aviso. Ese fue el criterio con el que descarté todo lo demás.
02 · La decisión importanteQué significa «publicar»
Aquí está la primera decisión. Cuando me planteé la pregunta —«¿se puede avisar cuando se publica un informe?»— me di cuenta de que el problema estaba en qué es realmente publicar. «Publicar» puede significar varias cosas, aunque te parezca que no es así, y no todas son detectables con esta solución.
| Evento | ¿Detectable? |
|---|---|
| Subir el informe directamente a Power BI Service | No |
| Terminar una actualización de datos | No de forma nativa |
Hacer check-in de una nueva versión del .pbix | Sí |
Me quedé con la tercera, y no solo por descarte: es la que significa lo que quiero comunicar. Cuando alguien libera el archivo con su comentario, ese es el momento exacto en que las copias del resto del equipo dejan de ser la última versión.
Importante
El flujo observa SharePoint, no Power BI Service. Si alguien publica directamente desde Power BI Desktop sin pasar por el proceso de check-out y check-in, la alerta no lo detectará.
Lo digo aquí y no lo repito más: esto refuerza el protocolo de equipo, no lo sustituye ni lo vigila.
03 · Lo que necesitasEntorno de trabajo
Donde lo construí
- Power BI
- Pro, capacidad compartida
- Power Automate
- Estándar, sin conectores premium
- Permisos
- Sin rol administrativo de organización
- Origen
- Biblioteca documental con check-out obligatorio
- Archivo
- Biblioteca sincronizada en el explorador
- Destino
- Correo mediante Office 365 Outlook
La combinación importa más que cada dato suelto: sin rol de administrador y sin conectores premium, la mitad de lo que encuentras buscando «alerta publicación Power BI» queda descartado de entrada.
04 · La arquitecturaCómo funciona
La solución se resume en cuatro pasos:
El detalle que decide si esto cuesta licencia
«Enviar una solicitud HTTP a SharePoint» pertenece al conector de SharePoint, que es estándar. No hay que confundirla con el conector HTTP genérico, que sí es premium en Power Automate.
Encontré una forma de obtener el dato que necesitaba sin pagar más, pero esa solución solo funciona con SharePoint, porque la acción únicamente habla con su API REST. Si quisiera conectarme de la misma manera a otros servicios, tendría que usar opciones Premium.
05 · Paso a pasoMontar el flujo
1. Crear el flujo
En Power Automate creé un flujo de nube automatizado con el disparador When an item or a file is modified. También contemplé «Cuando se crea o modifica un archivo (solo propiedades)»: funciona igual de bien, porque un check-in es una modificación sobre un archivo que ya existe, no una creación.
2. Seleccionar el sitio y la biblioteca
Solo hay dos campos: el sitio de SharePoint y la biblioteca donde están almacenados los informes.
3. Filtrar la carpeta
El disparador escucha la biblioteca entera. Como el sitio es un grupo con mucha gente y muchos archivos, sin este filtro el flujo se ejecutaría con cada acta de reunión que alguien tocara. Añadí una condición para que continúe únicamente cuando el archivo esté dentro de la carpeta de informes.
4. Añadir el filtro clave
Checked out is equal to false
Usé el campo booleano nativo del disparador, con el valor insertado como booleano puro desde el editor de expresiones (fx), no como el texto «false». Consideré las alternativas de texto —«Checked Out To» y sus variantes—, que también habrían servido, pero requerían una expresión empty() alrededor y dependen de cómo venga rellenado un campo de persona. El booleano es más limpio.
5. Recuperar el comentario
El comentario de check-in no aparece en el contenido dinámico del disparador. Ni con otro nombre ni escondido: no viene. Hay que ir a buscarlo con SharePoint → Enviar una solicitud HTTP a SharePoint, con método GET. Y aquí hay una bifurcación que a mí me costó dos ejecuciones fallidas descubrir.
La opción A es la que probé primero, porque es la más cómoda: se termina la URI en /$value y SharePoint devuelve el comentario como texto plano, sin necesidad de analizar JSON.
_api/web/lists/getbytitle('Documentos')/items([ID])/File/CheckInComment/$value
Funcionó en las pruebas… hasta que un check-in real llevó una raya larga en el comentario. El flujo terminó en BadGateway, y al abrir la salida de la acción el detalle era claro: Unable to translate Unicode character, un EncoderFallbackException. El endpoint plano no consigue codificar ciertos caracteres —la raya —, las comillas «tipográficas», las viñetas— al devolverlos en crudo.
La opción B lo resuelve: se pide lo mismo sin el sufijo /$value y se añade un encabezado Accept para que la respuesta llegue en JSON.
_api/web/lists/getbytitle('Documentos')/items([ID])/File/CheckInComment
Accept: application/json;odata=nometadata
En ambos casos, el [ID] debe proceder del contenido dinámico del disparador, no ir fijo. La diferencia es qué haces con la respuesta, y eso cambia la expresión del correo del paso siguiente.
Ojo con el nombre de la biblioteca
Antes incluso de ese fallo, mi primerísima versión usaba getbytitle('Documents') y falló con un NotFound. El motivo: en un inquilino en español el título interno de la biblioteca es Documentos, aunque la URL contenga «/Documents/». La URL y el título no tienen por qué coincidir.
A largo plazo es mejor usar el identificador único de la biblioteca, que sobrevive a los renombrados.
6. Evitar comentarios vacíos
Si alguien hace check-in sin escribir nada, la llamada devuelve vacío y el correo llega con un hueco justo donde va lo importante. Lo resolví envolviendo el valor en una expresión condicional. Como me quedé con la opción B, el comentario ahora viene dentro del JSON y se extrae con ?['value']:
if(empty(body('Obtener_comentario_checkin')?['value']),
'Sin comentario',
body('Obtener_comentario_checkin')?['value'])
Si te hubieras quedado con la opción A del valor plano, la misma expresión iría sin el ?['value'], directamente sobre body('Obtener_comentario_checkin'). En cualquiera de los dos casos, el nombre tiene que coincidir exactamente con el de la acción: en las referencias internas, los espacios se sustituyen por guiones bajos.
Y que el correo diga «Sin comentario» no es solo estética: deja visible que el acuerdo de documentar el cambio no se cumplió.
7. Dar formato a la fecha
La fecha nativa llegaba en UTC crudo, con pinta de 2026-08-17T13:29:07Z: ilegible, y seis horas por delante de mi hora local. La sustituí por:
convertTimeZone(triggerOutputs()?['body/Modified'],
'UTC',
'Central Standard Time (Mexico)',
'dd/MM/yyyy HH:mm')
El tercer parámetro es el identificador de zona horaria de Windows, no el de IANA. Si tu equipo está en otro huso, ese es el valor que cambia.
8. Enviar el correo
Un aviso sencillo es suficiente:
Nueva versión publicada Archivo: [nombre del archivo] Modificado por: [persona] Fecha: [fecha] Comentario: [comentario] Enlace: [archivo]
No hace falta más. El aviso no tiene que contar toda la historia del cambio: tiene que permitir que el resto del equipo entienda en segundos qué cambió y si su copia puede haber quedado obsoleta.
06 · El filtro centralPor qué Checked out = false importa tanto
Mientras una persona trabaja en el archivo puede guardarlo muchas veces. SharePoint detecta esas modificaciones, pero todavía no existe una nueva versión definitiva: la versión llega con el check-in.
Esto lo vi con claridad en el historial de ejecuciones, y es el punto donde esta alerta se cruza con algo que ya había verificado en la nota anterior: una sesión de check-out produce una sola fila en el historial de versiones, guardes una vez o quince. Las dos cosas conviven sin contradecirse.
El historial de versiones no crece con cada guardado. Los eventos de modificación, sí.
El resultado es simple: muchos guardados, un solo correo, y con la versión definitiva.
07 · Las pruebasCómo supe que funcionaba
El historial de ejecuciones fue mi herramienta de diagnóstico. Vale la pena mirarlo en lugar de dar por bueno que «funciona porque no dio error».
Durante los guardados intermedios
Guardando el informe mientras seguía desprotegido, las ejecuciones aparecieron en estado Succeeded, pero con las acciones de la llamada REST y del correo marcadas como Skipped. Eso es justo lo que buscaba: el disparador se activó, la condición dio falso, y el flujo terminó sin enviar nada.
El primer check-in real falló, y fue útil
La primera liberación de verdad terminó en Failed. Al abrir el detalle vi tres cosas de una vez: el check-in sí genera el evento, ambas condiciones dieron verdadero —la lógica de detección funcionaba— y la ejecución murió en la llamada REST con el NotFound del nombre de la biblioteca.
Corregí el nombre y reejecuté con Resubmit, que reintenta con los mismos datos del disparador sin obligarte a repetir a mano el ciclo de check-out y check-in. Si estás depurando algo así, ese botón te ahorra media tarde.
Y un tiempo después, con el flujo ya en producción
Una ejecución terminó en Failed otra vez, y encima tardando doce minutos en hacerlo. Esa duración ya decía algo: un error de configuración falla al instante; doce minutos son reintentos agotándose.
El mensaje era BadGateway, pero el dato útil estaba enterrado en el innerError de la salida de la acción: Unable to translate Unicode character. Es el fallo del paso 5 —el comentario de aquel check-in llevaba una raya larga.
Cambié la lectura a JSON, volví a pulsar Resubmit sobre esa misma ejecución fallida —que conservaba el comentario problemático, así que era la prueba perfecta— y esta vez el correo llegó con la descripción que yo había puesto, sin problemas.
08 · LimitacionesLo que debes saber antes de usarlo
No es instantáneo
El disparador de SharePoint funciona mediante sondeo: cada cierto tiempo comprueba si hubo cambios, en lugar de recibirlos automáticamente cuando ocurren. Con las licencias estándar de Microsoft 365, el intervalo mínimo suele ser de unos cinco minutos y no se puede reducir sin cambiar de plan. Para este caso no supone un problema, pero es bueno tenerlo en cuenta para que el equipo no lo interprete como un error si el flujo tarda unos minutos en reaccionar.
Reacciona a más cosas de las que parece
«Modificado» incluye cambios de metadatos, y la condición filtra por carpeta pero no por tipo de archivo. Si alguien edita una columna de la vista o deja un Excel de apoyo en la carpeta, el flujo también se dispara.
La conexión pertenece a una cuenta
Las conexiones de SharePoint y Outlook son de quien las creó, y el correo sale desde esa cuenta. Si esa persona pierde acceso o deja la organización, el flujo se rompe.
Los permisos importan
Mientras la carpeta herede los permisos de un sitio de grupo amplio, cualquier persona con permiso de edición puede hacer check-in y generar el aviso. Restringir la carpeta al equipo de BI sería lo más lógico.
09 · VariantesPequeños cambios que mejoran el flujo
Filtrar por extensión
Añadir a la segunda condición una comprobación de que el nombre del archivo termina en .pbix.
Enviar el aviso a Teams
El conector de Teams también es estándar, así que cambiar el destino no altera el licenciamiento. Y el mensaje queda como historial para el equipo, mientras que el correo no.
Incluir el número de versión
Permite relacionar el aviso con el historial del archivo cuando aparece un incidente, que es justo el momento en que alguien va a intentar hacerlo con prisa.
10 · Errores frecuentesSi algo falla, revisa esto primero
NotFound al consultar SharePoint
El título interno de la biblioteca no coincide con lo que aparece en la URL.
El título real o, mejor, el identificador único de la biblioteca. Lo confirmas en el JSON de salida del disparador, en el historial de ejecuciones.
Un correo por cada guardado
El flujo reacciona a cada modificación del archivo, no solo a la versión liberada.
Que exista la condición Checked out = false y que el valor esté insertado como booleano, no como texto.
No aparece el comentario
El comentario de check-in no está entre las salidas del disparador.
Que lo estés recuperando con la solicitud HTTP a SharePoint, y que el nombre de la acción coincida con el usado en la expresión.
El correo llega con un hueco donde iba el comentario
El check-in se hizo sin escribir comentario, la llamada devolvió vacío y el token se insertó tal cual.
Que el valor esté envuelto en if(empty(...), 'Sin comentario', ...). Que el hueco se vea es parte de la función: empuja a escribir el comentario la próxima vez.
La fecha llega en UTC crudo y con horas de más
El campo nativo de modificación viene en formato ISO y hora Zulu, que no coincide con la hora a la que el equipo recuerda haber trabajado.
Que estés aplicando convertTimeZone con el identificador de zona de Windows correcto. Verifícalo; no lo deduzcas del nombre de la ciudad.
También avisa por archivos que no son .pbix
La condición filtra por carpeta, no por tipo de archivo. Cualquier documento de apoyo que alguien deje ahí genera alerta.
Añade una comprobación sobre el nombre del archivo para aceptar solo los que terminan en .pbix.
Alguien publicó y no llegó ningún aviso
Se publicó al servicio sin pasar por el archivo controlado. Publicar y guardar el .pbix son operaciones independientes, y solo la segunda pasa por SharePoint.
No es un fallo del flujo, sino del protocolo: la alerta lo refuerza, no lo sustituye. Cerrar esa brecha de verdad requiere el registro de auditoría o un repositorio.
El flujo deja de funcionar sin haber tocado nada
Cambió la cuenta propietaria de las conexiones, o perdió acceso al sitio.
Las conexiones del flujo y quién figura como responsable. Déjalo documentado antes de que haga falta.
BadGateway cuando el comentario lleva una raya o comillas tipográficas
El endpoint /$value devuelve el comentario en texto plano y no consigue codificar ciertos caracteres Unicode (la raya —, las comillas «tipográficas», las viñetas). Falla con un 502 y un EncoderFallbackException en la salida. Aparece tarde, porque Word convierte solo los guiones en rayas sin que nadie lo escriba a propósito.
Pide el comentario en JSON en lugar de en valor plano: quita el /$value de la URI, añade el header Accept: application/json;odata=nometadata y lee el dato con ?['value'] en la expresión del correo. El JSON escapa el texto y el problema desaparece para cualquier carácter.
11 · ChecklistAntes de ponerlo en producción
- El equipo tiene claro qué significa «publicar».
- El archivo se trabaja con check-out y check-in.
- El flujo escucha solo la carpeta correcta.
- Está configurado
Checked out = false, como booleano. - El comentario se obtiene correctamente y tiene reserva si viene vacío.
- El comentario se lee en JSON, no con
/$value, para que aguante rayas y comillas tipográficas. - La biblioteca utilizada en la llamada REST es la correcta.
- La fecha se muestra en la zona horaria del equipo.
- El correo muestra archivo, persona, fecha, comentario y enlace.
- Está documentado que el aviso puede no ser instantáneo.
- Está documentado quién es responsable de la conexión.
Esta es la tercera nota de la serie
El método de trabajo en equipo del que sale este aviso —los acuerdos, el protocolo de publicación y las alternativas de control de versiones con licencia Pro— está en «Publicar entre varios, sin perder trabajo».
Y la mecánica de sincronización, bloqueo y versiones que explica por qué hace falta el filtro de la sección 06 está en «Tu copia local miente».
12 · GlosarioTérminos que aparecen en el artículo
| Término | Qué significa |
|---|---|
| Conector estándar / premium | Clasificación de licenciamiento. Los estándar vienen incluidos con Microsoft 365; usar uno premium obliga a que quien dispare el flujo tenga licencia de Power Automate Premium, o a cubrir el flujo con una licencia por flujo. |
| Disparador de sondeo | Disparador que consulta periódicamente si hubo cambios, en lugar de recibir una notificación inmediata. Su frecuencia mínima la fija el plan de licencia. |
| Check-out / check-in | Desprotección y liberación de un archivo en una biblioteca documental. Mientras está desprotegido, nadie más puede editarlo y el historial no cierra una versión nueva. |
CheckInComment | Propiedad del archivo en la API REST de SharePoint que contiene el comentario escrito al liberarlo. Máximo 1023 caracteres. |
/$value | Sufijo de la API REST que devuelve el valor de una propiedad como texto plano, en lugar de envuelto en una estructura de datos. Cómodo, pero se atraganta con ciertos caracteres Unicode. |
?['value'] | Forma de leer, dentro de una expresión, el campo value de una respuesta JSON. Es la alternativa a /$value cuando se pide el comentario como JSON. |
| Skipped | Estado de una acción que no llegó a ejecutarse porque la condición que la contiene dio falso. No cuenta contra los límites de acciones de la plataforma. |
| Resubmit | Reejecución de un flujo con los mismos datos del disparador original. Permite depurar sin reproducir a mano el evento que lo activó. |
13 · FuentesDocumentación consultada
- Referencia del conector de SharePoint learn.microsoft.com/connectors/sharepointonline
- Trabajar con la acción «Enviar una solicitud HTTP a SharePoint» learn.microsoft.com/sharepoint/dev/business-apps/power-automate/guidance/working-with-send-sp-http-request
- Trabajar con carpetas y archivos mediante REST learn.microsoft.com/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest
- Límites y configuración de Power Automate learn.microsoft.com/power-automate/limits-and-config
Afirmaciones verificadas contra la documentación del conector en agosto de 2026. El flujo descrito lleva funcionando en producción desde entonces; las correcciones surgidas de fallos reales están integradas en el texto.
No hace falta una arquitectura complicada para eliminar un aviso manual. La clave está en no intentar detectar directamente algo que Power Automate no expone como evento: el evento útil ya existía en SharePoint, que es el check-in de una nueva versión.
El resultado no parece espectacular. Y precisamente por eso es útil: el equipo deja de depender de que alguien se acuerde de mandar el mensaje.
¿Qué evento usas tú para marcar «publicado»? ¿Y qué datos lleva tu aviso que a mí me faltan? Cuéntamelo y lo incorporo al artículo con tu crédito.