diff --git a/gso/products/product_blocks/opengear.py b/gso/products/product_blocks/opengear.py
new file mode 100644
index 0000000000000000000000000000000000000000..992a06e06626b4191edb32109d53a66fcc8a1685
--- /dev/null
+++ b/gso/products/product_blocks/opengear.py
@@ -0,0 +1,45 @@
+"""Product block for :class:`Opengear` products."""
+import ipaddress
+
+from orchestrator.domain.base import ProductBlockModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.site import (
+    SiteBlock,
+    SiteBlockInactive,
+    SiteBlockProvisioning,
+)
+
+
+class OpengearBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="OpengearBlock",
+):
+    """An Opengear that's being currently inactive. See :class:`OpengearBlock`."""
+
+    opengear_hostname: str | None = None
+    opengear_site: SiteBlockInactive | None = None
+    opengear_wan_address: ipaddress.IPv4Address | None = None
+    opengear_wan_netmask: ipaddress.IPv4Address | None = None
+    opengear_wan_gateway: ipaddress.IPv4Address | None = None
+
+
+class OpengearBlockProvisioning(OpengearBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An Opengear that's being provisioned. See :class:`OpengearBlock`."""
+
+    opengear_hostname: str
+    opengear_site: SiteBlockProvisioning
+    opengear_wan_address: ipaddress.IPv4Address | None = None
+    opengear_wan_netmask: ipaddress.IPv4Address | None = None
+    opengear_wan_gateway: ipaddress.IPv4Address | None = None
+
+
+class OpengearBlock(OpengearBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An Opengear that's currently deployed in the network."""
+
+    opengear_hostname: str
+    opengear_site: SiteBlock
+    opengear_wan_address: ipaddress.IPv4Address
+    opengear_wan_netmask: ipaddress.IPv4Address
+    opengear_wan_gateway: ipaddress.IPv4Address
diff --git a/gso/products/product_types/opengear.py b/gso/products/product_types/opengear.py
new file mode 100644
index 0000000000000000000000000000000000000000..73ec76917eb10fa0c789c16c6086750bc5003451
--- /dev/null
+++ b/gso/products/product_types/opengear.py
@@ -0,0 +1,24 @@
+"""An Opengear product type."""
+
+from orchestrator.domain.base import SubscriptionModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.opengear import OpengearBlock, OpengearBlockInactive, OpengearBlockProvisioning
+
+
+class OpengearInactive(SubscriptionModel, is_base=True):
+    """An inactive Opengear."""
+
+    opengear: OpengearBlockInactive
+
+
+class OpengearProvisioning(OpengearInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An Opengear that is being provisioned."""
+
+    opengear: OpengearBlockProvisioning
+
+
+class OpenGear(OpengearProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An Opengear that is currently active."""
+
+    opengear: OpengearBlock