diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs
index 3a7cd8bec2a500b36218c3d1f008d96a10d45d3a..1245ea28e247dfc297a2a2ac17013b7f41ac5a4c 100644
--- a/pallets/smith-members/src/lib.rs
+++ b/pallets/smith-members/src/lib.rs
@@ -245,6 +245,8 @@ pub mod pallet {
         ReceiverHasNotBeenInvited,
         /// Smith must be a member of the main WoT
         NotAMember,
+        /// A smith has a limited stock of certifications
+        TooMuchCertificationsIssued,
     }
 
     #[pallet::call]
@@ -357,13 +359,16 @@ impl<T: Config> Pallet<T> {
         receiver: T::IdtyIndex,
     ) -> DispatchResultWithPostInfo {
         ensure!(issuer != receiver, Error::<T>::CannotCertifySelf);
-        let issuer_status = Smiths::<T>::get(issuer)
-            .ok_or(Error::<T>::IssuerHasNoSmithStatus)?
-            .status;
+        let issuer = Smiths::<T>::get(issuer).ok_or(Error::<T>::IssuerHasNoSmithStatus)?;
         ensure!(
-            issuer_status == SmithStatus::Smith,
+            issuer.status == SmithStatus::Smith,
             Error::<T>::IssuerIsNotASmith
         );
+        let issued_certs = issuer.issued_certs.len() as u32;
+        ensure!(
+            issued_certs < T::MaxByIssuer::get(),
+            Error::<T>::TooMuchCertificationsIssued
+        );
         let receiver_status = Smiths::<T>::get(receiver)
             .ok_or(Error::<T>::ReceiverHasNotBeenInvited)?
             .status;
diff --git a/pallets/smith-members/src/mock.rs b/pallets/smith-members/src/mock.rs
index b32cf9b0ffc4999c9d63d9cad0eb8ff3120afc41..d68d9782e63fc642d50b70c34e58c43f700f7676 100644
--- a/pallets/smith-members/src/mock.rs
+++ b/pallets/smith-members/src/mock.rs
@@ -95,7 +95,7 @@ impl pallet_smith_members::Config for Runtime {
     type IdtyIdOf = ConvertInto;
     type MinCertForMembership = ConstU32<2>;
     type MinCertForCreateIdtyRight = ConstU32<3>;
-    type MaxByIssuer = ConstU32<5>;
+    type MaxByIssuer = ConstU32<3>;
     type InactivityMaxDuration = ConstU32<5>;
     type OnSmithDelete = ();
     type IdtyIdOfAuthorityId = ConvertInto;
diff --git a/pallets/smith-members/src/tests.rs b/pallets/smith-members/src/tests.rs
index 42b417077e495fa4336e1bde88813ba80e50695f..54c4652bfdd83b7210c1f9e68f9a6df75972798c 100644
--- a/pallets/smith-members/src/tests.rs
+++ b/pallets/smith-members/src/tests.rs
@@ -387,5 +387,19 @@ fn smith_coming_back_recovers_its_issued_certs() {
                 received_certs: vec![1, 3]
             })
         );
+        // We can verify it with the stock rule
+        assert_ok!(Pallet::<Runtime>::certify_smith(
+            RuntimeOrigin::signed(2),
+            3
+        ));
+        assert_ok!(Pallet::<Runtime>::certify_smith(
+            RuntimeOrigin::signed(2),
+            4
+        ));
+        // Max stock is reached (3 = 1 recovered + 2 new)
+        assert_err!(
+            Pallet::<Runtime>::certify_smith(RuntimeOrigin::signed(2), 5),
+            Error::<Runtime>::TooMuchCertificationsIssued
+        );
     });
 }