Automatisation de la rédaction de contrats et de la signature électronique

Avancé

Ceci est unDocument Extractionworkflow d'automatisation du domainecontenant 33 nœuds.Utilise principalement des nœuds comme Set, Code, Gmail, Merge, DataTable. Automatisation du cycle de vie complet du contrat : JotForm, approbation, signature électronique et suivi avec Signwell

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Informations d'identification Google Drive API
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "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": "Déclencheur JotForm",
      "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": "Obtenir l'URL du document nettoyé",
      "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": "Partager le brouillon par e-mail",
      "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": "Modifier les champs",
      "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": "Copier et renommer le fichier",
      "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": "Mettre à jour le nouveau fichier",
      "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": "Obtenir l'enregistrement d'accord pertinent",
      "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": "Vérifier l'approbation par e-mail",
      "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": "Télécharger le fichier en 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": "Téléverser le fichier PDF",
      "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": "Créer un document dans 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": "Envoyer l'accord préparé au 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": "Mettre à jour la ligne - Statut d'approbation",
      "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": "Mettre à jour la ligne - Détails du document supplémentaire",
      "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": "Accorder l'accès de partage au fichier PDF",
      "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": "Retirer l'accès de partage au fichier PDF",
      "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": "Extraire le fil de discussion complet - URL du document finalisé",
      "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": "Obtenir l'URL du document finalisé Signwell + données",
      "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": "Télécharger le document finalisé depuis 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": "Téléverser le document finalisé",
      "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": "Vérifier l'e-mail pour la notification d'achèvement",
      "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": "Obtenir l'enregistrement d'accord pertinent2",
      "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": "Mettre à jour la ligne - Détails du document finalisé",
      "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": "Supprimer le document finalisé de 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": "Note adhésive",
      "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": "Note adhésive1",
      "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": "Note adhésive2",
      "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": "Fusionner les données",
      "type": "n8n-nodes-base.merge",
      "position": [
        544,
        832
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.1
    },
    {
      "id": "0fdb0538-ab98-41bf-9d7e-226f16d62a93",
      "name": "Envoyer l'accord finalisé au client en 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": "Insérer une nouvelle ligne",
      "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": "Note adhésive7",
      "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": "Note adhésive8",
      "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": "Note adhésive5",
      "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": {
    "7ca36348-ef27-44b4-96f0-64bc12f08172": {
      "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": "58107ec8-d271-446e-9265-af7597678714",
            "type": "main",
            "index": 0
          },
          {
            "node": "2084e233-a3a2-4fcb-b55b-a4a4757ce165",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "58107ec8-d271-446e-9265-af7597678714": {
      "main": [
        []
      ]
    },
    "65107954-9e06-47dd-9199-e4c34182f36a": {
      "main": [
        [
          {
            "node": "731dc0a8-e40d-4ccb-baf4-8aa14cb6e543",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2fa4037a-3f10-48db-ba88-9da006d0ecf6": {
      "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
          }
        ]
      ]
    },
    "c4fbf446-5a2e-4ece-80e3-af4ee341a23a": {
      "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": "2fa4037a-3f10-48db-ba88-9da006d0ecf6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4daba244-542c-41c4-85ee-0c76cb12c4ea": {
      "main": [
        [
          {
            "node": "975619f1-0546-44b5-827e-81871649b273",
            "type": "main",
            "index": 0
          },
          {
            "node": "7ca36348-ef27-44b4-96f0-64bc12f08172",
            "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": "7ca36348-ef27-44b4-96f0-64bc12f08172",
            "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": "5ca86907-f3f4-473f-ad9c-a172f7e17079",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5ca86907-f3f4-473f-ad9c-a172f7e17079": {
      "main": [
        [
          {
            "node": "0236fb26-b121-4874-ace9-7976f82df4ba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Extraction de documents

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds33
Catégorie1
Types de nœuds11
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
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.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34