Automatisierung von Vertragserstellung und E-Signatur

Experte

Dies ist ein Document Extraction-Bereich Automatisierungsworkflow mit 33 Nodes. Hauptsächlich werden Set, Code, Gmail, Merge, DataTable und andere Nodes verwendet. Automatisierung des vollständigen Protokoll-Lebenszyklus: JotForm, Genehmigung, Signwell-eSignature und Tracking

Voraussetzungen
  • Google-Konto + Gmail API-Anmeldedaten
  • Google Drive API-Anmeldedaten
  • Möglicherweise sind Ziel-API-Anmeldedaten erforderlich
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "id": "TWnGL7anpqfTlrTu",
  "meta": {
    "instanceId": "90dd23d886c9cb675f452d0fb004af6ee783e4e974ef4384cbfad1854c68a875",
    "templateCredsSetupCompleted": true
  },
  "name": "Agreement Composer and E-Signature Automation",
  "tags": [
    {
      "id": "ClBqgyA0LGlkvyvZ",
      "name": "Contracts",
      "createdAt": "2025-10-16T09:18:33.184Z",
      "updatedAt": "2025-10-16T09:18:33.184Z"
    },
    {
      "id": "ZFOFNDdsvoQ2qGKW",
      "name": "Form Automation",
      "createdAt": "2025-10-16T09:18:33.189Z",
      "updatedAt": "2025-10-16T09:18:33.189Z"
    },
    {
      "id": "ZUPuUVjkdgHAmXJY",
      "name": "Document Generation",
      "createdAt": "2025-10-16T09:18:33.178Z",
      "updatedAt": "2025-10-16T09:18:33.178Z"
    },
    {
      "id": "aXYmTJgLTE6cyQne",
      "name": "Agreements",
      "createdAt": "2025-10-20T04:04:41.153Z",
      "updatedAt": "2025-10-20T04:04:41.153Z"
    }
  ],
  "nodes": [
    {
      "id": "ebc8134f-42d0-41cf-99de-61df1a74a558",
      "name": "JotForm Trigger",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        -880,
        -352
      ],
      "webhookId": "c4c32e08-4686-4831-966c-7241f91b8048",
      "parameters": {
        "form": "252888042997475"
      },
      "credentials": {
        "jotFormApi": {
          "id": "MEZxYkQDesqbiRMw",
          "name": "JotForm account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d8d29e44-2dd1-4f58-9c6f-56aafb3d02b0",
      "name": "Get Clean Doc URL",
      "type": "n8n-nodes-base.set",
      "position": [
        -64,
        -352
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f10e836d-09ee-4fed-93bd-548c0e6ac685",
              "name": "documentUrl",
              "type": "string",
              "value": "=https://docs.google.com/document/d/{{ $json.documentId }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "58107ec8-d271-446e-9265-af7597678714",
      "name": "Share E-Mail Draft",
      "type": "n8n-nodes-base.gmail",
      "position": [
        144,
        -224
      ],
      "webhookId": "f7e31863-b041-4ea2-bd2d-12a16654e17f",
      "parameters": {
        "sendTo": "YOUR_EMAIL_ADDRESS",
        "message": "=Hi – your agreement composer here emailing on behalf of you...\n<br><br>\nThe draft digital services agreement for <b>{{ $('Edit Fields').item.json.clientCompanyName }}</b> is ready for your review: {{ $json.documentUrl }}.\n<br><br>\nOnce you are happy with it, simply reply <b>Approved</b> so that I can continue the process. Otherwise, you can edit the draft as required, and then reply 'Approved' after so that I can continue the same process.\n<br><br>\n<em>Please note, the agreement will be sent for signing to <b>{{ $('Edit Fields').item.json.clientFullName }}</b> ({{ $('Edit Fields').item.json.clientEmail }}).</em>\n<br><br>\nThanks!",
        "options": {
          "senderName": "Your Agreement Composer",
          "appendAttribution": false
        },
        "subject": "=Approval Request: Draft - {{ $('Copy and Rename File').item.json.name }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "51mlyK2w5LA9QaKi",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "300eec85-1d70-486a-b596-5f9e38f6f6b4",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -672,
        -352
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5eaad570-e75d-4a35-8811-7f88c7a5afe7",
              "name": "clientCompanyName",
              "type": "string",
              "value": "={{ $json['Company Name'] }}"
            },
            {
              "id": "7136a740-0ea6-449d-a4ea-269ff1455d18",
              "name": "clientCompanyAddress",
              "type": "string",
              "value": "={{ (() => {\n  const a = $json['Company Address'] ?? {};\n  const parts = [a.addr_line1, a.addr_line2, a.city, a.state, a.postal, a.country]\n    .map(v => (typeof v === 'string' ? v.trim() : v))\n    .filter(v => v); // drops empty/undefined\n\n  return parts.join(', ');\n})() }}"
            },
            {
              "id": "3947ba78-0d19-44df-8b0a-53302a7a0b31",
              "name": "clientFullName",
              "type": "string",
              "value": "={{ $json[\"Full Name\"].first }} {{ $json[\"Full Name\"].last }}"
            },
            {
              "id": "d07cb3d5-ff59-4984-bf3d-a83b8fcba9cb",
              "name": "ClientNamePosition",
              "type": "string",
              "value": "={{ $json[\"Your Position / Job Title\"] }}"
            },
            {
              "id": "7b28296d-5c19-4ca8-b77b-f8d0d83dedb9",
              "name": "clientEmail",
              "type": "string",
              "value": "={{ $json.Email }}"
            },
            {
              "id": "efc5cdb0-49eb-451f-acea-df916982d05a",
              "name": "formCompletedDate",
              "type": "string",
              "value": "={{ $now.format('yyyy-MM-dd') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "65107954-9e06-47dd-9199-e4c34182f36a",
      "name": "Copy and Rename File",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -464,
        -352
      ],
      "parameters": {
        "name": "=Digital Services Agreement - {{ $json.clientCompanyName }} - {{ $json.formCompletedDate }} - Ref-{{ new Date().toISOString().replace(/[-T:.Z]/g, '') }}",
        "fileId": {
          "__rl": true,
          "mode": "list",
          "value": "1Nz2sAkDiIxMylzec7vNqOwjP2RRIeV8VOip4UWh2JD8",
          "cachedResultUrl": "https://docs.google.com/document/d/1Nz2sAkDiIxMylzec7vNqOwjP2RRIeV8VOip4UWh2JD8/edit?usp=drivesdk",
          "cachedResultName": "Digital Services Agreement - {{clientCompanyName}} - {{currentDate}}"
        },
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1DNTyDTLimYYpG6Oj_DxSfaw9yx-S43rH",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1DNTyDTLimYYpG6Oj_DxSfaw9yx-S43rH",
          "cachedResultName": "Services Agreements - Drafts"
        },
        "operation": "copy",
        "sameFolder": false
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IjoB5flCkLlcfjdH",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "731dc0a8-e40d-4ccb-baf4-8aa14cb6e543",
      "name": "Update New File",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        -256,
        -352
      ],
      "parameters": {
        "simple": false,
        "actionsUi": {
          "actionFields": [
            {
              "text": "{{clientCompanyName}}",
              "action": "replaceAll",
              "replaceText": "={{ $('Edit Fields').item.json.clientCompanyName }}"
            },
            {
              "text": "{{clientFullName}}",
              "action": "replaceAll",
              "replaceText": "={{ $('Edit Fields').item.json.clientFullName }}"
            },
            {
              "text": "{{clientNamePosition}}",
              "action": "replaceAll",
              "replaceText": "={{ $('Edit Fields').item.json.ClientNamePosition }}"
            },
            {
              "text": "{{clientCompanyAddress}}",
              "action": "replaceAll",
              "replaceText": "={{ $('Edit Fields').item.json.clientCompanyAddress }}"
            },
            {
              "text": "{{agreementDate1}}",
              "action": "replaceAll",
              "replaceText": "={{ new Date($('Edit Fields').item.json.formCompletedDate).toLocaleDateString('en-US', { month:'long', day:'numeric', year:'numeric' }) }}"
            },
            {
              "text": "{{agreementDate2}}",
              "action": "replaceAll",
              "replaceText": "={{ new Date($('Edit Fields').item.json.formCompletedDate).toLocaleDateString('en-US', { month:'short', day:'numeric', year:'numeric' }) }}"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "id": "lJWyEbBbmTlTRv3x",
          "name": "Google Docs account"
        }
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "13d43194-f2a6-466e-a587-97f3752f0bed",
      "name": "Get Relevant Agreement Record",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -640,
        128
      ],
      "parameters": {
        "limit": 1,
        "filters": {
          "conditions": [
            {
              "keyName": "documentFileName",
              "keyValue": "={{ (() => {\n  const s = ($json.Subject ?? '').toString();\n  const m = s.match(/Digital Services Agreement.*$/i);\n  return m ? m[0].trim() : s;\n})() }}"
            }
          ]
        },
        "operation": "get",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "7q3kikjopVGUGQgQ",
          "cachedResultUrl": "/projects/7FLBLfPJX4Uw0i6f/datatables/7q3kikjopVGUGQgQ",
          "cachedResultName": "Services Agreements"
        }
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "c4fbf446-5a2e-4ece-80e3-af4ee341a23a",
      "name": "Check for E-Mail Approval",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -880,
        128
      ],
      "parameters": {
        "filters": {
          "q": "from:@YOUR_EMAIL_DOMAIN \"Re: Approval Request: Draft\" \"Approved\" ",
          "labelIds": [
            "Label_1461057032612050483"
          ]
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "51mlyK2w5LA9QaKi",
          "name": "Gmail account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2fa4037a-3f10-48db-ba88-9da006d0ecf6",
      "name": "Datei herunterladen as PDF",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -432,
        128
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $json.documentUrl }}"
        },
        "options": {
          "binaryPropertyName": "downloadedPdfFile",
          "googleFileConversion": {
            "conversion": {
              "docsToFormat": "application/pdf"
            }
          }
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IjoB5flCkLlcfjdH",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "ab82861a-b78b-44f2-8c91-77418777f4c2",
      "name": "Upload PDF File",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -208,
        128
      ],
      "parameters": {
        "name": "={{ $json.documentFileName }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1DNTyDTLimYYpG6Oj_DxSfaw9yx-S43rH",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1DNTyDTLimYYpG6Oj_DxSfaw9yx-S43rH",
          "cachedResultName": "Services Agreements - Drafts"
        },
        "inputDataFieldName": "=downloadedPdfFile"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IjoB5flCkLlcfjdH",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "13e7027a-a84d-4619-8e25-4cbdd87d1fd0",
      "name": "Create Document in Signwell",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        224,
        128
      ],
      "parameters": {
        "url": "https://www.signwell.com/api/v1/documents/",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"test_mode\": true,\n  \"draft\": false,\n  \"with_signature_page\": false,\n  \"reminders\": false,\n  \"apply_signing_order\": false,\n  \"embedded_signing\": true,\n  \"embedded_signing_notifications\": true,\n  \"text_tags\": false,\n  \"allow_decline\": true,\n  \"allow_reassign\": true,\n  \"files\": [\n    {\n      \"name\": \"{{ $('Upload PDF File').item.json.name }}.pdf\",\n      \"file_url\": \"https://drive.google.com/uc?export=download&id={{ $('Upload PDF File').item.json.id }}\"\n    }\n  ],\n  \"recipients\": [\n    {\n      \"send_email\": false,\n      \"send_email_delay\": 0,\n      \"id\": \"1\",\n      \"name\": \"{{ $('Get Relevant Agreement Record').item.json.clientFullName }}\",\n      \"email\": \"{{ $('Get Relevant Agreement Record').item.json.clientEmail }}\"\n    }\n  ],\n  \"fields\": [\n    [\n      {\n        \"type\": \"signature\",\n        \"required\": true,\n        \"fixed_width\": false,\n        \"lock_sign_date\": false,\n        \"x\": 140,\n        \"y\": 527,\n        \"page\": 2,\n        \"recipient_id\": \"1\",\n        \"height\": \"40.0\",\n        \"width\": \"200.0\"\n      },\n      {\n        \"type\": \"date\",\n        \"required\": true,\n        \"fixed_width\": false,\n        \"lock_sign_date\": true,\n        \"x\": 100,\n        \"y\": 588,\n        \"page\": 2,\n        \"recipient_id\": \"1\",\n        \"date_format\": \"Month DD, YYYY\"\n      }\n    ]\n  ]\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "X-Api-Key",
              "value": "YOUR_SIGNWELL_API_KEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "776c7399-727c-4a96-a09b-748ebf486364",
      "name": "Send Prepared Agreement to Client",
      "type": "n8n-nodes-base.gmail",
      "position": [
        544,
        432
      ],
      "webhookId": "96aa5fa2-dfd3-46b1-b831-400093f55b46",
      "parameters": {
        "sendTo": "={{ $json.recipients[0].email }}",
        "message": "=Hi {{ $json.recipients[0].name.split(\" \")[0] }},\n<br><br>\nThanks for the conversations so far regarding the engagement.\n<br><br>\nAs discussed, please find the Services Agreement for your review and e-signing: <b>{{ $json.recipients[0].embedded_signing_url }}</b>.\n<br><br>\nThanks,<br>\nYOUR NAME",
        "options": {
          "senderName": "YOUR NAME OR COMPANY NAME",
          "appendAttribution": false
        },
        "subject": "=Please Review and Sign: {{ $json.name }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "51mlyK2w5LA9QaKi",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "a390b505-acee-4f18-9919-9bf512d3afd9",
      "name": "Update Row - Approval Status",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -432,
        336
      ],
      "parameters": {
        "columns": {
          "value": {
            "approvalStatus": "Approved"
          },
          "schema": [
            {
              "id": "documentFileName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "documentFileName",
              "defaultMatch": false
            },
            {
              "id": "clientEmail",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientEmail",
              "defaultMatch": false
            },
            {
              "id": "clientFullName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientFullName",
              "defaultMatch": false
            },
            {
              "id": "clientNamePosition",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientNamePosition",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyName",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyAddress",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyAddress",
              "defaultMatch": false
            },
            {
              "id": "documentUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "documentUrl",
              "defaultMatch": false
            },
            {
              "id": "approvalStatus",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "approvalStatus",
              "defaultMatch": false
            },
            {
              "id": "sentDocumentPdfUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "sentDocumentPdfUrl",
              "defaultMatch": false
            },
            {
              "id": "sentDate",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "sentDate",
              "defaultMatch": false
            },
            {
              "id": "signwellUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "signwellUrl",
              "defaultMatch": false
            },
            {
              "id": "docSigned",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "docSigned",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocGDrive",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocGDrive",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocSignwellUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocSignwellUrl",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "options": {},
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "7q3kikjopVGUGQgQ",
          "cachedResultUrl": "/projects/7FLBLfPJX4Uw0i6f/datatables/7q3kikjopVGUGQgQ",
          "cachedResultName": "Services Agreements"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e3d74ab8-44ef-4dd2-ade0-dbe942af78d3",
      "name": "Update Row - Additional Doc Details",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        544,
        80
      ],
      "parameters": {
        "columns": {
          "value": {
            "sentDate": "={{ $('Create Document in Signwell').item.json.created_at }}",
            "signwellUrl": "={{ $('Create Document in Signwell').item.json.recipients[0].embedded_signing_url }}",
            "signwellDocID": "={{ $json.id }}",
            "sentDocumentPdfUrl": "={{ $('Upload PDF File').item.json.webViewLink }}"
          },
          "schema": [
            {
              "id": "documentFileName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "documentFileName",
              "defaultMatch": false
            },
            {
              "id": "clientEmail",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientEmail",
              "defaultMatch": false
            },
            {
              "id": "clientFullName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientFullName",
              "defaultMatch": false
            },
            {
              "id": "clientNamePosition",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientNamePosition",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyName",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyAddress",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyAddress",
              "defaultMatch": false
            },
            {
              "id": "documentUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "documentUrl",
              "defaultMatch": false
            },
            {
              "id": "approvalStatus",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "approvalStatus",
              "defaultMatch": false
            },
            {
              "id": "sentDocumentPdfUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "sentDocumentPdfUrl",
              "defaultMatch": false
            },
            {
              "id": "sentDate",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "sentDate",
              "defaultMatch": false
            },
            {
              "id": "signwellUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "signwellUrl",
              "defaultMatch": false
            },
            {
              "id": "docSigned",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "docSigned",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocGDrive",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocGDrive",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocSignwellUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocSignwellUrl",
              "defaultMatch": false
            },
            {
              "id": "signwellDocID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "signwellDocID",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyValue": "={{ $('Get Relevant Agreement Record').item.json.id }}"
            }
          ]
        },
        "options": {},
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "7q3kikjopVGUGQgQ",
          "cachedResultUrl": "/projects/7FLBLfPJX4Uw0i6f/datatables/7q3kikjopVGUGQgQ",
          "cachedResultName": "Services Agreements"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b926ab5b-99ba-4400-9726-ca7ccc8bd9ef",
      "name": "Grant Sharing Access to PDF File",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        0,
        128
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "share",
        "permissionsUi": {
          "permissionsValues": {
            "role": "reader",
            "type": "anyone"
          }
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IjoB5flCkLlcfjdH",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "26ceb85f-ea7d-4b06-9739-5295f2ebdb70",
      "name": "Remove Sharing Access to PDF File",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        544,
        256
      ],
      "parameters": {
        "url": "=https://www.googleapis.com/drive/v3/files/{{ $('Upload PDF File').item.json.id }}/permissions/anyoneWithLink",
        "method": "DELETE",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleDriveOAuth2Api"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IjoB5flCkLlcfjdH",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5ca86907-f3f4-473f-ad9c-a172f7e17079",
      "name": "Extract Full E-Mail Thread - Completed Doc URL",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -640,
        816
      ],
      "webhookId": "2569cc53-b873-438f-b4ae-060bee204b92",
      "parameters": {
        "simple": false,
        "options": {},
        "resource": "thread",
        "threadId": "={{ $json.threadId }}",
        "operation": "get"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "51mlyK2w5LA9QaKi",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "0236fb26-b121-4874-ace9-7976f82df4ba",
      "name": "Get Signwell Completed Doc URL + Data",
      "type": "n8n-nodes-base.code",
      "position": [
        -400,
        816
      ],
      "parameters": {
        "jsCode": "// Robust SignWell link extractor for a Gmail thread item\n\nconst msgs = $json.messages || ($json.payload ? [$json] : []);\nconst out = { decodedText: '', downloadLink: '', extractedFilename: '' };\n\n// helpers\nfunction b64urlDecode(s = '') {\n  s = s.replace(/-/g, '+').replace(/_/g, '/');\n  while (s.length % 4) s += '=';\n  return Buffer.from(s, 'base64').toString('utf8');\n}\nfunction qpDecode(s = '') {\n  // remove soft line breaks and decode =XX\n  return s.replace(/=\\r?\\n/g, '').replace(/=([A-Fa-f0-9]{2})/g, (_, h) => String.fromCharCode(parseInt(h, 16)));\n}\nfunction partText(part) {\n  if (!part?.body?.data) return '';\n  let s = b64urlDecode(part.body.data);\n  const isQP = (part.headers || []).some(h => /Content-Transfer-Encoding/i.test(h.name) && /quoted-printable/i.test(h.value));\n  if (isQP) s = qpDecode(s);\n  return s;\n}\nfunction findFirstLinkInParts(p) {\n  if (!p) return null;\n  // prefer text/plain, then text/html\n  if (/^text\\//i.test(p.mimeType)) {\n    const s = partText(p);\n    const m = s.match(/https:\\/\\/www\\.signwell\\.com\\/app\\/signed\\/[^\\s\"'()<>]+/i);\n    if (m) return m[0].replace(/[.)]+$/, ''); // strip trailing punctuation\n  }\n  for (const child of (p.parts || [])) {\n    const found = findFirstLinkInParts(child);\n    if (found) return found;\n  }\n  return null;\n}\nfunction findPlainText(p) {\n  if (!p) return '';\n  if (p.mimeType === 'text/plain') return partText(p);\n  for (const child of (p.parts || [])) {\n    const s = findPlainText(child);\n    if (s) return s;\n  }\n  return '';\n}\n\n// process first message in thread\nfor (const m of msgs) {\n  // Subject can be top-level or in headers\n  const subject = m.Subject || m.subject ||\n    (m.payload?.headers || []).find(h => h.name === 'Subject')?.value || '';\n  const nameMatch = subject.match(/\\(([^)]+)\\)/);\n  if (nameMatch) out.extractedFilename = nameMatch[1].replace(/\\.pdf$/i, '');\n\n  out.downloadLink = findFirstLinkInParts(m.payload) || '';\n  out.decodedText = findPlainText(m.payload) || '';\n  break;\n}\n\nreturn [{ json: out }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1b0a1605-2c44-4bcf-b728-643be7d8655c",
      "name": "Download Completed Doc from Signwell",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -144,
        816
      ],
      "parameters": {
        "url": "={{ $json.downloadLink }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "finalExecutedDocGDrive"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d8a87424-131d-4eb1-b385-0b1ec209ef6d",
      "name": "Upload Completed Doc",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        96,
        928
      ],
      "parameters": {
        "name": "={{ $node['Get Signwell Completed Doc URL + Data'].json['extractedFilename'] }}_SIGNED.pdf",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1hRcXphNp4YPFaBzJOj86w2im4Pv5jH4H",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1hRcXphNp4YPFaBzJOj86w2im4Pv5jH4H",
          "cachedResultName": "Services Agreements - Final Versions"
        },
        "inputDataFieldName": "finalExecutedDocGDrive"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IjoB5flCkLlcfjdH",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "250db16b-8cf8-438c-b2ca-cf2e53a5a136",
      "name": "Check Email for Completed Notification",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -896,
        816
      ],
      "parameters": {
        "filters": {
          "q": "from:signwelldocs@signwell.com \"document completed (digital services agreement\" ",
          "labelIds": [
            "Label_572888736126663916"
          ]
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "51mlyK2w5LA9QaKi",
          "name": "Gmail account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4daba244-542c-41c4-85ee-0c76cb12c4ea",
      "name": "Get Relevant Agreement Record2",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        320,
        928
      ],
      "parameters": {
        "limit": 1,
        "filters": {
          "conditions": [
            {
              "keyName": "documentFileName",
              "keyValue": "={{ $('Download Completed Doc from Signwell').item.json.extractedFilename }}"
            }
          ]
        },
        "operation": "get",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "7q3kikjopVGUGQgQ",
          "cachedResultUrl": "/projects/7FLBLfPJX4Uw0i6f/datatables/7q3kikjopVGUGQgQ",
          "cachedResultName": "Services Agreements"
        }
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "975619f1-0546-44b5-827e-81871649b273",
      "name": "Update Row - Completed Doc Details",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        544,
        1024
      ],
      "parameters": {
        "columns": {
          "value": {
            "docSigned": "Yes",
            "finalExecutedDocGDrive": "={{ $('Upload Completed Doc').item.json.webContentLink }}",
            "finalExecutedDocSignwellUrl": "={{ $('Download Completed Doc from Signwell').item.json.downloadLink }}"
          },
          "schema": [
            {
              "id": "documentFileName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "documentFileName",
              "defaultMatch": false
            },
            {
              "id": "clientEmail",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientEmail",
              "defaultMatch": false
            },
            {
              "id": "clientFullName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientFullName",
              "defaultMatch": false
            },
            {
              "id": "clientNamePosition",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientNamePosition",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyName",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyName",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyAddress",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyAddress",
              "defaultMatch": false
            },
            {
              "id": "documentUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "documentUrl",
              "defaultMatch": false
            },
            {
              "id": "approvalStatus",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "approvalStatus",
              "defaultMatch": false
            },
            {
              "id": "sentDocumentPdfUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "sentDocumentPdfUrl",
              "defaultMatch": false
            },
            {
              "id": "sentDate",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "sentDate",
              "defaultMatch": false
            },
            {
              "id": "signwellUrl",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "signwellUrl",
              "defaultMatch": false
            },
            {
              "id": "docSigned",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "docSigned",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocGDrive",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocGDrive",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocSignwellUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocSignwellUrl",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "options": {},
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "7q3kikjopVGUGQgQ",
          "cachedResultUrl": "/projects/7FLBLfPJX4Uw0i6f/datatables/7q3kikjopVGUGQgQ",
          "cachedResultName": "Services Agreements"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c3005f01-30b9-4f42-943b-b8371ae9adf7",
      "name": "Remove Completed Doc from Signwell",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        784,
        1024
      ],
      "parameters": {
        "url": "=https://www.signwell.com/api/v1/documents/{{ $json.signwellDocID }}",
        "method": "DELETE",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Api-Key",
              "value": "YOUR_SIGNWELL_API_KEY"
            },
            {
              "name": "accept",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "1bdc96ce-bc11-41cb-9525-c9f1abc5ef80",
      "name": "Haftnotiz",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -992,
        -464
      ],
      "parameters": {
        "color": 5,
        "width": 1392,
        "height": 432,
        "content": "## Get Client Form Inputs > Create + Send Agreement Draft (Internally)"
      },
      "typeVersion": 1
    },
    {
      "id": "5dab0894-c4e7-41cd-9404-de4051b5259c",
      "name": "Haftnotiz1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -992,
        0
      ],
      "parameters": {
        "color": 2,
        "width": 1808,
        "height": 656,
        "content": "## Get Internal Approval  >  Create Signwell Doc  >  Send Agreement to Client "
      },
      "typeVersion": 1
    },
    {
      "id": "06ab07cd-6660-44aa-ac46-f4c15cf37cfc",
      "name": "Haftnotiz2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -992,
        688
      ],
      "parameters": {
        "color": 4,
        "width": 2080,
        "height": 544,
        "content": "## Get Completed Signwell Doc Notification > Download & Store Completed Agreement > Share With Client"
      },
      "typeVersion": 1
    },
    {
      "id": "7ca36348-ef27-44b4-96f0-64bc12f08172",
      "name": "Zusammenführen Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        544,
        832
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.1
    },
    {
      "id": "0fdb0538-ab98-41bf-9d7e-226f16d62a93",
      "name": "Send Client Completed Agreement PDF",
      "type": "n8n-nodes-base.gmail",
      "position": [
        784,
        832
      ],
      "webhookId": "d39932e5-037b-499f-a277-d77e42d52045",
      "parameters": {
        "sendTo": "={{ $json.clientEmail }}",
        "message": "=Hi {{ (() => {\n  const raw = ($json.clientFullName?.name ?? $json.clientFullName ?? '').toString();\n  const first = raw.trim().replace(/\\s+/g, ' ').split(' ')[0] || '';\n  return first; // \"John\" or \"John-Boy\"\n})() }},\n<br><br>\nPlease find attached the fully signed agreement.\n<br><br>\nThanks,\n<br>\nYOUR NAME",
        "options": {
          "senderName": "YOUR NAME OR COMPANY NAME",
          "attachmentsUi": {
            "attachmentsBinary": [
              {
                "property": "finalExecutedDocGDrive"
              }
            ]
          },
          "appendAttribution": false
        },
        "subject": "=Signed Agreement Copy ({{ $json.documentFileName }})\n"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "51mlyK2w5LA9QaKi",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "2084e233-a3a2-4fcb-b55b-a4a4757ce165",
      "name": "Insert New Row",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        144,
        -384
      ],
      "parameters": {
        "columns": {
          "value": {
            "clientEmail": "={{ $('Edit Fields').item.json.clientEmail }}",
            "documentUrl": "={{ $json.documentUrl }}",
            "clientFullName": "={{ $('Edit Fields').item.json.clientFullName }}",
            "documentFileName": "={{ $('Copy and Rename File').item.json.name }}",
            "clientCompanyName": "={{ $('Edit Fields').item.json.clientCompanyName }}",
            "clientNamePosition": "={{ $('Edit Fields').item.json.ClientNamePosition }}",
            "clientCompanyAddress": "={{ $('Edit Fields').item.json.clientCompanyAddress }}"
          },
          "schema": [
            {
              "id": "documentFileName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "documentFileName",
              "defaultMatch": false
            },
            {
              "id": "clientEmail",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "clientEmail",
              "defaultMatch": false
            },
            {
              "id": "clientFullName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "clientFullName",
              "defaultMatch": false
            },
            {
              "id": "clientNamePosition",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "clientNamePosition",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyName",
              "defaultMatch": false
            },
            {
              "id": "clientCompanyAddress",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "clientCompanyAddress",
              "defaultMatch": false
            },
            {
              "id": "documentUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "documentUrl",
              "defaultMatch": false
            },
            {
              "id": "approvalStatus",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "approvalStatus",
              "defaultMatch": false
            },
            {
              "id": "sentDocumentPdfUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "sentDocumentPdfUrl",
              "defaultMatch": false
            },
            {
              "id": "sentDate",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "sentDate",
              "defaultMatch": false
            },
            {
              "id": "signwellUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "signwellUrl",
              "defaultMatch": false
            },
            {
              "id": "docSigned",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "docSigned",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocGDrive",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocGDrive",
              "defaultMatch": false
            },
            {
              "id": "finalExecutedDocSignwellUrl",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "finalExecutedDocSignwellUrl",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "7q3kikjopVGUGQgQ",
          "cachedResultUrl": "/projects/7FLBLfPJX4Uw0i6f/datatables/7q3kikjopVGUGQgQ",
          "cachedResultName": "Services Agreements"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "30a27a9e-2c98-4b70-b320-9c260cad1a76",
      "name": "Haftnotiz7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2032,
        -976
      ],
      "parameters": {
        "color": 7,
        "width": 1008,
        "height": 2032,
        "content": "# **Agreement Composer and E-Signature Automation**\n  *Client Form → Draft → Approve → Sign → Deliver, fully automated*\n\n  This workflow automates the entire agreement lifecycle from client form submission to signed document delivery. It generates personalized agreements from templates, manages internal approvals, orchestrates e-signatures via Signwell, and delivers fully executed documents with complete audit trails in n8n Data Tables.\n\n  ### Good to know\n  - Handles client data collection via JotForm with custom field mapping\n  - Automatically populates Google Doc templates with client-specific details\n  - Internal approval workflow with email-based confirmation\n  - Signwell integration for embedded e-signatures - **test mode enabled by default** - disable for legally binding documents\n  - Complete lifecycle tracking in n8n Data Tables (draft → approval → sent → signed)\n  - Auto-cleanup: removes documents from Signwell after completion to save storage\n\n  ## Who's it for\n  Service businesses, consultants, agencies, and freelancers who send agreements to clients regularly. Perfect for anyone wanting to avoid other costly e-signature platforms with limited API and automation capabilities. [Signwell has an affordable entry level tier](https://www.signwell.com/pricing/) with generous API limits. If you're looking to eliminate manual document preparation, have an approval workflow, and track signatures while maintaining professional client communication, then this solution is a good fit.\n\n## How it works\n### Phase 1: Draft Creation\n  1. JotForm trigger captures client submission (company name, address, contact details, position)\n  2. Standardizes form data and duplicates Google Doc template with custom filename\n  3. Replaces template variables with client information (company name, address, full name, position, dates)\n  4. Creates clean document URL and logs initial record to Data Tables\n  5. Emails internal team with draft review link and client details\n### Phase 2: Approval & Preparation\n  1. Gmail monitors inbox for \"Approved\" reply email\n  2. Fetches agreement record from Data Tables and marks as approved\n  3. Downloads Google Doc as PDF and uploads to Drive folder\n  4. Grants temporary public sharing access (required for Signwell file import)\n  5. Creates Signwell document with embedded signature fields and signing URL\n  6. Emails client with personalized signing link\n  7. Revokes public sharing access for security and updates Data Tables with Signwell details\n### Phase 3: Signature & Delivery\n  1. Gmail monitors for Signwell completion notification\n  2. Extracts signed document download link from notification email\n  3. Downloads fully executed PDF from Signwell\n  4. Uploads to \"Final Versions\" folder in Google Drive\n  5. Updates Data Tables with completion status and final document URLs\n  6. Sends confirmation email to client with signed PDF attached\n  7. Deletes document from Signwell to free up storage\n\n  ## Requirements\n  - JotForm account (free tier works)\n  - Gmail account with OAuth2 access\n  - Google Drive account (OAuth2)\n  - Google Docs account (OAuth2) with a draft Agreement template\n  - Signwell account with API key\n  - n8n Data Tables (built-in, no external service needed)\n  - Google Drive folders: \"Services Agreements - Drafts\" and \"Services Agreements - Final Versions\"\n\n  ## How to set up\n  1. **Add credentials**: JotForm API, Gmail OAuth2, Google Drive OAuth2, Google Docs OAuth2, Signwell API key\n  2. **Create JotForm**: Build form with fields: Company Name, Company Address (address field), Full Name (name field), Your Position/Job    \n   Title, Email\n  3. In \"JotForm Trigger\" node: select your form\n  4. **Create Google Doc template**: Add variables `{{clientCompanyName}}`, `{{clientFullName}}`, `{{clientNamePosition}}`,\n  `{{clientCompanyAddress}}`, `{{agreementDate1}}`, `{{agreementDate2}}`\n  5. In \"Copy and Rename File\" node: select your template document and update folder ID to your \"Drafts\" folder\n  6. **Create Data Table**: Name it \"Services Agreements\" with columns: documentFileName, clientEmail, clientFullName,\n  clientNamePosition, clientCompanyName, clientCompanyAddress, documentUrl, approvalStatus, sentDocumentPdfUrl, sentDate, signwellUrl,       \n  signwellDocID, docSigned, finalExecutedDocGDrive, finalExecutedDocSignwellUrl\n  7. In \"Insert Row\" and all \"Get/Update Row\" nodes: select your Data Table\n  8. **Create Gmail labels**: \"_AGREEMENTS\" with 2 nested (sublabels) Agreement-Approvals\" and \"Agreement-Completed\" for filtering\n  9. In \"Check for Email Approval\" node: select your approval label and update internal email address\n  10. In \"Check Email for Completed Notification\" node: select your completed label\n  11. In \"Create Document in Signwell\" node: update API key and adjust signature field coordinates for your document\n  12. **Set Signwell to live mode**: Change `\"test_mode\": true` to `\"test_mode\": false` when ready for production\n  13. Activate workflow\n\n  ## Customizing this workflow\n  - **Change template variables**: Edit \"Update New File\" node to add/remove fields (e.g., pricing, terms, scope of work)\n  - **Modify approval email**: Edit \"Share Email Draft\" node to change recipient, subject line, or message format\n  - **Adjust Signwell fields**: Edit \"Create Document in Signwell\" node to change signature/date field positions (x, y coordinates) to match your agreement template, and add any other fields you'd like\n  - **Add approval deadline**: Add Wait node with timeout after \"Share Email Draft\" to auto-remind for pending approvals\n  - **Multi-signer support**: Modify \"Create Document in Signwell\" recipients array to add multiple signers (e.g., both parties)\n  - **Change storage folders**: Update folder IDs in \"Upload PDF File\" and \"Upload Completed Doc\" nodes\n  - **Add Slack notifications**: Add Slack nodes after key milestones (draft created, approved, signed)\n  - **Custom client messaging**: Edit \"Send Prepared Agreement to Client\" and \"Send Client Completed Agreement PDF\" nodes for personalized communication\n  - **Add reminder logic**: Insert Wait + Send Email nodes between signing and completion to remind client if not signed within X days"
      },
      "typeVersion": 1
    },
    {
      "id": "3a637b50-3438-4a8a-994e-d9223a1c8d75",
      "name": "Haftnotiz8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -992,
        -976
      ],
      "parameters": {
        "color": 7,
        "width": 896,
        "height": 480,
        "content": "## Quick Troubleshooting\n  * **JotForm not triggering**: Verify webhook is active in JotForm settings and form ID matches \"JotForm Trigger\" node\n  * **Template variables not replacing**: Check variable names in template doc exactly match `{{variableName}}` format (case-sensitive)      \n  * **Wrong internal email for approval**: Update email address in \"Share Email Draft\" node to your own email\n  * **Approval email not detected**: Confirm Gmail label \"Agreement-Approvals\" exists and reply contains exact word \"Approved\"\n  * **Signwell document creation fails**: Verify PDF has public sharing enabled before API call AND Signwell API key is valid in \"Create Document in Signwell\" node\n  * **Signature fields in wrong position**: Adjust x/y coordinates in \"Create Document in Signwell\" node (test in Signwell UI first to find correct pixel positions)\n  * **Completed document not downloading**: Check Signwell completion email format - Code node extracts link via regex pattern\n  * **Data Tables errors**: Ensure documentFileName exactly matches between \"Insert Row\" and \"Get/Update Row\" operations\n  * **Client emails not sending**: Re-authorize Gmail OAuth2 credentials and verify sender name/address in Gmail nodes\n  * **Drive folder not found**: Update folder IDs in \"Copy and Rename File\", \"Upload PDF File\", and \"Upload Completed Doc\" nodes to your own folder IDs\n  * **Signwell deletion fails**: Verify signwellDocID was correctly stored in Data Tables before deletion (check \"Update Row - Additional Doc Details\" output)\n  * **401/403 API errors**: Re-authorize all OAuth2 credentials (Gmail, Google Drive, Google Docs)\n  * **Test mode documents**: Change `\"test_mode\": true` to `\"test_mode\": false` in \"Create Document in Signwell\" node for production signatures"
      },
      "typeVersion": 1
    },
    {
      "id": "81473db5-2e22-46cf-8916-50272872e083",
      "name": "Haftnotiz5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -1200
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 704,
        "content": "## Sample Outputs\n- Agreement Drafts and Final folders/files in Google Drive\n\n![](https://i.postimg.cc/Jz6kpcxG/Screenshot-2025-10-20-115200.png)\n\n![](https://i.postimg.cc/T3D6sTJ6/Screenshot-2025-10-20-115457.png)\n\n### File References\n- [Agreement Template (sample)](https://docs.google.com/document/d/1Nz2sAkDiIxMylzec7vNqOwjP2RRIeV8VOip4UWh2JD8/edit?usp=sharing)\n- [Final Agreement Signed (sample)](https://drive.google.com/file/d/1zV4iQ1SDiofNQ9fNXWSABa7-ki0Txhvz/view?usp=sharing)\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "786fdb22-129f-423a-b7fb-8f54bf4f95c2",
  "connections": {
    "Merge Data": {
      "main": [
        [
          {
            "node": "0fdb0538-ab98-41bf-9d7e-226f16d62a93",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "300eec85-1d70-486a-b596-5f9e38f6f6b4": {
      "main": [
        [
          {
            "node": "65107954-9e06-47dd-9199-e4c34182f36a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2084e233-a3a2-4fcb-b55b-a4a4757ce165": {
      "main": [
        []
      ]
    },
    "ebc8134f-42d0-41cf-99de-61df1a74a558": {
      "main": [
        [
          {
            "node": "300eec85-1d70-486a-b596-5f9e38f6f6b4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "731dc0a8-e40d-4ccb-baf4-8aa14cb6e543": {
      "main": [
        [
          {
            "node": "d8d29e44-2dd1-4f58-9c6f-56aafb3d02b0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ab82861a-b78b-44f2-8c91-77418777f4c2": {
      "main": [
        [
          {
            "node": "b926ab5b-99ba-4400-9726-ca7ccc8bd9ef",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d8d29e44-2dd1-4f58-9c6f-56aafb3d02b0": {
      "main": [
        [
          {
            "node": "Share Email Draft",
            "type": "main",
            "index": 0
          },
          {
            "node": "2084e233-a3a2-4fcb-b55b-a4a4757ce165",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Share Email Draft": {
      "main": [
        []
      ]
    },
    "65107954-9e06-47dd-9199-e4c34182f36a": {
      "main": [
        [
          {
            "node": "731dc0a8-e40d-4ccb-baf4-8aa14cb6e543",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download File as PDF": {
      "main": [
        [
          {
            "node": "ab82861a-b78b-44f2-8c91-77418777f4c2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d8a87424-131d-4eb1-b385-0b1ec209ef6d": {
      "main": [
        [
          {
            "node": "4daba244-542c-41c4-85ee-0c76cb12c4ea",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for Email Approval": {
      "main": [
        [
          {
            "node": "13d43194-f2a6-466e-a587-97f3752f0bed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13e7027a-a84d-4619-8e25-4cbdd87d1fd0": {
      "main": [
        [
          {
            "node": "776c7399-727c-4a96-a09b-748ebf486364",
            "type": "main",
            "index": 0
          },
          {
            "node": "26ceb85f-ea7d-4b06-9739-5295f2ebdb70",
            "type": "main",
            "index": 0
          },
          {
            "node": "e3d74ab8-44ef-4dd2-ade0-dbe942af78d3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a390b505-acee-4f18-9919-9bf512d3afd9": {
      "main": [
        []
      ]
    },
    "13d43194-f2a6-466e-a587-97f3752f0bed": {
      "main": [
        [
          {
            "node": "a390b505-acee-4f18-9919-9bf512d3afd9",
            "type": "main",
            "index": 0
          },
          {
            "node": "Download File as PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4daba244-542c-41c4-85ee-0c76cb12c4ea": {
      "main": [
        [
          {
            "node": "975619f1-0546-44b5-827e-81871649b273",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "b926ab5b-99ba-4400-9726-ca7ccc8bd9ef": {
      "main": [
        [
          {
            "node": "13e7027a-a84d-4619-8e25-4cbdd87d1fd0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "26ceb85f-ea7d-4b06-9739-5295f2ebdb70": {
      "main": [
        []
      ]
    },
    "776c7399-727c-4a96-a09b-748ebf486364": {
      "main": [
        []
      ]
    },
    "975619f1-0546-44b5-827e-81871649b273": {
      "main": [
        [
          {
            "node": "c3005f01-30b9-4f42-943b-b8371ae9adf7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1b0a1605-2c44-4bcf-b728-643be7d8655c": {
      "main": [
        [
          {
            "node": "d8a87424-131d-4eb1-b385-0b1ec209ef6d",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0236fb26-b121-4874-ace9-7976f82df4ba": {
      "main": [
        [
          {
            "node": "1b0a1605-2c44-4bcf-b728-643be7d8655c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "250db16b-8cf8-438c-b2ca-cf2e53a5a136": {
      "main": [
        [
          {
            "node": "Extract Full Email Thread - Completed Doc URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Full Email Thread - Completed Doc URL": {
      "main": [
        [
          {
            "node": "0236fb26-b121-4874-ace9-7976f82df4ba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Experte - Dokumentenextraktion

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Experte
Anzahl der Nodes33
Kategorie1
Node-Typen11
Schwierigkeitsbeschreibung

Für fortgeschrittene Benutzer, komplexe Workflows mit 16+ Nodes

Autor
Dean Pike

Dean Pike

@deanjp

Saving 20+ hours weekly for growing companies by putting their client-facing and back-office operations on autopilot. As the Founder of TidyCurve, we build AI agents and workflow automations that replace critical repetitive work: from lead generation and customer support, to marketing, recruitment, and onboarding. We deploy scalable solutions in 4-8 weeks at a fraction of enterprise costs - backed by a 60-day 3x ROI guarantee.

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34