diff --git a/README.md b/README.md
index ff48c2979c1c0c91025981b389211a3ac4ce9552..e529f48dbd22a0573999baf6e06597cc4691f7d0 100644
--- a/README.md
+++ b/README.md
@@ -157,6 +157,8 @@ Různé:
 | `SENTRY_DSN` | | pokud je zadáno, pády se reportují do Sentry |
 | `SEARCH_CONFIG` | english | nastavení jazyka fulltextového vyhledávání, viz níže |
 | `DEBUG_TOOLBAR` | False | zobrazit Django Debug Toolbar (pro vývoj) |
+| `MAILTRAIN_API_URL` | | URL k API Mailtrain |
+| `MAILTRAIN_API_TOKEN` | | token k API Mailtrain |
 
 Settings pro appky na weby:
 
diff --git a/czech_inspirational/models.py b/czech_inspirational/models.py
index e7c33cbdcb1f950964d7b15c38d0f8d04c0faa35..b92889df8eeeace16da10fa9bdb9bebc3bc3ad5a 100644
--- a/czech_inspirational/models.py
+++ b/czech_inspirational/models.py
@@ -299,9 +299,7 @@ class CzechInspirationalDownloadPage(
                     pass
                 else:
                     subscribe_to_newsletter(
-                        email,
-                        settings.CZECH_INSPIRATIONAL_NEWSLETTER_ID,
-                        settings.CZECH_INSPIRATIONAL_NEWSLETTER_SOURCE,
+                        email, settings.CZECH_INSPIRATIONAL_NEWSLETTER_CID
                     )
 
         return context
diff --git a/elections2021/models.py b/elections2021/models.py
index cd452b167b8d1332868967e5eb617b4b7be319ad..dc170d52e6da7aecffde474b4fef1a5b56975dc2 100644
--- a/elections2021/models.py
+++ b/elections2021/models.py
@@ -518,9 +518,7 @@ class Elections2021HomePage(MetadataPageMixin, RoutablePageMixin, Page):
             form = SubscribeForm(request.POST)
             if form.is_valid():
                 subscribe_to_newsletter(
-                    form.cleaned_data["email"],
-                    settings.ELECTIONS2021_NEWSLETTER_ID,
-                    settings.ELECTIONS2021_NEWSLETTER_SOURCE,
+                    form.cleaned_data["email"], settings.ELECTIONS2021_NEWSLETTER_CID
                 )
                 try:
                     page = (
diff --git a/main/models.py b/main/models.py
index 33b1e96fc15c57a43f035ea6737fc547396a0b62..20353e10d5165f1555e07b8ef0704488455d5e96 100644
--- a/main/models.py
+++ b/main/models.py
@@ -27,6 +27,7 @@ from wagtail.search import index
 from wagtailmetadata.models import MetadataPageMixin
 
 from elections2021.constants import REGION_CHOICES  # pozor, import ze sousedního modulu
+from instagram_utils.models import InstagramPost
 from shared.forms import SubscribeForm
 from shared.models import (  # MenuMixin,
     ArticleMixin,
@@ -36,7 +37,6 @@ from shared.models import (  # MenuMixin,
 )
 from shared.utils import make_promote_panels, subscribe_to_newsletter
 from tuning import admin_help
-from instagram_utils.models import InstagramPost
 
 from . import blocks
 from .constants import MONTH_NAMES
@@ -209,12 +209,9 @@ class MainHomePage(
             for access_data in self.instagram_access.raw_data
         ]
 
-        instagram_post_list = (
-            InstagramPost.
-            objects.
-            filter(author_username__in=instagram_username_list).
-            order_by("-timestamp")
-        )
+        instagram_post_list = InstagramPost.objects.filter(
+            author_username__in=instagram_username_list
+        ).order_by("-timestamp")
 
         context["instagram_post_list"] = instagram_post_list[:4]
         context["show_next_instagram_post"] = len(instagram_post_list) > 4
@@ -262,22 +259,19 @@ class MainHomePage(
             for access_data in self.instagram_access.raw_data
         ]
 
-        instagram_post_list_queryset = (
-            InstagramPost.
-            objects.
-            filter(author_username__in=instagram_username_list).
-            order_by("-timestamp")
-        )
+        instagram_post_list_queryset = InstagramPost.objects.filter(
+            author_username__in=instagram_username_list
+        ).order_by("-timestamp")
 
         instagram_post_paginator = Paginator(instagram_post_list_queryset, 4)
 
-        instagram_post_page = instagram_post_paginator.get_page(request.GET.get("page", 1))
+        instagram_post_page = instagram_post_paginator.get_page(
+            request.GET.get("page", 1)
+        )
         context = {"instagram_post_list": instagram_post_page.object_list}
 
         html_content = render(
-            request,
-            "main/includes/instagram_widget.html",
-            context
+            request, "main/includes/instagram_widget.html", context
         ).content
 
         data = {
@@ -314,9 +308,7 @@ class MainHomePage(
             form = SubscribeForm(request.POST)
             if form.is_valid():
                 subscribe_to_newsletter(
-                    form.cleaned_data["email"],
-                    settings.PIRATICZ_NEWSLETTER_ID,
-                    settings.PIRATICZ_NEWSLETTER_SOURCE,
+                    form.cleaned_data["email"], settings.PIRATICZ_NEWSLETTER_CID
                 )
 
                 messages.success(
@@ -822,12 +814,11 @@ class MainPersonPage(ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin,
 
         if len(self.instagram_access.raw_data) != 0:
             context["instagram_post_list"] = (
-                InstagramPost.
-                objects.
-                filter(
-                    author_username=self.instagram_access.raw_data[0]["value"]["username"]
-                ).
-                order_by("-timestamp")
+                InstagramPost.objects.filter(
+                    author_username=self.instagram_access.raw_data[0]["value"][
+                        "username"
+                    ]
+                ).order_by("-timestamp")
             )[:20]
 
         return context
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 618884f2785919dbe42df1f5636318a46d5fd422..db4fe38990c7845158011d6295fb9909747a2db3 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -284,24 +284,17 @@ DONATE_PORTAL_API_URL = env.str("DONATE_PORTAL_API_URL", default="")
 DONATE_PORTAL_API_TIMEOUT = 5
 DONATE_PORTAL_API_CACHE_TIMEOUT = 60 * 5
 
-CZECH_INSPIRATIONAL_NEWSLETTER_ID = env.int(
-    "CZECH_INSPIRATIONAL_NEWSLETTER_ID", default=0
-)
-CZECH_INSPIRATIONAL_NEWSLETTER_SOURCE = env.str(
-    "CZECH_INSPIRATIONAL_NEWSLETTER_SOURCE", default="Česko inspirativní"
-)
+MAILTRAIN_API_URL = env.str("MAILTRAIN_API_URL", default="")
+MAILTRAIN_API_TOKEN = env.str("MAILTRAIN_API_TOKEN", default="")
 
-NALODENI_API_NEWS_SUBSCRIBE_URL = env.str("NALODENI_API_NEWS_SUBSCRIBE_URL", default="")
-NALODENI_API_CREDENTIALS = env.str("NALODENI_API_CREDENTIALS", default="")
+CZECH_INSPIRATIONAL_NEWSLETTER_CID = env.str(
+    "CZECH_INSPIRATIONAL_NEWSLETTER_CID", default=""
+)
 
 ELECTIONS2021_COOKIE_NAME = "program"
-ELECTIONS2021_NEWSLETTER_ID = env.int("ELECTIONS2021_NEWSLETTER_ID", default=0)
-ELECTIONS2021_NEWSLETTER_SOURCE = env.str(
-    "ELECTIONS2021_NEWSLETTER_SOURCE", "Koalice 2021"
-)
+ELECTIONS2021_NEWSLETTER_CID = env.str("ELECTIONS2021_NEWSLETTER_CID", default="")
 
-PIRATICZ_NEWSLETTER_ID = env.int("PIRATICZ_NEWSLETTER_ID", default=0)
-PIRATICZ_NEWSLETTER_SOURCE = env.str("PIRATICZ_NEWSLETTER_SOURCE", "Piráti.cz")
+PIRATICZ_NEWSLETTER_CID = env.str("PIRATICZ_NEWSLETTER_CID", default="")
 
 # URL pointing to MapProxy instance to use.
 # MapProxy is used to serve map tiles to hide client details from the tile provider.
diff --git a/shared/utils.py b/shared/utils.py
index c2a42ee84b0a6be4d82297831b6b93af60086128..48a1cc3205bff9cbfd9092545448d2c446bab499 100644
--- a/shared/utils.py
+++ b/shared/utils.py
@@ -1,6 +1,7 @@
 import json
 import logging
 import urllib.request
+from urllib.parse import urljoin
 
 import bleach
 import requests
@@ -53,22 +54,15 @@ def make_promote_panels(
     return [MultiFieldPanel(panels, gettext_lazy("Common page configuration"))]
 
 
-def subscribe_to_newsletter(email, news_id, source):
-    payload = {
-        "email": email,
-        "news_id": news_id,
-        "source": source,
-        "verify_email": 1,
-    }
+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(
-        settings.NALODENI_API_NEWS_SUBSCRIBE_URL,
-        data=json.dumps(payload),
-        auth=tuple(settings.NALODENI_API_CREDENTIALS.split(":")),
+        url, data=data, headers={"access-token": settings.MAILTRAIN_API_TOKEN}
     )
     if response.status_code != 200:
         logger.error(
-            "Failed to subscribe!",
-            extra={"payload": payload, "response": response.text},
+            "Failed to subscribe!", extra={"data": data, "response": response.text}
         )