Skip to main content

Turn each Typeform response into a PDF with n8n

Every Typeform submission becomes a formatted Google Doc and a PDF in Google Drive, built from your own template, with the link emailed to the respondent or your team.

Source
Typeform
Output
Google DocsPDF (single runs only)
Delivered to
Google Drive

n8n workflow

The importable workflow file for this recipe is being tested and will be added here. The steps below show exactly what it does, so you can build it now in a few minutes with the SourceToDocs n8n node.

How the workflow runs

  1. 01

    Typeform Trigger: your form

    Starts the workflow on each submission of the form you pick in Form Name or ID. Simplify Answers and Only Answers stay on, the defaults, so the item is a flat list of question titles and answers.

  2. 02

    SourceToDocs: Document, Generate

    Rows Come From is set to the Map Columns mode. Name, Email, Company and Request come from the answers; Submitted is the day the workflow runs. One submission is one run, so switching on Also generate PDF delivers a PDF beside the Google Doc.

  3. 03

    Gmail: Message, Send

    The node's output carries file_url, file_name and a deliveries list. The email goes to the address typed into the form, or to a fixed team address, with the PDF link taken from the Google Drive delivery.

Typeform fields and the template placeholders they fill
Typeform field Template placeholder
Full name {{ name }}
Email {{ email }}
Company {{ company }}
Request {{ request }}
(run date) {{ submitted }}

Or have Claude set it up

The Form responses to PDF skill works through the SourceToDocs connector at https://app.sourcetodocs.com/api/mcp. Install the skill, connect, then paste:

Use the form-to-pdf skill. I exported my Typeform responses as a CSV, attached here: one row per response, with the columns Name, Email, Company, Request and Submitted. Create a Google Docs document in SourceToDocs from it, with a PDF for each response. I will pick the Google Docs template and the Drive folder "Form responses" when you send me the links. Show me the placeholder mapping and tell me how many runs it takes before you run anything, then generate the first response only.

Get the skill file

To turn a Typeform response into a PDF with n8n, start the workflow with the Typeform Trigger, pass the answers to the SourceToDocs node to fill your Google Docs template, and email the link the node returns with Gmail. Each submission is its own run, which is what lets SourceToDocs save a PDF next to the Google Doc in your Drive folder. The build is three nodes, described below.

What you need

  • A Typeform form with questions titled Full name, Email, Company and Request. Other titles work; you change the expressions to match.
  • A template in Google Docs with the placeholders {{ name }}, {{ email }}, {{ company }}, {{ request }} and {{ submitted }}, laid out the way the finished document should look: your logo, headings, a table, fixed text around the answers.
  • A SourceToDocs workspace and an API token for it. A workspace owner or admin creates the token on the API Tokens page.
  • On the Accounts page, a Google Docs connection for the template and a Google Drive connection for delivery. Every tile is a separate connection: Google Drive does not cover Google Docs.
  • n8n, self-hosted or Cloud, with the SourceToDocs node installed. In n8n, open Settings, then Community nodes, and install @twovmodules/n8n-nodes-sourcetodocs. On n8n Cloud, add it from the nodes panel, where it is listed as a verified node.
  • A Typeform credential and a Gmail credential in n8n.

Set up the document in SourceToDocs

SourceToDocs has no Typeform connection. The template and its settings live in SourceToDocs, and n8n sends the answers.

  1. Create a Google Docs document.
  2. Upload a small CSV with the header row Name, Email, Company, Request, Submitted and one sample line as the data source; it becomes a data set. The sample is enough, because the workflow sends the real rows in place of reading the source.
  3. Each column gets an alias, a snake-case identifier derived from its name. The template uses the alias: column Submitted is {{ submitted }}.
  4. On the Document step, pick your Google Doc. Its Variables panel lists the exact placeholders for your data set; click one to copy it.
  5. Add a Google Drive distribution and choose the folder.
  6. Switch on Also generate PDF in the Output card.
  7. Leave split off. A split document produces no PDFs.

Build it in n8n

Add the nodes in this order and connect them in a line. A submission arrives as one item, so no loop is needed.

NodeOperationKey settings
Typeform TriggerStarts on a form submissionForm Name or ID: your form. Simplify Answers and Only Answers stay on, which is the default.
SourceToDocsResource: Document. Operation: GenerateDocument: your form response document. Rows Come From: This Workflow — Map Columns. Data Set: the one with the five columns. Columns: see below. Wait for Completion stays on, which is the default.
GmailResource: Message. Operation: SendTo, Subject and Message: see below.

