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
- 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.
- 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.
- 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.
- 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 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.
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,CourseandEmail. - 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.
- Create a Google Slides document.
- Upload a small CSV with the header row
Name,Course,Dateand 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. - Each column gets an alias, a snake-case identifier derived from its name. The template uses the alias: column
Nameis{{ name }}. - Bind the slide to the data: Add Subset on the data set, add a
dynamic_slideentry 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. - Add a Google Drive distribution and choose the folder.
- Switch on Also generate PDF in the Output card.
- 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.
| Node | Operation | Key settings |
|---|---|---|
| Google Sheets Trigger | Trigger On: Row Added | Document: the form’s response spreadsheet. Sheet: the responses tab. |
| Loop Over Items | Batch Size: 1 | No other settings. |
| SourceToDocs | Resource: Document. Operation: Generate | Document: 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. |
| Gmail | Resource: Message. Operation: Send | To, Subject and Message: see below. |
The three column values in the SourceToDocs node:
| Column | Value |
|---|---|
| Name | {{ $json['Full name'] }} |
| Course | {{ $json['Course'] }} |
| Date | {{ $now.toFormat('d LLLL yyyy') }} |
The Gmail fields:
| Field | Value |
|---|---|
| To | {{ $('Loop Over Items').item.json['Email'] }} |
| Subject | Your certificate for {{ $('Loop Over Items').item.json['Course'] }} |
| Message | Your 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.
Which link to send
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 nametoNameand 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 aCompletion datequestion 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
- document automation: the full guide this recipe belongs to.
- Free certificate of completion template for Google Slides: the template this workflow fills.
- The SourceToDocs n8n node: every action and setting.
- The SourceToDocs MCP server: what Claude can do through the connector.