AutomationFlowsWeb Scraping › Auto-Generate Client Contracts with Google Docs & Drive

Auto-Generate Client Contracts with Google Docs & Drive

Original n8n title: Generate Client Contracts Automatically Using Google Docs, Drive, and Gohighlevel

ByRahul Joshi @rahul08 on n8n.io

📘 Description This workflow is a fully automated contract generation and delivery system that converts structured client input into a finalized, professional PDF contract and uploads it directly to your CRM. It eliminates manual document handling by dynamically populating a…

Webhook trigger★★★☆☆ complexity12 nodesGoogle DriveGoogle DocsHTTP Request
Web Scraping Trigger: Webhook Nodes: 12 Complexity: ★★★☆☆ Added:

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

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

The workflow JSON

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

Download .json
{
  "id": "RD7R4vPftgj9uhAP",
  "name": "Generate Client Contracts Automatically using Google Docs, Drive, and GoHighLevel",
  "tags": [],
  "nodes": [
    {
      "id": "d53465c0-2029-4272-ad5f-1f6be7026286",
      "name": "Sticky Note: Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        -624
      ],
      "parameters": {
        "width": 708,
        "height": 544,
        "content": "## \ud83d\udcc4 Automated Contract Generator\n\n### How it works\nWhen a webhook receives client data (name, date, scope of works, PC items, and financials), the workflow copies a master Google Docs contract template, populates it with the submitted details using find-and-replace, exports it as a PDF, uploads it to GoHighLevel, and then deletes the temporary copy from Drive \u2014 leaving no clutter behind.\n\nThis removes the manual work of copying, editing, and emailing contracts one by one. Every contract is generated in seconds, consistently formatted, and automatically delivered to your CRM.\n\n### Setup steps\n1. **Google Drive** \u2014 Connect your Google Drive OAuth2 credential. Update the `Copy Master Template` node with your own master template file ID.\n2. **Google Docs** \u2014 Connect your Google Docs OAuth2 credential to the `Populate Contract with Client Data` node.\n3. **GoHighLevel** \u2014 Replace the placeholder Bearer token in `Upload PDF to GoHighLevel` with your own GHL API key.\n4. **Webhook** \u2014 Copy the webhook URL and add it to whatever form or CRM triggers contract generation.\n5. **Test** \u2014 Submit a test payload matching the expected body structure (full_name, date, scope_of_works[], pc_items[], subtotal, gst, total) and verify the PDF arrives in GHL."
      },
      "typeVersion": 1
    },
    {
      "id": "6c18cc5a-609b-4785-8ae7-4260415960bb",
      "name": "Sticky Note: Webhook",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 280,
        "height": 380,
        "content": "## \ud83d\udd17 Webhook Trigger\nReceives a POST request with all client contract details \u2014 name, date, scope of works, PC items, and pricing. This is the entry point; nothing runs until this fires."
      },
      "typeVersion": 1
    },
    {
      "id": "89545069-7529-46a8-8936-ee637f5a1a86",
      "name": "Sticky Note: Template Population",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 564,
        "height": 384,
        "content": "## \ud83d\udccb Template Copy & Population\nClones the master Google Docs contract template and replaces all placeholder text with the client's actual data \u2014 name, date, scope of works headings and descriptions, PC item names and values, and totals. The original template is never modified."
      },
      "typeVersion": 1
    },
    {
      "id": "ae0db946-929d-49f3-ab74-b613dc38b65b",
      "name": "Sticky Note: Export & Upload",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 492,
        "height": 374,
        "content": "## \ud83d\udce4 Export & Upload to CRM\nDownloads the completed contract as a PDF from Google Drive, then uploads it directly to GoHighLevel via the media API. The PDF is ready to attach to a contact record or send to the client."
      },
      "typeVersion": 1
    },
    {
      "id": "ca2e06f1-6a0a-4502-bed5-189204883cd1",
      "name": "Sticky Note: Cleanup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1952,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 388,
        "height": 376,
        "content": "## \ud83d\uddd1\ufe0f Cleanup\nDeletes the temporary Google Drive copy after the PDF has been successfully uploaded. Keeps your Drive tidy with no leftover contract drafts."
      },
      "typeVersion": 1
    },
    {
      "id": "b04ffc44-b344-4881-b686-956ebffe482d",
      "name": "Sticky Note: Security",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2368,
        112
      ],
      "parameters": {
        "color": 3,
        "width": 292,
        "height": 210,
        "content": "## \ud83d\udd10 Credentials & Security\nUse OAuth2 for Google Drive and Google Docs. Replace the GoHighLevel Bearer token with a credential stored in n8n \u2014 never paste live API keys into node fields for shared templates."
      },
      "typeVersion": 1
    },
    {
      "id": "0d648496-37ae-4658-8200-543dd560d598",
      "name": "Receive Contract Request",
      "type": "n8n-nodes-base.webhook",
      "position": [
        672,
        112
      ],
      "parameters": {
        "path": "dc09097f-d5ac-4352-b249-7f03e71876d6",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "73927614-2bdd-4128-9cc5-90fb5c473e82",
      "name": "Copy Master Template",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        960,
        112
      ],
      "parameters": {
        "name": "={{ 'Contract_' + $('Receive Contract Request').item.json.body.full_name + '_' + $('Receive Contract Request').item.json.body.date }}",
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_MASTER_TEMPLATE_FILE_ID"
        },
        "options": {},
        "operation": "copy"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "cae4af45-d5a1-4979-8b9d-f0e601137af7",
      "name": "Populate Contract with Client Data",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1264,
        112
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "Michelle Humphries",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.full_name }}"
            },
            {
              "text": "22\u207f\u1d48 of December 2025",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.date }}"
            },
            {
              "text": "DEMOLITION",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[0].heading }}"
            },
            {
              "text": "Complete Heading 1 to bathroom & laundry. Remove fixtures & fittings (bath, vanity, toilet, shower screen, Heading 7 *, benchtop, etc). Remove floor & wall tiles. Remove wall sheeting where required. Remove bathroom door frame. Remove screed. Remove concrete slab where required for plumbing access/relocation (bath, vanity, laundry sink waste). Supply skip bin. Dust extractors & floor protection to be used at all times..",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[0].sub_heading }}"
            },
            {
              "text": "FIRST FIX PLUMBING & ELECTRICAL",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[1].heading }}"
            },
            {
              "text": "Disconnect existing plumbing. Relocate bath waste & convert to suit shower strip drain. Relocate vanity waste to suit wall hung. Relocate laundry sink waste to suit new. Relocate vanity water outlets to suit wall hung. Relocate shower water outlet to suit Item 5 * Relocate toilet water inlet to suit BTW. Relocate laundry sink water outlets to suit new. Relocate laundry washing machine water outlets to suit new. Convert all tapware to mixer taps. Disconnect existing electrical. Delete laundry ceiling light. Relocate existing vanity GPO to suit new. Add new ceiling electrical (exhaust fan above shower, 2 downlights in laundry). Add new wall electrical (HTR, GPO above vanity, GPO above laundry benchtop, GPO inside laundry sink cupboard). Supply all materials.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[1].sub_heading }}"
            },
            {
              "text": "CONCRETING & CARPENTRY",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[2].heading }}"
            },
            {
              "text": "Repair concrete slab where removed for plumbing access/relocation (bath, vanity, laundry sink waste). Termite protection to be installed beforehand. First & second fix bathroom sliding cavity door. Build dividing half nib wall between toilet & shower. Build shower niche (size & location to be determined on site). Add timber supports to wall framing where required Supply all materials",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[2].sub_heading }}"
            },
            {
              "text": "CEILING/WALL LININGS & FLUSHING",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[3].heading }}"
            },
            {
              "text": "Sheet walls where removed. Repair laundry ceiling. Tape, flush & sand all new ceiling/wall linings. Supply all materials.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[3].sub_heading }}"
            },
            {
              "text": "SCREEDING",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[4].heading }}"
            },
            {
              "text": "Screed bathroom & laundry floor. Supply all materials.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[4].sub_heading }}"
            },
            {
              "text": "WATERPROOFING & TILING",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[5].heading }}"
            },
            {
              "text": "Install puddle flange to floor wastes. Prep floor & walls for correct Heading 6 * installation. Waterproof bathroom & laundry in accordance to AS370 using the full laticrete system. Tile    bathroom & laundry floor. * Tile bathroom walls - 2100mm high in shower area, 1200mm high  outside shower area. * Tile bathroom nib wall. * Tile laundry walls - skirting tile. * Tile laundry  splashback - 600mm high. * Mitre tiles around shower niche & nib wall. * Grout & silicone all new tiling works. Install tile insert strip drain to shower waste. Install tile insert floor grate to floor wastes. Supply all materials. *PC Item",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[5].sub_heading }}"
            },
            {
              "text": "CABINETRY",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[6].heading }}"
            },
            {
              "text": "Supply & install laundry cupboards. Supply & install laundry stone benchtop. Refer to attached plan/drawing.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[6].sub_heading }}"
            },
            {
              "text": "SECOND FIX PLUMBING & ELECTRICAL",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[7].heading }}"
            },
            {
              "text": "Install vanity. * Install toilet. * Install Item 5 * * Install laundry trough. * Install all tapware. * Connect washing machine & dryer. ** Supply & install exhaust fan above shower. Supply & replace existing bathroom 4 in 1. Supply & install 2 downlights in laundry. Install HTR. * Supply & install LED motion sensor strip light under vanity. Supply & install bathroom GPO (above vanity). Supply & install laundry GPO's (above benchtop, inside sink cupboard). Supply & replace all existing electrical switches. *PC Item **Items To Be Supplied By Owner",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[7].sub_heading }}"
            },
            {
              "text": " FIT OUT",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[8].heading }}"
            },
            {
              "text": "Install fittings (mirror, towel rails, toilet roll holder, robe hooks, etc). * Supply & install custom made frameless single panel shower screen (2100x1000mm). Final site clean up. *PC Item",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.scope_of_works[8].sub_heading }}"
            },
            {
              "text": "1200mm wall hung vanity unit.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[0].item }}"
            },
            {
              "text": "2,250.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[0].value }}"
            },
            {
              "text": "Wall tiles ($40m2).",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[1].item }}"
            },
            {
              "text": "1,190.40",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[1].value }}"
            },
            {
              "text": "Floor tiles ($60m2).",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[2].item }}"
            },
            {
              "text": "1,043.40",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[2].value }}"
            },
            {
              "text": "BTW toilet suite.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[3].item }}"
            },
            {
              "text": "713.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[3].value }}"
            },
            {
              "text": "Shower rail.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[4].item }}"
            },
            {
              "text": "660.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[4].value }}"
            },
            {
              "text": "700mm HTR.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[5].item }}"
            },
            {
              "text": "499.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[5].value }}"
            },
            {
              "text": "Above counter basin.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[6].item }}"
            },
            {
              "text": "349.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[6].value }}"
            },
            {
              "text": "Wall basin mixer tap.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[7].item }}"
            },
            {
              "text": "281.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[7].value }}"
            },
            {
              "text": "1200mm rectangle mirror.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[8].item }}"
            },
            {
              "text": "266.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[8].value }}"
            },
            {
              "text": "Laundry inset trough.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[9].item }}"
            },
            {
              "text": "249.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[9].value }}"
            },
            {
              "text": "Laundry sink mixer tap.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[10].item }}"
            },
            {
              "text": "169.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[10].value }}"
            },
            {
              "text": "Shower mixer tap.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[11].item }}"
            },
            {
              "text": "146.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[11].value }}"
            },
            {
              "text": "Hand towel rail.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[12].item }}"
            },
            {
              "text": "65.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[12].value }}"
            },
            {
              "text": "Robe hook X2. ",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[13].item }}"
            },
            {
              "text": "60.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[13].value }}"
            },
            {
              "text": "Toilet roll holder.",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[14].item }}"
            },
            {
              "text": "44.00",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.pc_items[14].value }}"
            },
            {
              "text": "Michelle Humphries",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.fee_full_name }}"
            },
            {
              "text": "22nd of December 2025",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.fee_date }}"
            },
            {
              "text": "58,808.61",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.subtotal }}"
            },
            {
              "text": "5,880.86",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.gst }}"
            },
            {
              "text": "64,689.47",
              "action": "replaceAll",
              "replaceText": "={{ $('Receive Contract Request').item.json.body.total }}"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "3f017f3b-31c3-4d70-abea-3c6ee8157b37",
      "name": "Download Contract as PDF",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1536,
        112
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Copy Master Template').item.json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "71876bed-020a-4259-8628-0fa726357cb9",
      "name": "Upload PDF to GoHighLevel",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1808,
        112
      ],
      "parameters": {
        "url": "https://services.leadconnectorhq.com/medias/upload-file",
        "method": "POST",
        "options": {
          "redirect": {
            "redirect": {}
          }
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "file",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "data"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Accept",
              "value": "application/json"
            },
            {
              "name": "Version",
              "value": "2021-07-28"
            },
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "Channel",
              "value": "API"
            },
            {
              "name": "source",
              "value": "WEB_USER"
            },
            {
              "name": "origin",
              "value": "https://app.gohighlevel.com"
            },
            {
              "name": "referer",
              "value": "https://app.gohighlevel.com/"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "a994f86b-e5f5-4043-8d19-f654682b18c1",
      "name": "Delete Temp Copy from Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2064,
        112
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Copy Master Template').item.json.id }}"
        },
        "options": {},
        "operation": "deleteFile"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "585f4265-305e-4d86-b44f-99b4508eb6d4",
  "connections": {
    "Copy Master Template": {
      "main": [
        [
          {
            "node": "Populate Contract with Client Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Contract as PDF": {
      "main": [
        [
          {
            "node": "Upload PDF to GoHighLevel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Contract Request": {
      "main": [
        [
          {
            "node": "Copy Master Template",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload PDF to GoHighLevel": {
      "main": [
        [
          {
            "node": "Delete Temp Copy from Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Populate Contract with Client Data": {
      "main": [
        [
          {
            "node": "Download Contract as PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

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

Pro

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

About this workflow

📘 Description This workflow is a fully automated contract generation and delivery system that converts structured client input into a finalized, professional PDF contract and uploads it directly to your CRM. It eliminates manual document handling by dynamically populating a…

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

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Remove Video Background & Compose on Custom Background with Google Drive. Uses httpRequest, googleDrive. Webhook trigger; 25 nodes.

HTTP Request, Google Drive
Web Scraping

• Upload foreground video (AI actors, product demos, webcam footage) • Provide custom background video URL • API removes video background with videobgremover.com • Composites foreground onto backgroun

HTTP Request, Google Drive
Web Scraping

Automated workflow to remove video backgrounds and composite foreground video on static image backgrounds. Perfect for creating branded content, professional presentations, and consistent visual brand

HTTP Request, Google Drive
Web Scraping

A comprehensive n8n workflow template that completely automates the startup pitch deck submission process for accelerators, incubators, VC firms, and startup competitions. This workflow validates foun

Google Drive, Gmail, N8N Nodes Verifiemail +2
Web Scraping

This workflow automates the entire parent consent process for school field trips, replacing manual paper forms with a secure, verified, and legally compliant digital system.

Google Drive, Gmail, N8N Nodes Verifiemail +2