The five column values in the SourceToDocs node:

ColumnValue
Name{{ $json['Full name'] }}
Email{{ $json['Email'] }}
Company{{ $json['Company'] }}
Request{{ $json['Request'] }}
Submitted{{ $now.toFormat('d LLLL yyyy') }}

The Gmail fields:

FieldValue
To{{ $('Typeform Trigger').first().json['Email'] }}
SubjectYour request: a copy for your records
MessageHere is a copy of what you sent us: {{ $json.deliveries[0].result.pdf_url }}

With Simplify Answers on, the trigger’s item uses your question titles as field names. Run the trigger once with a test submission, look at its output, and change the bracketed names to the titles you see. The Column names are the data set’s column names, case included, not the template placeholders, which use the aliases.

To send the document to your team instead of the respondent, type a fixed address into To.

The SourceToDocs node returns file_url and file_name at the top level of its output. With Also generate PDF on and a Google Drive destination, the deliveries list holds one entry per destination, and a Drive entry’s result carries drive_url for the Google Doc and pdf_url for the PDF. The Message above uses the first entry, which is correct when the document has one destination.

The file sits in your Drive folder, so a respondent outside your organisation can open the link only if that folder’s sharing allows it. Share the folder so that anyone with the link can view it, or attach the PDF instead (see the FAQ). A team address that already has access to the folder needs neither.

The same build for Jotform and Tally

Only the first node changes.

  • Jotform: n8n has a Jotform Trigger node. Pick the form in Form Name or ID and leave Resolve Data and Only Answers on, so the item carries the question names.
  • Tally: n8n has no built-in Tally trigger. Add a webhook to the form in Tally’s integrations and point it at an n8n Webhook node, or install the community Tally Trigger node if your n8n allows community nodes.

Each tool shapes its answers differently, so run the trigger once, read the output and adjust the five expressions in the SourceToDocs node. The rest of the workflow stays as it is.

The Claude route

With the SourceToDocs connector added to Claude and the form-to-pdf skill installed, Claude can do the setup above for you: create the document, attach your data, read the template’s placeholders, show you the mapping, set the Drive delivery with a PDF and start the runs, one run per response, because a PDF comes with a single run only. You pick the template and the Drive folder through links Claude sends you, and you edit the template itself in Google Docs. The MCP page explains how to connect it.

The limit: Claude cannot read Typeform through SourceToDocs, and a new submission does not start it. Export the responses from Typeform as a CSV, or keep them in a Google Sheet or an Airtable base, and hand that to Claude. That suits one response or a handful you already have. For a long backlog Claude can set the document to split instead, which gives one Google Doc per response in a single run and no PDFs. To react to each new submission as it arrives, use the n8n workflow on this page.

Where this fits

A form answer, a template and a destination: the same pattern sits behind most generated documents. The document automation guide covers it beyond form responses, and the automations library has the other recipes.

Related

Common questions, answered

Is there a workflow file to import? +
Not yet. The importable file is being tested and will be added to this page. Until then, the three nodes and their settings above are everything the workflow contains, so you can build it by hand.
Does SourceToDocs connect to Typeform directly? +
No. SourceToDocs reads Airtable, Google Sheets and uploaded CSV files, or takes rows from an n8n workflow. Here n8n receives the submission from Typeform and passes the answers to the SourceToDocs node.
Can the email carry the PDF as an attachment instead of a link? +
Yes. The Drive delivery in the node's output also holds pdf_file_id. Pass it to n8n's Google Drive node with its download operation, then attach the downloaded file in the Gmail node. SourceToDocs itself returns links, never file contents.
What happens to questions the respondent skipped? +
A placeholder with no value renders blank, and the run still succeeds. If a whole section should disappear when an answer is empty, wrap it in an if block in the Google Docs template.
Can I turn the responses I already have into PDFs? +
Not with this trigger, which only fires on new submissions. Export the existing responses from Typeform as a CSV. A PDF per response means one run per response: feed the rows to the same SourceToDocs node through a Loop Over Items node with Batch Size 1, or ask Claude with the form-to-pdf skill. A split document produces one Google Doc per response in a single run, and no PDFs.