{"id":23458,"date":"2026-09-16T06:14:43","date_gmt":"2026-09-16T06:14:43","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/una-guia-para-usar-los-webhooks-de-mailgun\/"},"modified":"2026-09-16T06:14:44","modified_gmt":"2026-09-16T06:14:44","slug":"una-guia-para-usar-los-webhooks-de-mailgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/","title":{"rendered":"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><i>Esta publicaci\u00f3n invitada es obra de\u00a0<\/i><i><b>Opeyemi Obembe<\/b><\/i><i>, un cliente de Mailgun de Nigeria. Cuando vimos\u00a0el tutorial de Opeyemi sobre c\u00f3mo configurar los webhooks, supimos que ten\u00edamos que compartirlo contigo. Su metodolog\u00eda no solo es muy s\u00f3lida, sino que adem\u00e1s es el tipo de desarrollador al que nos encanta apoyar.<\/i><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><i>Opeyemi se registr\u00f3 en Mailgun hace cuatro a\u00f1os y, desde entonces, ha creado cosas realmente incre\u00edbles. Hace poco ha desarrollado\u00a0Suet, un proyecto de c\u00f3digo abierto que ofrece anal\u00edticas e informes detallados sobre los emails transaccionales enviados a trav\u00e9s de Mailgun. Puedes usarlo junto con nuestras nuevas funciones de anal\u00edticas para obtener informaci\u00f3n adicional sobre la interacci\u00f3n de tus emails.<\/i><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los emails transaccionales son esenciales para la mayor\u00eda de las aplicaciones. Enviamos emails de bienvenida, emails de recuperaci\u00f3n de contrase\u00f1a, notificaciones y mucho m\u00e1s. Y cuando lo hacemos, usamos proveedores como Mailgun. Enviar los emails est\u00e1 muy bien, pero \u00bfqu\u00e9 pasa con la entrega y el rendimiento? \u00bfRecibi\u00f3 ese usuario el email para restablecer la contrase\u00f1a? \u00bfSe ha abierto ese email de notificaci\u00f3n de \u201ctarjeta de cr\u00e9dito a punto de caducar\u201d?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque estos datos est\u00e1n disponibles en\u00a0<a href=\"https:\/\/app.mailgun.com\/sessions\/new\" target=\"_tabs\" rel=\"noopener noreferrer\">el panel de control de tu cuenta de Mailgun<\/a>, otra forma de recibir actualizaciones sobre lo que ocurre con tus mensajes transaccionales en Mailgun es a trav\u00e9s de <a href=\"https:\/\/www.mailgun.com\/resources\/learn\/glossary\/webhook\/\" target=\"_tabs\" rel=\"noopener noreferrer\">webhooks<\/a>.\u00a0<a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/intro\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Tambi\u00e9n existe la API<\/a>, pero a diferencia de la API, donde t\u00fa \u201csolicitas\u201d estas actualizaciones (Poll), con los webhooks las actualizaciones se te env\u00edan directamente (Push). Lo \u00fanico que tienes que hacer es proporcionar la URL de un script que pueda manejar los datos del evento a trav\u00e9s de\u00a0<code>POST<\/code>.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-7705\"><p class=\"h5 m-0\" id=\"toc-title-7705\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#configurar-webhooks\">Configurar webhooks<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#manejo-de-los-datos\">Manejo de los datos<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#garantizar-la-seguridad\">Garantizar la seguridad<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#mejorar-la-escalabilidad\">Mejorar la escalabilidad<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#conclusion\">Conclusi\u00f3n<\/a><\/div><\/div><\/nav>\n\n\n<p class=\"wp-block-paragraph\"><b>Sobra decir que el modelo Push tiene ciertas ventajas sobre el modelo Poll.<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No tienes que hacer peticiones repetidas a la API. Esto supone consumir menos recursos del servidor.<\/li>\n\n\n\n<li>Las actualizaciones son m\u00e1s en tiempo real porque se env\u00edan tan pronto como est\u00e1n disponibles en el servidor.<\/li>\n<\/ul>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_1c943316059d61c153b7492ef115ceb3\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_1c943316059d61c153b7492ef115ceb3\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n\n\n\n<h2 class=\"wp-block-heading\">Configurar webhooks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hay dos maneras de configurar los webhooks en Mailgun. Puede hacerse a trav\u00e9s del panel de control de Mailgun o\u00a0<a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/openapi-final\/tag\/Webhooks\/\" target=\"_tabs\" rel=\"noopener noreferrer\">API<\/a>. La forma m\u00e1s sencilla de hacerlo es a trav\u00e9s del panel de control. Una vez que hayas iniciado sesi\u00f3n en el panel de control,\u00a0<a href=\"https:\/\/app.mailgun.com\/app\/webhooks\" target=\"_tabs\" rel=\"noopener noreferrer\">un enlace de Webhooks<\/a>\u00a0est\u00e1 disponible en la barra de navegaci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4570\" width=\"1024\" height=\"783\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1.jpeg\" alt=\"webhooks1\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1.jpeg 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1-300x229.jpeg 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/webhooks1-768x587.jpeg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En la p\u00e1gina de los webhooks se enumeran los diferentes tipos de eventos de los que puedes recibir datos. Si haces clic en el icono \u201c+\u201d situado junto a cada evento, <b>podr\u00e1s establecer la URL a la que se enviar\u00e1n los datos del evento.<\/b><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Manejo de los datos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para manejar los datos de eventos enviados a la URL de nuestro webhook, primero tenemos que saber qu\u00e9 aspecto tendr\u00e1n. Los par\u00e1metros enviados a trav\u00e9s de POST est\u00e1n disponibles\u00a0<a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/tracking-messages\/#tracking-open-messages\" target=\"_tabs\" rel=\"noopener noreferrer\">en la documentaci\u00f3n de la API<\/a>. Podemos ir un paso m\u00e1s all\u00e1 y confirmarlo usando una URL de webhook de prueba que registre los datos de Mailgun. Podemos usar el\u00a0<a href=\"http:\/\/bin.mailgun.net\/?utm_source=mailgun&amp;utm_medium=blog&amp;utm_campaign=webhooks-1710\" target=\"_tabs\" rel=\"noopener noreferrer\">Postbin de Mailgun<\/a>\u00a0o\u00a0<a href=\"https:\/\/requestbin.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">requestb.in<\/a>. <b>Estos servicios generar\u00e1n un punto de conexi\u00f3n \u00fanico que podremos usar en el panel de control de Mailgun para obtener datos de eventos de muestra<\/b>. Te recomiendo usar requestbin porque ofrece m\u00e1s detalles, como los encabezados de las peticiones. Estos encabezados son importantes porque es f\u00e1cil pasar por alto el hecho de que Mailgun env\u00eda algunos datos usando el tipo de contenido\u00a0[<code>application\/x-www-form-urlencoded]<\/code>\u00a0y otros como\u00a0[<code>multipart\/form-data]<\/code>. Pasar por alto estos peque\u00f1os detalles lo cambia todo en la forma de obtener los datos de los eventos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a crear un punto de conexi\u00f3n de prueba para ver el aspecto de los datos de los eventos en comparaci\u00f3n con lo que figura en la documentaci\u00f3n.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Entra en <a href=\"https:\/\/requestbin.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">requestb.in<\/a> y crea un \u201cbin\u201d.<\/li>\n\n\n\n<li>Copia la URL y accede a <a href=\"https:\/\/app.mailgun.com\/app\/webhooks\" target=\"_tabs\" rel=\"noopener noreferrer\">la secci\u00f3n de webhooks del panel de control de Mailgun<\/a>.<\/li>\n\n\n\n<li>Pega la URL en el campo de entrada y haz clic en el enlace para probar el webhook. Esto enviar\u00e1 datos de eventos de muestra a la URL.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4571\" width=\"1024\" height=\"547\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM.png\" alt=\"Screen-Shot-2019-04-12-at-3\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM-300x160.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen-Shot-2019-04-12-at-3.18.54-PM-768x410.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Repite este proceso para todos los eventos que te interesen.<\/li>\n\n\n\n<li>Actualiza la p\u00e1gina de requestbin para ver los datos de los eventos enviados.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4572\" width=\"956\" height=\"343\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data.png\" alt=\"requestbin-webhooks-data\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data.png 956w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data-300x108.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/requestbin-webhooks-data-768x276.png 768w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si te fijas bien en los datos de requestbin, te dar\u00e1s cuenta de lo que te comentaba sobre algunos datos que se env\u00edan como multipart\/form-data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que sabemos cu\u00e1les son los par\u00e1metros de cada tipo de evento y en qu\u00e9 tipo de contenido pueden venir, resulta f\u00e1cil escribir c\u00f3digo para gestionar los datos enviados. A continuaci\u00f3n te mostramos un c\u00f3digo sencillo que mostrar\u00e1 los detalles de las quejas y los emails descartados. (Estoy usando\u00a0<a href=\"https:\/\/github.com\/expressjs\/multer\" target=\"_tabs\" rel=\"noopener noreferrer\">multer<\/a>\u00a0para manejar multipart\/form-data).<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const express = require(&#039;express&#039;)  rn    , bodyParser = require(&#039;body-parser&#039;)rn    , multer = require(&#039;multer&#039;)rn    ;rnrnconst app = express();  rnapp.use(bodyParser.urlencoded({extended: false}));  rnapp.listen(process.env.PORT || 3000);rnrnapp.post(&#039;\/webhook&#039;, multer().none(), function(req, res) {  rn  const email = req.body.recipient;rn  const event = req.body.event;rnrn  if (event == &#039;complained&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;${email} complained about your mail&lt;\/code&gt;);rn  }rn  else if (event == &#039;dropped&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Mail to ${email} dropped. ${event.description}&lt;\/code&gt;);rn  }rn  else if (event == &#039;bounced&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Error ${event.code}: Mail to ${email} bounced. ${event.error}&lt;\/code&gt;);rn  }rnrn  res.end();rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Garantizar la seguridad<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No hay nada que impida que alguien que conozca la URL de nuestro webhook cree datos de eventos falsos y los env\u00ede a dicha URL. Por suerte, Mailgun firma cada petici\u00f3n enviada e incluye tambi\u00e9n los siguientes par\u00e1metros:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>timestamp (n\u00famero de segundos transcurridos desde el 1 de enero de 1970)<\/li>\n\n\n\n<li>token (cadena de caracteres generada de forma aleatoria con una longitud de 50)<\/li>\n\n\n\n<li>signature (cadena de caracteres hexadecimales generada mediante el algoritmo HMAC)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para verificar el token, debes hacer lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Concatenar los valores de timestamp y de token.<\/li>\n\n\n\n<li>Codificar la cadena de caracteres resultante con HMAC, utilizando la clave de firma HTTP de tu webhook como clave y Sha256 como algoritmo.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><b>El resultado debe ser id\u00e9ntico al valor de signature.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n te mostramos c\u00f3mo se ve esto en Node.js:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const value = event_data_timestamp+event_data_token;  rnconst hash = crypto.createHmac(&#039;sha256&#039;, apikey)  rn                   .update(value)rn                   .digest(&#039;hex&#039;);rnif (hash !== event_data_signature) {  rn  console.log(&#039;Invalid signature&#039;);rn  return;rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Si a\u00f1adimos eso a nuestro ejemplo de c\u00f3digo original, obtendremos algo as\u00ed:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const express = require(&#039;express&#039;)  rn    , crypto = require(&#039;crypto&#039;)rn    , multer = require(&#039;multer&#039;)rn    , bodyParser = require(&#039;body-parser&#039;)rn    ;rnrnconst app = express();  rnapp.use(bodyParser.urlencoded({extended: false}));  rnapp.listen(process.env.PORT || 3000);rnrnapp.get(&#039;\/webhook&#039;, multer().none(), function(req, res) {  rn  \/\/ Validate signaturern  const value = req.body.timestamp+req.body.token;rn  const hash = crypto.createHmac(&#039;sha256&#039;,rn              process.env.API_KEY)rn                   .update(value)rn                   .digest(&#039;hex&#039;);rn  if (hash !== req.body.signature) {rn    console.log(&#039;Invalid signature&#039;);rn    return res.end();rn  }rnrn  \/\/ Log status of eventrn  const email = req.body.recipient;rn  const event = req.body.event;rnrn  if (event == &#039;complained&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;${email} complained about your mail&lt;\/code&gt;);rn  }rn  else if (event == &#039;dropped&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Mail to ${email} dropped. ${event.description}&lt;\/code&gt;);rn  }rn  else if (event == &#039;bounced&#039;) {rn    console.log(&lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;Error ${event.code}: Mail to ${email} bounced. ${event.error}&lt;\/code&gt;);rn  }rnrn  res.end();rn});\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Podemos ir un paso m\u00e1s all\u00e1 e incluir lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Comprobar cada petici\u00f3n frente a una memoria cach\u00e9 de tokens para evitar que se use el mismo token. Todos los tokens se almacenar\u00e1n all\u00ed. Esto evitar\u00e1 los ataques de repetici\u00f3n (replay).<\/li>\n\n\n\n<li>Comprobar que el valor de timestamp no est\u00e9 demasiado alejado de la hora actual.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Mejorar la escalabilidad<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si env\u00edas muchos emails y esperas bastantes eventos, colocar el script del webhook en un servidor que no pueda escalar autom\u00e1ticamente es una mala idea. Incluso si no esperas muchos eventos, puede ocurrir cualquier imprevisto que provoque un aumento repentino. Tener un servidor que pueda escalar de forma autom\u00e1tica resulta muy \u00fatil para este tipo de situaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed es donde entra en juego la\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Serverless_computing\" target=\"_tabs\" rel=\"noopener noreferrer\">computaci\u00f3n sin servidor<\/a>. En pocas palabras, la idea consiste en delegar la ejecuci\u00f3n de tu c\u00f3digo y todo lo relacionado con ella en un proveedor. Pueden ejecutarse m\u00faltiples instancias de tu c\u00f3digo en paralelo y puedes ajustar sobre la marcha los recursos inform\u00e1ticos, como la memoria RAM y el tiempo de ejecuci\u00f3n. Esto hace que sea altamente escalable. <b>Adem\u00e1s, se te cobrar\u00e1 en funci\u00f3n de los recursos consumidos y el tiempo de ejecuci\u00f3n, por lo que puede resultar muy barato si no env\u00edas gran cantidad de emails habitualmente.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay varios proveedores de computaci\u00f3n sin servidor. Uno que yo utilizo y recomiendo es\u00a0<a href=\"https:\/\/cloud.google.com\/functions\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Google Cloud Functions<\/a>\u00a0por la facilidad para configurar las funciones HTTP. Una funci\u00f3n HTTP es un bloque de c\u00f3digo encapsulado como una funci\u00f3n que puede activarse al visitar una URL. Eso es justo lo que necesitamos para nuestro webhook.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para crear esta funci\u00f3n, debemos escribir una funci\u00f3n en JavaScript que se exportar\u00e1 como un m\u00f3dulo de Node.js. La funci\u00f3n toma argumentos espec\u00edficos de HTTP:\u00a0<code>request<\/code>\u00a0y\u00a0<code>response<\/code>.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    exports.webhook = function(request, response) {  rn  \/\/ Handle event data herern  response.send({status:&quot;ok&quot;});rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Dependiendo del tipo de contenido de la petici\u00f3n, el cuerpo de la misma se pasa de manera autom\u00e1tica y queda disponible en el par\u00e1metro\u00a0<code>body<\/code>\u00a0del objeto de la petici\u00f3n.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    exports.webhook = function(request, response) {  rn  let event = request.body.event; \/\/ deliveredrn  \/\/ Handle event data herern  \/\/ ...rn  response.send({status:&quot;ok&quot;});rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\"><b>Sin embargo, esto no funciona para el tipo de contenido multipart\/form-data<\/b>. Y como ya sabemos, Mailgun env\u00eda algunos de los datos en formato multipart\/form-data. Podemos incorporar una biblioteca como\u00a0<a href=\"https:\/\/github.com\/expressjs\/multer\" target=\"_tabs\" rel=\"noopener noreferrer\">Multer<\/a>\u00a0utilizando\u00a0<code>require()<\/code>. No obstante, debemos asegurarnos de que la dependencia conste en el archivo\u00a0<b>package.json<\/b>.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    const multer = require(&#039;multer&#039;);rnrnexports.webhook = function(request, response) {  rn  parser(request, response, function(){rn    console.log(request.body); \/\/ Our event datarn    \/\/ Handle event data herern    \/\/ ...rn    response.send({status:&quot;ok&quot;});rn  });rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Java                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Java\">\r\n                                <code id=\"code_0_content\" class=\"language-Java\">\r\n\r\n                                    {rn  &quot;dependencies&quot;: {rn    &quot;multer&quot;: &quot;^1.3.0&quot;rn  }rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, podemos publicar la funci\u00f3n en\u00a0<a href=\"https:\/\/cloud.google.com\/functions\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Cloud Functions<\/a>. Una forma sencilla de hacerlo es desde el panel de control de Cloud Functions.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ve a la <a href=\"https:\/\/console.cloud.google.com\/start\" target=\"_tabs\" rel=\"noopener noreferrer\">Google Cloud Console<\/a> (si a\u00fan no tienes una cuenta, crea una).<\/li>\n\n\n\n<li>Habilita Cloud Functions en el panel de control.<\/li>\n\n\n\n<li>Haz clic en \u201cCrear funci\u00f3n\u201d.<\/li>\n\n\n\n<li>Escribe un nombre para la funci\u00f3n (p. ej., \u201cmailgun-webhook\u201d).<\/li>\n\n\n\n<li>En la secci\u00f3n del disparador, selecciona \u201cDisparador HTTP\u201d. Anota la URL, ya que esa ser\u00e1 la URL de tu webhook.<\/li>\n\n\n\n<li>Copia el c\u00f3digo que maneja los datos de los eventos a la secci\u00f3n i<i>ndex.js <\/i>de Cloud Functions.<\/li>\n\n\n\n<li>Copia el contenido de tu <b>package.json <\/b>y p\u00e9galo en la secci\u00f3n <i>package.json<\/i>.<\/li>\n\n\n\n<li>Selecciona o crea un segmento de etapa (<i>Stage bucket<\/i>). Ah\u00ed es sencillamente donde se aloja el c\u00f3digo. Puedes usar cualquier cosa aqu\u00ed.<\/li>\n\n\n\n<li>En <i>Funci\u00f3n a ejecutar<\/i>, introduce el nombre de la funci\u00f3n (p. ej., \u201cwebhook\u201d).<\/li>\n\n\n\n<li>Guardar.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora ya puedes usar la URL de la funci\u00f3n en Mailgun como URL de tu webhook.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trabajar con los webhooks de Mailgun es muy f\u00e1cil. Hay muchas formas de usar los datos de eventos para enriquecer tus aplicaciones fuera de Mailgun. Por ejemplo, si permites que tu base de usuarios env\u00ede emails desde el sitio web por el motivo que sea y utilizas Mailgun, puedes emplear los webhooks para ofrecerles anal\u00edticas. O a lo mejor quieres enviar las anal\u00edticas de los emails a otra plataforma. O tal vez prefieres que se te notifiquen los fallos de tu\u00a0<a href=\"https:\/\/slack.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Slack<\/a>\u00a0cuenta. O puede que ni siquiera eso, quiz\u00e1 solo busques anal\u00edticas m\u00e1s detalladas. Sea cual sea el caso de uso, <b>los datos de los eventos est\u00e1n a tu disposici\u00f3n.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ver un ejemplo del mundo real, echa un vistazo al c\u00f3digo fuente del\u00a0<a href=\"https:\/\/github.com\/kehers\/suet\/blob\/master\/workers\/hooks\/index.js\" target=\"_tabs\" rel=\"noopener noreferrer\">archivo del webhook de Suet<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><i>\u00bfQuieres probar los webhooks de Mailgun? \u00a1Reg\u00edstrate!<\/i><\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_1c943316059d61c153b7492ef115ceb3\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_1c943316059d61c153b7492ef115ceb3\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n\n\n\n<p class=\"wp-block-paragraph\"><i>Y si necesitas algo de ayuda para dar los primeros pasos con Mailgun,\u00a0<\/i><a href=\"https:\/\/www.crowdcast.io\/e\/getting-started-with-mailgun?utm_source=mailgun&amp;utm_medium=blog&amp;utm_campaign=webhooks-1710\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>echa un vistazo a esta formaci\u00f3n gratuita de Mailgun<\/i><\/a><i>! Nuestro l\u00edder del equipo de Asistencia al cliente, Chris Hammer, te guiar\u00e1 durante todo el proceso de configuraci\u00f3n y te ayudar\u00e1 a empezar a enviar, recibir y hacer el seguimiento de tus emails con Mailgun.<\/i><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.<\/p>\n","protected":false},"author":13,"featured_media":4555,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[22],"class_list":["post-23458","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-product"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-16T06:14:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/\",\"name\":\"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Product.png\",\"datePublished\":\"2026-09-16T06:14:43+00:00\",\"dateModified\":\"2026-09-16T06:14:44+00:00\",\"description\":\"Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Product.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Product.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/product\\\/una-guia-para-usar-los-webhooks-de-mailgun\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun - Transactional Email API Service For Developers | Mailgun","description":"Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/","og_locale":"es_ES","og_type":"article","og_title":"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun - Transactional Email API Service For Developers | Mailgun","og_description":"Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-16T06:14:44+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/","url":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/","name":"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","datePublished":"2026-09-16T06:14:43+00:00","dateModified":"2026-09-16T06:14:44+00:00","description":"Aprende a configurar los webhooks, manejar los datos de tus emails transaccionales y proteger la informaci\u00f3n de los webhooks en esta publicaci\u00f3n de un cliente de Mailgun.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Product.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/product\/una-guia-para-usar-los-webhooks-de-mailgun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Gu\u00eda pr\u00e1ctica para usar los webhooks de Mailgun"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/23458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/23458\/revisions"}],"predecessor-version":[{"id":23459,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/23458\/revisions\/23459"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4555"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=23458"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=23458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}