diff --git a/district/migrations/0314_districthomepage_ecomail_newsletter_list_categories_and_more.py b/district/migrations/0314_districthomepage_ecomail_newsletter_list_categories_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..20970cf588523da171a2772caccd5a71aed813a9
--- /dev/null
+++ b/district/migrations/0314_districthomepage_ecomail_newsletter_list_categories_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 5.0.7 on 2025-03-19 07:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0313_alter_districtarticlepage_content_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='districthomepage',
+            name='ecomail_newsletter_list_categories',
+            field=models.CharField(blank=True, help_text="Oddělte čárkou, například 'Kategorie1,Kategorie2,Kategorie3'.", max_length=128, null=True, verbose_name='Kategorie k přidání novým odběratelům na Ecomailu'),
+        ),
+        migrations.AddField(
+            model_name='districthomepage',
+            name='ecomail_newsletter_list_id',
+            field=models.IntegerField(blank=True, null=True, verbose_name='ID Ecomail newsletteru'),
+        ),
+        migrations.AlterField(
+            model_name='districthomepage',
+            name='newsletter_list_id',
+            field=models.CharField(blank=True, help_text='ID newsletteru z Mailtrainu. Po vyplnění se formulář pro odběr newsletteru zobrazí na úvodní stránce a na stránce s kontakty.', max_length=20, null=True, verbose_name='ID Mailtrain newsletteru'),
+        ),
+    ]
diff --git a/district/migrations/0315_remove_districthomepage_ecomail_newsletter_list_categories_and_more.py b/district/migrations/0315_remove_districthomepage_ecomail_newsletter_list_categories_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..eec439041d979899841022e18b1a3344bcfd16dc
--- /dev/null
+++ b/district/migrations/0315_remove_districthomepage_ecomail_newsletter_list_categories_and_more.py
@@ -0,0 +1,22 @@
+# Generated by Django 5.0.7 on 2025-03-19 08:37
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0314_districthomepage_ecomail_newsletter_list_categories_and_more'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='districthomepage',
+            name='ecomail_newsletter_list_categories',
+        ),
+        migrations.AddField(
+            model_name='districthomepage',
+            name='ecomail_newsletter_list_tags',
+            field=models.CharField(blank=True, help_text="Oddělte čárkou, například 'Tag1,Tag2,Tag3'. Bez mezer.", max_length=128, null=True, verbose_name='Tagy k přidání novým odběratelům na Ecomailu'),
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index b9908d0a28135e13bad2d32a417ed9e4774b9cf6..5804515ecaba8fe8083505b372297ec732dab62d 100644
--- a/district/models.py
+++ b/district/models.py
@@ -72,6 +72,7 @@ from shared.utils import (
     make_promote_panels,
     strip_all_html_tags,
     subscribe_to_newsletter,
+    subscribe_to_ecomail_newsletter,
     trim_to_length,
 )
 
@@ -130,12 +131,27 @@ class DistrictHomePage(CustomLogoMixin, CalendarMixin, MainHomePageMixin):
 
     # Settings
     newsletter_list_id = models.CharField(
-        "ID newsletteru",
+        "ID Mailtrain newsletteru",
         max_length=20,
         blank=True,
         null=True,
         help_text="ID newsletteru z Mailtrainu. Po vyplnění se formulář pro odběr newsletteru zobrazí na úvodní stránce a na stránce s kontakty.",
     )
+
+    ecomail_newsletter_list_id = models.IntegerField(
+        "ID Ecomail newsletteru",
+        blank=True,
+        null=True,
+    )
+
+    ecomail_newsletter_list_tags = models.CharField(
+        "Tagy k přidání novým odběratelům na Ecomailu",
+        max_length=128,
+        blank=True,
+        null=True,
+        help_text="Oddělte čárkou, například 'Tag1,Tag2,Tag3'. Bez mezer."
+    )
+
     newsletter_description = models.CharField(
         "Popis newsletteru",
         max_length=250,
@@ -201,8 +217,10 @@ class DistrictHomePage(CustomLogoMixin, CalendarMixin, MainHomePageMixin):
         ),
         MultiFieldPanel(
             [
-                FieldPanel("newsletter_list_id"),
                 FieldPanel("newsletter_description"),
+                FieldPanel("newsletter_list_id"),
+                FieldPanel("ecomail_newsletter_list_id"),
+                FieldPanel("ecomail_newsletter_list_tags"),
             ],
             "Formulář pro odběr newsletteru",
         ),
@@ -1136,44 +1154,6 @@ class DistrictCustomPage(RoutablePageMixin, MainSimplePageMixin):
             else newsletter_subscribe
         )  # preview fix
 
-    @route(r"^prihlaseni-k-newsletteru/$")
-    def newsletter_subscribe(self, request):
-        if request.method == "POST":
-            form = SubscribeForm(request.POST)
-
-            if form.is_valid():
-                subscribe_to_newsletter(
-                    form.cleaned_data["email"],
-                    (
-                        self.newsletter_list_id
-                        if hasattr(self, "newsletter_list_id")
-                        and self.newsletter_list_id
-                        else settings.PIRATICZ_NEWSLETTER_CID
-                    ),
-                )
-
-                messages.success(
-                    request,
-                    "Zkontroluj si prosím schránku, poslali jsme ti potvrzovací email.",
-                )
-
-                try:
-                    page = (
-                        Page.objects.filter(id=form.cleaned_data["return_page_id"])
-                        .live()
-                        .first()
-                    )
-                    return HttpResponseRedirect(page.full_url)
-                except Page.DoesNotExist:
-                    return HttpResponseRedirect(self.url)
-
-            messages.error(
-                request,
-                "Tvůj prohlížeč nám odeslal špatná data. Prosím, zkus to znovu.",
-            )
-
-        return HttpResponseRedirect(self.url)
-
     @property
     def newsletter_list_id(self) -> str:
         for block in self.content:
