En muchas empresas, solicitar un curso de formación sigue siendo un proceso manual: un correo aquí, una hoja de cálculo allá, un recordatorio que se pierde. El resultado es siempre el mismo: solicitudes olvidadas, falta de seguimiento y tiempo administrativo desperdiciado.
Este proyecto nace para resolver exactamente ese problema. La idea es sencilla: el usuario rellena una solicitud, la API la procesa automáticamente y, sin intervención humana, tanto el usuario como el coordinador reciben un email con todos los detalles.

¿Qué vamos a construir?

  • Una API REST con ASP.NET Core (.NET 8) que recibe y valida las solicitudes.
  • Un flujo en Power Automate que se activa automáticamente y envía los emails.
  • La conexión entre ambos a través de un webhook HTTP.

Arquitectura del sistema:

Swagger UI (cliente)
       ↓
ASP.NET Core API (.NET 8)
       ↓
Power Automate (webhook HTTP)
       ↓
Email al usuario + Email al coordinador

Desarrollo paso a paso

Paso 1 — Crear el proyecto ASP.NET Core


Abrimos Visual Studio y creamos un nuevo proyecto de tipo ASP.NET Core Web API con .NET 8. También se puede hacer desde terminal:

dotnet new webapi -n TrainingRequestAPI --no-openapi
cd TrainingRequestAPI
dotnet add package Swashbuckle.AspNetCore

La estructura del proyecto queda así:

TrainingRequestAPI/
├── Controllers/
│   └── TrainingController.cs
├── Models/
│   └── TrainingRequest.cs
│   └── TrainingResponse.cs
├── Services/
│   └── PowerAutomateService.cs
├── Program.cs
└── appsettings.json

Paso 2 — Definir el modelo de datos

El modelo representa los datos que recibirá la API en cada solicitud:

public class TrainingRequest
{
    public string Name { get; set; } = string.Empty;
    public string Email { get; set; } = string.Empty;
    public string Course { get; set; } = string.Empty;
    public string Level { get; set; } = string.Empty;
}

Y la respuesta que devuelve la API al cliente:

public class TrainingResponse
{
    public string RequestId { get; set; } = string.Empty;
    public string Message { get; set; } = string.Empty;
    public string Status { get; set; } = string.Empty;
    public DateTime CreatedAt { get; set; }
}

Paso 3 — Crear el servicio de Power Automate


Este servicio es el puente entre la API y Power Automate. Cuando llega una solicitud válida, construye un payload JSON y lo envía al webhook:

public async Task<bool> TriggerFlowAsync(TrainingRequest request, string requestId)
{
    if (string.IsNullOrEmpty(_webhookUrl))
        return false;

    var payload = new
    {
        requestId,
        name = request.Name,
        email = request.Email,
        course = request.Course,
        level = request.Level,
        createdAt = DateTime.UtcNow.ToString("dd/MM/yyyy HH:mm")
    };

    var json = JsonSerializer.Serialize(payload);
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    var response = await _httpClient.PostAsync(_webhookUrl, content);
    return response.IsSuccessStatusCode;
}

Paso 4 — Crear el controlador


El controlador expone el endpoint POST /api/training. Valida los campos obligatorios, genera un ID único para cada solicitud y delega en el servicio de Power Automate:

[HttpPost]
public async Task<IActionResult> Create([FromBody] TrainingRequest request)
{
    if (string.IsNullOrWhiteSpace(request.Name) ||
        string.IsNullOrWhiteSpace(request.Email) ||
        string.IsNullOrWhiteSpace(request.Course))
    {
        return BadRequest(new { Error = "Name, Email y Course son obligatorios." });
    }

    var requestId = $"TRN-{DateTime.UtcNow:yyyy}-{Guid.NewGuid().ToString()[..6].ToUpper()}";
    var triggered = await _powerAutomate.TriggerFlowAsync(request, requestId);

    return Ok(new TrainingResponse
    {
        RequestId = requestId,
        Message = "Solicitud recibida correctamente. Recibirás un email de confirmación.",
        Status = triggered ? "Procesada" : "Registrada",
        CreatedAt = DateTime.UtcNow
    });
}

El ID generado sigue el formato TRN-2026-XXXXXX, lo que facilita el seguimiento de cada solicitud.


Paso 5 — Configurar el flujo en Power Automate

En Power Automate creamos un nuevo Flujo de nube automatizado.

1

Le ponemos el nombre Training Request – Notificaciones Email.

2

Formulario de creación con el nombre del flujo

Elegir el trigger: buscamos «HTTP» y seleccionamos «Cuando se recibe una solicitud HTTP».

3

Búsqueda del trigger HTTP


Configurar el trigger: pegamos el esquema JSON que define los campos que recibirá el flujo desde nuestra API:

{
  "type": "object",
  "properties": {
    "requestId": { "type": "string" },
    "name": { "type": "string" },
    "email": { "type": "string" },
    "course": { "type": "string" },
    "level": { "type": "string" },
    "createdAt": { "type": "string" }
  }
}
4

Trigger configurado con el esquema JSON

Paso 6 — Añadir las acciones de email

Añadimos dos acciones «Enviar correo electrónico (V2)» de Office 365 Outlook en serie.

5

Búsqueda de la acción de email, Office 365 Outlook

Primer email — al usuario: usamos los valores dinámicos del trigger (name, email, course, level, requestId) para personalizar el mensaje.

6

Configuración del email al usuario con valores dinámicos


Segundo email — al coordinador: mismo formato pero dirigido a la persona responsable de gestionar las solicitudes.

7
8

Configuración del email al coordinador


El flujo completo, una vez guardado, queda así: nombramos las acciones (pasos) que componen el proceso, las cuales se ejecutan secuencialmente tras el desencadenador inicial

9

Vista general del flujo con los tres bloques


Paso 7 — Conectar la API con Power Automate

Al guardar el flujo, Power Automate genera la URL del webhook. La copiamos y la pegamos en el archivo appsettings.json del proyecto:

10

URL del webhook generada en el trigger

11

appsettings.json en Visual Studio con la URL configurada


Paso 8 — Prueba completa desde Swagger

Arrancamos la API con dotnet run y abrimos Swagger en el navegador. Enviamos una solicitud de prueba:

{
  "name": "Pepe",
  "email": "test@email.com",
  "course": "Azure Fundamentals",
  "level": "Básico"
}

La API responde con 200 OK y el ID generado. Segundos después llegan los dos emails.

Recomendaciones

  • En un entorno de producción, proteger el webhook con autenticación (Azure AD, API key o firma HMAC) en lugar de dejarlo abierto a cualquiera.
  • Centralizar toda la configuración sensible (URLs, credenciales) en variables de entorno o Azure Key Vault, nunca en el código fuente.
  • Añadir validación del formato de email en el modelo antes de llamar a Power Automate.
  • Registrar cada solicitud en una base de datos para poder hacer seguimiento histórico.

¿Crees que este tipo de automatización tiene sentido en tu empresa? ¿Qué otros procesos manuales podrían resolverse con una arquitectura similar? Déjalo en los comentarios.

Autora: Salima Agmir Achabbab
Máster: Desarrollo Full Stack + Arquitecturas Cloud
Centro: Tajamar Tech

Recurso: Documentación oficial de Microsoft Power Automate – Power Automate | Microsoft Learn
Año académico: 2025-2026
Código: Enlace a GitHub
LinkedIn: salima-agmir

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.