diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py
index 0e40edf699cf9653e9a814f1d2a8895d73038a2e..6dbf35040e47b1832fdecf817e7a15fff7bf9e3e 100644
--- a/apps/note/models/transactions.py
+++ b/apps/note/models/transactions.py
@@ -6,6 +6,7 @@ from django.urls import reverse
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 from polymorphic.models import PolymorphicModel
+from treasury.models import Remittance
 
 from .notes import Note, NoteClub, NoteSpecial
 
@@ -209,6 +210,13 @@ class SpecialTransaction(Transaction):
         blank=True,
     )
 
+    remittance = models.ForeignKey(
+        Remittance,
+        on_delete=models.PROTECT,
+        null=True,
+        verbose_name=_("Remittance"),
+    )
+
     @property
     def type(self):
         return _('Credit') if isinstance(self.source, NoteSpecial) else _("Debit")
diff --git a/apps/treasury/models.py b/apps/treasury/models.py
index 52caeb0b2a13641cbe7ab97eccb71e62ee09fb25..7c634fdddf03448272a0e5fcc5dad31a539849e7 100644
--- a/apps/treasury/models.py
+++ b/apps/treasury/models.py
@@ -1,8 +1,10 @@
 # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 # SPDX-License-Identifier: GPL-3.0-or-later
-
+from django.core.exceptions import ValidationError
 from django.db import models
+from django.db.models import Q
 from django.utils.translation import gettext_lazy as _
+from note.models import NoteSpecial
 
 
 class Invoice(models.Model):
@@ -83,3 +85,37 @@ class Product(models.Model):
     @property
     def total_euros(self):
         return self.total / 100
+
+
+class Remittance(models.Model):
+    date = models.DateField(
+        auto_now_add=True,
+        verbose_name=_("Date"),
+    )
+
+    type = models.ForeignKey(
+        NoteSpecial,
+        on_delete=models.PROTECT,
+        verbose_name=_("Type"),
+    )
+
+    comment = models.CharField(
+        max_length=255,
+        verbose_name=_("Comment"),
+    )
+
+    @property
+    def size(self):
+        return self.specialtransaction_set.count()
+
+    @property
+    def amount(self):
+        return sum(transaction.total for transaction in self.specialtransaction_set.all())
+
+    def full_clean(self, exclude=None, validate_unique=True):
+        ret = super().full_clean(exclude, validate_unique)
+
+        if self.specialtransaction_set.filter(~Q(source=self.type)).exists():
+            raise ValidationError("All transactions in a remittance must have the same type")
+
+        return ret