{
  "name": "Generate bulk certificates from Google Sheets and Google Slides",
  "nodes": [
    {
      "id": "f352d49c-d9bc-49fa-8b0a-c43a94d321fa",
      "name": "When clicking 'Test workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -272,
        -32
      ]
    },
    {
      "id": "4651f9ff-07a3-4857-9d69-06cf864315e5",
      "name": "Read Unprocessed Recipients",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -48,
        -32
      ]
    },
    {
      "id": "5b34aeac-f173-4c22-8826-930bb392182f",
      "name": "Process One at a Time",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        224,
        -32
      ]
    },
    {
      "id": "0d054ec2-6ac2-43f9-a5f7-3ce5a4399556",
      "name": "Copy Slides Template",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        480,
        -16
      ]
    },
    {
      "id": "546fe323-348e-4345-9658-abb66e898a19",
      "name": "Replace Template Placeholders",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        688,
        -16
      ]
    },
    {
      "id": "404a9f32-2653-46f1-ae0f-da5e517b85f1",
      "name": "Export to PDF",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        912,
        -16
      ]
    },
    {
      "id": "e1d0a513-024c-49c5-b5b0-6af8145ccf09",
      "name": "Save PDF to Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1152,
        -16
      ]
    },
    {
      "id": "beda0ef7-7376-431c-b753-2565efa28f5f",
      "name": "Mark as Processed",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1376,
        -16
      ]
    },
    {
      "id": "e85e5469-bfeb-43d2-a9d1-e478f06695a6",
      "name": "Delete Temporary Slide",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1600,
        -16
      ]
    },
    {
      "id": "420a078e-5d83-416f-9b23-0c16e89222d3",
      "name": "Wait 2s (Rate Limit)",
      "type": "n8n-nodes-base.wait",
      "position": [
        1824,
        -16
      ]
    },
    {
      "id": "4cfca671-cf3d-48c5-905a-3f86db1d4433",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        -240
      ],
      "parameters": {
        "width": 560,
        "height": 550,
        "content": "## How it works\nThis workflow generates personalized PDF certificates in bulk using Google Sheets as the data source and Google Slides as the template engine.\n\n1. Reads recipient data from a Google Sh"
      }
    },
    {
      "id": "2da79aa7-186f-4239-9946-611867eb56de",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        -176
      ],
      "parameters": {
        "width": 652,
        "height": 336,
        "content": "### 📥 Data Input\nReads recipients from Google Sheets and processes them one at a time to avoid API rate limits."
      }
    },
    {
      "id": "8b5724f3-07ab-4e46-ad57-b2d9730ea818",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -176
      ],
      "parameters": {
        "width": 680,
        "height": 336,
        "content": "### 🎨 Certificate Generation\nCopies the Slides template, replaces placeholders with recipient data, and exports as PDF."
      }
    },
    {
      "id": "73124c2f-6c78-49f3-8571-c3e59487c0c4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -176
      ],
      "parameters": {
        "width": 450,
        "height": 336,
        "content": "### 💾 Save & Update\nSaves the PDF to Drive and updates the spreadsheet with the file link."
      }
    },
    {
      "id": "28057c2a-b7e1-4228-abb0-36b5a76af4d0",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        -176
      ],
      "parameters": {
        "width": 414,
        "height": 336,
        "content": "### 🧹 Cleanup & Loop\nDeletes temporary files and waits 2 seconds before processing the next recipient."
      }
    }
  ],
  "connections": {
    "Export to PDF": {
      "main": [
        [
          {
            "node": "Save PDF to Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark as Processed": {
      "main": [
        [
          {
            "node": "Delete Temporary Slide",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save PDF to Drive": {
      "main": [
        [
          {
            "node": "Mark as Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Copy Slides Template": {
      "main": [
        [
          {
            "node": "Replace Template Placeholders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 2s (Rate Limit)": {
      "main": [
        [
          {
            "node": "Process One at a Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process One at a Time": {
      "main": [
        [],
        [
          {
            "node": "Copy Slides Template",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete Temporary Slide": {
      "main": [
        [
          {
            "node": "Wait 2s (Rate Limit)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Unprocessed Recipients": {
      "main": [
        [
          {
            "node": "Process One at a Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Replace Template Placeholders": {
      "main": [
        [
          {
            "node": "Export to PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking 'Test workflow'": {
      "main": [
        [
          {
            "node": "Read Unprocessed Recipients",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}