diff -Nuar a/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php b/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php
index 76d02836a5b..3322e3e6065 100644
--- a/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php
+++ b/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php
@@ -19,6 +19,7 @@ use Magento\Sales\Api\Data\OrderItemInterface;
 use Magento\Sales\Model\Order\Invoice;
 use Magento\Sales\Model\Order\Item;
 use Magento\Store\Model\ScopeInterface;
+use Magento\Sales\Model\Order;
 
 /**
  * Gift cards generator observer called on invoice after save
@@ -66,7 +67,7 @@ class GenerateGiftCardAccountsInvoice implements ObserverInterface
         $event = $observer->getEvent();
         /** @var Invoice $invoice */
         $invoice = $event->getInvoice();
-        /** @var \Magento\Sales\Model\Order $order */
+        /** @var Order $order */
         $order = $invoice->getOrder();
         $orderPaid = false;
 
@@ -84,25 +85,40 @@ class GenerateGiftCardAccountsInvoice implements ObserverInterface
             $orderPaid = true;
         }
 
-        /** @var Item $orderItem */
-        foreach ($order->getAllItems() as $orderItem) {
-            if ($orderItem->getProductType() !== ProductGiftCard::TYPE_GIFTCARD) {
-                continue;
-            }
-
+        /** @var Item $giftCardItem */
+        foreach ($this->getGiftCardOrderItems($order) as $giftCardItem) {
             if ($orderPaid) {
-                $qty = (int)$orderItem->getQtyInvoiced();
+                $qty = (int)$giftCardItem->getQtyInvoiced();
             } else {
-                $qty = $this->getInvoicedOrderItemQty($invoice, $orderItem);
+                $qty = $this->getInvoicedOrderItemQty($invoice, $giftCardItem);
             }
 
-            $options = $orderItem->getProductOptions();
-            if ($qty > 0) {
-                $options['giftcard_paid_invoice_items'][] = $orderItem->getItemId();
+            $options = $giftCardItem->getProductOptions();
+            $qtyGiftcardCodes = isset($options['giftcard_created_codes'])
+                ? count($options['giftcard_created_codes'])
+                : 0;
+            if ($qtyGiftcardCodes < (int)$giftCardItem->getQtyInvoiced()) {
+                $options['giftcard_paid_invoice_items'][] = $giftCardItem->getItemId();
+                $this->accountGenerator->generate($giftCardItem, $qty, $options);
             }
+        }
+    }
 
-            $this->accountGenerator->generate($orderItem, $qty, $options);
+    /**
+     * Return only gift card items from order
+     *
+     * @param Order $order
+     * @return array
+     */
+    private function getGiftCardOrderItems(Order $order): array
+    {
+        $items = [];
+        foreach ($order->getAllItems() as $orderItem) {
+            if ($orderItem->getProductType() === ProductGiftCard::TYPE_GIFTCARD) {
+                $items[] = $orderItem;
+            }
         }
+        return $items;
     }
 
     /**
