AutomationFlowsSlack & Telegram › Automate Manufacturing Qc Documentation & Compliance with Jotform

Automate Manufacturing Qc Documentation & Compliance with Jotform

ByJitesh Dugar @jiteshdugar on n8n.io

Streamline your manufacturing quality control process with automated inspection tracking, compliance documentation, and real-time alerts. This workflow eliminates manual QC paperwork while ensuring ISO compliance and instant visibility into product quality.

Cron / scheduled trigger★★★★☆ complexity21 nodesGoogle SheetsGoogle DriveSlackEmail SendJot Form Trigger
Slack & Telegram Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9761 — we link there as the canonical source.

This workflow follows the Emailsend → Google Drive recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "MAgkC5xPvs1oSfOG",
  "name": "Quality Control Documentation & Compliance Tracker",
  "tags": [
    {
      "id": "CWardZYJBmejoyC4",
      "name": "under review",
      "createdAt": "2025-10-09T18:43:37.031Z",
      "updatedAt": "2025-10-09T18:43:37.031Z"
    },
    {
      "id": "DP1soi5mjVldqSt2",
      "name": "Manufacturing",
      "createdAt": "2025-10-16T07:01:03.515Z",
      "updatedAt": "2025-10-16T07:01:03.515Z"
    },
    {
      "id": "YsSinivD5gbLQ0t9",
      "name": "Quality Control",
      "createdAt": "2025-10-16T07:01:03.524Z",
      "updatedAt": "2025-10-16T07:01:03.524Z"
    },
    {
      "id": "fVuzFMBZ0wHzY3en",
      "name": "Compliance",
      "createdAt": "2025-10-16T07:01:03.521Z",
      "updatedAt": "2025-10-16T07:01:03.521Z"
    }
  ],
  "nodes": [
    {
      "id": "8f4dabc5-b0f6-4f4b-8e07-aec5b456c963",
      "name": "Check for New Inspections",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -656,
        160
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "09bfd902-b390-418e-8b95-52f1e2b12853",
      "name": "Read Inspection Queue",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -448,
        160
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4
    },
    {
      "id": "9511a47d-58f0-4755-9f03-c36adfcffbe4",
      "name": "Process Inspection Data",
      "type": "n8n-nodes-base.code",
      "position": [
        -256,
        256
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Parse inspection data and determine compliance status\nconst item = $input.item.json;\n\n// Extract inspection details\nconst inspectionData = {\n  id: item.inspection_id || new Date().getTime().toString(),\n  timestamp: new Date().toISOString(),\n  product_name: item.product_name || item.answers?.product_name || '',\n  batch_number: item.batch_number || item.answers?.batch_number || '',\n  inspector_name: item.inspector_name || item.answers?.inspector_name || '',\n  inspection_type: item.inspection_type || item.answers?.inspection_type || 'Standard',\n  \n  // Measurement data\n  measurements: {\n    dimension_length: parseFloat(item.dimension_length || item.answers?.dimension_length || 0),\n    dimension_width: parseFloat(item.dimension_width || item.answers?.dimension_width || 0),\n    dimension_height: parseFloat(item.dimension_height || item.answers?.dimension_height || 0),\n    weight: parseFloat(item.weight || item.answers?.weight || 0),\n    temperature: parseFloat(item.temperature || item.answers?.temperature || 0)\n  },\n  \n  // Quality checks\n  visual_inspection: item.visual_inspection || item.answers?.visual_inspection || 'Pass',\n  surface_finish: item.surface_finish || item.answers?.surface_finish || 'Acceptable',\n  color_match: item.color_match || item.answers?.color_match || 'Yes',\n  defects_found: item.defects_found || item.answers?.defects_found || 'None',\n  \n  // Compliance calculation\n  specifications: {\n    length_min: 100,\n    length_max: 102,\n    width_min: 50,\n    width_max: 52,\n    height_min: 25,\n    height_max: 27,\n    weight_min: 450,\n    weight_max: 550\n  }\n};\n\n// Check compliance\nconst m = inspectionData.measurements;\nconst s = inspectionData.specifications;\n\nconst dimensionsCompliant = \n  m.dimension_length >= s.length_min && m.dimension_length <= s.length_max &&\n  m.dimension_width >= s.width_min && m.dimension_width <= s.width_max &&\n  m.dimension_height >= s.height_min && m.dimension_height <= s.height_max;\n\nconst weightCompliant = m.weight >= s.weight_min && m.weight <= s.weight_max;\n\nconst visualCompliant = \n  inspectionData.visual_inspection === 'Pass' &&\n  inspectionData.surface_finish === 'Acceptable' &&\n  inspectionData.color_match === 'Yes';\n\ninspectionData.compliance_status = \n  dimensionsCompliant && weightCompliant && visualCompliant ? 'PASS' : 'FAIL';\n\ninspectionData.non_conformities = [];\nif (!dimensionsCompliant) inspectionData.non_conformities.push('Dimensions out of spec');\nif (!weightCompliant) inspectionData.non_conformities.push('Weight out of spec');\nif (!visualCompliant) inspectionData.non_conformities.push('Visual inspection failed');\n\nreturn inspectionData;"
      },
      "typeVersion": 2
    },
    {
      "id": "5c1c11fe-848e-4951-9423-e86a0bb8b14b",
      "name": "Store in Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -48,
        160
      ],
      "parameters": {
        "name": "=QC_Report_{{$json.batch_number}}_{{$json.id}}.json",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "/ (Root folder)"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "32d6c442-d011-4dd4-8755-ed62277041b5",
      "name": "Log to Tracking Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        160,
        160
      ],
      "parameters": {
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4
    },
    {
      "id": "8665c487-3083-4f39-b9de-69ad7bd68afd",
      "name": "Check if Failed",
      "type": "n8n-nodes-base.if",
      "position": [
        -48,
        352
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json.compliance_status}}",
              "value2": "FAIL"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ae823af6-bfe5-4c77-8789-b5c27daf5327",
      "name": "Alert Quality Team",
      "type": "n8n-nodes-base.slack",
      "position": [
        160,
        464
      ],
      "parameters": {
        "text": "\ud83d\udea8 *Quality Control Alert*\n\nProduct: {{$json.product_name}}\nBatch: {{$json.batch_number}}\nStatus: *{{$json.compliance_status}}*\n\nNon-conformities:\n{{$json.non_conformities.join('\\n\u2022 ')}}",
        "otherOptions": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "e1e70d0c-4d12-4e10-85fc-b42a062451d2",
      "name": "Generate Certificate",
      "type": "n8n-nodes-base.code",
      "position": [
        352,
        160
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Generate HTML certificate of compliance\nconst data = $input.item.json;\n\nconst html = `\n<!DOCTYPE html>\n<html>\n<head>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 40px; }\n        .header { text-align: center; margin-bottom: 30px; }\n        .certificate { border: 2px solid #333; padding: 30px; }\n        h1 { color: #2c5aa0; }\n        .details { margin: 20px 0; }\n        .signature { margin-top: 50px; }\n        .footer { text-align: center; margin-top: 30px; font-size: 12px; }\n    </style>\n</head>\n<body>\n    <div class=\"certificate\">\n        <div class=\"header\">\n            <h1>CERTIFICATE OF COMPLIANCE</h1>\n            <p>ISO 9001:2015 Quality Management System</p>\n        </div>\n        \n        <div class=\"details\">\n            <p><strong>Certificate No:</strong> ${data.id}</p>\n            <p><strong>Date:</strong> ${new Date(data.timestamp).toLocaleDateString()}</p>\n            <p><strong>Product:</strong> ${data.product_name}</p>\n            <p><strong>Batch Number:</strong> ${data.batch_number}</p>\n            <p><strong>Inspector:</strong> ${data.inspector_name}</p>\n            \n            <h3>Inspection Results</h3>\n            <table border=\"1\" style=\"width: 100%; border-collapse: collapse;\">\n                <tr>\n                    <th>Parameter</th>\n                    <th>Measured Value</th>\n                    <th>Specification</th>\n                    <th>Status</th>\n                </tr>\n                <tr>\n                    <td>Length (mm)</td>\n                    <td>${data.measurements.dimension_length}</td>\n                    <td>100-102</td>\n                    <td>${data.measurements.dimension_length >= 100 && data.measurements.dimension_length <= 102 ? '\u2713' : '\u2717'}</td>\n                </tr>\n                <tr>\n                    <td>Width (mm)</td>\n                    <td>${data.measurements.dimension_width}</td>\n                    <td>50-52</td>\n                    <td>${data.measurements.dimension_width >= 50 && data.measurements.dimension_width <= 52 ? '\u2713' : '\u2717'}</td>\n                </tr>\n                <tr>\n                    <td>Weight (g)</td>\n                    <td>${data.measurements.weight}</td>\n                    <td>450-550</td>\n                    <td>${data.measurements.weight >= 450 && data.measurements.weight <= 550 ? '\u2713' : '\u2717'}</td>\n                </tr>\n            </table>\n            \n            <h3>Compliance Status: ${data.compliance_status}</h3>\n        </div>\n        \n        <div class=\"signature\">\n            <p>_______________________</p>\n            <p>Quality Manager Signature</p>\n        </div>\n        \n        <div class=\"footer\">\n            <p>This certificate is electronically generated and valid without signature</p>\n        </div>\n    </div>\n</body>\n</html>\n`;\n\nreturn {\n  html: html,\n  filename: `Certificate_${data.batch_number}_${data.id}.html`\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "622adac3-cd64-44d5-839e-dca015951252",
      "name": "Email Certificate",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        560,
        160
      ],
      "parameters": {
        "options": {
          "attachments": "={{$node['Generate Certificate'].json.html}}"
        },
        "subject": "Quality Certificate - Batch {{$json.batch_number}}",
        "toEmail": "={{$json.customer_email || 'customer@example.com'}}",
        "fromEmail": "user@example.com"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8bbe8307-48a8-4875-9e55-27988dc638af",
      "name": "Daily Report Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -656,
        656
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1af14ece-11a2-44a0-a935-8cdbdc0cff3e",
      "name": "Get Daily Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -448,
        656
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4
    },
    {
      "id": "91204a97-f66a-4d3f-bc34-f9b06b25e21f",
      "name": "Generate Summary",
      "type": "n8n-nodes-base.code",
      "position": [
        -256,
        656
      ],
      "parameters": {
        "jsCode": "// Generate daily compliance summary\nconst items = $input.all();\nconst today = new Date().toDateString();\n\nconst todaysInspections = items.filter(item => {\n  const itemDate = new Date(item.json.timestamp).toDateString();\n  return itemDate === today;\n});\n\nconst summary = {\n  date: today,\n  total_inspections: todaysInspections.length,\n  passed: todaysInspections.filter(i => i.json.compliance_status === 'PASS').length,\n  failed: todaysInspections.filter(i => i.json.compliance_status === 'FAIL').length,\n  pass_rate: 0,\n  products_inspected: [...new Set(todaysInspections.map(i => i.json.product_name))],\n  inspectors: [...new Set(todaysInspections.map(i => i.json.inspector_name))],\n  common_issues: {}\n};\n\nif (summary.total_inspections > 0) {\n  summary.pass_rate = ((summary.passed / summary.total_inspections) * 100).toFixed(1);\n}\n\n// Count non-conformities\ntodaysInspections.forEach(inspection => {\n  if (inspection.json.non_conformities) {\n    inspection.json.non_conformities.forEach(issue => {\n      summary.common_issues[issue] = (summary.common_issues[issue] || 0) + 1;\n    });\n  }\n});\n\nreturn summary;"
      },
      "typeVersion": 2
    },
    {
      "id": "4947aabe-e0be-4ea2-85f4-fa259b1f4290",
      "name": "Send Daily Report",
      "type": "n8n-nodes-base.slack",
      "position": [
        -48,
        656
      ],
      "parameters": {
        "text": "\ud83d\udcca *Daily Quality Report*\nDate: {{$json.date}}\n\n*Summary:*\n\u2022 Total Inspections: {{$json.total_inspections}}\n\u2022 Passed: {{$json.passed}} \u2705\n\u2022 Failed: {{$json.failed}} \u274c\n\u2022 Pass Rate: {{$json.pass_rate}}%\n\n*Products Inspected:*\n{{$json.products_inspected.join('\\n\u2022 ')}}",
        "otherOptions": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "151db029-c3da-4324-b523-014be9200479",
      "name": "Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        112
      ],
      "parameters": {
        "width": 250,
        "height": 156,
        "content": "## \ud83d\udce5 INPUT SOURCES\n\n**Two ways to receive data:**\n- Form submissions\n- Scheduled checks"
      },
      "typeVersion": 1
    },
    {
      "id": "efd420c8-6496-4775-ae49-e9ddd0439deb",
      "name": "Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        384
      ],
      "parameters": {
        "width": 200,
        "height": 152,
        "content": "## \ud83d\udd04 PROCESSING\n\nCalculates compliance\nbased on specs"
      },
      "typeVersion": 1
    },
    {
      "id": "97aad2cd-f193-48d2-91c4-271a5c2d3a11",
      "name": "Note 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        0
      ],
      "parameters": {
        "width": 372,
        "height": 136,
        "content": "## \ud83d\udcbe STORAGE\n\nSaves to Drive & tracking sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "d214ceff-a286-4941-aa49-a2e8ccad92f4",
      "name": "Note 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        624
      ],
      "parameters": {
        "width": 180,
        "height": 136,
        "content": "## \ud83d\udea8 ALERTS\n\nNotifies team\nfor failures only"
      },
      "typeVersion": 1
    },
    {
      "id": "76539b89-3dab-4804-b6f8-c2f4b5dac0ec",
      "name": "Note 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        320
      ],
      "parameters": {
        "width": 360,
        "height": 120,
        "content": "## \ud83d\udccb DOCS\n\nGenerates & emails certificates"
      },
      "typeVersion": 1
    },
    {
      "id": "11a5eb71-0f1f-4d6e-8f40-11113c6513e0",
      "name": "Note 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        688
      ],
      "parameters": {
        "width": 200,
        "height": 168,
        "content": "## \ud83d\udcca DAILY REPORTS\n\nRuns at 8 AM\nSummarizes metrics"
      },
      "typeVersion": 1
    },
    {
      "id": "7191be65-1d4b-4ee1-8eb5-48dd0343c85a",
      "name": "Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        384
      ],
      "parameters": {
        "width": 314,
        "height": 156,
        "content": "## \ud83d\udce5 MANUAL FORM\n\nJotform Trigger\n\nCreate your form for free on [Jotform using this link](https://www.jotform.com/?partner=mediajade)"
      },
      "typeVersion": 1
    },
    {
      "id": "db6112a6-2bfe-4242-b893-8c4ab757592b",
      "name": "Jotform Trigger",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        -640,
        416
      ],
      "parameters": {
        "form": "252815424602048"
      },
      "credentials": {
        "jotFormApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "43118887-aa49-452b-81c1-4ad1fc98eabb",
  "connections": {
    "Get Daily Data": {
      "main": [
        [
          {
            "node": "Generate Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Failed": {
      "main": [
        [
          {
            "node": "Alert Quality Team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Jotform Trigger": {
      "main": [
        [
          {
            "node": "Process Inspection Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Summary": {
      "main": [
        [
          {
            "node": "Send Daily Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Report Trigger": {
      "main": [
        [
          {
            "node": "Get Daily Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Certificate": {
      "main": [
        [
          {
            "node": "Email Certificate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Tracking Sheet": {
      "main": [
        [
          {
            "node": "Generate Certificate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Inspection Queue": {
      "main": [
        [
          {
            "node": "Process Inspection Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store in Google Drive": {
      "main": [
        [
          {
            "node": "Log to Tracking Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Inspection Data": {
      "main": [
        [
          {
            "node": "Store in Google Drive",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check if Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for New Inspections": {
      "main": [
        [
          {
            "node": "Read Inspection Queue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Streamline your manufacturing quality control process with automated inspection tracking, compliance documentation, and real-time alerts. This workflow eliminates manual QC paperwork while ensuring ISO compliance and instant visibility into product quality.

Source: https://n8n.io/workflows/9761/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

Simplify financial oversight with this automated n8n workflow. Triggered daily, it fetches cash flow and expense data from a Google Sheet, analyzes inflows and outflows, validates records, and generat

HTTP Request, Google Sheets, Email Send +3
Slack & Telegram

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

N8N Nodes Scrapegraphai, HTTP Request, Google Sheets +2
Slack & Telegram

This workflow automatically monitors competitor affiliate programs twice daily using Bright Data's web scraping API to extract commission rates, cookie durations, average order values, and payout term

HTTP Request, Google Sheets, Slack +1
Slack & Telegram

Optimize your performance review process with this automated workflow. Running daily at 8 AM, it retrieves scheduled reviews from a Google Sheet, validates upcoming sessions, processes each review, an

Google Sheets, Email Send, Google Calendar +1
Slack & Telegram

Transform your attendance management with this enterprise-grade automated workflow featuring AI-powered analytics, multi-dimensional insights, and intelligent alerting. Running hourly, it integrates m

Google Sheets, Email Send, Slack