diff --git a/gso/api/v1/imports.py b/gso/api/v1/imports.py
index 6500238983ddf0b5fb27d6461e36afcc70df64b3..fcc4a89a309a2795db4d5132035489758fe3e6fe 100644
--- a/gso/api/v1/imports.py
+++ b/gso/api/v1/imports.py
@@ -50,14 +50,14 @@ class SiteImportModel(BaseModel):
 
     @validator("site_ts_address", allow_reuse=True)
     def validate_ts_address(cls, site_ts_address: str) -> str:
-        """A terminal server address must be valid."""
+        """Validate the terminal server address."""
         validate_site_fields_is_unique("site_ts_address", site_ts_address)
         validate_ipv4_or_ipv6(site_ts_address)
         return site_ts_address
 
     @validator("site_country_code", allow_reuse=True)
     def country_code_must_exist(cls, country_code: str) -> str:
-        """A country code must exist."""
+        """Validate the country code such that it exists."""
         validate_country_code(country_code)
         return country_code
 
@@ -126,7 +126,7 @@ class IptrunkImportModel(BaseModel):
 
     @validator("customer")
     def check_if_customer_exists(cls, value: str) -> str:
-        """The customer must exist."""
+        """Validate that the customer exists."""
         try:
             get_customer_by_name(value)
         except CustomerNotFoundError as e:
diff --git a/gso/products/product_blocks/site.py b/gso/products/product_blocks/site.py
index ce5ec5f18cd071cc750d059d1bab608ff4ff4f01..89c63768b240ff1a4c389714a5c4e7ee32ce927a 100644
--- a/gso/products/product_blocks/site.py
+++ b/gso/products/product_blocks/site.py
@@ -31,6 +31,7 @@ class LatitudeCoordinate(ConstrainedStr):
 
     @classmethod
     def validate(cls, value: str) -> str:
+        """Validate that a latitude coordinate is valid."""
         if not cls.regex.match(value):
             msg = "Invalid latitude coordinate. Valid examples: '40.7128', '-74.0060', '90', '-90', '0'."
             raise ValueError(msg)
@@ -50,6 +51,7 @@ class LongitudeCoordinate(ConstrainedStr):
 
     @classmethod
     def validate(cls, value: str) -> str:
+        """Validate that a longitude coordinate is valid."""
         if not cls.regex.match(value):
             msg = "Invalid longitude coordinate. Valid examples: '40.7128', '-74.0060', '180', '-180'"
             raise ValueError(msg)
