Automation Templates
Pre-built templates for connecting Foglift to your existing tools. Use webhooks + these recipes to automate your SEO/GEO monitoring workflow.
Quick Setup
- 1. Go to Settings > Webhooks and create a webhook endpoint
- 2. Choose which events to listen for (scan.completed, score.dropped, score.changed)
- 3. Point the webhook URL to your automation platform (Zapier Webhook URL, n8n Webhook node, etc.)
- 4. Copy the code from a template below and paste it into your workflow
Webhook Payload Reference
{
"event": "scan.completed",
"url": "https://example.com",
"scores": {
"overall": 85,
"seo": 90,
"geo": 80,
"performance": 85,
"security": 90,
"accessibility": 80
},
"previousScore": 78,
"newScore": 85,
"scannedAt": "2026-03-19T12:00:00Z",
"userId": "abc123"
}Slack Alert on Score Drop
Get notified in Slack when a monitored URL's score drops below a threshold.
score.droppedView code template
// n8n Code Node — Format Slack message
const data = $input.first().json;
return [{
json: {
text: "Score dropped for " + data.url + ": " + data.newScore + "/100",
blocks: [{
type: "section",
text: {
type: "mrkdwn",
text: ":warning: *Score Drop Alert*\n" + data.url
+ " score: " + data.previousScore + " → " + data.newScore
}
}]
}
}];Log Scans to Google Sheets
Automatically log every scan result to a Google Sheets spreadsheet.
scan.completedView code template
// n8n Code Node — Prepare row for Google Sheets
const data = $input.first().json;
return [{
json: {
url: data.url,
overall: data.scores.overall,
seo: data.scores.seo,
geo: data.scores.geo,
performance: data.scores.performance,
security: data.scores.security,
accessibility: data.scores.accessibility,
grade: data.scores.overall >= 90 ? "A" : "B",
scannedAt: data.scannedAt,
}
}];Email Weekly Report to Client
Send a formatted email summary to clients every Monday with their latest scores.
weekly.digestView code template
// n8n HTTP Request node config:
// URL: https://foglift.io/api/v1/scan?url=CLIENT_URL
// Method: GET
// Headers: { "x-api-key": "your-foglift-api-key" }
// Then use Code Node to format:
const data = $input.first().json;
const grade = data.scores.overall >= 90 ? "A" : "B";
return [{
json: {
to: "client@example.com",
subject: "Weekly SEO Report: " + data.url + " — Grade " + grade,
html: "<h2>Report for " + data.url + "</h2>"
+ "<p>Overall: <strong>" + data.scores.overall + "/100</strong></p>"
+ "<ul><li>SEO: " + data.scores.seo + "</li>"
+ "<li>GEO: " + data.scores.geo + "</li></ul>"
}
}];Discord Notification on Scan Complete
Send a Discord embed when any scan completes, with scores and a link.
scan.completedView code template
// n8n HTTP Request node — POST to Discord Webhook
// URL: https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN
const data = $input.first().json;
const color = data.scores.overall >= 80 ? 0x22c55e : 0xef4444;
return [{
json: {
embeds: [{
title: "Scan Complete: " + data.url,
color: color,
fields: [
{ name: "Overall", value: String(data.scores.overall), inline: true },
{ name: "SEO", value: String(data.scores.seo), inline: true },
{ name: "GEO", value: String(data.scores.geo), inline: true },
],
footer: { text: "Foglift — foglift.io" },
timestamp: new Date().toISOString(),
}]
}
}];Sync Scans to Airtable
Keep an Airtable base in sync with your latest scan results for reporting.
scan.completedView code template
// n8n Code Node — Format for Airtable
const data = $input.first().json;
return [{
json: {
fields: {
URL: data.url,
"Overall Score": data.scores.overall,
"SEO Score": data.scores.seo,
"GEO Score": data.scores.geo,
Grade: data.scores.overall >= 90 ? "A" : "B",
"Last Scanned": data.scannedAt,
Status: data.scores.overall >= 80 ? "Healthy" : "Needs Attention",
}
}
}];Monitor Competitor Score Changes
Scan competitor URLs daily and alert when their scores change significantly.
score.changedView code template
// n8n workflow:
// 1. Cron Trigger (daily)
// 2. HTTP Request to Foglift API for each competitor URL
// 3. Code node to compare with stored scores
// 4. IF node to check threshold
// 5. Slack/Email notification
const competitors = ["competitor1.com", "competitor2.com"];
const results = [];
for (const url of competitors) {
const res = await this.helpers.httpRequest({
method: "GET",
url: "https://foglift.io/api/v1/scan?url=" + url,
headers: { "x-api-key": "your-foglift-api-key" },
});
results.push({ url, scores: res.scores });
}
return results.map(r => ({ json: r }));Supported Platforms
Zapier
Use Webhooks by Zapier trigger
n8n
Use Webhook node as trigger
Make
Use Custom Webhook module
Custom
Any HTTP endpoint works
Need a custom integration? Check the API docs or set up webhooks.