Abstract / Overview

Build a form-to-document pipeline using Typeform, Make.com, and Google Docs. Collect responses, transform values, inject them into a template, export PDFs, and distribute by email or Drive sharing. No add-on marketplace, no scripts required. The same pattern produces certificates, reports, and receipts with consistent formatting at scale.

Assumption: You can connect Typeform, Google Drive/Docs, and Gmail in Make. Timezone defaults to UTC unless set per run.

ChatGPT Image Sep 5, 2025, 09_59_20 AM

Conceptual Background

Step-by-Step Walkthrough

1) Design the Typeform

Create a form to gather the minimal fields the document needs:

Recommended

2) Build the Google Docs template

Create a single template in a “Templates” folder. Use consistent placeholder syntax. Avoid curly braces that are part of normal prose. Example placeholders:

Formatting guidelines

3) Prepare Google Drive structure

Record IDs you will need:

4) Create the Make.com scenario

Use one scenario with a router to support multiple variants.

Trigger

Set variables

Router

Each path differs only in template selection or small replacements.

Google Docs → Create a document from a template

Optional. Insert images

If the template reserves an image placeholder like {{qr_code}}, first generate a QR/Barcode URL (external image service) or compute it elsewhere, then use Google Docs → Insert an image at a bookmark position named qr_code. When not required, omit for a pure Docs workflow.

Export PDF

Share and deliver

Log

5) Template selection logic

If you maintain three separate templates:

6) Field edge cases

7) Idempotency and retries

Code / JSON Snippets

A. Docs placeholder quick reference (copy into your template)

{{doc_title}}
{{full_name}}
{{email}}
{{score}}
{{completion_date}}
{{certificate_id}}
{{cohort}}
{{issuer_name}}
{{issuer_title}}
{{issued_date}}

B. Filename and IDs (Make “Set multiple variables”)

docTitle = {{ if(answers["variant"].label = "Certificate"; "Certificate of Completion"; if(answers["variant"].label = "Receipt"; "Payment Receipt"; "Program Report")) }}
fullName = {{ trim(answers["name_full"].text) }}
certificateId = {{ upper(concat("CERT-", substring(md5(response_id); 0; 8))) }}
baseName = {{ concat(docTitle; " — "; fullName; " — "; formatDate(now; "YYYYMMDD-HHmm")) }}

C. Google Docs “Create from template” mapping (pseudo-JSON for clarity)

{
  "templateId": "YOUR_DOC_TEMPLATE_ID",
  "name": "{{baseName}}",
  "folderId": "YOUR_OUTPUT_FOLDER_ID",
  "replacements": [
    {"placeholder": "{{doc_title}}", "value": "{{docTitle}}"},
    {"placeholder": "{{full_name}}", "value": "{{fullName}}"},
    {"placeholder": "{{email}}", "value": "{{answers[\"email_recipient\"].email}}"},
    {"placeholder": "{{score}}", "value": "{{formatNumber(answers[\"score\"].number; 2)}}"},
    {"placeholder": "{{completion_date}}", "value": "{{formatDate(answers[\"date_complete\"].date; \"YYYY-MM-DD\")}}"},
    {"placeholder": "{{certificate_id}}", "value": "{{certificateId}}"},
    {"placeholder": "{{cohort}}", "value": "{{answers[\"cohort\"].text}}"},
    {"placeholder": "{{issuer_name}}", "value": "YOUR ORG NAME"},
    {"placeholder": "{{issuer_title}}", "value": "PROGRAM DIRECTOR"},
    {"placeholder": "{{issued_date}}", "value": "{{formatDate(now; \"YYYY-MM-DD\")}}"}
  ]
}

D. Gmail delivery body (HTML)

Subject: {{docTitle}} — {{fullName}}

Hi {{fullName}},

Your document is ready.

Title: {{docTitle}}
Reference: {{certificateId}}
Date: {{formatDate(now; "YYYY-MM-DD")}}

File link: {{driveFile.webViewLink}}

Best regards,
Automation System

E. Sample workflow JSON code (Make scenario blueprint)

Replace connection and resource IDs with your own. This blueprint uses a single template path. Duplicate the “Create from template” module per variant or inject the templateId via a variable.