diff --git a/env.example b/env.example
index baa1ffc19dddbbc08eb345fb8432bfb88725b005..a8abfea1342191a560996fd20a9d92897deec75a 100644
--- a/env.example
+++ b/env.example
@@ -11,3 +11,6 @@ DJANGO_SECRET_KEY=123456
 DJANGO_ALLOWED_HOSTS=
 CELERY_BROKER_URL=redis://127.0.0.1:6379/0
 CELERY_RESULT_BACKEND=
+
+ECOMAIL_API_URL=https://api2.ecomailapp.cz
+ECOMAIL_API_KEY=asdf
\ No newline at end of file
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 13f60a424bdc02321913d989756f52a16ab461a9..b875d229e146e7a71d106462f4f606e3b9950628 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -309,6 +309,9 @@ DONATE_PORTAL_API_CACHE_TIMEOUT = 60 * 5
 MAILTRAIN_API_URL = env.str("MAILTRAIN_API_URL", default="")
 MAILTRAIN_API_TOKEN = env.str("MAILTRAIN_API_TOKEN", default="")
 
+ECOMAIL_API_URL = env.str("ECOMAIL_API_URL", default="")
+ECOMAIL_API_KEY = env.str("ECOMAIL_API_KEY", default="")
+
 CZECH_INSPIRATIONAL_NEWSLETTER_CID = env.str(
     "CZECH_INSPIRATIONAL_NEWSLETTER_CID", default=""
 )
diff --git a/shared/models/main.py b/shared/models/main.py
index 070a4041d8336d79fdbde6cbd192afaef4fdc3a2..9926976063d8f1432a14971b1ee616a40c0ab0a4 100644
--- a/shared/models/main.py
+++ b/shared/models/main.py
@@ -50,7 +50,7 @@ from shared.blocks import (
     TwoTextColumnBlock,
 )
 from shared.forms import SubscribeForm
-from shared.utils import make_promote_panels, subscribe_to_newsletter
+from shared.utils import make_promote_panels, subscribe_to_newsletter, subscribe_to_ecomail_newsletter
 from tuning import admin_help
 
 logger = logging.getLogger(__name__)
@@ -1214,15 +1214,40 @@ class MainHomePageMixin(
             form = SubscribeForm(request.POST)
 
             if form.is_valid():
-                subscribe_to_newsletter(
-                    form.cleaned_data["email"],
-                    (
+                # If there is a mailtrain newsletter list ID, subscribe to it.
+                # 
+                # Otherwise, if there is no ecomail newsletter list ID, subscribe
+                # to the global mailtrain list as long as it's defined.
+                # 
+                # If there is an ecomail newsletter list ID, subscribe to it
+                # (even if the mailtrain one was also subscribed to. Seems logical here.)
+                if hasattr(self, "newsletter_list_id") and self.newsletter_list_id:
+                    subscribe_to_newsletter(
+                        form.cleaned_data["email"],
                         self.newsletter_list_id
-                        if hasattr(self, "newsletter_list_id")
-                        and self.newsletter_list_id
-                        else settings.PIRATICZ_NEWSLETTER_CID
-                    ),
-                )
+                    )
+                elif (
+                    (
+                        not hasattr(self, "ecomail_newsletter_list_id")
+                        or not self.ecomail_newsletter_list_id
+                    )
+                    and settings.PIRATICZ_NEWSLETTER_CID
+                ):
+                    subscribe_to_newsletter(
+                        form.cleaned_data["email"],
+                        settings.PIRATICZ_NEWSLETTER_CID
+                    )
+
+                if (
+                    hasattr(self, "ecomail_newsletter_list_id")
+                    and self.ecomail_newsletter_list_id is not None
+                    and self.ecomail_newsletter_list_id >= 1
+                ):
+                    subscribe_to_ecomail_newsletter(
+                        form.cleaned_data["email"],
+                        self.ecomail_newsletter_list_id,
+                        self.ecomail_newsletter_list_tags
+                    )
 
                 messages.success(
                     request,
diff --git a/shared/utils.py b/shared/utils.py
index 23eafdf5b23bf869a6407a131ca4ad697b9917de..07bd03558a642cb0cf3a86e8c52f5851f1dc177b 100644
--- a/shared/utils.py
+++ b/shared/utils.py
@@ -56,14 +56,44 @@ def make_promote_panels(
 
 def subscribe_to_newsletter(email, list_id):
     url = urljoin(settings.MAILTRAIN_API_URL, f"subscribe/{list_id}")
+
     data = {"EMAIL": email, "FORCE_SUBSCRIBE": False, "REQUIRE_CONFIRMATION": True}
     response = requests.post(
         url, data=data, headers={"access-token": settings.MAILTRAIN_API_TOKEN}
     )
+
+    if response.status_code != 200:
+        logger.error(
+            "Failed to subscribe!", extra={"data": data, "response": response.text}
+        )
+
+    return response
+
+
+def subscribe_to_ecomail_newsletter(email, list_id: int, categories: str):
+    split_categories = categories.split(",")
+
+    data = {
+        "subscriber_data": {
+            "email": email,
+            "tags": split_categories,
+        }
+    }
+
+    response = requests.post(
+        urljoin(settings.ECOMAIL_API_URL, f"lists/{list_id}/subscribe"),
+        data=json.dumps(data),
+        headers={
+            "Content-Type": "application/json",
+            "key": settings.ECOMAIL_API_KEY
+        }
+    )
+
     if response.status_code != 200:
         logger.error(
             "Failed to subscribe!", extra={"data": data, "response": response.text}
         )
+
     return response