PDFPipe

Guide

HTML to PDF in Make (Integromat)

Make lets you wire together hundreds of apps without writing a server. This guide shows how to add PDF generation to any scenario using the HTTP module, turning a form submission, a spreadsheet row, or a CRM event into a finished PDF document in a few clicks.

Overview

The approach is straightforward: place a HTTP › Make a Request module anywhere in your scenario, point it at https://api.pdfpipe.xyz/v1/pdf, and pass your HTML as the request body. The module returns a JSON response containing either the raw PDF bytes or a hosted download URL, depending on whether you set store: true.

Because the HTTP module is a built-in Make primitive, this works with every trigger Make supports: Google Sheets, Airtable, HubSpot, Typeform, Webhooks, and the rest. No custom app or plugin required.

HTTP module configuration

Add an HTTP › Make a Request module to your scenario. Fill in each field as follows.

FieldValue
URLhttps://api.pdfpipe.xyz/v1/pdf
MethodPOST
HeadersAuthorization: Bearer {{your_api_key}}
Content-Type: application/json
Body typeRaw
Content typeJSON (application/json)
Request contentJSON object (see below)
Parse responseYes

For the Request content field, enter a JSON object. The example below maps the html field from a previous module (bundle item 1) and requests A4 page format. Setting store: true tells the API to host the PDF and return a download URL instead of binary bytes, which is easier to pass between Make modules.

json
{
  "html": "{{1.html}}",
  "store": true,
  "options": {
    "format": "A4"
  }
}

Replace {{1.html}}with whatever mapped value holds your HTML string. If you are building the HTML inline, use Make's text template or a Tools › Set Variable module earlier in the scenario to assemble it first.

Getting the PDF URL

When store: true is set, the JSON response from the HTTP module includes a document_url field. This is a time-limited direct download link to the rendered PDF.

json
{
  "success": true,
  "document_url": "https://storage.pdfpipe.xyz/documents/abc123.pdf",
  "pages": 1
}

In subsequent Make modules, map this as {{<http_module_number>.data.document_url}}. For example:

  • Pass it as the body text in a Gmail › Send an Email module.
  • Use it as the file URL in a Google Drive › Upload a File module (set the source to URL).
  • Store it in an Airtable or HubSpot field so the record links directly to the PDF.

Full scenario example

The example below describes a three-module scenario that generates and emails a PDF whenever a new row appears in a Google Sheet.

  1. Google Sheets › Watch New Rows: triggers when a row is added. Columns: name, email, amount.
  2. HTTP › Make a Request: calls PDFPipe with an HTML invoice built from the row values (see template below).
  3. Gmail › Send an Email: sends the PDF URL to {{1.email}} with the download link in the body.

For the HTTP module request content, use a Make text template to inject the sheet values into the HTML. The cleanest approach is to build the HTML string in a Tools › Set Variable module first, then reference that variable in the HTTP request content. Here is the template for the Set Variable value:

html
<html>
  <body style="font-family: sans-serif; padding: 48px; color: #1d1812;">
    <h1 style="font-size: 28px; margin-bottom: 8px;">Invoice</h1>
    <p style="margin: 0; color: #6b5e52;">Prepared for {{1.name}}</p>

    <table style="width: 100%; border-collapse: collapse; margin-top: 32px;">
      <thead>
        <tr style="border-bottom: 2px solid #1d1812; text-align: left;">
          <th style="padding: 8px 16px 8px 0; font-size: 12px;">Description</th>
          <th style="padding: 8px 0; font-size: 12px; text-align: right;">Amount</th>
        </tr>
      </thead>
      <tbody>
        <tr style="border-bottom: 1px solid #e5ddd0;">
          <td style="padding: 12px 16px 12px 0;">Services rendered</td>
          <td style="padding: 12px 0; text-align: right;">{{1.amount}}</td>
        </tr>
      </tbody>
    </table>

    <p style="margin-top: 32px; font-size: 13px; color: #6b5e52;">
      Thank you for your business.
    </p>
  </body>
</html>

In the HTTP module request content, reference the variable you just set: {{2.value}} (where 2 is the Set Variable module number). The full request content becomes:

json
{
  "html": "{{2.value}}",
  "store": true,
  "options": {
    "format": "A4"
  }
}

Storing your API key securely

Avoid pasting your API key directly into the HTTP module header field. Make provides two better options.

Option 1: Make Data Store

Create a Data Store with a single record holding your key (for example, a store named Config with a field pdfpipe_key). Add a Data Store › Get a Record module at the start of your scenario and map the key into the HTTP Authorization header: Bearer {{1.pdfpipe_key}}.

The key lives in the Data Store, not in the scenario definition. Anyone with scenario access cannot read it directly without also having Data Store access.

Option 2: Custom variable in scenario settings

Open the scenario's Settings panel and define a custom variable named PDFPIPE_KEY. Reference it in any module field with the standard double-brace syntax. This is the quickest option and keeps the key out of module configurations.

Whichever option you choose, never paste the raw key into a module header field directly: it will be visible to anyone who can view the scenario blueprint, and it travels in plain text through Make's export/import flow.

Test your HTML in the live playground on the home page before wiring up the scenario, then read the docs for every rendering option (margins, orientation, landscape mode, custom headers and footers).

Get an API key →