Skip to main content

Turn Google Forms responses into certificate PDFs with n8n

Each new form response becomes a certificate built from your own Google Slides template, saved to Google Drive as a deck and a PDF, with the link emailed to the respondent.

Source
Google Forms
Output
Google SlidesPDF (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

    Google Sheets Trigger: Row Added

    Google Forms writes every response to a linked Google Sheet. The trigger outputs one item for each new row.

  2. 02

    Loop Over Items: Batch Size 1

    The SourceToDocs node starts one run for all the items it receives. The loop hands it one response at a time, so every respondent gets a separate run and a separate certificate.

  3. 03

    SourceToDocs: Document, Generate

    Rows Come From is set to the Map Columns mode. Name and Course come from the response; Date is the day the workflow runs. Because this is a single run, switching on Also generate PDF delivers a PDF beside the Google Slides file.

  4. 04

    Gmail: Message, Send

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

Google Forms fields and the template placeholders they fill
Google Forms field Template placeholder
Full name {{ name }}
Course {{ course }}
(run date) {{ date }}

Or have Claude set it up

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

Use the certificates skill. The people are in my Google Forms response sheet "Course completion (Responses)", one row per person, with the columns Full name, Course, Completion date and Email. I will pick the sheet, the Google Slides certificate template and the Drive folder when you ask. Before you set anything up, tell me how many people are on the list and explain my options for PDFs. Show me one certificate before you generate the rest.

Get the skill file

To create a certificate from every Google Forms response in n8n, trigger on the new row in the form’s response sheet, pass that row to the SourceToDocs node to fill your Google Slides certificate template, and email the link the node returns. Each response is its own run, which is what lets SourceToDocs deliver a PDF next to the Google Slides file. The build is four nodes, described below.

What you need

  • A Google Form linked to a Google Sheet (Responses, then Link to Sheets), with questions titled Full name, Course and Email.
  • A one-slide certificate template in Google Slides with just the placeholders {{ name }}, {{ course }} and {{ date }}. The certificate of completion template is a fuller, multi-slide design with its own placeholder names: a design reference, not a drop-in file.
  • 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, separate Google Slides and Google Drive connections, for the template and for delivery.
  • n8n, Cloud or self-hosted, with the SourceToDocs node installed. On a self-hosted instance that is Settings, then Community nodes, then Install, with the package name @twovmodules/n8n-nodes-sourcetodocs; on n8n Cloud, add it from the nodes panel, where it has a verified listing.
  • Google credentials in n8n for Google Sheets and Gmail.

Set up the document in SourceToDocs

The template and its settings live in SourceToDocs. n8n only sends the row.

  1. Create a Google Slides document.
  2. Upload a small CSV with the header row Name, Course, Date 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 Name is {{ name }}.
  4. Bind the slide to the data: Add Subset on the data set, add a dynamic_slide entry on that subset in Template Config, pick your template in Presentation Access, then map the entry to the slide in the Slide Editor and press Save Mappings. A Slides document will not generate until both are done. The Slide Editor lists the slide’s placeholders as Matched, Available or Unresolved.
  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. Connect the loop output of Loop Over Items to SourceToDocs, SourceToDocs to Gmail, and Gmail back into Loop Over Items.

NodeOperationKey settings
Google Sheets TriggerTrigger On: Row AddedDocument: the form’s response spreadsheet. Sheet: the responses tab.
Loop Over ItemsBatch Size: 1No other settings.
SourceToDocsResource: Document. Operation: GenerateDocument: your certificate document. Rows Come From: This Workflow — Map Columns. Data Set: the one with Name, Course and Date. Columns: see below. Wait for Completion stays on, which is the default.
GmailResource: Message. Operation: SendTo, Subject and Message: see below.

The three column values in the SourceToDocs node:

ColumnValue
Name{{ $json['Full name'] }}
Course{{ $json['Course'] }}
Date{{ $now.toFormat('d LLLL yyyy') }}

The Gmail fields:

FieldValue
To{{ $('Loop Over Items').item.json['Email'] }}
SubjectYour certificate for {{ $('Loop Over Items').item.json['Course'] }}
MessageYour certificate is ready: {{ $json.deliveries[0].result.pdf_url }}

If your form questions have other titles, change the bracketed names to match. The Column names are the data set’s column names, case included, not the template placeholders, which use the aliases.

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 Slides file 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 the respondent 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).

When n8n’s Google Slides node is enough

n8n’s own Google Slides node can create a presentation, read one and replace text in it. If the certificate is three words swapped into a copy of one file, that node and the Google Drive node will do it: copy the template, replace each placeholder, export the PDF and move the file, each as its own step. The SourceToDocs node does the same job as one Generate step from a template a designer can keep editing. The n8n node page has the comparison table.

Certificates in batches

A course that ends on one day does not need a trigger per person. Read the attendee rows with a Google Sheets node, send them all in one run, and let a split document produce one file per attendee. That run produces Google Slides files without PDFs.

Do it with Claude instead

If you would rather ask for the certificates than build a workflow, the certificates skill lets Claude do the setup through the SourceToDocs connector. Claude reads the columns of your response sheet or a CSV export of it, checks them against the placeholders on your certificate slide, binds the slide to the list, sets the Google Drive folder and starts the run. You connect Google and pick the sheet, the template and the folder yourself from links Claude gives you. Claude cannot edit the template.

Three things to know before you choose this route:

  • Claude prints what is in the sheet, under the sheet’s own column names. The workflow above renames Full name to Name and fills in the date itself; Claude does neither. For this route the sheet needs a date column, which the list under What you need does not include: add a Completion date question to the form, or a column to the response sheet. The slide then carries the aliases of the sheet’s columns, {{ full_name }}, {{ course }} and {{ completion_date }}, in place of {{ name }} and {{ date }}. The prompt at the top of this page assumes those four columns.
  • Claude works when you ask, from the responses that are in the sheet at that moment. It does not react to a new response. A certificate the minute someone submits the form is the n8n workflow above.
  • The PDF rule is the same as in n8n. A run that splits into one file per person delivers Google Slides files and no PDFs. Claude asks which you want before it configures anything: one deck with a slide per person and one PDF of the whole deck, one Slides file per person with no PDFs, or one run per person so that each gets a PDF. The last one is a run for every person on the list, so for a long list the workflow above is the better fit.

Where this fits

A row, a template and a destination: the same pattern sits behind most generated documents. The document automation guide covers it beyond certificates.

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 four nodes and their settings above are everything the workflow contains, so you can build it by hand.
Do I need Google Apps Script? +
No. The workflow is four n8n nodes and two short expressions. The certificate layout lives in a Google Slides template you edit like any other deck.
Can it create certificates for a whole class at once? +
Yes, with a different setup: send all the rows in one run and set the SourceToDocs document to split one file per person, with its data set on Only matching rows. A split run delivers the Google Slides files and no PDFs, so keep one response per run, as on this page, when each person needs a PDF.
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 the Download operation, then attach the downloaded file in the Gmail node. SourceToDocs itself returns links, never file contents.