Make Tutorial

Automate Invoice Generation with Make

Connect Stripe, Gumroad, or any payment platform to auto-generate and send professional invoices using Make's visual scenario builder and iteration modules.

Vincent Ventalon
Vincent Ventalon

Why automate invoices?

You just got a payment notification. Now you need to create an invoice — open your template, copy the customer details, add line items, double-check the math, export to PDF, attach it to an email. For one order? Fine. For 10 a day? That's your entire morning gone.

Stripe's built-in invoices work, but they look like everyone else's. Same layout, same font, same "powered by Stripe" branding. If you're running a serious business, you probably want something that actually looks like your business.

Here's what we're building: a Make scenario that fires whenever you get paid, generates a branded PDF invoice with all the details, and emails it to your customer. Make is ideal here because its visual builder, iteration modules, and data transformers make it easy to handle bulk invoicing and complex data mapping.

1

Create your invoice template

1.1 — Choose a template

Start with one of our pre-built invoice templates or create your own:

  1. Go to Templates
  2. Filter by Invoice category
  3. Choose a template that matches your style (minimal, corporate, creative)
  4. Click Use Template to add it to your dashboard

This tutorial uses the Freelancer Consultant Invoice template. It's clean, supports VAT and IBAN fields, and works well for both freelancers and small businesses.

Other options: European Corporate for enterprise invoicing, Modern with QR Code for instant payments.

Screenshot: Freelancer Consultant Invoice template in the template gallery

1.2 — Understand the template structure

The template uses dynamic fields that get replaced with real data. Some fields you'll hardcode (your company info), others come from Make (client, invoice details).

Freelancer Consultant invoice template in the visual editor showing dynamic fields

Hardcode once (your company)

  • company_name — Your business name
  • company_address — Your address
  • company_vat — Your VAT number
  • iban, bic, bank_name — Bank details

Edit these directly in the template — they stay the same for every invoice.

Dynamic from Make (per invoice)

  • client_company — Customer name
  • client_address — Customer address
  • invoice_number — Unique invoice ID
  • invoice_date, due_date — Dates
  • items[] — Line items array

Map these from your payment platform in the Make scenario.

Auto-expanding line items table

The items table automatically repeats for each product in the items array. Send 2 items, get 2 rows. Send 10 items, get 10 rows.

Each row uses:
{{items.description}} — Service name
{{items.amount_excl_vat}} — Price before tax
{{items.vat_rate}} — Tax rate (20%)
{{items.vat_amount}} — Tax amount

Automatic totals with expressions

The template calculates subtotal, VAT, and total automatically using sum() expressions. You don't need to calculate these in Make.

Subtotal: {{sum(items, 'amount_excl_vat')}}
VAT: {{sum(items, 'vat_amount')}}
Total: {{sum(items, 'amount_excl_vat') + sum(items, 'vat_amount')}}

Page numbers (for multi-page invoices)

The footer shows page numbers using system variables. If your invoice has many line items and spans multiple pages, pagination is automatic.

{{sys.page_number}} / {{sys.total_pages}}→ 1 / 2

1.3 — Test with the Preview tab

The Preview tab lets you test your template with sample data before building the Make scenario. The JSON panel on the right contains your test data, and the rendered invoice appears on the left in real-time.

1

JSON data maps to template fields

Each key in the JSON (like client_company) fills its matching {{client_company}} placeholder.

2

Line items array becomes table rows

The objects in the items array generate table rows automatically.

3

Totals calculate automatically

The sum() expressions add up all values across the items array.

Tip: Use the Copy Payload button to copy the JSON structure. This is the exact format you'll need to send from the Make HTTP module.

View full JSON payload example
{
"company_name": "Jane Smith Consulting",
"company_address": "15 Baker Street, London W1U 3BW",
"company_email": "jane@smithconsulting.co.uk",
"company_vat": "GB 123 4567 89",
"client_company": "Acme Corp Ltd",
"client_address": "100 Market Street, Manchester M1 1PD",
"client_vat": "GB 987 6543 21",
"invoice_number": "INV-2026-0087",
"invoice_date": "March 15, 2026",
"due_date": "April 14, 2026",
"payment_terms": "Net 30",
"iban": "GB29 NWBK 6016 1331 9268 19",
"bic": "NWBKGB2L",
"bank_name": "NatWest",
"notes": "Thank you for your business.",
"items": [
{
"description": "UX Research & Analysis",
"amount_excl_vat": 2400,
"vat_rate": "20%",
"vat_amount": 480
},
{
"description": "Wireframes & Prototyping",
"amount_excl_vat": 3600,
"vat_rate": "20%",
"vat_amount": 720
},
{
"description": "Design System Setup",
"amount_excl_vat": 5200,
"vat_rate": "20%",
"vat_amount": 1040
}
]
}
2