{
  "name": "Typeform → Google Docs Generator",
  "version": 3,
  "schedule": { "type": "immediate" },
  "modules": [
    {
      "id": "1",
      "name": "Watch Responses",
      "type": "typeform",
      "func": "watchResponses",
      "params": {
        "connectionId": "conn_typeform_1",
        "formId": "YOUR_TYPEFORM_FORM_ID",
        "limit": 1
      }
    },
    {
      "id": "2",
      "name": "Set variables",
      "type": "tools",
      "func": "setVars",
      "params": {
        "vars": {
          "fullName": "{{ trim(answers[\"name_full\"].text) }}",
          "recipientEmail": "{{ answers[\"email_recipient\"].email }}",
          "completionDate": "{{ formatDate(answers[\"date_complete\"].date; \"YYYY-MM-DD\") }}",
          "certificateId": "{{ upper(concat(\"CERT-\", substring(md5(response_id); 0; 8))) }}",
          "docTitle": "{{ if(answers[\"variant\"].label = \"Certificate\"; \"Certificate of Completion\"; if(answers[\"variant\"].label = \"Receipt\"; \"Payment Receipt\"; \"Program Report\")) }}",
          "baseName": "{{ concat(docTitle; \" — \"; fullName; \" — \"; formatDate(now; \"YYYYMMDD-HHmm\")) }}"
        }
      }
    },
    {
      "id": "3",
      "name": "Create doc from template",
      "type": "google-docs",
      "func": "createFromTemplate",
      "params": {
        "connectionId": "conn_gdocs_1",
        "templateId": "YOUR_DOC_TEMPLATE_ID",
        "name": "{{baseName}}",
        "folderId": "YOUR_OUTPUT_FOLDER_ID",
        "replacements": [
          {"key": "{{doc_title}}", "value": "{{docTitle}}"},
          {"key": "{{full_name}}", "value": "{{fullName}}"},
          {"key": "{{email}}", "value": "{{recipientEmail}}"},
          {"key": "{{score}}", "value": "{{ formatNumber(answers[\"score\"].number; 2) }}"},
          {"key": "{{completion_date}}", "value": "{{completionDate}}"},
          {"key": "{{certificate_id}}", "value": "{{certificateId}}"},
          {"key": "{{cohort}}", "value": "{{answers[\"cohort\"].text}}"},
          {"key": "{{issuer_name}}", "value": "YOUR ORG NAME"},
          {"key": "{{issuer_title}}", "value": "PROGRAM DIRECTOR"},
          {"key": "{{issued_date}}", "value": "{{ formatDate(now; \"YYYY-MM-DD\") }}"}
        ]
      }
    },
    {
      "id": "4",
      "name": "Export to PDF",
      "type": "google-docs",
      "func": "export",
      "params": {
        "connectionId": "conn_gdocs_1",
        "documentId": "{{3.documentId}}",
        "mimeType": "application/pdf",
        "fileName": "{{baseName}}.pdf",
        "folderId": "YOUR_OUTPUT_FOLDER_ID"
      }
    },
    {
      "id": "5",
      "name": "Share PDF",
      "type": "google-drive",
      "func": "shareFile",
      "params": {
        "connectionId": "conn_gdrive_1",
        "fileId": "{{4.fileId}}",
        "role": "reader",
        "type": "user",
        "emailAddress": "{{recipientEmail}}",
        "sendNotificationEmail": false
      }
    },
    {
      "id": "6",
      "name": "Email PDF link",
      "type": "gmail",
      "func": "sendEmail",
      "params": {
        "connectionId": "conn_gmail_1",
        "to": "{{recipientEmail}}",
        "subject": "{{docTitle}} — {{fullName}}",
        "htmlBody": "Hi {{fullName}},<br><br>Your document is ready.<br><br>Title: {{docTitle}}<br>Reference: {{certificateId}}<br>Date: {{ formatDate(now; \"YYYY-MM-DD\") }}<br><br>File link: {{5.webViewLink}}",
        "attachments": [ { "fileId": "{{4.fileId}}" } ]
      }
    },
    {
      "id": "7",
      "name": "Log to Google Sheets",
      "type": "google-sheets",
      "func": "appendRow",
      "params": {
        "connectionId": "conn_gsheets_1",
        "spreadsheetId": "YOUR_SPREADSHEET_ID",
        "sheetName": "Generation Log",
        "values": [
          "{{response_id}}",
          "{{3.documentId}}",
          "{{4.fileId}}",
          "{{recipientEmail}}",
          "{{ formatDate(now; \"YYYY-MM-DDTHH:mm:ssZ\"; \"UTC\") }}"
        ]
      }
    }
  ],
  "links": [
    {"from_module": "1", "to_module": "2"},
    {"from_module": "2", "to_module": "3"},
    {"from_module": "3", "to_module": "4"},
    {"from_module": "4", "to_module": "5"},
    {"from_module": "5", "to_module": "6"},
    {"from_module": "6", "to_module": "7"}
  ]
}

F. Minimal “Replace text” fallback (if your plan lacks Create-from-template)

Copy the file, then run multiple replace steps.

{
  "copyTemplate": {
    "type": "google-drive.copyFile",
    "params": { "fileId": "YOUR_DOC_TEMPLATE_ID", "name": "{{baseName}}", "folderId": "YOUR_OUTPUT_FOLDER_ID" }
  },
  "replace1": {
    "type": "google-docs.replaceText",
    "params": { "documentId": "{{copyTemplate.newFileId}}", "search": "{{full_name}}", "replace": "{{fullName}}" }
  },
  "replace2": {
    "type": "google-docs.replaceText",
    "params": { "documentId": "{{copyTemplate.newFileId}}", "search": "{{email}}", "replace": "{{recipientEmail}}" }
  }
  /* add more replace steps as needed */
}

Use Cases / Scenarios

Limitations / Considerations

Fixes (common pitfalls with solutions and troubleshooting)

Diagram

diagram

Budget calculation

Let:

Examples:

Gmail send limits and Typeform response quotas vary by plan. To estimate email capacity:

Cost levers:

Future enhancements

No-Code Alternative (Free)

Make allows mapping Typeform responses directly into Google Docs templates using its document and form modules. It offers a free tier and allows you to design automation with simple drag-and-drop modules—useful if you want to add filters, branching, or additional app integrations later.

You can explore it here (free account): https://www.make.com/en/register?pc=rohit9910

Conclusion

Typeform collects structured inputs. Make orchestrates the run on each submission, normalizes data, selects a template, and generates consistent Google Docs and PDFs. The same mechanism emits certificates, reports, or receipts with traceable IDs and minimal manual work. The design stays template-centric, idempotent, and easy to audit.