diff --git a/gso/products/product_types/iptrunk.py b/gso/products/product_types/iptrunk.py
index 82b283b678371a7a9af4e5e3ca547b4536cfc690..70612d49216fa6f00fb47835bbbc1b772b818dc1 100644
--- a/gso/products/product_types/iptrunk.py
+++ b/gso/products/product_types/iptrunk.py
@@ -1,3 +1,5 @@
+"""The product type for IP trunks, does not contain any special variables apart from the corresponding product block."""
+
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
@@ -9,12 +11,18 @@ from gso.products.product_blocks.iptrunk import (
 
 
 class IptrunkInactive(SubscriptionModel, is_base=True):
+    """An IP trunk that is inactive."""
+
     iptrunk: IptrunkBlockInactive
 
 
 class IptrunkProvisioning(IptrunkInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An IP trunk that is being provisioned."""
+
     iptrunk: IptrunkBlockProvisioning
 
 
 class Iptrunk(IptrunkProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An IP trunk that is active."""
+
     iptrunk: IptrunkBlock
diff --git a/gso/products/product_types/router.py b/gso/products/product_types/router.py
index e0cfa3b092a6491c5d337f907da4c85afb42d92a..d6a59c12ccd14dea0dac8852a7748810359718b7 100644
--- a/gso/products/product_types/router.py
+++ b/gso/products/product_types/router.py
@@ -1,3 +1,5 @@
+"""A router product type."""
+
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
@@ -9,12 +11,18 @@ from gso.products.product_blocks.router import (
 
 
 class RouterInactive(SubscriptionModel, is_base=True):
+    """An inactive router."""
+
     router: RouterBlockInactive
 
 
 class RouterProvisioning(RouterInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A router that is being provisioned."""
+
     router: RouterBlockProvisioning
 
 
 class Router(RouterProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A router that is currently active."""
+
     router: RouterBlock
diff --git a/gso/products/product_types/site.py b/gso/products/product_types/site.py
index 5a78adffa596c376414d464502fe45c1ff09aa1e..ec09962e33521d82bd5c05b6fa3bccd6dbb6e8bf 100644
--- a/gso/products/product_types/site.py
+++ b/gso/products/product_types/site.py
@@ -1,3 +1,5 @@
+"""The product type for sites. Used for tying together shared information between the products that reside here."""
+
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
@@ -9,12 +11,18 @@ from gso.products.product_blocks.site import (
 
 
 class SiteInactive(SubscriptionModel, is_base=True):
+    """A site that is inactive."""
+
     site: SiteBlockInactive
 
 
 class SiteProvisioning(SiteInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A site that is being provisioned."""
+
     site: SiteBlockProvisioning
 
 
 class Site(SiteProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A site that is currently active."""
+
     site: SiteBlock
diff --git a/gso/schedules/__init__.py b/gso/schedules/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8257a874c6c090c1d284966d2ff4f9064d04e831 100644
--- a/gso/schedules/__init__.py
+++ b/gso/schedules/__init__.py
@@ -0,0 +1 @@
+"""Tasks that are scheduled to run periodically in :term:`GSO`."""
diff --git a/gso/schedules/scheduling.py b/gso/schedules/scheduling.py
index 8202bd3b1be54cede66c820020c54a20fb00636b..d7044351b1493b154961eaa67c421a98290cff10 100644
--- a/gso/schedules/scheduling.py
+++ b/gso/schedules/scheduling.py
@@ -1,3 +1,5 @@
+"""Definition of the decorator that allows for scheduling tasks in :term:`GSO` that are to run periodically."""
+
 import inspect
 from collections.abc import Callable
 from functools import wraps
diff --git a/gso/schedules/task_vacuum.py b/gso/schedules/task_vacuum.py
index ef90479e33d6ffe5d20f8b246aa4597cd57e8b48..98e05343dff0c701dd6e48f229d1e553e4149358 100644
--- a/gso/schedules/task_vacuum.py
+++ b/gso/schedules/task_vacuum.py
@@ -1,3 +1,5 @@
+"""Metatask that runs all cleanup tasks."""
+
 from orchestrator.services.processes import start_process
 
 from gso.schedules.scheduling import scheduler
@@ -7,4 +9,5 @@ from gso.worker import celery
 @celery.task
 @scheduler(name="Clean up tasks", hour="*/6")
 def vacuum_tasks() -> None:
+    """Run all cleanup tasks every 6 hours."""
     start_process("task_clean_up_tasks")
diff --git a/gso/schedules/validate_products.py b/gso/schedules/validate_products.py
index 4140df8efaf6738fbf8e4375bef8b12befb1398a..cb9ecc675264835dd4f13dc0069be61f3472f742 100644
--- a/gso/schedules/validate_products.py
+++ b/gso/schedules/validate_products.py
@@ -1,3 +1,5 @@
+"""Scheduled task that validates all products and inactive subscriptions in :term:`GSO`."""
+
 from orchestrator.services.processes import start_process
 
 from gso.schedules.scheduling import scheduler
@@ -8,5 +10,6 @@ from gso.worker import celery
 @celery.task
 @scheduler(name="Validate Products and inactive subscriptions", minute="30", hour="2")
 def validate_products() -> None:
+    """Validate all products."""
     if count_incomplete_validate_products() > 0:
         start_process("task_validate_products")
diff --git a/gso/schedules/validate_subscriptions.py b/gso/schedules/validate_subscriptions.py
index 78525caf38eb8569232d07631a10c3b524529fa0..7c4404356a656291c169cb665ac1a12e56ce0e38 100644
--- a/gso/schedules/validate_subscriptions.py
+++ b/gso/schedules/validate_subscriptions.py
@@ -1,3 +1,5 @@
+"""Scheduled task that runs a validation workflow for all active subscriptions."""
+
 import structlog
 from orchestrator.services.processes import get_execution_context
 from orchestrator.services.subscriptions import TARGET_DEFAULT_USABLE_MAP, WF_USABLE_MAP
@@ -13,6 +15,7 @@ logger = structlog.get_logger(__name__)
 @celery.task
 @scheduler(name="Subscriptions Validator", minute="10", hour="0")
 def validate_subscriptions() -> None:
+    """Validate all subscriptions using their corresponding validation workflow."""
     subscriptions = get_insync_subscriptions()
     if not subscriptions:
         logger.info("No subscriptions to validate")
diff --git a/pyproject.toml b/pyproject.toml
index 943f74b37a8547d7026f5e3f157766b73aad73ea..bcc10d8c8d8905c55dbe6012385e9693ebfdc58e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -42,6 +42,7 @@ ignore = [
     "D213",
     "N805",
     "PLR0913",
+    "PLR0904"
 ]
 line-length = 120
 select = [