Build your Make scenario

The scenario runs automatically. Payment hits Stripe, invoice lands in your customer's inbox. Here's the module flow:

Scenario flow:
Stripe (trigger) → Data Transformer (optional) → HTTP Module (TemplateFox API) → Gmail (send invoice)

Screenshot: Complete Make scenario overview showing the module flow from trigger to email

2.1 — Set up the trigger

Choose your payment platform and trigger event. Each platform has a native Make module:

S

Stripe

Module: Watch Events → filter by payment_intent.succeeded

G

Gumroad

Module: Watch Sales — triggers on every new purchase

L

LemonSqueezy

Module: Watch Orders or use a Webhook trigger

P

Paddle

Module: Watch Events → filter by transaction.completed

  1. Go to make.com and create a new scenario
  2. Click the + button to add your first module
  3. Search for your payment platform (e.g., Stripe)
  4. Select the appropriate trigger event
  5. Connect your account and run once to pull sample data

Testing with Stripe Test Mode

Connect Make using your test secret key (starts with sk_test_). Then create a test payment in Stripe Dashboard:

  • Card: 4242 4242 4242 4242
  • Expiry: any future date (e.g., 10/30)
  • CVC: 123

Screenshot: Make scenario with Stripe trigger module showing sample payment data

2.2 — Add the HTTP module

Make doesn't have a native TemplateFox module (yet), so you'll use the built-in HTTP "Make a request" module to call the API directly. This is actually more flexible — you get full control over the request body.

  1. Click + after your trigger module
  2. Search for HTTP → select Make a request
  3. URL: https://api.pdftemplateapi.com/v1/pdf
  4. Method: POST
  5. Headers: add two rows:
    • x-api-key: your API key (from the TemplateFox dashboard)
    • Content-Type: application/json
  6. Body type: Raw
  7. Content type: JSON (application/json)
  8. Request content: paste the JSON body (see below)

The request body maps your Stripe data to the template fields. Use Make's variable picker to insert data from the trigger:

{
"template_id": "your-template-id-here",
"data": {
"client_company": {{stripe.customer.name}},
"client_address": {{stripe.customer.address}},
"invoice_number": "INV-{{stripe.payment_intent.id}}",
"invoice_date": {{formatDate(now; "MMMM D, YYYY")}},
"due_date": {{formatDate(addDays(now; 30); "MMMM D, YYYY")}},
"items": [
{
"description": {{stripe.line_items.description}},
"amount_excl_vat": {{stripe.line_items.amount / 100}},
"vat_rate": "20%",
"vat_amount": {{stripe.line_items.tax / 100}}
}
]
}
}

Tip: Hardcode your company info (address, IBAN, VAT) directly in the template editor. Only map dynamic data like customer name and amounts from the trigger module. This keeps the HTTP request body simpler.

Stripe amounts: Stripe sends amounts in cents (e.g., 2500 = $25.00). Use Make's built-in math to divide by 100, or use a data transformer module to convert before the HTTP call.

Screenshot: Make HTTP module configuration showing URL, headers, and JSON body with mapped Stripe variables

2.3 — Handle the response

The HTTP module returns a JSON response from the TemplateFox API. The key field is pdf_url — a direct link to the generated invoice PDF.

{
"pdf_url": "https://storage.pdftemplateapi.com/pdfs/abc123.pdf",
"credits_remaining": 142
}

Make automatically parses the JSON response. In the next module, you can reference pdf_url directly from the HTTP module's output using the variable picker.

Important: Make sure Parse response is enabled in the HTTP module settings (it is by default). This lets subsequent modules access the JSON fields directly.

2.4 — Send via email

Add an email module to automatically send the invoice to your customer:

  1. Click + after the HTTP module
  2. Add Gmail, Microsoft 365 Email, or SMTP
  3. Select "Send an Email"
  4. To: map to the customer's email from the trigger module
  5. Subject: Invoice #{{invoice_number}} from Your Company
  6. Body: write a brief message with payment confirmation
  7. Attachments: use the pdf_url from the HTTP module response

