Zapier's own use-case page for turning form submissions into PDFs lists pre-built templates combining form apps with PlatoForms, CraftMyPDF and PDF Maker, but leaves out how to build a direct API pipeline yourself. Meanwhile, community threads from 2023–2025 asking how to dynamically generate PDFs from form data remain unanswered or end with workarounds costing $300–400/month [1]. The pattern that actually works: trigger on any form submission, POST the mapped fields as JSON to a template-based rendering API, and receive a hosted PDF URL you can email, store, or attach. MarkupGo's POST /api/v1/pdf endpoint accepts a template ID plus context data and returns a file URL [2], with a 100-credit/month free trial that lets you prototype the entire Zap without a credit card [3].
Log into the MarkupGo dashboard and navigate to Templates. Create a new template with Handlebars placeholders for the fields your form collects: {{clientName}}, {{serviceType}}, {{amount}}, {{submittedAt}}. Use a fixed width container (around 800px for A4-friendly rendering), print-safe margins of at least 40px, and load web fonts via @import or <link> tags rather than @font-face declarations with local files.
Enable the Magic Template URL option in the template settings, then hit the preview URL directly in your browser [4]:
https://render.markupgo.com/template/{your-template-id}.pdf?clientName=Test%20User&serviceType=Consulting&amount=250
If the PDF renders with your test data populated, your template is solid. Keep Magic URL enabled if you want the no-code GET variant later—it saves a step in simple Zaps.
Create a new Zap. For your trigger, choose your form tool's "New Submission" or "New Response" event. This works with Typeform, Tally, Jotform, Google Forms, or any other form app that Zapier supports among its 9,000+ integrations.
Add a Formatter by Zapier step if your form data needs cleanup. Split full names into first and last, format phone numbers, or convert date strings to ISO format.
Map each form field to a named variable you'll reference in the JSON body. If your form has conditional fields that may be empty, note which ones; you'll handle those in the API request.
Add a Webhooks by Zapier step and choose Custom Request.
Set the method to POST and the URL to https://api.markupgo.com/api/v1/pdf [2]. Add two headers:
Content-Type: application/jsonx-api-key: your MarkupGo API key (find this in your dashboard under Settings → Tokens)In the Data field, switch to Raw and build this JSON structure [2]:
{
"source": {
"type": "template",
"data": {
"id": "your-template-id",
"context": {
"clientName": "{{step_1_field_clientName}}",
"serviceType": "{{step_1_field_serviceType}}",
"amount": "{{step_1_field_amount}}",
"submittedAt": "{{step_1_field_submittedAt}}"
}
}
},
"options": {
"properties": {
"printBackground": true,
"margins": {
"top": 10,
"bottom": 10,
"left": 10,
"right": 10
}
}
},
"expiration": {
"expiresInSeconds": 604800
}
}
Replace the {{step_1_field_...}} values with the actual dynamic insertions from your trigger step. The expiration field is optional but recommended for anything containing PII. Set expiresInSeconds to 3600 for one hour, 604800 for seven days, or up to 7776000 for ninety days [2]. Expired files are swept every minute, though they may remain reachable for up to about sixty seconds past the requested expiration [2].
Test this step. The response contains a task object with a url field pointing to your generated PDF on files.markupgo.com [2].
Add a Gmail step to send the PDF to the form submitter. Put the PDF URL in the email body, or use Zapier's "Attach file from URL" option if you want a true attachment rather than a link.
For internal records, add a Google Drive step with the "Upload file from URL" action. Point it to the url from the MarkupGo response and specify your target folder. The PDF will be pulled from MarkupGo's hosting and saved to your Drive within seconds.
You can also add a Google Docs step to insert the PDF link as a footnote in a running log document, or send it to Slack, Airtable, or any other destination Zapier supports.
Submit real data, trace through each Zap step, and verify the PDF renders correctly with all mapped fields populated. If a field appears blank, check that the Handlebars placeholder name exactly matches the key in your context object.
The perpetual free trial grants 100 credits per month with no credit card required [3]. Typically one API request equals one credit, so you can build and test this entire workflow without spending anything [5].
When you're ready to scale, choose the plan that matches your volume:
Magic Template URL requests cache for 15 days on identical URLs, meaning repeat requests cost no additional credits during that window [4].
For simpler Zaps where you don't need to manipulate the response before delivery, bypass the Custom Request step entirely. Build a Magic Template URL directly in your form data [4]:
https://render.markupgo.com/template/{templateId}.pdf?clientName={{clientName}}&serviceType={{serviceType}}&amount={{amount}}
Use this URL as the attachment link in a Gmail step, or as the file URL in a Google Drive upload. No API call, no headers, no JSON body. The same 15-day cache applies: identical URLs cost no extra credits [4].
This approach works best when your form data fits cleanly in query parameters and you don't need custom PDF options like margins or headers. It's also useful for giving end users a direct "download your PDF" link without building a full API integration.
After your Zap is live, submit a few test forms with edge cases: long names, special characters, empty optional fields, and large numbers. Check that your template's CSS handles overflow gracefully and that Handlebars doesn't break on missing keys.
Track your credit usage in the MarkupGo dashboard. The analytics page shows total created tasks, downloads, views, and bandwidth consumed. If you're burning credits faster than expected, check whether a loop in your Zap is triggering duplicate requests, or whether your Magic Template URLs are changing on every request and busting the cache.
If you need to generate more than PDFs from the same form data, reuse the template for images too. The same template ID works with .png or .jpeg extensions in the Magic URL, or with the /api/v1/image endpoint using an identical body structure.