This workflow follows the Google Drive → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Hectelion | NDA",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "tally-nda-exe-fr",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
288,
-96
],
"id": "54311a10-6700-43eb-9990-12f639bd9f71",
"name": "Webhook | NDA - FR"
},
{
"parameters": {
"httpMethod": "POST",
"path": "tally-nda-exe-en",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
288,
288
],
"id": "ef1b9258-3c05-4f92-83c9-17c0c1c0d70d",
"name": "Webhook | NDA - EN"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "624cc48b-805f-4d0a-bae8-afb8feec9c24",
"name": "lang",
"value": "FR",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
704,
-96
],
"id": "80b7c40d-6926-4cb8-ba0c-7c4ad69d8a37",
"name": "Set | Lang = FR"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f18e75f9-6441-4c09-b745-a23942e2ad42",
"name": "lang",
"value": "EN",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
736,
288
],
"id": "69792d5a-88d6-45e6-8b73-14205858f898",
"name": "Set | Lang = EN"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1374477926,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1374477926"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2304,
-80
],
"id": "8422bd69-1cbb-4510-ad18-9b42729088e7",
"name": "Google Sheet | Tally - Hectelion - NDA - FR"
},
{
"parameters": {
"jsCode": "const placeholders = {};\n\nfor (const item of items) {\n const key = item.json[\"Key\"];\n const value = item.json[\"value clean\"];\n\n if (key && value !== undefined && value !== null && value !== \"\") {\n placeholders[key] = value; // ex: \"{{PROJECT_NAME}}\": \"ede\"\n }\n}\n\n// Aliases sans accolades (robustes pour n8n)\nplaceholders.COMPANY_NAME = placeholders[\"{{COMPANY_NAME}}\"] || \"\";\nplaceholders.ISSUER_FIRST_NAME = placeholders[\"{{ISSUER_FIRST_NAME}}\"] || \"\";\nplaceholders.ISSUER_LAST_NAME = placeholders[\"{{ISSUER_LAST_NAME}}\"] || \"\";\nplaceholders.FUNCTION = placeholders[\"{{FUNCTION}}\"] || \"\";\nplaceholders.STREET_NAME = placeholders[\"{{STREET_NAME}}\"] || \"\";\nplaceholders.STREET_NUMBER = placeholders[\"{{STREET_NUMBER}}\"] || \"\";\nplaceholders.POST_CODE = placeholders[\"{{POST_CODE}}\"] || \"\";\nplaceholders.CITY = placeholders[\"{{CITY}}\"] || \"\";\nplaceholders.COUNTRY = placeholders[\"{{COUNTRY}}\"] || \"\";\nplaceholders.EMAIL = placeholders[\"{{EMAIL}}\"] || \"\";\nplaceholders.PHONE_NUMBER = placeholders[\"{{PHONE_NUMBER}}\"] || \"\";\nplaceholders.CONFIDENTIALITY_TERM_YEARS = placeholders[\"{{CONFIDENTIALITY_TERM_YEARS}}\"] || \"\";\nplaceholders.GOVERNING_LAW = placeholders[\"{{GOVERNING_LAW}}\"] || \"\";\nplaceholders.JURISDICTION_COUNTRY = placeholders[\"{{JURISDICTION_COUNTRY}}\"] || \"\";\n\n// Ceux-l\u00e0, tu les utilises d\u00e9j\u00e0 pour renommer (on les garde)\nplaceholders.PROJECT_NAME = placeholders[\"{{PROJECT_NAME}}\"] || \"\";\nplaceholders.TODAY = placeholders[\"{{TODAY}}\"] || \"\";\n\nreturn [{ json: placeholders }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3216,
-96
],
"id": "79baa984-5b86-4d8b-ace1-1f5f6897bef8",
"name": "Prepare NDA placeholders"
},
{
"parameters": {
"operation": "copy",
"fileId": {
"__rl": true,
"value": "{{FR_DOC_TEMPLATE_ID}}",
"mode": "list",
"cachedResultName": "TEMPLATE - NDA - Mandat de vente - IA - Hectelion - FR - V1",
"cachedResultUrl": "https://docs.google.com/document/d/{{FR_DOC_TEMPLATE_ID}}/edit?usp=drivesdk"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3424,
-96
],
"id": "3d1916b4-77a2-4f9d-a88b-8e07af827fd0",
"name": "Copier le template"
},
{
"parameters": {
"operation": "update",
"fileId": {
"__rl": true,
"value": "={{ $json.id }}",
"mode": "id"
},
"newUpdatedFileName": "={{\"Projet \" + $node[\"Prepare NDA placeholders\"].json.PROJECT_NAME + \" - NDA - \" + $node[\"Prepare NDA placeholders\"].json.TODAY}}",
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3632,
-96
],
"id": "dcb87bf1-fe02-443e-b454-57c1ac1a7056",
"name": "Update file"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1374477926,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1374477926"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
3840,
-96
],
"id": "542ffe84-2e23-4c0a-9d01-6cfb1816b580",
"name": "Load NDA metadata \u2013 FR"
},
{
"parameters": {
"jsCode": "const requests = [];\n\nfor (const item of items) {\n const key = item.json[\"Key\"]; // ex: {{COMPANY_NAME}}\n const val = item.json[\"value clean\"]; // ex: wedewd\n\n // Ne pas remplacer si vide\n if (!key) continue;\n\n requests.push({\n replaceAllText: {\n containsText: {\n text: key,\n matchCase: true\n },\n replaceText: val ?? \"\"\n }\n });\n}\n\nreturn [{ json: { requests } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4048,
-96
],
"id": "a1e9ebe7-2638-4f86-b86a-f0ba8bde4bac",
"name": "Prepare Google Docs replace requests"
},
{
"parameters": {
"method": "POST",
"url": "={{\"https://docs.googleapis.com/v1/documents/\" + $node[\"Copier le template\"].json.id + \":batchUpdate\"}}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleDocsOAuth2Api",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { \"requests\": $json.requests } }}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4256,
-96
],
"id": "18c082d2-b8ee-4005-8972-1b3a0fe97c7e",
"name": "Apply placeholders to NDA (Google Docs)"
},
{
"parameters": {
"toRecipients": "={{ $('Set | submissionID_FR').first().json.email }}",
"subject": "={{ \"Projet \" + $node[\"Set | submissionID_FR\"].json.project + \" - NDA - \" + $node[\"Set | submissionID_FR\"].json.company + \" - \" + new Date().toISOString().slice(0,10) }}",
"bodyContent": "=Bonjour,\n\nHectelion vous remercie pour votre int\u00e9r\u00eat et votre confiance.\n\nVeuillez trouver en pi\u00e8ce jointe la clause de confidentialit\u00e9 (NDA) relative \u00e0 v\u00f4tre projet, g\u00e9n\u00e9r\u00e9e sur la base des informations que vous avez communiqu\u00e9es.\n\nCe document a pour objectif de poser un cadre de confidentialit\u00e9 pr\u00e9alable aux \u00e9changes d\u2019informations dans le contexte de l\u2019op\u00e9ration envisag\u00e9e, selon des standards usuels de march\u00e9 et une approche automatis\u00e9e.\n\nIl s\u2019agit d\u2019un projet indicatif, susceptible de n\u00e9cessiter des ajustements en fonction des sp\u00e9cificit\u00e9s de l\u2019op\u00e9ration, des parties concern\u00e9es et de la juridiction applicable. Nous vous recommandons, le cas \u00e9ch\u00e9ant, de le faire relire et valider par votre conseil habituel avant signature.\n\nSi vous souhaitez aller plus loin, affiner certains points ou envisager un accompagnement plus approfondi dans le cadre de l\u2019op\u00e9ration (cession, lev\u00e9e de fonds, structuration, n\u00e9gociation), nous serions ravis d\u2019en discuter avec vous.\n\nNous restons \u00e0 votre enti\u00e8re disposition pour tout compl\u00e9ment d\u2019information.\n\nBien cordialement,\n\n{{SENDER_NAME}}\n{{SENDER_TITLE}}\n\nM : {{SENDER_PHONE}}\nE-mail : {{SENDER_EMAIL}}\nSite web : {{SENDER_WEBSITE}}\n{{SENDER_ADDRESS}}",
"additionalFields": {
"attachments": {
"attachments": [
{
"binaryPropertyName": "=data"
}
]
}
}
},
"type": "n8n-nodes-base.microsoftOutlook",
"typeVersion": 2,
"position": [
4880,
-96
],
"id": "d1002796-6edd-4ec5-9e4f-e325317dc09f",
"name": "Send NDA by email (Outlook)"
},
{
"parameters": {
"jsCode": "// Node plac\u00e9 juste apr\u00e8s \"HTTP Request\u201d (export DOCX) - FR\n// Objectif : renommer le fichier DOCX g\u00e9n\u00e9r\u00e9 avant envoi Outlook\n\nfunction safe(s) {\n return String(s ?? '').trim();\n}\n\n// Toujours lire la source canonique\nconst fr = $node[\"Set | submissionID_FR\"].json;\n\nconst project = safe(fr.project) || \"Projet\";\nconst today = new Date().toISOString().slice(0, 10);\n\n// Nom final souhait\u00e9 (FR)\nconst filename = `NDA - Projet ${project} - ${today}.docx`;\n\nreturn $input.all().map(item => {\n\n if (!item.binary || !item.binary.data) {\n throw new Error(\n 'Binaire introuvable. V\u00e9rifie que \"HTTP Request\u201d (export DOCX)\" sort bien le fichier dans binary.data.'\n );\n }\n\n item.binary.data.fileName = filename;\n item.binary.data.mimeType =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n\n return item;\n});\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4672,
-96
],
"id": "d1983f7c-d207-432d-99ac-45c8ce3a0194",
"name": "Code in JavaScript"
},
{
"parameters": {
"url": "={{\"https://www.googleapis.com/drive/v3/files/\" + $node[\"Copier le template\"].json.id + \"/export?mimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document\"}}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleDriveOAuth2Api",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4464,
-96
],
"id": "8981cec2-2582-415a-89df-a5c9fdd49659",
"name": "HTTP Request\u201d (export DOCX)"
},
{
"parameters": {
"operation": "move",
"fileId": {
"__rl": true,
"value": "={{$node[\"Copier le template\"].json.id}}",
"mode": "id"
},
"driveId": {
"__rl": true,
"value": "My Drive",
"mode": "list",
"cachedResultName": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive"
},
"folderId": {
"__rl": true,
"value": "{{DRIVE_ARCHIVE_FOLDER_ID}}",
"mode": "list",
"cachedResultName": "Formulaire | IA - NDA",
"cachedResultUrl": "https://drive.google.com/drive/folders/{{DRIVE_ARCHIVE_FOLDER_ID}}"
}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
5088,
-96
],
"id": "eb523494-2ff0-4c45-bdaf-76ce8c1b91ad",
"name": "Move file"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 835167854,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=835167854"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2304,
304
],
"id": "459f9f7e-2f5a-4530-bd1f-7a8fdddc48d0",
"name": "Google Sheet | Tally - Hectelion - NDA - EN"
},
{
"parameters": {
"jsCode": "const placeholders = {};\n\nfor (const item of items) {\n const key = item.json[\"Key\"];\n const value = item.json[\"value clean\"];\n\n if (key && value !== undefined && value !== null && value !== \"\") {\n placeholders[key] = value; // ex: \"{{PROJECT_NAME}}\": \"ede\"\n }\n}\n\n// Aliases sans accolades (robustes pour n8n)\nplaceholders.COMPANY_NAME = placeholders[\"{{COMPANY_NAME}}\"] || \"\";\nplaceholders.ISSUER_FIRST_NAME = placeholders[\"{{ISSUER_FIRST_NAME}}\"] || \"\";\nplaceholders.ISSUER_LAST_NAME = placeholders[\"{{ISSUER_LAST_NAME}}\"] || \"\";\nplaceholders.FUNCTION = placeholders[\"{{FUNCTION}}\"] || \"\";\nplaceholders.STREET_NAME = placeholders[\"{{STREET_NAME}}\"] || \"\";\nplaceholders.STREET_NUMBER = placeholders[\"{{STREET_NUMBER}}\"] || \"\";\nplaceholders.POST_CODE = placeholders[\"{{POST_CODE}}\"] || \"\";\nplaceholders.CITY = placeholders[\"{{CITY}}\"] || \"\";\nplaceholders.COUNTRY = placeholders[\"{{COUNTRY}}\"] || \"\";\nplaceholders.EMAIL = placeholders[\"{{EMAIL}}\"] || \"\";\nplaceholders.PHONE_NUMBER = placeholders[\"{{PHONE_NUMBER}}\"] || \"\";\nplaceholders.CONFIDENTIALITY_TERM_YEARS = placeholders[\"{{CONFIDENTIALITY_TERM_YEARS}}\"] || \"\";\nplaceholders.GOVERNING_LAW = placeholders[\"{{GOVERNING_LAW}}\"] || \"\";\nplaceholders.JURISDICTION_COUNTRY = placeholders[\"{{JURISDICTION_COUNTRY}}\"] || \"\";\n\n// Ceux-l\u00e0, tu les utilises d\u00e9j\u00e0 pour renommer (on les garde)\nplaceholders.PROJECT_NAME = placeholders[\"{{PROJECT_NAME}}\"] || \"\";\nplaceholders.TODAY = placeholders[\"{{TODAY}}\"] || \"\";\n\nreturn [{ json: placeholders }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3232,
288
],
"id": "b2b6ebb0-8630-4bb6-9d2c-1efef9c662d1",
"name": "Prepare NDA placeholders - EN"
},
{
"parameters": {
"operation": "copy",
"fileId": {
"__rl": true,
"value": "{{EN_DOC_TEMPLATE_ID}}",
"mode": "list",
"cachedResultName": "TEMPLATE - NDA - Sell-side - IA - Hectelion - EN - V1",
"cachedResultUrl": "https://docs.google.com/document/d/{{EN_DOC_TEMPLATE_ID}}/edit?usp=drivesdk"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3440,
288
],
"id": "710bbe30-067f-49a2-ab25-f94e3e7798df",
"name": "Copier le template - EN"
},
{
"parameters": {
"operation": "update",
"fileId": {
"__rl": true,
"value": "={{ $json.id }}",
"mode": "id"
},
"newUpdatedFileName": "={{\"Projet \" + $node[\"Prepare NDA placeholders - EN\"].json.PROJECT_NAME + \" - NDA - \" + $node[\"Prepare NDA placeholders - EN\"].json.TODAY}}",
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3648,
288
],
"id": "a3d2c140-2921-4d46-b2f9-5f54684c6a84",
"name": "Update file - EN"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 835167854,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=835167854"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
3856,
288
],
"id": "9e9408ec-6e3f-4086-acc1-c69fc78c2a99",
"name": "Load NDA metadata \u2013 EN"
},
{
"parameters": {
"jsCode": "const requests = [];\n\nfor (const item of items) {\n const key = item.json[\"Key\"]; // ex: {{COMPANY_NAME}}\n const val = item.json[\"value clean\"]; // ex: wedewd\n\n // Ne pas remplacer si vide\n if (!key) continue;\n\n requests.push({\n replaceAllText: {\n containsText: {\n text: key,\n matchCase: true\n },\n replaceText: val ?? \"\"\n }\n });\n}\n\nreturn [{ json: { requests } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4064,
288
],
"id": "e9f387a4-5906-4fdc-be8b-fd0efff1bd7d",
"name": "Prepare Google Docs replace requests - EN"
},
{
"parameters": {
"method": "POST",
"url": "={{\"https://docs.googleapis.com/v1/documents/\" + $node[\"Copier le template - EN\"].json.id + \":batchUpdate\"}}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleDocsOAuth2Api",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { \"requests\": $json.requests } }}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4272,
288
],
"id": "d4c7898d-cac8-413a-96cd-68221f597079",
"name": "Apply placeholders to NDA (Google Docs) - EN"
},
{
"parameters": {
"url": "={{\"https://www.googleapis.com/drive/v3/files/\" + $node[\"Copier le template - EN\"].json.id + \"/export?mimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document\"}}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleDriveOAuth2Api",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4480,
288
],
"id": "a0dfb0a5-ee3e-4991-b2d1-41ba68040d6c",
"name": "HTTP Request\u201d (export DOCX) - EN"
},
{
"parameters": {
"jsCode": "// Node plac\u00e9 juste apr\u00e8s \"HTTP Request\" (export DOCX) - EN\n\nfunction safe(s) {\n return String(s ?? '').trim();\n}\n\nconst en = $node[\"Set | submissionID_EN\"].json;\n\nconst project = safe(en.project) || \"Project\";\nconst today = new Date().toISOString().slice(0, 10);\n\n// Nom final souhait\u00e9\nconst filename = `NDA - Project ${project} - ${today}.docx`;\n\nreturn $input.all().map(item => {\n if (!item.binary || !item.binary.data) {\n throw new Error('Binaire introuvable. V\u00e9rifie que \"HTTP Request\" sort un fichier dans binary.data (Response Format = File, Binary field = data).');\n }\n\n item.binary.data.fileName = filename;\n item.binary.data.mimeType = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n return item;\n});\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4672,
288
],
"id": "a8c1c25c-b379-42a6-97d8-ca61b171eef0",
"name": "Code in JavaScript - EN"
},
{
"parameters": {
"toRecipients": "={{ $('Set | submissionID_EN').first().json.email }}",
"subject": "={{ \"Project \" + $node[\"Set | submissionID_EN\"].json.project + \" - NDA - \" + $node[\"Set | submissionID_EN\"].json.company + \" - \" + new Date().toISOString().slice(0,10) }}",
"bodyContent": "=Hello,\n\nHectelion thanks you for your interest and for the trust you have placed in us.\n\nPlease find attached the Non-Disclosure Agreement (NDA) relating to your project, generated on the basis of the information you provided.\n\nThe purpose of this document is to establish a preliminary confidentiality framework for the exchange of information in the context of the contemplated transaction, in line with customary market standards and through an automated approach.\n\nThis document is provided on an indicative basis and may require adjustments depending on the specificities of the transaction, the parties involved, and the applicable jurisdiction. We therefore recommend, where appropriate, that it be reviewed and validated by your usual legal counsel prior to signature.\n\nShould you wish to go further, refine certain aspects, or consider more comprehensive support in connection with the transaction (sale, fundraising, structuring, negotiation), we would be pleased to discuss this with you.\n\nWe remain at your full disposal should you require any additional information.\n\nKind regards,\n\n{{SENDER_NAME}}\n{{SENDER_TITLE}}\n\nM: {{SENDER_PHONE}}\nE-mail: {{SENDER_EMAIL}}\nWebsite: {{SENDER_WEBSITE}}\n{{SENDER_ADDRESS}}",
"additionalFields": {
"attachments": {
"attachments": [
{
"binaryPropertyName": "=data"
}
]
}
}
},
"type": "n8n-nodes-base.microsoftOutlook",
"typeVersion": 2,
"position": [
4864,
288
],
"id": "fc78d28e-dc95-4dcb-9a29-af9797a1a858",
"name": "Send NDA by email (Outlook) - EN"
},
{
"parameters": {
"operation": "move",
"fileId": {
"__rl": true,
"value": "={{$node[\"Copier le template - EN\"].json.id}}",
"mode": "id"
},
"driveId": {
"__rl": true,
"value": "My Drive",
"mode": "list",
"cachedResultName": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive"
},
"folderId": {
"__rl": true,
"value": "{{DRIVE_ARCHIVE_FOLDER_ID}}",
"mode": "list",
"cachedResultName": "Formulaire | IA - NDA",
"cachedResultUrl": "https://drive.google.com/drive/folders/{{DRIVE_ARCHIVE_FOLDER_ID}}"
}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
5088,
288
],
"id": "a5ec6faf-e99f-4e49-a788-e872c5beea11",
"name": "Move file - EN"
},
{
"parameters": {
"jsCode": "const body = $json.body ?? $json;\nconst data = body.data ?? body;\n\nconst website =\n data?.hiddenFields?.website ??\n data?.hiddenFields?.Website ??\n data?.website ??\n data?.Website ??\n '';\n\nreturn [{\n json: {\n ...$json,\n website: String(website).trim(),\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
912,
-96
],
"id": "9dc28f7f-4ddc-499d-8f7b-90c30032cc40",
"name": "Normalize honeypot"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1872,
-400
],
"id": "9abbaa88-b5dc-43f6-9387-7e6d5f55b7e0",
"name": "Respond to Webhook1"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1211877039,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1211877039"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1408,
-96
],
"id": "8c00a470-fa26-4040-9494-9d228f03b246",
"name": "(Read n8n_sent_log)"
},
{
"parameters": {
"jsCode": "// FR \u2014 compare submissionId (Set | submissionID_FR) vs colonne \"Submission ID\" du log\n\nconst currentId = String($('Set | submissionID_FR').first().json.submissionId ?? '').trim();\n\nconst logItems = $items('(Read n8n_sent_log)');\n\nconst alreadySent = logItems.some(i =>\n String(i.json['Submission ID'] ?? '').trim() === currentId\n);\n\nreturn [\n {\n json: {\n submissionId_current: currentId,\n alreadySent,\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1648,
-96
],
"id": "437a0c1d-eca1-4bd9-84ed-930ae7c043f3",
"name": "Code | compute alreadySent"
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1211877039,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1211877039"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Submission ID": "={{ $('Set | submissionID_FR').first().json.submissionId }}"
},
"matchingColumns": [
"Submission ID"
],
"schema": [
{
"id": "Submission ID",
"displayName": "Submission ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "alreadySent",
"displayName": "alreadySent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2080,
-80
],
"id": "f86738fd-fb77-44c1-80e9-9b4364ba385f",
"name": "Append to n8n_sent_log"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "7459da8d-32a0-47c1-897e-8672364d57c5",
"leftValue": "={{ $json.alreadySent }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1872,
-96
],
"id": "480b5673-1eea-4b73-8c61-f07e5117a7ab",
"name": "IF \u201calreadySent\u201d"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\n// \u26a0\ufe0f adapte les chemins ci-dessous selon ton webhook Tally\nconst data = $json.body?.data ?? $json.data ?? $json;\n\nconst obj = {\n email: norm(data.email ?? data.hiddenFields?.email),\n company: norm(data.company_name ?? data.company),\n project: norm(data.project_name ?? data.project),\n first: norm(data.first_name ?? data.issuer_first_name),\n last: norm(data.last_name ?? data.issuer_last_name),\n term: norm(data.confidentiality_term_years ?? data.term),\n};\n\nconst fingerprint_webhook = Object.keys(obj)\n .sort()\n .map(k => `${k}=${obj[k]}`)\n .join('|');\n\nreturn [{ json: { ...$json, fingerprint_webhook } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1184,
-96
],
"id": "24575ac4-b6da-4cab-9aaf-dfe7ac4e0216",
"name": "fingerprint_webhook"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst rows = $input.all();\n\n// Construire map : \"{{EMAIL}}\" -> \"...\"\nconst map = {};\nfor (const r of rows) {\n const key = String(r.json[\"Key\"] ?? \"\").trim();\n const val = r.json[\"value clean\"] ?? r.json[\"value brute\"] ?? \"\";\n if (key) map[key] = val;\n}\n\n// Extraire UNIQUEMENT les 5 champs requis\nconst sheetFields = {\n email: norm(map[\"{{EMAIL}}\"]),\n first: norm(map[\"{{ISSUER_FIRST_NAME}}\"]),\n last: norm(map[\"{{ISSUER_LAST_NAME}}\"]),\n company: norm(map[\"{{COMPANY_NAME}}\"]),\n project: norm(map[\"{{PROJECT_NAME}}\"]),\n};\n\nreturn [\n {\n json: {\n sheetFields,\n // debug utile (tu peux enlever apr\u00e8s)\n debug: {\n extracted: sheetFields,\n }\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2512,
-80
],
"id": "d07b322a-eb76-46e8-84ef-46e08f91a440",
"name": "fingerprint_sheet_fr"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
2928,
128
],
"id": "37165920-2072-43eb-8483-0d91bf728463",
"name": "Respond to Webhook"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "d4773188-3695-47f2-818f-569a6af30cdb",
"leftValue": "={{ $json.isMatch }}",
"rightValue": "={{ $node[\"fingerprint_webhook\"].json.fingerprint_webhook }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
2880,
-80
],
"id": "4176a8ab-9471-4da7-b6fd-50d2fdc2921e",
"name": "Webhook vs. google sheet_fr"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
2928,
512
],
"id": "d0cc0b9e-9944-4875-a603-1b1f1437dbdd",
"name": "Respond to Webhook2"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst rows = $input.all();\n\n// Key -> value (on prend \"value clean\" sinon \"value brute\")\nconst map = {};\nfor (const r of rows) {\n const k = String(r.json.Key ?? '').trim();\n const v = r.json['value clean'] ?? r.json['value brute'] ?? '';\n if (k) map[k] = v;\n}\n\nconst sheetFields = {\n email: norm(map['{{EMAIL}}']),\n first: norm(map['{{ISSUER_FIRST_NAME}}']),\n last: norm(map['{{ISSUER_LAST_NAME}}']),\n company: norm(map['{{COMPANY_NAME}}']),\n project: norm(map['{{PROJECT_NAME}}']),\n};\n\nreturn [{ json: { sheetFields } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2512,
304
],
"id": "d0b7bedd-13b0-48e2-8799-1b57836dc60a",
"name": "fingerprint_sheet_en"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "d4773188-3695-47f2-818f-569a6af30cdb",
"leftValue": "={{ $json.isMatch }}",
"rightValue": "={{ $('fingerprint_webhook_en').first().json.fingerprint_webhook }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
2848,
304
],
"id": "9abe0750-2642-4bde-8220-91f42520847c",
"name": "Webhook vs. google sheet_en"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "3346028b-f99f-490a-98aa-b13adf49015a",
"name": "submissionId",
"value": "={{ $('Webhook | NDA - FR').item.json.body.data.submissionId }}",
"type": "string"
},
{
"id": "6004744c-2a4d-435a-8cd0-53c53205abb2",
"name": "email",
"value": "={{ $json.body.data.fields[3].value }}",
"type": "string"
},
{
"id": "ca02563a-6cd5-43cc-8962-e29af7136fbc",
"name": "first",
"value": "={{ $json.body.data.fields[0].value }}",
"type": "string"
},
{
"id": "e5aab000-018f-4059-bd79-ae0e7a4b83cd",
"name": "last",
"value": "={{ $json.body.data.fields[1].value }}",
"type": "string"
},
{
"id": "03b844c4-1e69-43c1-8ac4-8b4d7d78784f",
"name": "company",
"value": "={{ $json.body.data.fields[5].value }}",
"type": "string"
},
{
"id": "56e26c4b-1f8a-4ed6-937c-f497130b7fa7",
"name": "project",
"value": "={{ $json.body.data.fields[9].value }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
496,
-96
],
"id": "ecff1620-cc91-45ac-beec-84340ce84b37",
"name": "Set | submissionID_FR"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "3346028b-f99f-490a-98aa-b13adf49015a",
"name": "submissionId",
"value": "={{ $('Webhook | NDA - EN').item.json.body.data.submissionId }}",
"type": "string"
},
{
"id": "f172dff5-e7b3-4f8d-813c-4ab3855e7add",
"name": "email",
"value": "={{ $json.body.data.fields[3].value }}",
"type": "string"
},
{
"id": "6cbed047-7011-47ab-97be-09b732637bca",
"name": "first",
"value": "={{ $json.body.data.fields[0].value }}",
"type": "string"
},
{
"id": "ef1cac08-119f-40cb-b95b-b6c3ac9df01d",
"name": "last",
"value": "={{ $json.body.data.fields[1].value }}",
"type": "string"
},
{
"id": "49ccb0eb-beaa-469e-8b83-5c9b485052ad",
"name": "company",
"value": "={{ $json.body.data.fields[5].value }}",
"type": "string"
},
{
"id": "d6b279da-ea35-4248-870e-1d7022988347",
"name": "project",
"value": "={{ $json.body.data.fields[9].value }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
512,
288
],
"id": "28f226b2-0b45-443d-84de-2917e1750652",
"name": "Set | submissionID_EN"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1936,
720
],
"id": "75b604b1-537c-4a93-bd60-85b816feffc3",
"name": "Respond to Webhook3"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 269918093,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=269918093"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1408,
288
],
"id": "aebfa876-bd3f-48c3-8e01-e05419232040",
"name": "(Read n8n_sent_log)_en"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\n// \u26a0\ufe0f adapte les chemins ci-dessous selon ton webhook Tally\nconst data = $json.body?.data ?? $json.data ?? $json;\n\nconst obj = {\n email: norm(data.email ?? data.hiddenFields?.email),\n company: norm(data.company_name ?? data.company),\n project: norm(data.project_name ?? data.project),\n first: norm(data.first_name ?? data.issuer_first_name),\n last: norm(data.last_name ?? data.issuer_last_name),\n term: norm(data.confidentiality_term_years ?? data.term),\n};\n\nconst fingerprint_webhook = Object.keys(obj)\n .sort()\n .map(k => `${k}=${obj[k]}`)\n .join('|');\n\nreturn [{ json: { ...$json, fingerprint_webhook } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1184,
288
],
"id": "2ff0fe27-b015-456a-acb5-b88863de2a05",
"name": "fingerprint_webhook_en"
},
{
"parameters": {
"jsCode": "const body = $json.body ?? $json;\nconst data = body.data ?? body;\n\nconst website =\n data?.hiddenFields?.website ??\n data?.hiddenFields?.Website ??\n data?.website ??\n data?.Website ??\n '';\n\nreturn [{\n json: {\n ...$json,\n website: String(website).trim(),\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
928,
288
],
"id": "cd36ae22-174f-49b6-b5d9-f3ad8e50481d",
"name": "Normalize honeypot_en"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "7459da8d-32a0-47c1-897e-8672364d57c5",
"leftValue": "={{ $json.alreadySent }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1856,
288
],
"id": "fa17c9b1-8c1f-4292-a738-fe47cd08028b",
"name": "IF \u201calreadySent\u201d_en"
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | NDA - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 269918093,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=269918093"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Submission ID": "={{ $json.submissionId_current }}"
},
"matchingColumns": [
"Submission ID"
],
"schema": [
{
"id": "Submission ID",
"displayName": "Submission ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "alreadySent",
"displayName": "alreadySent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2080,
304
],
"id": "7ee99db8-1284-4f6d-9a93-00691218fc25",
"name": "Append to n8n_sent_log_en"
},
{
"parameters": {
"jsCode": "// 1) Prendre le submissionId depuis \"Set | submissionID_EN\" SANS pairing\nconst currentId = String($('Set | submissionID_EN').first().json.submissionId ?? '').trim();\n\n// 2) Lire toutes les lignes du log EN\nconst logItems = $items('(Read n8n_sent_log)_en');\n\n// 3) Comparer au champ \"Submission ID\" du log\nconst alreadySent = logItems.some(i =>\n String(i.json['Submission ID'] ?? '').trim() === currentId\n);\n\n// 4) Retourner seulement le bool\u00e9en (et le currentId pour l'\u00e9tape suivante)\nreturn [\n {\n json: {\n submissionId_current: currentId,\n alreadySent\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1648,
288
],
"id": "25433e6d-a9fa-42b2-9820-f5a778ec4514",
"name": "Code | compute alreadySent_en"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst sheet = $json.sheetFields;\n\n// \u26a0\ufe0f On lit DIRECTEMENT la node Set | submissionID_EN (sans pairing)\nconst w = $('Set | submissionID_EN').first().json;\n\nconst webhookFields = {\n email: norm(w.email),\n first: norm(w.first),\n last: norm(w.last),\n company: norm(w.company),\n project: norm(w.project),\n};\n\nconst checks = {\n email: sheet.email === webhookFields.email,\n first: sheet.first === webhookFields.first,\n last: sheet.last === webhookFields.last,\n company: sheet.company === webhookFields.company,\n project: sheet.project === webhookFields.project,\n};\n\nconst isMatch = Object.values(checks).every(Boolean);\n\nreturn [{\n json: {\n isMatch,\n checks,\n sheetFields: sheet,\n webhookFields\n }\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2688,
304
],
"id": "95950654-875f-465c-a86a-6f1af02b1fbf",
"name": "Match_en"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst sheet = $json.sheetFields;\n\n// Lire le payload canonique webhook FR\nconst w = $(\"Set | submissionID_FR\").first().json;\n\nconst webhookFields = {\n email: norm(w.email),\n first: norm(w.first),\n last: norm(w.last),\n company: norm(w.company),\n project: norm(w.project),\n};\n\nconst checks = {\n email: sheet.email === webhookFields.email,\n first: sheet.first === webhookFields.first,\n last: sheet.last === webhookFields.last,\n company: sheet.company === webhookFields.company,\n project: sheet.project === webhookFields.project,\n};\n\nconst isMatch = Object.values(checks).every(Boolean);\n\nreturn [\n {\n json: {\n isMatch,\n checks,\n sheetFields: sheet,\n webhookFields,\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2704,
-80
],
"id": "8832c09f-0d4d-4973-a12c-d30c732d70a5",
"name": "Match_fr"
}
],
"connections": {
"Webhook | NDA - FR": {
"main": [
[
{
"node": "Set | submissionID_FR",
"type": "main",
"index": 0
}
]
]
},
"Webhook | NDA - EN": {
"main": [
[
{
"node": "Set | submissionID_EN",
"type": "main",
"index": 0
}
]
]
},
"Set | Lang = FR": {
"main": [
[
{
"node": "Normalize honeypot",
"type": "main",
"index": 0
}
]
]
},
"Set | Lang = EN": {
"main": [
[
{
"node": "Normalize honeypot_en",
"type": "main",
"index": 0
}
]
]
},
"Google Sheet | Tally - Hectelion - NDA - FR": {
"main": [
[
{
"node": "fingerprint_sheet_fr",
"type": "main",
"index": 0
}
]
]
},
"Prepare NDA placeholders": {
"main": [
[
{
"node": "Copier le template",
"type": "main",
"index": 0
}
]
]
},
"Copier le template": {
"main": [
[
{
"node": "Update file",
"type": "main",
"index": 0
}
]
]
},
"Update file": {
"main": [
[
{
"node": "Load NDA metadata \u2013 FR",
"type": "main",
"index": 0
}
]
]
},
"Load NDA metadata \u2013 FR": {
"main": [
[
{
"node": "Prepare Google Docs replace requests",
"type": "main",
"index": 0
}
]
]
},
"Prepare Google Docs replace requests": {
"main": [
[
{
"node": "Apply placeholders to NDA (Google Docs)",
"type": "main",
"index": 0
}
]
]
},
"Apply placeholders to NDA (Google Docs)": {
"main": [
[
{
"node": "HTTP Request\u201d (export DOCX)",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Send NDA by email (Outlook)",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request\u201d (export DOCX)": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Send NDA by email (Outlook)": {
"main": [
[
{
"node": "Move file",
"type": "main",
"index": 0
}
]
]
},
"Google Sheet | Tally - Hectelion - NDA - EN": {
"main": [
[
{
"node": "fingerprint_sheet_en",
"type": "main",
"index": 0
}
]
]
},
"Prepare NDA placeholders - EN": {
"main": [
[
{
"node": "Copier le template - EN",
"type": "main",
"index": 0
}
]
]
},
"Copier le template - EN": {
"main": [
[
{
"node": "Update file - EN",
"type": "main",
"index": 0
}
]
]
},
"Update file - EN": {
"main": [
[
{
"node": "Load NDA metadata \u2013 EN",
"type": "main",
"index": 0
}
]
]
},
"Load NDA metadata \u2013 EN": {
"main": [
[
{
"node": "Prepare Google Docs replace requests - EN",
"type": "main",
"index": 0
}
]
]
},
"Prepare Google Docs replace requests - EN": {
"main": [
[
{
"node": "Apply placeholders to NDA (Google Docs) - EN",
"type": "main",
"index": 0
}
]
]
},
"Apply placeholders to NDA (Google Docs) - EN": {
"main": [
[
{
"node": "HTTP Request\u201d (export DOCX) - EN",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request\u201d (export DOCX) - EN": {
"main": [
[
{
"node": "Code in JavaScript - EN",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript - EN": {
"main": [
[
{
"node": "Send NDA by email (Outlook) - EN",
"type": "main",
"index": 0
}
]
]
},
"Send NDA by email (Outlook) - EN": {
"main": [
[
{
"node": "Move file - EN",
"type": "main",
"index": 0
}
]
]
},
"Normalize honeypot": {
"main": [
[
{
"node": "fingerprint_webhook",
"type": "main",
"index": 0
}
]
]
},
"(Read n8n_sent_log)": {
"main": [
[
{
"node": "Code | compute alreadySent",
"type": "main",
"index": 0
}
]
]
},
"Code | compute alreadySent": {
"main": [
[
{
"node": "IF \u201calreadySent\u201d",
"type": "main",
"index": 0
}
]
]
},
"Append to n8n_sent_log": {
"main": [
[
{
"node": "Google Sheet | Tally - Hectelion - NDA - FR",
"type": "main",
"index": 0
}
]
]
},
"IF \u201calreadySent\u201d": {
"main": [
[
{
"node": "Respond to Webhook1",
"type": "main",
"index": 0
}
],
[
{
"node": "Append to n8n_sent_log",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_webhook": {
"main": [
[
{
"node": "(Read n8n_sent_log)",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_sheet_fr": {
"main": [
[
{
"node": "Match_fr",
"type": "main",
"index": 0
}
]
]
},
"Webhook vs. google sheet_fr": {
"main": [
[
{
"node": "Prepare NDA placeholders",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_sheet_en": {
"main": [
[
{
"node": "Match_en",
"type": "main",
"index": 0
}
]
]
},
"Webhook vs. google sheet_en": {
"main": [
[
{
"node": "Prepare NDA placeholders - EN",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook2",
"type": "main",
"index": 0
}
]
]
},
"Set | submissionID_FR": {
"main": [
[
{
"node": "Set | Lang = FR",
"type": "main",
"index": 0
}
]
]
},
"Set | submissionID_EN": {
"main": [
[
{
"node": "Set | Lang = EN",
"type": "main",
"index": 0
}
]
]
},
"(Read n8n_sent_log)_en": {
"main": [
[
{
"node": "Code | compute alreadySent_en",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_webhook_en": {
"main": [
[
{
"node": "(Read n8n_sent_log)_en",
"type": "main",
"index": 0
}
]
]
},
"Normalize honeypot_en": {
"main": [
[
{
"node": "fingerprint_webhook_en",
"type": "main",
"index": 0
}
]
]
},
"IF \u201calreadySent\u201d_en": {
"main": [
[
{
"node": "Respond to Webhook3",
"type": "main",
"index": 0
}
],
[
{
"node": "Append to n8n_sent_log_en",
"type": "main",
"index": 0
}
]
]
},
"Append to n8n_sent_log_en": {
"main": [
[
{
"node": "Google Sheet | Tally - Hectelion - NDA - EN",
"type": "main",
"index": 0
}
]
]
},
"Code | compute alreadySent_en": {
"main": [
[
{
"node": "IF \u201calreadySent\u201d_en",
"type": "main",
"index": 0
}
]
]
},
"Match_en": {
"main": [
[
{
"node": "Webhook vs. google sheet_en",
"type": "main",
"index": 0
}
]
]
},
"Match_fr": {
"main": [
[
{
"node": "Webhook vs. google sheet_fr",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"availableInMCP": true
},
"meta": {
"templateCredsSetupCompleted": false
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Hectelion | NDA. Uses googleSheets, googleDrive, httpRequest, microsoftOutlook. Webhook trigger; 50 nodes.
Source: https://github.com/Hectelion-SA/n8n-nda-generator/blob/main/workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Hectelion | Evaluation d'entreprise. Uses googleDrive, httpRequest, microsoftOutlook, googleSheets. Webhook trigger; 64 nodes.
Streamline and standardize your entire client onboarding process with a single end-to-end automation. 🚀📋 This workflow captures detailed client intake data via webhook, automatically creates a fully s
Sell on n8n using Stripe (Fully Automated Delivery)
This workflow creates PDF certificates using Stencil, stores them in Google Drive, and emails them to participants. A new row is added to the Google Sheets document (via form, webhook, or manual entry
✨🔪 Advanced AI Powered Document Parsing & Text Extraction with Llama Parse. Uses gmail, gmailTrigger, limit, stickyNote. Webhook trigger; 54 nodes.