Document templates let you design reusable layouts once and generate polished, branded documents from your form record automatically. Instead of copying data into a Word file or a design tool after every submission, you build a template, link it to your form, and let Formaloo fill it in.
Every generated document is saved to the record it was created from, can be downloaded or shared, and can be delivered automatically via email.
When to use document templates
Document templates are useful whenever a record needs to produce a formatted file. Common scenarios:
Agencies: turn a client project request into a branded proposal, invoice, or contract
Education: generate a certificate when a student passes a quiz or completes a course
HR & recruitment: auto-generate offer letters for successful candidates, or training completion certificates for employees
Healthcare: produce lab reports or intake summaries from standardized forms
Any approval workflow: generate a summary document the moment a request is approved
How to create a document template
Open Docs from the left-hand sidebar in your dashboard. This is where all your document templates live – you can review, create, edit, duplicate, or delete them from here.
Click + New template to open the template editor.
➔ Rich text editor
The default view is the Rich text editor. Use it to build your layout visually:
Add and format text,
Insert images (like your logo),
Create tables, add links, and use block elements like quotes and dividers.
It’s the fastest way to get a clean, branded document without writing any code.
➔ HTML editor
For complete design control, switch to the HTML editor. You can paste or write raw HTML and CSS to produce pixel-perfect, fully custom layouts – any font, any structure, any design.
This is the right choice when you need something that looks like it came from a design tool.
👀 Example:
Here’s a simple example of a certificate built in HTML – all the @field_id placeholders get filled in with real record data when the document is generated:
Sample Certificate HTML code
Sample Certificate HTML code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> @import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,300;0,400;0,500;0,600;1,300&display=swap'); :root { --wine: #6b3540; --blush: #d4acad; --paper: #f2ede6; --ink: #3a2a2e; --muted: #9b7f83; --sage: #7a8c6e; } * { margin: 0; padding: 0; box-sizing: border-box; } html, body { font-family: 'DM Sans', sans-serif; background: var(--paper); color: var(--ink); } .page { width: 100%; aspect-ratio: 210 / 297; background: var(--paper); padding: 24px; } .frame { width: 100%; height: 100%; border: 2px solid var(--wine); padding: 8px; } .frame-inner { width: 100%; height: 100%; border: 1px solid var(--blush); display: flex; flex-direction: column; align-items: center; text-align: center; padding: 5% 9%; } .logo-mark { width: 44px; height: 44px; border-radius: 50%; background: var(--sage); display: flex; align-items: center; justify-content: center; margin-bottom: 10px; } .org-name { font-size: 10px; font-weight: 500; letter-spacing: 4px; text-transform: uppercase; color: var(--muted); margin-bottom: 18px; } .double-rule { width: 65%; margin-bottom: 18px; } .double-rule-thick { width: 100%; height: 3px; background: var(--wine); margin-bottom: 3px; } .double-rule-thin { width: 100%; height: 1px; background: var(--wine); } .title-big { font-size: 3.6vw; font-weight: 600; letter-spacing: 8px; text-transform: uppercase; color: var(--ink); margin-bottom: 4px; } .title-sub { font-size: 1.4vw; font-weight: 300; letter-spacing: 5px; text-transform: uppercase; color: var(--ink); } .block { margin-top: 6%; width: 100%; display: flex; flex-direction: column; align-items: center; } .certify-label { font-size: 9px; font-weight: 400; letter-spacing: 3px; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; } .recipient { font-size: 3.4vw; font-weight: 300; font-style: italic; color: var(--ink); line-height: 1; padding-bottom: 8px; border-bottom: 1px solid var(--ink); width: 70%; margin-bottom: 16px; } .body-text { font-size: 11px; font-weight: 300; color: var(--muted); line-height: 1.8; max-width: 80%; } .course-name { font-size: 13px; font-weight: 600; letter-spacing: 1px; text-transform: uppercase; color: var(--ink); margin-bottom: 6px; } .course-detail { font-size: 11px; font-weight: 300; color: var(--muted); } .bottom-row { width: 100%; display: flex; align-items: flex-end; justify-content: space-between; } .sig-block { display: flex; flex-direction: column; align-items: flex-start; } .date-block { display: flex; flex-direction: column; align-items: flex-end; } .sig-line { width: 140px; height: 1px; background: var(--ink); margin-bottom: 6px; } .date-line { width: 110px; height: 1px; background: var(--ink); margin-bottom: 6px; } .col-label { font-size: 9px; font-weight: 400; letter-spacing: 2px; text-transform: uppercase; color: var(--muted); } .date-val { font-size: 12px; font-weight: 300; font-style: italic; color: var(--ink); margin-bottom: 4px; text-align: right; } </style> </head> <body> <div class="page"> <div class="frame"> <div class="frame-inner"> <!-- Logo + org name --> <div class="logo-mark"> <svg viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect x="1" y="1" width="8" height="8" rx="1.5" fill="white"/> <rect x="13" y="1" width="8" height="8" rx="1.5" fill="white" opacity="0.4"/> <rect x="1" y="13" width="8" height="8" rx="1.5" fill="white" opacity="0.4"/> <rect x="13" y="13" width="8" height="8" rx="1.5" fill="white" opacity="0.65"/> </svg> </div> <div class="org-name">Acme Academy</div> <!-- Double rule --> <div class="double-rule"> <div class="double-rule-thick"></div> <div class="double-rule-thin"></div> </div> <!-- Title --> <div class="title-big">Certificate</div> <div class="title-sub">of Completion</div> <!-- Block: certify + recipient name + description --> <div class="block"> <div class="certify-label">This is to certify that</div> <div class="recipient">@participant_name</div> <p class="body-text">has successfully completed all requirements and demonstrated outstanding commitment and proficiency throughout the course.</p> </div> <!-- Block: course details --> <div class="block"> <div class="course-name">@course_title</div> <div class="course-detail">Duration: @course_duration · Final score: @final_score% · Certificate ID: @certificate_id</div> </div> <!-- Block: signatures --> <div class="block" style="margin-top: auto;"> <div class="bottom-row"> <div class="sig-block"> <!-- @instructor_signature — image field piped from the form --> <svg width="130" height="44" viewBox="0 0 130 44" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-bottom:4px"> <path d="M 6,32 C 4,18 10,9 18,15 C 24,20 16,30 22,25 C 28,20 34,12 42,18 C 48,22 42,32 48,27 C 54,22 60,14 68,20 C 74,25 70,33 76,29 C 82,25 88,17 98,23 C 104,27 102,34 108,31 C 114,28 120,22 128,26" stroke="#3a2a2e" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> <path d="M 4,40 C 26,36 54,38 82,37 C 100,36 114,37 126,35" stroke="#3a2a2e" stroke-width="0.7" stroke-linecap="round" opacity="0.3"/> </svg> <div class="sig-line"></div> <div class="col-label">Course Instructor</div> </div> <div class="date-block"> <div class="date-val">@completion_date</div> <div class="date-line"></div> <div class="col-label">Date</div> </div> </div> </div> </div> </div> </div> </body> </html>
➔ Preview your document
While building, switch to the Preview tab at any time to see how the generated document will actually look – with your layout, fonts, and content rendered as the final output.
➔ Personalize your document with @ answer-piping
Answer piping lets you pull record data directly into your template, so each generated document is unique to that record.
Inside the template editor, open the answer piping menu (@) and select a form to see the fields available for it.
Click any field to insert it as a dynamic variable – it gets replaced with the actual submitted value when the document is generated.
➔ With answer piping you can:
Pipe in person's name into a Certificate (
"This certifies that @participant_name has successfully completed") or an Agreement ("This agreement is entered into between Acme Corp and @client_name")Reference any field a user filled in or any variable the logic has calculated in the background: cost estimates, quiz scores, project statuses, dates, assignees, and many more
Include a full summary of the record with
@answered_public
💡 For a full walkthrough of what’s possible, see How to dynamically pull form data into custom emails, PDFs, and AI prompts (supported variables for answer-piping).
How to generate documents
There are four ways to generate a document from a template.
➔ Manually, for any single record
Open your Records table, click Edit next to any record, and scroll to the bottom of the sidebar.
Find Generate PDF using, select a template, and click Generate.
The document appears instantly in the Generated PDFs section of that record, ready to open, download, or print.
➔ Automatically, for every new record
Open the form in the editor, go to Settings on the right,
Scroll down to Generate a PDF for all responses,
Enable the toggle, and select a template.
From that point on, every new submission automatically gets a document generated and saved to it.
This works well when every record should produce the same type of document as soon as it's created – for example, an instant client request summary for your team.
➔ Conditionally, with logic
In Logic → Advanced Logic, under On Submit or On Update, add a rule and choose Generate PDF as the action. Set the conditions that must be met and pick the template to use.
👀 Some examples:
If
Service typeisBranding→ Generate PDF usingBranding ProposalIf
Final score≥90→ Generate PDF usingCourse Completion CertificateIf
Statuschanges toApproved→ Generate PDF usingApproval Summary
➔ Via email notifications
When an email notification fires – either from the Notify tab or from a logic rule – and the email template has a PDF attachment enabled in it, the document is generated and attached to the email and automatically saved to the record.
This means if you’re already sending an email with a document attached, you don’t need a separate Generate PDF logic rule for the same template – it’s handled automatically when the email fires.
How documents are stored and managed
Every generated document is saved in the Generated PDFs section of its record. Open any record to find them there.
Each record will show the full list of generated documents, each with the name (which is a clickable link), the template used, and the timestamp.
For faster access, add a Generated PDFs column to your records table: go to Options → Columns and add it to the visible columns.
ℹ️ A few things worth knowing:
Documents are never overwritten. Each generation creates a new copy, so you always have a full history.
You can regenerate after editing a record – the new document uses the latest data.
All document links are included in exports, synced Google Sheets, webhooks, and API responses.
Sending documents via email
You can attach a generated document to any email notification – whether it’s a simple notification set up in the Notify tab, or a conditional email triggered by a logic rule.
How you enable it depends on which type of email template you’re using.
Using the default email template
In the Notify tab, once the default template is selected, an Attach generated PDF toggle appears below. Enable it and choose a document template.
Using a custom email template
Open the template from your Formaloo dashboard → Emails,
Edit any of your custom email templates (or create a new one),
And enable Attach PDF to email. Pick a document template.
This setting applies every time that email template is triggered – from the Notify tab or from any logic rule.
ℹ️ When a document is generated as part of an email notification, it’s automatically saved to the record, too – no separate Generate PDF logic rule needed for the same template.
Workflow examples
➔ Proposals and invoices
A client fills out a service request form. On Submit, generate a branded proposal PDF using their selections and calculated price. Email it to the client’s email field and CC your team – the document lands in their inbox and is saved to the record automatically.
➔ Course completion certificate
At the end of an online course, a quiz form calculates the final score. A conditional logic rule fires: if Final score ≥ 90, generate a certificate using the Course Completion Certificate template and send it to the learner’s email. If the score is below the threshold, send a different email with no document attached.
➔ Job offer letter
After a candidate clears all stages in your hiring pipeline, an On Update rule triggers when their status changes to “Offer extended.” This generates an offer letter PDF and emails it to the candidate, while also alerting the HR manager with their own copy.
➔ Approval summary on status change
When a request is updated to “Approved,” an On Update rule generates a one-page approval summary PDF – no email needed, just saved to the record for internal reference.
Bottom line
Document templates give you a full document generation system – built directly into your forms and databases.
Design once in the Rich text or HTML editor, link your fields with answer piping, and let Formaloo generate the right document for the right record, at the right moment, automatically.

