{"id":15003,"date":"2023-01-12T00:00:00","date_gmt":"2023-01-12T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/mailgun-app-rebuild-teil-eins\/"},"modified":"2026-07-24T04:36:31","modified_gmt":"2026-07-24T04:36:31","slug":"mailgun-app-rebuild-teil-eins","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/","title":{"rendered":"Ein tiefer Einblick in den Rebuild der Mailgun-App: Teil 1 \u2013 Hervorragende Ideen"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Seien Sie gegr\u00fc\u00dft, liebe Entwickler. Wir freuen uns, Ihnen mitteilen zu k\u00f6nnen, dass unser Team nach drei langen Jahren der Planung, des Designs und der Entwicklung unser gro\u00dfartiges App-Update ver\u00f6ffentlicht hat. Sicherlich haben wir unerm\u00fcdlich daran gearbeitet, das Erscheinungsbild unserer Benutzeroberfl\u00e4che zu aktualisieren, aber wir haben eine noch weitreichendere \u00dcberarbeitung vorgenommen an <!-- -->unserem grundlegenden Technologie-Stack<!-- -->.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was bedeutet das f\u00fcr Sie? Bessere Leistung, besseres Interface und skalierbar f\u00fcr zuk\u00fcnftiges Wachstum. Wir reisen in die Vergangenheit, um Ihnen den vollst\u00e4ndigen Bericht dar\u00fcber zu bringen, wie wir dies verwirklicht haben. Begleiten Sie uns auf dieser Reise.<\/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-1509\"><p class=\"h5 m-0\" id=\"toc-title-1509\">Table of contents<\/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=\"#warum-wir-diese-reise-angetreten-haben\">Warum wir diese Reise angetreten haben<\/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=\"#was-wir-bauen-wollten\">Was wir bauen wollten<\/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=\"#geschichte-unser-urspruenglicher-frontend-stack\">Geschichte: Unser urspr\u00fcnglicher Frontend-Stack<\/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=\"#wie-unser-legacy-framework-unserer-skalierbarkeit-einen-strich-durch-die-rechnung-machte\">Wie unser Legacy-Framework unserer Skalierbarkeit einen Strich durch die Rechnung machte<\/a><a class=\"scrollme link-body-color\" href=\"#das-problem-bei-der-verwaltung-von-app-weiten-states\">Das Problem bei der Verwaltung von app-weiten States<\/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=\"#einschraenkungen-des-polyrepos\">Einschr\u00e4nkungen des Polyrepos<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#plaene-fuer-ein-schickes-neues-repo-ein-modularer-ansatz\">Pl\u00e4ne f\u00fcr ein schickes neues Repo: Ein modularer Ansatz<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">07<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#auf-die-fuesse-treten-der-deployment-tanz\">Auf die F\u00fc\u00dfe treten: Der Deployment-Tanz<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">08<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#miese-herausforderungen-und-exzellenteste-loesungen\">Miese Herausforderungen und exzellenteste L\u00f6sungen<\/a><a class=\"scrollme link-body-color\" href=\"#werfen-sie-das-kind-nicht-mit-dem-bade-aus\">Werfen Sie das Kind nicht mit dem Bade aus<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">09<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#wir-haben-einen-plan-aber-koennen-wir-ihn-verwirklichen\">Wir haben einen Plan, aber k\u00f6nnen wir ihn verwirklichen?<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Warum wir diese Reise angetreten haben<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aber warten Sie! Bevor wir in die Vergangenheit springen, ist es wichtig, unsere verbesserte App vorzustellen. \u201eVerbessert\u201c ist eine Untertreibung. Es mag Sie \u00fcberraschen, dass dieses UI- und Performance-Facelift kein Umsatztreiber war. Warum haben wir es also getan?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Zwei Gr\u00fcnde:<\/b><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Die bestehende Nutzererfahrung beeintr\u00e4chtigte die Leistung f\u00fcr Kunden, die gr\u00f6\u00dfere Mengen an E-Mails versenden, und erschwerte die Navigation zwischen den Produkten in unserem wachsenden Portfolio. Wenn es nicht einfach zu bedienen ist, dann werden <i>Sie<\/i> es nicht nutzen. <\/li>\n\n\n\n<li>Wir mussten unseren zentralen API-Datenfluss neu bewerten, um leistungsorientierter und skalierbarer zu sein.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Was wir geschaffen haben, ist <b>Portal<\/b>, eine epische Schnittstelle, um Sie besser mit Ihren Produkten und Tools f\u00fcr die Zustellbarkeit zu verbinden, jetzt <i>und<\/i> w\u00e4hrend wir wachsen. <b>Portal<\/b> erm\u00f6glicht es Ihnen, nahtlos zwischen unseren Mailgun- und <a href=\"https:\/\/www.mailgun.com\/de\/products\/inbox\/inboxready\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun Optimize<\/a> Produkten zu wechseln, und bietet ein hochperformantes Erlebnis f\u00fcr unsere Power-Nutzer, die Zehntausende von E-Mails pro Tag versenden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bleiben Sie also bei uns, w\u00e4hrend wir fachsimpeln, uns einklinken und durch die letzten drei Jahre unseres Entwicklungsprozesses reisen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4049\" width=\"1280\" height=\"720\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/bill-teds-excellent-adventure-wallpaper-12__1_.png\" alt=\"bill-teds-excellent-adventure-wallpaper-12__1_\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/bill-teds-excellent-adventure-wallpaper-12__1_.png 1280w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/bill-teds-excellent-adventure-wallpaper-12__1_-300x169.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/bill-teds-excellent-adventure-wallpaper-12__1_-768x432.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/bill-teds-excellent-adventure-wallpaper-12__1_-1024x576.png 1024w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Was wir bauen wollten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wir begannen mit der Erstellung einer langen Liste all der verschiedenen Dinge, die wir wollten \u2013 vom Aktualisieren unserer Repository-Struktur bis zur Implementierung eines neuen Deploy-Systems, und wir wussten, dass wir es von Grund auf neu erstellen mussten, da unser SRE-Team von AWS zur Google Cloud migrierte. Wir wollten uns auch von unserem eng gekoppelten monolithischen Design hin zu einem verteilteren Design bewegen. Dies w\u00fcrde f\u00fcr das Team in Zukunft alles einfacher machen: von der Entwicklung umfassender Tests bis hin zu gezielten Rebuilds, ohne sich durch den gesamten Code w\u00fchlen oder ihn \u00e4ndern zu m\u00fcssen.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> \u201eWas wollen wir letztendlich bauen?\u201c Dies war die erste Frage, die wir beantworten mussten. Die n\u00e4chste Frage war: \u201eWo weisen wir Defizite auf?\u201c<\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\"><b>Bei jedem Redesign m\u00f6chten wir immer den Nutzer ber\u00fccksichtigen, aber ein gro\u00dfer Teil des Antriebs hinter unserem App-Update bestand auch darin, die Entwicklererfahrung zu verbessern. <\/b>Unser Ziel war es, die Entwicklererfahrung zu verbessern, indem wir die Komplexit\u00e4t bei der \u00dcbertragung von Daten von der API auf die gerenderte Seite deutlich reduzierten und die Wartbarkeit verbesserten, indem wir die Gesamtzahl der Muster in unserem Toolkit verringerten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Geschichte: Unser urspr\u00fcnglicher Frontend-Stack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Stacks k\u00f6nnen veralten, und unser urspr\u00fcnglicher Frontend-Stack wurde vor fast einem Jahrzehnt entwickelt<\/b> \u2013 was 350 in Internetjahren entspricht. Er enthielt einen Python Flask-Webserver, der wahrscheinlich mehr Aufgaben erledigte, als er sollte, und einen sehr eng gekoppelten State aufwies, der mit dem Client geteilt wurde. Er verwendete mehrere Abstraktionsschichten, die urspr\u00fcnglich dazu gedacht waren, den Abruf von Daten aus unseren APIs zu erleichtern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als diese Oberfl\u00e4che immer gr\u00f6\u00dfer wurde, verursachten die Muster mehr Overhead als Komfort. Es wurde sehr schwierig, grundlegende \u00c4nderungen vorzunehmen, da es so viele Stellen gab, die davon betroffen sein k\u00f6nnten. Zu diesem Zeitpunkt war unser Frontend-Client zu einem Museum veralteter React-Muster geworden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All unsere Interaktionen mit unseren eigenen \u00f6ffentlichen und privaten APIs wurden durch mehrere Schichten \u00fcberm\u00e4\u00dfiger Code-Komplexit\u00e4t verschleiert. Dies schuf eine riesige Kluft zwischen den Frontend-Entwicklern von Mailgun und ihrem Verst\u00e4ndnis unserer APIs und Kundenerlebnisse.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie unser Legacy-Framework unserer Skalierbarkeit einen Strich durch die Rechnung machte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der Flickenteppich an API-Abstraktionen f\u00fchrte nicht nur zu \u00fcberm\u00e4\u00dfiger Komplexit\u00e4t, sondern beeintr\u00e4chtigte auch erheblich unsere F\u00e4higkeit, unsere Anwendung zu skalieren. Wir wussten, dass wir im Laufe der Zeit immer mehr Produkte in die Codebasis integrieren wollten. Wir mussten v\u00f6llig neu \u00fcberdenken, wie wir unsere Daten konsumierten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als wir das neue Framework planten, wussten wir, dass wir API-Anfragen direkt vom Client an die \u00f6ffentlichen APIs mit so wenig Middleware wie m\u00f6glich stellen wollten. Warum? Auf diese Weise w\u00e4ren wir in der Lage, unsere APIs auf die gleiche Weise zu verstehen und zu konsumieren wie unsere Kunden, indem wir \u201eunser eigenes Hundefutter essen\u201c, wie man so sch\u00f6n sagt. Ich wei\u00df nicht, wie es Ihnen geht, aber ich esse lieber Steak als Hundefutter.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <b>Eine Anmerkung aus der Zukunft: <\/b>API-Anfragen direkt vom Client an die \u00f6ffentlichen APIs zu stellen, ist ein langfristiges Ziel, da viele der APIs, mit denen unsere Web-App interagiert, noch privat sind. Wir planen, die meisten dieser Dienste nach und nach in den \u00f6ffentlichen Raum zu verlagern, um eine einheitliche API-Schnittstelle f\u00fcr Portal zu haben.<\/div>\r\n    <\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">Das Problem bei der Verwaltung von app-weiten States<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Eine weitere wesentliche \u00c4nderung, die wir vornehmen wollten, war der Ersatz von Redux, das unseren app-weiten State (etwa 150 States) verwaltete. Jeder State war einem Netzwerkaufruf oder einem Netzwerk von Datentransformationen zugeordnet, und unsere Legacy-Struktur legte nicht wirklich Richtlinien daf\u00fcr fest, wie er verwendet werden sollte. Das Ergebnis? Viele Redundanzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn ein Entwickler einen Aufruf zur Datenmanipulation einf\u00fchrte, erfolgte die Integration \u00fcber drei Abstraktionsebenen. Zus\u00e4tzlich hatten wir unsere eigenen benutzerdefinierten Clients f\u00fcr unseren Browser und unseren Flask-Server (der mit all unseren APIs kommunizierte). Also <b>musste ein Entwickler, um eine neue Funktion hinzuzuf\u00fcgen, insgesamt etwa sieben Abstraktionsebenen durchlaufen<\/b>, und Fehler sind auf jeder Ebene m\u00f6glich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was wir schlie\u00dflich herausfanden, war, dass 95 % unseres app-weiten States nur ein verherrlichter Netzwerk-Cache waren. Nur zogen wir nicht einmal den Nutzen aus gecachten Daten, sondern machten oft redundante Aufrufe, um Daten anzufordern, die wir bereits hatten, was zu verschachtelten Schichten unn\u00f6tiger Re-Renders in unseren View-Komponenten f\u00fchrte. Da kann man wohl von einer holprigen Fahrt sprechen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Systemaufschl\u00fcsselung erkl\u00e4rt die Dinge etwas klarer, und obwohl wir niemals schlecht \u00fcber unsere Urspr\u00fcnge sprechen w\u00fcrden&#8230; sagt ein <i>scherzhaftes<\/i> Bild mehr als tausend Worte.<\/p>\n\n\n<div class=\"chart longform-spacings d-flex flex-column gap-3\">\r\n    <div class=\"rounded-lg bg-light-subtle position-relative py-5 py-md-6 py-lg-7 px-3 px-md-4\">\r\n\r\n                    <p class=\"mb-4 fs-sm fw-bold text-accent text-center\">\r\n                Aktuelles System            <\/p>\r\n        \r\n                                <div class=\"d-flex gap-4 flex-column\">\r\n                <div class=\"auto-chart\"  data-chart-type=\"bar\" data-chart-percentage=\"true\" data-chart-track=\"true\" data-chart-max=\"100\" data-chart-color=\"#f99b93\" data-chart-values=\"[&quot;61&quot;,&quot;54&quot;,&quot;31&quot;,&quot;88&quot;]\" data-chart-colors=\"[&quot;#FFBE3C&quot;,&quot;#FFBE3C&quot;,&quot;#FFBE3C&quot;,&quot;#FFBE3C&quot;]\" data-chart-titles=\"[&quot;Komplex&quot;,&quot;Langsam&quot;,&quot;M\\u00fchsam&quot;,&quot;Nervt&quot;]\" data-chart-series=\"[]\"><\/div>\r\n\r\n                            <\/div>\r\n            \r\n        \r\n        \r\n    <\/div>\r\n    <\/div>\n\n\n<p class=\"wp-block-paragraph\">Unser Team ist die Art von Team, das auf sich selbst aufbaut und iteriert, aber f\u00fcr diesen App-Rebuild mussten wir zur\u00fcckspulen und einige grundlegende Komponenten unserer Infrastruktur \u00fcberarbeiten \u2013 beginnend mit der Quellcode-Verwaltung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einschr\u00e4nkungen des Polyrepos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Ein <\/b><a href=\"https:\/\/github.com\/joelparkerhenderson\/monorepo-vs-polyrepo\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Polyrepo<\/b><\/a><b> ist ein Repository, das mehrere Projekte enth\u00e4lt. <\/b>Wir verwendeten einen Polyrepo-Organisationsstil, was einfach bedeutet, dass jedes Frontend-Projekt sein eigenes Repository hatte, obwohl viele der Projekte die gleichen Aufgaben wiederholten und dieselben Funktionen reproduzierten. Als zentraler Knotenpunkt k\u00f6nnen Polyrepos zu einer Herausforderung bei der Wartung werden, wenn die Anzahl der gespeicherten Projekte w\u00e4chst. In vielen F\u00e4llen mussten wir jedes Polyrepo gleichzeitig mit denselben Updates bereitstellen, um ein konsistentes Erlebnis \u00fcber unsere Produkte hinweg zu gew\u00e4hrleisten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aus Wartungssicht machte es dies f\u00fcr Teams schwierig, den ben\u00f6tigten Code zu finden und damit zu arbeiten. Die Verwaltung mehrerer Repos mit redundanten Funktionen bedeutet normalerweise, dass sie langsamer reagieren <i>und<\/i> ressourcenintensiver sind, was ein gro\u00dfes Problem darstellt, wenn Sie h\u00e4ufig Code pushen und pullen. Da Funktionen \u00fcber mehrere Codebasen verteilt sein k\u00f6nnen, k\u00f6nnen Polyrepos die Fehlersuche schwieriger machen als die Suche nach der sprichw\u00f6rtlichen Nadel im Heuhaufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit unserer Polyrepo-Struktur vor dem Rebuild wussten wir, dass die Zukunft eine Realit\u00e4t sein w\u00fcrde, in der wir mit einer Taschenlampe durch Repos jagen und nach dem suchen, was wir brauchten, und dass es eine Herausforderung sein w\u00fcrde, zusammenzuarbeiten, zu skalieren und Code zu teilen, w\u00e4hrend wir wuchsen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Dies waren unsere Hauptbedenken:<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Herausfordernde gemeinsame Entwicklung<\/li>\n\n\n\n<li>Enge Kopplung<\/li>\n\n\n\n<li>Skalierbarkeits-, Verf\u00fcgbarkeits- und Leistungsmanagement<\/li>\n\n\n\n<li>Schwierig, Code zu teilen<\/li>\n\n\n\n<li>Duplizierung<\/li>\n\n\n\n<li>Inkonsistentes Tooling<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn es um die Verwaltung von Quellcode geht, gibt es viele L\u00f6sungen, aber wir haben entschieden, dass eine modulare Monorepo-Struktur den Gro\u00dfteil unserer Entwicklungsprobleme in Zukunft lindern w\u00fcrde.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pl\u00e4ne f\u00fcr ein schickes neues Repo: Ein modularer Ansatz<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Ein Monorepo-Ansatz beinhaltet das Speichern des gesamten Codes des Projekts in einem einzigen, gro\u00dfen Repository<\/b>. Dies w\u00fcrde die Probleme mit dem Teilen von Code und der Duplizierung l\u00f6sen, die wir bei unserer Polyrepo-Organisation erlebt haben, aber Monorepos sind kein Allheilmittel. Wenn der Code eng gekoppelt ist, m\u00fcssen Monorepos auch modular konzipiert sein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Ein modularer Ansatz beinhaltet die Aufteilung eines gro\u00dfen Projekts in kleinere, unabh\u00e4ngige Module, die separat entwickelt, getestet und gewartet werden k\u00f6nnen<\/b>. Dies erm\u00f6glicht eine gr\u00f6\u00dfere Flexibilit\u00e4t und Wiederverwendbarkeit sowie die M\u00f6glichkeit, einzelne Module einfach zu aktualisieren, ohne den Rest des Projekts zu beeintr\u00e4chtigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir wussten, dass eine modulare Monorepo-L\u00f6sung es uns erm\u00f6glichen w\u00fcrde, effizienter zu sein bei:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Code-Generierung<\/li>\n\n\n\n<li>Code-Sharing<\/li>\n\n\n\n<li>Verteilte Aufgabenausf\u00fchrung und Orchestrierung<\/li>\n\n\n\n<li>Caching<\/li>\n\n\n\n<li>TypeScript<\/li>\n<\/ul>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <b>TypeScript ist eine Obermenge von typisiertem JavaScript, die es Entwicklern erleichtert, Projekte in gro\u00dfem Ma\u00dfstab zu erstellen.<\/b> Es verbessert die Entwicklererfahrung durch die Bereitstellung von Schnittstellen, Typ-Aliasen, statischer Code-Analyse zur Entwicklungszeit und anderen Tools, w\u00e4hrend es Entwicklern erm\u00f6glicht, ihren Projekten Typen hinzuzuf\u00fcgen. F\u00fcr unser Team ist TypeScript eine F\u00e4higkeit, von der wir wussten, dass wir sie suchen wollten, wenn es darum ging, unserem Team neue Mitglieder hinzuzuf\u00fcgen.<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Auf die F\u00fc\u00dfe treten: Der Deployment-Tanz<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zweifellos besteht die gr\u00f6\u00dfte Herausforderung beim Leben in einem Monorepo (monolithisch oder anders) darin, dass das Potenzial, uns gegenseitig auf die F\u00fc\u00dfe zu treten, umso gr\u00f6\u00dfer ist, je mehr Leute dazu beitragen. Was n\u00fctzt eine \u00fcberarbeitete Entwicklererfahrung, wenn Ihr Code bei einem schlechten Merge \u00fcberschrieben wird? Wenn wir wirklich eine ganzheitliche \u00dcberarbeitung unseres Stacks vornehmen, m\u00fcssen wir uns auch ansehen, wie wir unseren Deployment-Prozess verbessern k\u00f6nnen. Dies waren die dringendsten Herausforderungen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Skalierbarkeit: <\/b>Es w\u00e4re eine schlechte Idee, den gesamten Code im Mono-Repo f\u00fcr die kleinsten \u00c4nderungen, wie z. B. die Behebung eines Tippfehlers in einem Text, neu zu erstellen. Genau das haben wir in unserem alten System gemacht. Der neue Prozess w\u00fcrde die integrierten Funktionen von NX nutzen, um die von der \u00c4nderung betroffenen Dateien zu bewerten und nur diese auf granularster Ebene neu zu erstellen.<\/li>\n\n\n\n<li><b>Deployment: <\/b>Wir haben das meiste Zubeh\u00f6r unserer Deployment-Pipeline beibehalten. Sobald das Image erstellt ist, landet es im GitHub Container Repository. Unser SRE-Team hat unser Deployment-System w\u00e4hrend der Migration von AWS zu GCP optimiert. Wir k\u00f6nnen ganz einfach jeden Branch aus unserem Slack-Deployment-Kanal bereitstellen, mit einem sch\u00f6neren Bericht dank einer k\u00fcrzlichen Erg\u00e4nzung, die wir w\u00e4hrend der Migration erhalten haben.<\/li>\n\n\n\n<li><b>CI;CD:<\/b> Unser altes System nutzte eine wirklich alte Version von Jenkins, um Tests auszuf\u00fchren und unsere App-Images hinter einem VPN zu erstellen\/verteilen. Wenn der Build fehlschlug, brauchten wir einen hochrangigen Senior-Entwickler, der mit den alten Methoden vertraut war, um ihn zu reparieren. In unserem neuen System planten wir den Wechsel zu GitHub Actions, wo Konfigurationen zug\u00e4nglich, deklarativ und gut dokumentiert sind.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Miese Herausforderungen und exzellenteste L\u00f6sungen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Projekte jeder Art haben Herausforderungen, erwartete und \u00fcberraschende. Wir wussten, dass wir planen mussten, um einige Probleme zu \u00fcberwinden, und dass sich die neue Version der App aus mehreren Blickwinkeln auf die Leistung konzentrieren musste.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Identifizierte Probleme<\/th><th>Vorgeschlagene L\u00f6sungen<\/th><\/tr><\/thead><tbody><tr><td><strong>Unklare Code-Konventionen<\/strong><br>Code-Konventionen beziehen sich auf die Reihe von Programmierstilen, L\u00f6sungen und wiederverwendbaren Mustern innerhalb einer Codebasis. Stellen Sie sich ein Team von Schreinern vor, das an einem Projekt arbeitet. Wenn sie 1.000 spezialisierte Werkzeuge auf der Baustelle aufbewahren, ist es wahrscheinlich, dass ein Arbeiter das falsche Werkzeug f\u00fcr den Job w\u00e4hlt oder es unsachgem\u00e4\u00df verwendet. Und im Gegensatz zu physischen Werkzeugen k\u00f6nnen Software-Abh\u00e4ngigkeiten veralten, was zuk\u00fcnftige Updates der Codebasis behindert.<\/td><td><strong>Code-Styleguide<\/strong><br>Die Pflege expliziter Coding-Styleguides\u00a0und einer minimalen Anzahl einfacher, leistungsstarker Muster hilft dabei, Redundanz, Inkonsistenzen und Komplexit\u00e4t zu reduzieren, und kann sogar zu einer verbesserten Leistung f\u00fchren. Die Wiederverwendung einer kleinen Gruppe verallgemeinerter L\u00f6sungen und Muster macht den Code verst\u00e4ndlicher und verringert die Wahrscheinlichkeit schwer zu findender Fehler.<\/td><\/tr><tr><td><strong>\u00dcberlasteter State<\/strong><br>Wir haben Redux als One-Size-Fits-All-L\u00f6sung f\u00fcr den globalen Anwendungs-State verwendet. Allerdings waren 90 % unseres Redux-Stores nur ein verherrlichter Netzwerk-Cache. Redux erfordert mehrere Ebenen an Overhead f\u00fcr jedes State-Mitglied. Dies f\u00fchrte zu vielen Redundanzen und unn\u00f6tiger Komplexit\u00e4t.<\/td><td><strong>Trennung von Netzwerk-Cache und App-State<\/strong><br>Die Trennung der Netzwerk-Cache-Funktionen vom Anwendungs-State erm\u00f6glicht es uns, einen viel kleineren State-Footprint zu behalten. Der State kann lokaler implementiert werden. Ein reduzierter Overhead f\u00fchrt zu einer gesteigerten Leistung und gibt den Entwicklern mehr Kontrolle dar\u00fcber, wie die Daten verwendet werden.<br>Wir haben React Query\u00a0als Schnittstelle zu unseren Backend-APIs gew\u00e4hlt, was es uns erm\u00f6glicht, Daten einfach asynchron zu verwalten und den Netzwerk-Overhead zu reduzieren.<\/td><\/tr><tr><td><strong>Mehrschichtige Netzwerkarchitektur<\/strong><br>Unsere Anwendung wuchs organisch von einem grundlegenden API-zentrierten Control Panel zu der Suite von Kunden-Tools f\u00fcr mehrere Produkte, die wir heute haben. Anf\u00e4nglich wurde der Client auf gemeinsamen Python-Tools aufgebaut, die von vielen unserer API-Backends geteilt wurden. Dies f\u00fchrt dazu, dass zahlreiche Middleware-Schichten selbst f\u00fcr den einfachsten API-Aufruf ben\u00f6tigt werden. Dies machte es nicht nur schwierig, den Ursprung bestimmter Daten zu verstehen, es machte auch die Identifizierung von Fehlern im Netzwerk-Stack sehr zeitaufwendig.<\/td><td><strong>\u00d6ffentliche API zuerst<\/strong><br>Anstatt Anfragen durch mehrere Proxys, Authentifizierungsschichten und Python-Schnittstellen zu leiten, haben wir fr\u00fchzeitig entschieden, dass wir in jedem m\u00f6glichen Fall die ben\u00f6tigten Daten direkt vom Client \u00fcber die \u00f6ffentlich verf\u00fcgbaren APIs sammeln w\u00fcrden. Dies reduzierte nicht nur unseren Overhead und unsere Komplexit\u00e4t erheblich, es half uns auch, unsere API-Dienste besser aus der Perspektive unserer Kunden wahrzunehmen. Wir beabsichtigen, diese Initiative in naher Zukunft weiter voranzutreiben und mehr unserer APIs \u00f6ffentlich zu machen.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Werfen Sie das Kind nicht mit dem Bade aus<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir haben im letzten Jahrzehnt Hunderttausende von Zeilen Code geschrieben. Angesichts des Ma\u00dfstabs und Umfangs dieses neuen Plans w\u00fcrde es fast genauso viele Jahre dauern, unsere alten Funktionen zu portieren und in das neue Paradigma umzuschreiben. Das w\u00e4re von vornherein zum Scheitern verurteilt. Wir mussten einen Weg finden, diese bestehenden Funktionen weiterhin einzubinden, ohne unsere Ziele f\u00fcr den neuen Stack zu beeintr\u00e4chtigen. Wir fanden eine L\u00f6sung in einer Technologie namens Module Federation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem Module Federation Plugin von Webpack konnten wir <b>einen neuen Build unserer alten Anwendung mit minimalen \u00c4nderungen erstellen<\/b>, der in der Lage w\u00e4re, bestehende Funktionen in den neuen Portal-Stack zu integrieren. Wir h\u00e4tten weiterhin das langfristige Ziel, den nun veralteten Code auf neuere Standards zu portieren, aber dies w\u00fcrde es uns erm\u00f6glichen, sofort damit zu beginnen, neue Funktionen mit den neuen Vorteilen zu schreiben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wir haben einen Plan, aber k\u00f6nnen wir ihn verwirklichen?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wir wussten, dass die Konsolidierung unserer Plattformen bei gleichzeitigem kontinuierlichen Wachstum von Funktionen und Produktgruppen einen massiven Aufwand erfordern w\u00fcrde, und unsere Planung beeinflusste, was wir f\u00fcr unseren neuen Frontend-Stack wollten und wie wir das unsterbliche Erbe von antiquierten CSS-Styling-Systemen, veralteten Klassenkomponenten-Mustern und einem klobigen App-State-Management bew\u00e4ltigen w\u00fcrden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weil wir von Grund auf neu gebaut haben \u2013 insbesondere mit dem Wechsel von AWS zur Google Cloud \u2013 <b>war die beste L\u00f6sung ein sauberer Schnitt<\/b>. Ein neues Repo mit besseren, h\u00f6heren Standards, Module Federation, modularen, gemeinsam genutzten Bibliotheken und einer umfassenderen nutzerorientierten und internen Dokumentation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4052\" width=\"1440\" height=\"748\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/EN-Tools-Trade.png\" alt=\"New front-end stack; Nx, React, Webpack, TypeScript, Cypress, Jest, ES Links, Prettier, and Mock Service Worker.\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/EN-Tools-Trade.png 1440w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/EN-Tools-Trade-300x156.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/EN-Tools-Trade-768x399.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/EN-Tools-Trade-1024x532.png 1024w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Es\u00a0war eine intensive Planungs- und Vorbereitungsphase. Wie bei allen gro\u00dfen Projekten war die Generierung der Ideen und des Proof of Concept ein technisches und kreatives Unterfangen, an dem nur wenige ausgew\u00e4hlte Personen beteiligt waren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Phase 2? Die Idee in die Realit\u00e4t umsetzen \u2013 und daran waren noch viel mehr Teams beteiligt. Entwickler, ich glaube, unser Abenteuer nimmt gleich eine h\u00f6chst interessante Wendung. <\/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_0150672b323bd66839507109006f9de4\">\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_0150672b323bd66839507109006f9de4\">\r\n                Sehen Sie sich Teil 2 an \u2013 Eine \u00e4u\u00dferst triumphale Ausf\u00fchrung            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">In Teil 1 haben wir die Frage beantwortet: Warum ein Rebuild? In Teil 2 tauchen wir in die Implementierung und Ausf\u00fchrung ein. Es hat Drama, es hat Migrationen &#8230; und wahrscheinlich ein paar zu viele Sci-Fi-Referenzen. Begleiten Sie uns auf dieser Reise.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/www.mailgun.com\/blog\/dev-life\/mailgun-app-rebuild-part-two\/\"  class=\"btn btn-secondary\" >Read the blog<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Seien Sie gegr\u00fc\u00dft, liebe Entwickler. Wir freuen uns, Ihnen mitteilen zu k\u00f6nnen, dass unser Team nach drei langen Jahren der Planung, des Designs und der Entwicklung unser gro\u00dfartiges App-Update ver\u00f6ffentlicht hat. Sicherlich haben wir unerm\u00fcdlich daran gearbeitet, das Erscheinungsbild unserer Benutzeroberfl\u00e4che zu aktualisieren, aber wir haben eine noch weitreichendere \u00dcberarbeitung vorgenommen an unserem grundlegenden Technologie-Stack. [&hellip;]<\/p>\n","protected":false},"author":17,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[19],"class_list":["post-15003","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Wie wir unsere Mailgun-App f\u00fcr mehrere Produkte umgebaut haben: Teil 1 - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Das neu ver\u00f6ffentlichte Mailgun-App-Update begann als Basisinitiative. M\u00f6chten Sie sehen, wie wir das verwirklicht haben? Begleiten Sie uns auf diesem \u00fcberaus exzellenten Abenteuer.\" \/>\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\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wie wir unsere Mailgun-App f\u00fcr mehrere Produkte umgebaut haben: Teil 1 - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Das neu ver\u00f6ffentlichte Mailgun-App-Update begann als Basisinitiative. M\u00f6chten Sie sehen, wie wir das verwirklicht haben? Begleiten Sie uns auf diesem \u00fcberaus exzellenten Abenteuer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-24T04:36:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.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=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/\",\"name\":\"Wie wir unsere Mailgun-App f\u00fcr mehrere Produkte umgebaut haben: Teil 1 - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2023-01-12T00:00:00+00:00\",\"dateModified\":\"2026-07-24T04:36:31+00:00\",\"description\":\"Das neu ver\u00f6ffentlichte Mailgun-App-Update begann als Basisinitiative. M\u00f6chten Sie sehen, wie wir das verwirklicht haben? Begleiten Sie uns auf diesem \u00fcberaus exzellenten Abenteuer.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/mailgun-app-rebuild-teil-eins\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Ein tiefer Einblick in den Rebuild der Mailgun-App: Teil 1 \u2013 Hervorragende Ideen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Powerful Transactional Email APIs that enable you to send, receive, and track emails, built with developers in mind. Learn more today!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/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\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Wie wir unsere Mailgun-App f\u00fcr mehrere Produkte umgebaut haben: Teil 1 - Transactional Email API Service For Developers | Mailgun","description":"Das neu ver\u00f6ffentlichte Mailgun-App-Update begann als Basisinitiative. M\u00f6chten Sie sehen, wie wir das verwirklicht haben? Begleiten Sie uns auf diesem \u00fcberaus exzellenten Abenteuer.","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\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/","og_locale":"de_DE","og_type":"article","og_title":"Wie wir unsere Mailgun-App f\u00fcr mehrere Produkte umgebaut haben: Teil 1 - Transactional Email API Service For Developers | Mailgun","og_description":"Das neu ver\u00f6ffentlichte Mailgun-App-Update begann als Basisinitiative. M\u00f6chten Sie sehen, wie wir das verwirklicht haben? Begleiten Sie uns auf diesem \u00fcberaus exzellenten Abenteuer.","og_url":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-07-24T04:36:31+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/","url":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/","name":"Wie wir unsere Mailgun-App f\u00fcr mehrere Produkte umgebaut haben: Teil 1 - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2023-01-12T00:00:00+00:00","dateModified":"2026-07-24T04:36:31+00:00","description":"Das neu ver\u00f6ffentlichte Mailgun-App-Update begann als Basisinitiative. M\u00f6chten Sie sehen, wie wir das verwirklicht haben? Begleiten Sie uns auf diesem \u00fcberaus exzellenten Abenteuer.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/mailgun-app-rebuild-teil-eins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"Ein tiefer Einblick in den Rebuild der Mailgun-App: Teil 1 \u2013 Hervorragende Ideen"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Powerful Transactional Email APIs that enable you to send, receive, and track emails, built with developers in mind. Learn more today!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/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\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/15003","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/17"}],"version-history":[{"count":3,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/15003\/revisions"}],"predecessor-version":[{"id":15091,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/15003\/revisions\/15091"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=15003"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=15003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}