diff --git a/elections2021/forms.py b/elections2021/forms.py
index cf14770f6c2ff65e3191a197a92b8a4ec1fbba44..2743ffd0a8e1b2d58295c307830ee886498b3599 100644
--- a/elections2021/forms.py
+++ b/elections2021/forms.py
@@ -87,9 +87,3 @@ class ProgramAppForm(forms.Form):
         choices=OCCUPATION_CHOICES, initial=OCCUPATION_WORKING
     )
     topics = forms.MultipleChoiceField(required=False, choices=TOPIC_CHOICES)
-
-
-class SubscribeForm(forms.Form):
-    email = forms.EmailField()
-    confirmed = forms.BooleanField()
-    return_page_id = forms.IntegerField()
diff --git a/elections2021/models.py b/elections2021/models.py
index a0ba744b934d9b32806940279293161d5077c571..99c7da69feda02154b170aaf0c928f65456fa63d 100644
--- a/elections2021/models.py
+++ b/elections2021/models.py
@@ -35,6 +35,7 @@ from wagtail.search import index
 from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
+from shared.forms import SubscribeForm
 from shared.models import ArticleMixin, SubpageMixin
 from shared.utils import get_subpage_url, subscribe_to_newsletter
 from tuning import admin_help
@@ -110,7 +111,7 @@ from .constants import (
     WHITE,
     WORKING_SENIORS,
 )
-from .forms import ProgramAppForm, ProgramPointPageForm, SubscribeForm
+from .forms import ProgramAppForm, ProgramPointPageForm
 from .utils import get_archetype
 
 NO_SEARCH_IMAGE_USE_PHOTO = (
diff --git a/main/models.py b/main/models.py
index a159f2eef9e207db6d740be5b9f68fcf975d527f..ab90aada9785d467989116242201e7c9a7505add 100644
--- a/main/models.py
+++ b/main/models.py
@@ -1,5 +1,9 @@
+from functools import cached_property
+
+from django.conf import settings
 from django.core.paginator import Paginator
 from django.db import models
+from django.http import HttpResponseRedirect
 from django.shortcuts import render
 from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
@@ -12,6 +16,7 @@ from wagtail.core.models import Page
 from wagtailmetadata.models import MetadataPageMixin
 
 from shared.const import RICH_TEXT_DEFAULT_FEATURES
+from shared.forms import SubscribeForm
 from shared.models import (
     ArticleMixin,
     ExtendedMetadataHomePageMixin,
@@ -19,7 +24,7 @@ from shared.models import (
     MenuMixin,
     SubpageMixin,
 )
-from shared.utils import make_promote_panels
+from shared.utils import make_promote_panels, subscribe_to_newsletter
 from tuning import admin_help
 
 from . import blocks
@@ -133,10 +138,35 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin,
     def get_404_response(request):
         return render(request, "main/404.html", status=404)
 
+    @cached_property
+    def newsletter_subscribe_url(self):
+        return self.url + self.reverse_subpage("newsletter_subscribe")
+
     @property
     def root_page(self):
         return self
 
+    @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"],
+                    settings.PIRATICZ_NEWSLETTER_ID,
+                    settings.PIRATICZ_NEWSLETTER_SOURCE,
+                )
+                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)
+        return HttpResponseRedirect(self.url)
+
 
 class MainWorkPage(ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page):
     perex = models.TextField()
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 7e52665f1fda2389fb129046c5a8f266036230d0..fcd7d96e0d8e475fe8344229e55ab06f17d8a4af 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -298,6 +298,9 @@ ELECTIONS2021_NEWSLETTER_SOURCE = env.str(
     "ELECTIONS2021_NEWSLETTER_SOURCE", "Koalice 2021"
 )
 
+PIRATICZ_NEWSLETTER_ID = env.int("PIRATICZ_NEWSLETTER_ID", default=0)
+PIRATICZ_NEWSLETTER_SOURCE = env.str("PIRATICZ_NEWSLETTER_SOURCE", "PirĂ¡ti.cz")
+
 # URL pointing to MapProxy instance to use.
 # MapProxy is used to serve map tiles to hide client details from the tile provider.
 # @see: https://mapproxy.org/
diff --git a/shared/forms.py b/shared/forms.py
new file mode 100644
index 0000000000000000000000000000000000000000..98a3256a7470721a9ddf5a28b3fa03ff34190498
--- /dev/null
+++ b/shared/forms.py
@@ -0,0 +1,7 @@
+from django import forms
+
+
+class SubscribeForm(forms.Form):
+    email = forms.EmailField()
+    confirmed = forms.BooleanField()
+    return_page_id = forms.IntegerField()