That's it. Payment comes in, invoice goes out. Your customers get professional documentation, and you didn't lift a finger. Turn the scenario on and it runs 24/7.

Screenshot: Final generated invoice PDF with all data filled in automatically

3

Scale with iteration

The basic scenario above handles one invoice per payment. But Make really shines when you need to process invoices in bulk — generating dozens or hundreds at once from a spreadsheet, database, or batch of transactions.

3.1 — Bulk invoicing with the Iterator module

Make's Iterator module splits an array into individual items and processes each one separately. This is perfect for generating invoices from a batch of records — like rows in Google Sheets or records in Airtable.

Batch invoicing flow:
Google Sheets (Watch Rows) → Iterator → HTTP (TemplateFox API) → Gmail → Google Sheets (Update Row)

Here's how to set it up:

  1. Use Google Sheets → Search Rows as the trigger (filter for rows where "Invoice Sent" = FALSE)
  2. Add a Flow Control → Iterator module
  3. Point the Iterator at the array of rows from Google Sheets
  4. Add the HTTP module (same config as step 2.2) — it runs once per row
  5. Add the Gmail module to send each invoice
  6. Add Google Sheets → Update Row to set "Invoice Sent" = TRUE

Rate limits: Make processes Iterator items sequentially, not in parallel. For large batches (100+ invoices), consider scheduling the scenario to run during off-peak hours. The TemplateFox API handles concurrent requests well, but email providers may have sending limits.

Screenshot: Make scenario with Iterator module showing batch invoice processing flow

3.2 — Conditional routing

Make's Router module lets you branch your scenario based on conditions. Use this to send different invoice templates depending on the transaction type, region, or amount.

By region

EU customers get a VAT-compliant template with IBAN details. US customers get a simpler template with USD formatting.

By amount

Orders over $1,000 use a detailed template with extra terms and conditions. Smaller orders use a minimal receipt-style template.

To set up routing:

  1. Add a Router module after your trigger
  2. Each route gets a filter — e.g., customer.address.country = "US"
  3. Each route has its own HTTP module pointing to a different template_id
  4. All routes can share the same email module at the end

Pro tip: Combine Router with Iterator for maximum flexibility. For example: fetch all unpaid invoices from Airtable, iterate through them, then route each one to the right template based on the client's country.

Screenshot: Make scenario with Router module showing two branches for EU and US invoice templates

Supported platforms

Any payment platform with a Make module or webhook support works. Here are the most popular:

S
Stripe
G
Gumroad
P
Paddle
L
LemonSqueezy
P
PayPal
S
Square
S
Shopify
W
WooCommerce
C
Chargebee

Frequently asked questions

Which payment platforms can I connect?

Any platform with a Make module or webhook support: Stripe, Gumroad, Paddle, LemonSqueezy, PayPal, Square, Shopify, WooCommerce, and hundreds more. If it can send a webhook or has a Make module with a "Payment Received" trigger, it works. For platforms without a native module, use the generic HTTP webhook trigger.

Can I include line items and taxes on the invoice?

Yes. Use data binding to pass arrays of line items from your payment platform. Use Make's data transformer to format amounts or restructure nested data before sending it. The template automatically generates rows for each product, calculates subtotals, applies tax rates, and shows the final total.

How do I handle different currencies?

Your payment platform sends the currency with each transaction. Map the currency field to your template, and it will display the correct symbol. You can also use Make's Router module with conditional logic to apply different tax labels (VAT, GST, Sales Tax) based on region.

Can I send the invoice directly to the customer?

Yes. Add a Gmail, Outlook, or SMTP module after the HTTP module in your scenario. The customer's email comes from the payment trigger, and you attach the PDF using the pdf_url from the API response.

What about invoice numbering?

Use Make's built-in functions and text parser to generate sequential invoice numbers. Combine your payment platform's transaction ID with a prefix, or connect to a Google Sheet that tracks the last invoice number and increments it. See system variables for additional options.

What does automated invoicing cost?

TemplateFox offers 60 free PDFs per month. Paid plans start at $19/month for higher volume. Make has a free tier with 1,000 operations/month. View pricing.

Automate your PDF generation

Complete documentation, no-code integrations, and a powerful API to help you generate PDFs at scale. Let us handle the boring stuff.