{"id":18236,"date":"2026-09-03T11:49:17","date_gmt":"2026-09-03T11:49:17","guid":{"rendered":"https:\/\/www.mailgun.com\/resources\/case-studies\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/"},"modified":"2026-09-03T11:49:17","modified_gmt":"2026-09-03T11:49:17","slug":"como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes","status":"publish","type":"case-studies","link":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/","title":{"rendered":"C\u00f3mo triplic\u00f3 Launch School Academy la interacci\u00f3n de los estudiantes"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En Tealeaf Academy, crear una experiencia de \u201cestudiar juntos, progresar juntos\u201d para nuestros estudiantes es fundamental en nuestra forma de ense\u00f1ar. Una de nuestras herramientas principales es el foro de debate, donde los estudiantes hacen preguntas, comparten ideas, colaboran en los deberes y los profesores intervienen r\u00e1pidamente para ayudar a los estudiantes a resolver sus problemas. Una de nuestras prioridades recientes era reducir la fricci\u00f3n en el uso del foro de debate y fomentar m\u00e1s debates con una notificaci\u00f3n por email complementaria y un flujo de trabajo de \u201cresponder al email para publicar en el foro de debate\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Una vez que implementamos el siguiente c\u00f3digo utilizando la API de rutas de Mailgun, la actividad en nuestro foro de debate se triplic\u00f3, y ahora las preguntas suelen responderse en una hora, a veces incluso en minutos, y los estudiantes pueden pasar al siguiente conjunto de tareas mucho m\u00e1s r\u00e1pido.<\/b><b><i>\u00a0<\/i><\/b>As\u00ed es como lo hicimos:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nuestro flujo de trabajo ser\u00eda el siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Cuando se crea una publicaci\u00f3n (muy probablemente, una pregunta), todos los participantes del curso reciben una notificaci\u00f3n por email<\/li>\n\n\n\n<li>Los participantes del curso pueden responder a las notificaciones por email directamente desde su bandeja de entrada de email, sin tener que iniciar sesi\u00f3n en el curso<\/li>\n\n\n\n<li>Esa respuesta se publicar\u00e1 en el foro de debate online, y tambi\u00e9n se env\u00eda a otros participantes del curso para mantener la conversaci\u00f3n en marcha.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 elegimos Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La pieza clave de este flujo de trabajo es recibir y analizar mensajes de email entrantes. Buscamos entre varios proveedores de servicios de env\u00edo de emails, y al final elegimos Mailgun porque:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Es muy f\u00e1cil de usar para los desarrolladores: somos desarrolladores y Mailgun habla nuestro idioma. Las API exponen muchas opciones de bajo nivel que permiten hacer ajustes. Nos gustan las\u00a0<a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/api-routes.html?highlight=routes#routes\" target=\"_tabs\" rel=\"noopener noreferrer\">rutas<\/a>\u00a0en particular: es una buena capa de abstracci\u00f3n que hace que la integraci\u00f3n con las aplicaciones sea muy f\u00e1cil. (mira c\u00f3mo lo usamos a continuaci\u00f3n)<\/li>\n\n\n\n<li>Es el servicio m\u00e1s completo en caracter\u00edsticas que hemos encontrado: podemos usar Mailgun para emails transaccionales, campa\u00f1as y tambi\u00e9n para listas de contactos. Es estupendo tener un solo proveedor de servicios para encargarse de todo lo que necesitamos.<\/li>\n\n\n\n<li>El precio es razonable y el proceso para pasar a un plan superior con IP dedicada y DKIM personalizado est\u00e1 muy bien, aunque todav\u00eda no lo necesitemos.<\/li>\n\n\n\n<li>La asistencia es de primera categor\u00eda. Hay un chat en directo donde puedo hablar con sus desarrolladores directamente sobre los problemas y nos ha resultado muy \u00fatil para resolverlos.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Configuraci\u00f3n de la infraestructura de email<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El primer paso fue crear un nuevo dominio en Mailgun. En nuestro caso, es messaging.gotealeaf.com, el cual utilizamos para enviar y recibir emails.<\/li>\n\n\n\n<li>A continuaci\u00f3n, creamos un MailgunGateway como nuestro wrapper para la API de Mailgun. Este wrapper se encarga de todas nuestras interacciones con Mailgun a trav\u00e9s de nuestra cuenta. Aqu\u00ed utilizamos la API send_batch_messages de Mailgun para enviar emails en HTML. Nos permite enviar un mensaje a m\u00faltiples destinatarios con una sola llamada a la API. Mantenemos nuestra clave de API como variables de entorno en el servidor para mayor seguridad. Tambi\u00e9n hay un simple filtro de entrega de modo que no se env\u00edan emails en el entorno de desarrollo; en staging, todos los emails se env\u00edan a Chris (mi cofundador) y a m\u00ed, para que podamos probar las cosas sin temor a enviar spam a nuestros usuarios; solo en el entorno de producci\u00f3n se env\u00edan emails a usuarios reales.<\/li>\n<\/ul>\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                                HTML                            <\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"Copiado\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar 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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    class MailgunGateway  \r\n  def send_batch_message(options={})\r\n    RestClient.post(messaging_api_end_point,\r\n        from: default_sender,\r\n        to: delivery_filter(options[:to]),\r\n        subject: options[:subject],\r\n        html: options[:body],\r\n        :&quot;h:Reply-To&quot; =&gt; options[:reply_to],\r\n        :&quot;recipient-variables&quot; =&gt; options[:recipient_variables]\r\n        ) if Rails.env.staging? || Rails.env.production?\r\n    end\r\n  end\r\n\r\n  private\r\n\r\n  def default_sender\r\n    &quot;Tealeaf Academy &quot;\r\n  end\r\n\r\n  def api_key\r\n    @api_key ||= ENV[&#039;mailgun_api_key&#039;]\r\n  end\r\n\r\n  def messaging_api_end_point\r\n    @messaging_api_end_piont ||= \r\n        &quot;https:\/\/api:#{api_key}@api.mailgun.net\/v2\/messaging.gotealeaf.com\/messages&quot;\r\n  end\r\n\r\n  def delivery_filter(emails)\r\n    Rails.env.production? ? emails : &quot;kevin@gotealeaf.com, chris@gotealeaf.com&quot;\r\n  end\r\nend\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\">Env\u00eda notificaciones por email para nuevas publicaciones o comentarios<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que se crea una publicaci\u00f3n o comentario, enviamos una notificaci\u00f3n por email a todos los participantes del curso. Por ahora estamos enviando emails de forma sincr\u00f3nica, pero a medida que tengamos m\u00e1s usuarios, probablemente querremos delegar esto a un trabajo en segundo plano.<\/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                                HTML                            <\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"Copiado\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar 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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    Launch School Code 1class Courses::PostsController &lt; AuthenticatedController  \r\n  expose(:course)\r\n  expose(:posts) { course.posts }\r\n  expose(:post)\r\n\r\n  def create\r\n    post.user = current_user\r\n    post.save\r\n    CourseNotifier.new(course).notify_course_participants_on_new_discussion(post)\r\n    redirect_to course_home_path(course)\r\n  end\r\n\r\n  ...\r\nend\r\n\r\nclass Courses::Posts::CommentsController &lt; AuthenticatedController  \r\n  expose(:course)\r\n  expose(:posts) { course.posts }\r\n  expose(:post)\r\n  expose(:comments) { post.comments }\r\n  expose(:comment)\r\n\r\n  def create\r\n    comment.user = current_user\r\n    comment.save\r\n    CourseNotifier.new(course).notify_course_participants_on_new_discussion(comment)\r\n    redirect_to course_home_path(course)\r\n  end\r\n\r\n  ...\r\nend\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\">CourseNotifier es la clase donde ponemos la l\u00f3gica espec\u00edfica de nuestra aplicaci\u00f3n sobre las notificaciones. Ten en cuenta que MailgunGateway se inyecta como el gateway predeterminado: esto es de cuando sol\u00edamos tener varios proveedores de servicios de env\u00edo de emails para campa\u00f1as, listas y emails transaccionales. \u00a1Ahora es menos necesario, ya que consolidamos todas las necesidades de entrega de emails en Mailgun!<\/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                                HTML                            <\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"Copiado\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar 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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    class CourseNotifier\r\n\r\n  attr_reader :course, :gateway\r\n\r\n  def initialize(course, gateway=MailgunGateway.new)\r\n    @course = course\r\n    @gateway = gateway\r\n  end\r\n\r\n  def notify_course_participants_on_new_discussion(discussion)\r\n    gateway.send_batch_message(\r\n      to: notification_recipients(discussion).map(&amp;:email).join(&quot;, &quot;),\r\n      subject: notification_subject(discussion),\r\n      body: discussion_notification_text(discussion),\r\n      reply_to: reply_to_address(discussion),\r\n      recipient_variables: recipient_variables(\r\n        notification_recipients(discussion)\r\n      )\r\n    )\r\n  end\r\n\r\n  ...\r\n\r\n  private\r\n\r\n  def notification_recipients(discussion)\r\n    course.participants.reject {|participant| participant.email == discussion.user.email }\r\n  end\r\n\r\n  def notification_subject(discussion)\r\n    discussion.is_a?(Post) ?\r\n    &quot;[Tealeaf Academy] #{discussion.user.name} Posted a New Message on the Discussion Board&quot; :\r\n    &quot;[Tealeaf Academy] #{discussion.user.name} Replied to a Message on the Discussion Board&quot;\r\n  end\r\n\r\n  def reply_to_address(discussion)\r\n    &quot;reply+#{discussion.token}@messaging.gotealeaf.com&quot;\r\n  end\r\n\r\n  def recipient_variables(recipients)\r\n    vars = recipients.map do |recipient|\r\n      &quot;&quot;#{recipient.email}&quot;: {&quot;name&quot;:&quot;#{recipient.name}&quot;}&quot;\r\n    end\r\n    &quot;{#{vars.join(&#039;, &#039;)}}&quot;\r\n  end\r\n\r\n  def discussion_notification_text(discussion)\r\n&lt;&lt;-EMAIL\r\n\r\n\r\nHi %recipient.name%,\r\n\r\n&lt;p&gt;#{discussion.user.name} says on the course dicussion board:&lt;\/p&gt;\r\n\r\n&quot;#{discussion.text}&quot;\r\n&lt;br \/&gt;\r\n&lt;p&gt;Reply to this email directly or &lt;a href=&quot;http:\/\/www.gotealeaf.com\/courses\/#{course.slug}\/home&quot;&gt;view it on the discussion board&lt;\/a&gt;&lt;\/p&gt;\r\n\r\nEMAIL  \r\n  end\r\nend\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\">El reply<i>to<\/i>address es donde insertamos el token de la publicaci\u00f3n en el encabezado \u00abReply-To\u00bb. El contenido de los emails es bastante simple, as\u00ed que simplemente lo ponemos aqu\u00ed en la clase. Si tuvi\u00e9ramos un estilo de email m\u00e1s elaborado, habr\u00edamos utilizado la renderizaci\u00f3n de plantillas para manejarlo. Con la API send<i>batch<\/i>message de Mailgun, podemos llamar a la API solo una vez para enviar a m\u00faltiples destinatarios, y el m\u00e9todo recipient_variables es donde personalizamos los mensajes de email para cada destinatario e incluimos sus nombres para darle un toque personal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gesti\u00f3n de mensajes entrantes en la aplicaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En Mailgun, bajo \u00abRoutes\u00bb en el Panel de Control, creamos una ruta como la siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Expresi\u00f3n de filtro: match_recipient(\u00abreply+(.*)@messaging.gotealeaf.com\u00bb)<\/li>\n\n\n\n<li>Acci\u00f3n: forward(\u00abhttp:\/\/www.gotealeaf.com\/api\/incoming_messages\/?post_token=1\u00bb)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando un usuario responde a un email, lo responde a una direcci\u00f3n de email como \u00abreply+fj42gq4v@messaging.gotealeaf.com\u00bb, y esta ruta reenviar\u00e1 el email a un webhook que exponemos para manejar los mensajes entrantes.<\/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                                HTML                            <\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"Copiado\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar 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-markup\">\r\n                                <code id=\"code_0_content\" class=\"language-markup\">\r\n\r\n                                    class Api::IncomingMessagesController &lt; ApplicationController  \r\n  skip_before_filter :verify_authenticity_token\r\n\r\n  def create\r\n    user = User.where(email: params[&#039;sender&#039;]).first\r\n    post = Post.where(token: params[&#039;post_token&#039;]).first\r\n    text = params[&quot;stripped-text&quot;]\r\n    if post &amp;&amp; user &amp;&amp; text.present?\r\n      comment = post.comments.create(user: user, text: text)\r\n      CourseNotifier.new(post.course).notify_course_participants_on_new_discussion(comment)\r\n    end\r\n    head(200)\r\n  end\r\nend\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\">Aqu\u00ed, usamos el email del remitente para encontrar al autor, y usamos el token de la publicaci\u00f3n para encontrar la publicaci\u00f3n bajo la cual se debe cotejar esta respuesta. \u00a1Mailgun nos da el \u00fatil texto sin formato que elimina la parte del mensaje original para que solo contenga la respuesta en s\u00ed! Al final, devolvemos un encabezado 200 para decirle a Mailgun que esta interacci\u00f3n fue exitosa; de lo contrario, Mailgun pensar\u00e1 que nuestro servidor est\u00e1 ca\u00eddo y seguir\u00e1 intentando llamar fielmente a nuestro webhook.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El resultado de implementar este flujo de trabajo es impresionante: la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora, a veces incluso en minutos, los estudiantes pueden pasar a la siguiente serie de tareas mucho m\u00e1s r\u00e1pido y estamos muy contentos de c\u00f3mo result\u00f3.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"quote hub-quote longform-spacings d-flex flex-column rounded-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 shadow-sm bg-primary\" data-theme=\"light\">\r\n\r\n        <div class=\"quote-logo mb-3\">\r\n                            <img decoding=\"async\" class=\"quote-logo\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/omnisend.svg\" alt=\"Logotipo de cita de Paulius Milisauskas\">\r\n                    <\/div>\r\n\r\n        <blockquote class=\"quote-content content-body m-0 text-body-color\" id=\"quote-block-2a1e0a9335a39e714ddf1bd88fcadd2d\">\r\n            \u00abPodemos garantizar un mejor servicio para nuestros profesionales del marketing al usar Mailgun. Ellos cuentan con nosotros y nosotros contamos con Mailgun: y esta relaci\u00f3n nos ayuda a mantener la credibilidad ante nuestros clientes\u00bb.        <\/blockquote>\r\n\r\n                    <div class=\"d-flex gap-3 mt-5\">\r\n                                    <div>\r\n                        <img decoding=\"async\" width=\"72\" height=\"72\" class=\"rounded-lg quote-author\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/Portrait-Paulius-Milisauskas-Omnisend.png\" alt=\"Foto de Paulius Milisauskas\">\r\n                    <\/div>\r\n                                <div class=\"d-flex flex-column align-self-center fs-sm\">\r\n                    <cite class=\"mb-0 fw-bold text-accent fst-normal\" aria-describedby=\"quote-block-2a1e0a9335a39e714ddf1bd88fcadd2d\">\r\n                        Paulius Milisauskas                    <\/cite>\r\n                                            <span class=\"mb-0 text-body-color\">Vicepresidente de Operaciones de Cliente<\/span>\r\n                                    <\/div>\r\n            <\/div>\r\n            <\/div>\r\n\n\n    <div data-content-type=\"longform\" class=\"longform-spacings\">\r\n        <div class=\"cta bg-primary rounded-lg px-5 py-6 p-md-7 px-md-6\">\r\n                    <div class=\"form-subscription\">\r\n                            <div class=\"h4 mb-3\">\r\n                    \u00a1Mantenme informado\/a! Recibe excelentes recursos en tu bandeja de entrada cada semana.                <\/div>\r\n                                    <form accept-charset=\"UTF-8\" action=\"\" enctype=\"multipart\/form-data\" data-form-subscription method=\"POST\" style=\"max-width: 400px;\">\r\n                <div class=\"row justify-content-between align-items-top g-2\">\r\n                    <div class=\"col-10\">\r\n                        <input type=\"email\" name=\"email\" class=\"form-control\" placeholder=\"Email\" autocomplete=\"email\" required>\r\n                        <div data-fs=\"error\" role=\"alert\" class=\"invalid-feedback\">\r\n                            Please complete this required field.                        <\/div>\r\n                    <\/div>\r\n                                            <div class=\"col-12 order-last mt-3 fs-xxs\" data-fs=\"acceptance\" style=\"display:none;\">\r\n                            \r\n                                <div class=\"form-check\">\r\n                                    <input id=\"formSubscriptionAcceptance-terms-3489\" class=\"form-check-input\"\r\n                                        type=\"checkbox\" name=\"terms\">\r\n                                    <label for=\"formSubscriptionAcceptance-terms-3489\" class=\"form-check-label text-body-color\">\r\n                                        He le\u00eddo y acepto los T\u00e9rminos de Servicio.                                        <span class=\"hs-form-required\">*<\/span>\r\n                                    <\/label>\r\n                                <\/div>\r\n\r\n                            \r\n                                <div class=\"form-check\">\r\n                                    <input id=\"formSubscriptionAcceptance-privacy-5408\" class=\"form-check-input\"\r\n                                        type=\"checkbox\" name=\"privacy\">\r\n                                    <label for=\"formSubscriptionAcceptance-privacy-5408\" class=\"form-check-label text-body-color\">\r\n                                        He le\u00eddo y acepto la Pol\u00edtica de Privacidad.                                        <span class=\"hs-form-required\">*<\/span>\r\n                                    <\/label>\r\n                                <\/div>\r\n\r\n                                                    <\/div>\r\n                    \r\n                                            <div class=\"col-12 order-last fs-xxs mb-0 mt-2 text-body-color\">\r\n                            Env\u00edame la newsletter de Mailjet. Acepto expresamente recibir la newsletter y s\u00e9 que puedo darme de baja f\u00e1cilmente en cualquier momento.                        <\/div>\r\n                    \r\n                    <div class=\"col-2\">\r\n                        <button type=\"submit\" value=\"Submit\" aria-label=\"Submit\" class=\"btn btn-secondary btn-icon\">\r\n                            <svg aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/layout\/chevron-right.svg\"><\/svg>\r\n                        <\/button>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <input type=\"hidden\" name=\"formSubscriptionRecaptchaToken\" data-fs=\"recaptcha-token\">\r\n                <input type=\"hidden\" name=\"customListID\" value=\"\">\r\n\r\n            <\/form>\r\n            <div data-fs=\"message-success\" style=\"display: none;\">\r\n                <p class=\"mb-0 mt-2 text-body-color\">\r\n                    \u00a1Consulta mensualmente tu bandeja de entrada para recibir la newsletter de Mailjet!                <\/p>\r\n            <\/div>\r\n        <\/div>\r\n        <\/div>\r\n    <\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo est\u00e1 escrito por Kevin Wang, instructor jefe en Tealeaf Academy (Launch School). Tealeaf Academy es una escuela online para desarrolladores y ofrece bootcamps online intensivos basados en proyectos sobre desarrollo web. \u00a1Si te parece \u00fatil este art\u00edculo, deber\u00edas echarles un vistazo!<\/p>\n","protected":false},"author":90,"featured_media":8232,"template":"","meta":{"_acf_changed":true},"class_list":["post-18236","case-studies","type-case-studies","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C\u00f3mo triplic\u00f3 Tealeaf Academy la interacci\u00f3n de los estudiantes | Mailgun<\/title>\n<meta name=\"description\" content=\"Una vez que implementamos el siguiente c\u00f3digo usando la API de rutas de Mailgun, la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora. M\u00e1s informaci\u00f3n\" \/>\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\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo triplic\u00f3 Tealeaf Academy la interacci\u00f3n de los estudiantes | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Una vez que implementamos el siguiente c\u00f3digo usando la API de rutas de Mailgun, la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora. M\u00e1s informaci\u00f3n\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/01\/Mailgun-Case-Study-LaunchSchool.png\" \/>\n\t<meta property=\"og:image:width\" content=\"592\" \/>\n\t<meta property=\"og:image:height\" content=\"368\" \/>\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=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/\",\"name\":\"C\u00f3mo triplic\u00f3 Tealeaf Academy la interacci\u00f3n de los estudiantes | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Mailgun-Case-Study-LaunchSchool.png\",\"datePublished\":\"2026-09-03T11:49:17+00:00\",\"description\":\"Una vez que implementamos el siguiente c\u00f3digo usando la API de rutas de Mailgun, la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora. M\u00e1s informaci\u00f3n\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Mailgun-Case-Study-LaunchSchool.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Mailgun-Case-Study-LaunchSchool.png\",\"width\":592,\"height\":368},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Case Studies\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/recursos\\\/estudios-de-caso\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C\u00f3mo triplic\u00f3 Launch School Academy la interacci\u00f3n de los estudiantes\"}]},{\"@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":"C\u00f3mo triplic\u00f3 Tealeaf Academy la interacci\u00f3n de los estudiantes | Mailgun","description":"Una vez que implementamos el siguiente c\u00f3digo usando la API de rutas de Mailgun, la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora. M\u00e1s informaci\u00f3n","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\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo triplic\u00f3 Tealeaf Academy la interacci\u00f3n de los estudiantes | Mailgun","og_description":"Una vez que implementamos el siguiente c\u00f3digo usando la API de rutas de Mailgun, la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora. M\u00e1s informaci\u00f3n","og_url":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":592,"height":368,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/01\/Mailgun-Case-Study-LaunchSchool.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/","url":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/","name":"C\u00f3mo triplic\u00f3 Tealeaf Academy la interacci\u00f3n de los estudiantes | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/01\/Mailgun-Case-Study-LaunchSchool.png","datePublished":"2026-09-03T11:49:17+00:00","description":"Una vez que implementamos el siguiente c\u00f3digo usando la API de rutas de Mailgun, la actividad en nuestro foro de discusi\u00f3n se triplic\u00f3, y las preguntas ahora suelen responderse en menos de una hora. M\u00e1s informaci\u00f3n","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/01\/Mailgun-Case-Study-LaunchSchool.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/01\/Mailgun-Case-Study-LaunchSchool.png","width":592,"height":368},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/como-triplico-tealeaf-academy-la-interaccion-de-los-estudiantes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Case Studies","item":"https:\/\/www.mailgun.com\/es\/recursos\/estudios-de-caso\/"},{"@type":"ListItem","position":3,"name":"C\u00f3mo triplic\u00f3 Launch School Academy la interacci\u00f3n de los estudiantes"}]},{"@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\/case-studies\/18236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/case-studies"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/case-studies"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/90"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/8232"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=18236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}