Generate Marketing Reports from Google Sheets with GPT-4 Insights and PDF.co

Go to Workflow
0 views
Built by Robert Breen Robert Breen
Created on June 05, 2026

Description

This workflow pulls marketing data from Google Sheets, aggregates spend by channel, generates an AI-written summary, and outputs a formatted PDF report using a custom HTML template on PDF.co.

⚙️ Setup Instructions

1️⃣ Prepare Your Google Sheet
Copy this template into your Google Drive: Sample Marketing Data
Add or update your marketing spend data in rows 2–100.

Connect Google Sheets in n8n
Go to n8n → Credentials → New → Google Sheets (OAuth2)
Log in with your Google account and grant access
Select the Spreadsheet ID and Worksheet in the workflow

2️⃣ Set Up PDF.co for PDF Reports
Create a free account at PDF.co
In PDF.co Dashboard → HTML to PDF Templates, create a new Mustache template
Paste the HTML provided at the bottom of this description
Save, and note your Template ID
In n8n → Credentials → New → PDF.co API, paste your API Key and save
In the workflow, select your PDF.co credential in the Create PDF node
Replace the templateId with your Template ID

🧠 How It Works
Google Sheets Node**: Pulls marketing spend data
Summarize Nodes**: Aggregate total spend and spend per channel
OpenAI Node**: Writes a daily summary of marketing performance
Code Node**: Converts aggregated data into the correct shape for the PDF template
PDF.co Node: Generates a final, formatted **PDF report

📬 Contact
Need help customizing this (e.g., filtering by campaign, sending reports by email, or formatting your PDF)?

📧 [email protected]
🔗 Robert Breen
🌐 ynteractive.com

📄 HTML Template (for PDF.co)

> Paste this into a new HTML Template on PDF.co and reference its Template ID in your workflow.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Invoice {{invoiceNumber}}</title>
<style>
body { font-family: Arial, Helvetica, sans-serif; margin: 36px; color: #222; }
.header { display: flex; justify-content: space-between; align-items: center; }
.brand { max-height: 56px; }
h1 { margin: 12px 0 4px; font-size: 22px; }
.meta { font-size: 12px; color: #555; }
.two-col { display: flex; gap: 24px; margin-top: 16px; }
.box { flex: 1; border: 1px solid #ddd; padding: 12px; border-radius: 6px; }
.label { font-size: 11px; color: #666; text-transform: uppercase; letter-spacing: .02em; }
table { width: 100%; border-collapse: collapse; margin-top: 16px; }
th, td { border-bottom: 1px solid #eee; padding: 10px 8px; font-size: 13px; }
th { background: #fafafa; text-align: left; }
tfoot td { border-top: 2px solid #ddd; font-size: 13px; }
.right { text-align: right; }
.totals td { padding: 6px 8px; }
.grand { font-weight: 700; font-size: 14px; }
.notes { margin-top: 18px; font-size: 12px; color: #444; }
</style>
</head>
<body>


Invoice {{invoiceNumber}}
Date: {{invoiceDate}}   |   Due: {{dueDate}}

{{#company.logoUrl}}

{{/company.logoUrl}}




From
{{company.name}}
{{company.address}}
{{company.phone}}
{{company.email}}


Bill To
{{billTo.name}}
{{billTo.address}}
{{billTo.email}}
Description
Qty
Unit Price
Line Total



{{#items}}

{{line}}
{{description}}
{{qty}}
{{unitPriceFmt}}
{{lineTotalFmt}}

{{/items}}



Subtotal
{{subTotalFmt}}


Tax ({{taxRatePct}})
{{taxAmountFmt}}


Discount
-{{discountFmt}}


Total
{{totalFmt}}





Notes: {{notes}}
Terms: {{terms}}

</body>
</html>

Nodes Used (5)

AI Agent
@n8n/n8n-nodes-langchain.agent
Code
n8n-nodes-base.code
Google Sheets
n8n-nodes-base.googleSheets
OpenAI Chat Model
@n8n/n8n-nodes-langchain.lmChatOpenAi
Structured Output Parser
@n8n/n8n-nodes-langchain.outputParserStructured