If you run an ESG or sustainability reporting SaaS platform in 2026, you're sitting at the intersection of EU mandatory disclosure law, US securities rulemaking, and a global wave of voluntary-turned-mandatory frameworks that all land in different fiscal years with different clocks.
EU CSRD (Corporate Sustainability Reporting Directive, 2022/2464/EU) mandates sustainability reporting under ESRS standards for ~50,000 EU companies in waves starting 2025. ESRS E1 covers climate change — Scope 1, 2, and 3 GHG emissions, physical and transition risk, and a GHG inventory following GHG Protocol. ESRS E2–E5 cover pollution, water and marine, biodiversity, and circular economy. Double materiality assessment (impact + financial) must be completed before the first filing.
EU Taxonomy Art.8 requires large undertakings to disclose the proportion of revenue, capex, and opex aligned to the six environmental objectives (climate change mitigation, climate change adaptation, water, circular economy, pollution, biodiversity). Misalignment between the sustainability statement and the Art.8 KPI disclosure is a primary audit flag.
SFDR (Sustainable Finance Disclosure Regulation, 2019/2088) requires financial market participants to report 14 mandatory Principal Adverse Sustainability Indicators at entity level. The reference period runs January 1–December 31. The annual PAI statement must be published by June 30 on the entity's website. Missing indicators must be explained with a comply-or-explain note.
SEC Rule 33-11275 (climate disclosure, currently stayed pending litigation as of 2026) would require public companies to disclose Scope 1 and 2 GHG emissions in their annual filings. Even stayed, many public companies are collecting TCFD-aligned data proactively given investor demand.
Miss a CSRD ESRS filing and you face penalties under national transposition law — Germany's CSR-Richtlinie-Umsetzungsgesetz sets fines up to €10 million or 5% of annual turnover. Miss SFDR PAI reporting and the ESM/ESMA can impose supervisory measures. Art.8 misalignment triggers auditor qualification of the statutory accounts.
Here are 5 production-ready n8n workflows that automate the most time-sensitive compliance obligations for ESG and sustainability reporting SaaS vendors.
The Compliance Stack This Covers
| Regulation | Obligation | Deadline |
|---|---|---|
| EU CSRD ESRS E1 | GHG inventory (Scope 1/2/3) + climate risk | First reporting year |
| EU CSRD ESRS 1 | Double materiality assessment | Before first filing |
| EU CSRD ESRS E2 | Pollution: air, water, soil emissions | Annual with ESRS E1 |
| EU CSRD ESRS E3 | Water and marine resources | Annual with ESRS E1 |
| EU CSRD ESRS E4 | Biodiversity and ecosystems | Annual with ESRS E1 |
| EU CSRD ESRS E5 | Circular economy and resource use | Annual with ESRS E1 |
| EU Taxonomy Art.8 | Revenue/capex/opex alignment KPIs | Annual with accounts |
| SFDR Art.4 + RTS Annex I | 14 mandatory PAI indicators | Published by June 30 |
| ISSB IFRS S1 | General sustainability disclosures | Annual |
| ISSB IFRS S2 | Climate-related disclosures | Annual |
| GHG Protocol | Scope 1/2/3 corporate standard | Ongoing inventory |
| TCFD | Governance/strategy/risk/metrics | Annual |
| CDP | Climate/water/forests disclosure | Annual (July questionnaire) |
| SEC Rule 33-11275 | Scope 1/2 in 10-K (stayed 2026) | Annual with 10-K |
Workflow 1: Tier-Segmented ESG Compliance Onboarding Drip
Different ESG SaaS tiers face different Day 1 obligations. An ESG data platform must configure ESRS E1 GHG boundaries immediately. An ESG fund platform triggers SFDR PAI reference period tracking from January 1. This workflow routes new customers to the right compliance email based on their tier.
Tiers handled:
-
ESG_DATA_PLATFORM_SAAS→ CSRD ESRS E1 GHG inventory baseline notice -
SUSTAINABILITY_REPORTING_SAAS→ CSRD double materiality assessment window notice -
SUPPLY_CHAIN_ESG_SAAS→ ESRS E1 Scope 3 Category 1 traceability requirement notice -
CARBON_ACCOUNTING_SAAS→ GHG Protocol organizational boundary election notice -
ESG_FUND_SAAS→ SFDR PAI 14 mandatory indicator reference period notice
{
"name": "Tier-Segmented ESG Compliance Onboarding Drip",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * *"
}
]
}
},
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
250,
300
],
"id": "sched-1"
},
{
"parameters": {
"url": "https://api.example.com/customers/new-today",
"options": {}
},
"name": "Fetch New Customers",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
450,
300
],
"id": "fetch-1"
},
{
"parameters": {
"jsCode": "return $input.all().flatMap(item => (item.json.customers || []).map(c => ({json: c})));"
},
"name": "Flatten Customers",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
650,
300
],
"id": "code-1"
},
{
"parameters": {
"rules": {
"rules": [
{
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.customer_tier }}",
"rightValue": "ESG_DATA_PLATFORM_SAAS",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKey": "DataPlatform"
},
{
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.customer_tier }}",
"rightValue": "SUSTAINABILITY_REPORTING_SAAS",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKey": "Reporting"
},
{
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.customer_tier }}",
"rightValue": "SUPPLY_CHAIN_ESG_SAAS",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKey": "SupplyChain"
},
{
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.customer_tier }}",
"rightValue": "CARBON_ACCOUNTING_SAAS",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKey": "Carbon"
},
{
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.customer_tier }}",
"rightValue": "ESG_FUND_SAAS",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKey": "Fund"
}
]
},
"fallbackOutput": "extra"
},
"name": "Switch on Tier",
"type": "n8n-nodes-base.switch",
"typeVersion": 3,
"position": [
850,
300
],
"id": "switch-1"
},
{
"parameters": {
"fromEmail": "compliance@flowkit.ai",
"toEmail": "={{ $json.email }}",
"subject": "CSRD Day 1: Your ESRS E1 GHG Inventory Baseline Clock Has Started",
"text": "Welcome to the platform. Under EU CSRD (2022/2464/EU), large undertakings must disclose GHG emissions per ESRS E1 covering Scope 1, 2, and 3 from the first reporting year. ESRS E1 requires a GHG inventory following GHG Protocol Corporate Standard. Your baseline measurement period has started. Contact compliance@flowkit.ai with questions."
},
"name": "Email DataPlatform",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1100,
50
],
"id": "email-1"
},
{
"parameters": {
"fromEmail": "compliance@flowkit.ai",
"toEmail": "={{ $json.email }}",
"subject": "CSRD Day 1: Your ESRS Double Materiality Assessment Must Be Completed Before First Filing",
"text": "Welcome. Under CSRD ESRS 1 (General Requirements), a double materiality assessment (impact materiality + financial materiality) must be completed and documented before the first sustainability statement. Your 12-month assessment window has started. Impact topics include ESRS E1-E5, S1-S4, G1."
},
"name": "Email Reporting",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1100,
200
],
"id": "email-2"
},
{
"parameters": {
"fromEmail": "compliance@flowkit.ai",
"toEmail": "={{ $json.email }}",
"subject": "CSRD Day 1: Scope 3 Category 1 Purchased Goods Traceability Required from First Reporting Period",
"text": "Welcome. CSRD ESRS E1 requires disclosure of Scope 3 GHG emissions including Category 1 (purchased goods and services). For supply chain ESG platforms, your supplier data collection program must start immediately to capture the full upstream GHG inventory for the current reporting year."
},
"name": "Email SupplyChain",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1100,
350
],
"id": "email-3"
},
{
"parameters": {
"fromEmail": "compliance@flowkit.ai",
"toEmail": "={{ $json.email }}",
"subject": "GHG Protocol Day 1: Organizational Boundary Election Must Be Documented Before Scope 1/2/3 Calculation",
"text": "Welcome. GHG Protocol Corporate Standard requires election of either Equity Share, Financial Control, or Operational Control as your organizational boundary approach. This election determines which facilities appear in Scope 1/2 and drives Scope 3 category applicability. Document your boundary election within 30 days."
},
"name": "Email Carbon",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1100,
500
],
"id": "email-4"
},
{
"parameters": {
"fromEmail": "compliance@flowkit.ai",
"toEmail": "={{ $json.email }}",
"subject": "SFDR Day 1: Your 14 Mandatory PAI Indicator Reference Period Started on January 1",
"text": "Welcome. Under SFDR Art.4 and RTS Annex I, financial market participants must report 14 mandatory Principal Adverse Sustainability Indicators (PAI) for the reference period starting January 1. Indicators include GHG emissions (PAI 1), carbon footprint (PAI 2), GHG intensity of investee companies (PAI 3), exposure to fossil fuels (PAI 4), and energy efficiency (PAI 5). Your PAI reference period is active."
},
"name": "Email Fund",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1100,
650
],
"id": "email-5"
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Fetch New Customers",
"type": "main",
"index": 0
}
]
]
},
"Fetch New Customers": {
"main": [
[
{
"node": "Flatten Customers",
"type": "main",
"index": 0
}
]
]
},
"Flatten Customers": {
"main": [
[
{
"node": "Switch on Tier",
"type": "main",
"index": 0
}
]
]
},
"Switch on Tier": {
"main": [
[
{
"node": "Email DataPlatform",
"type": "main",
"index": 0
}
],
[
{
"node": "Email Reporting",
"type": "main",
"index": 0
}
],
[
{
"node": "Email SupplyChain",
"type": "main",
"index": 0
}
],
[
{
"node": "Email Carbon",
"type": "main",
"index": 0
}
],
[
{
"node": "Email Fund",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 2: ESG Compliance Deadline Tracker
Fourteen compliance deadline types, weekday morning monitoring, urgency classification, and dual Slack + email escalation for CRITICAL/OVERDUE items.
Deadline types tracked:
-
CSRD_ESRS_E1_FILING— ESRS E1 GHG disclosure with annual accounts -
CSRD_DOUBLE_MATERIALITY— double materiality assessment before first filing -
EU_TAXONOMY_ART8_KPI— Art.8 turnover/capex/opex alignment KPIs -
SFDR_PAI_ANNUAL_STATEMENT— 14 mandatory PAI indicators by June 30 -
SFDR_PERIODIC_REPORT— fund-level PAI periodic report -
ISSB_S1_S2_FILING— IFRS S1+S2 disclosure with annual report -
CDP_QUESTIONNAIRE— CDP climate questionnaire (July deadline) -
TCFD_REPORT— TCFD-aligned annual report -
GHG_VERIFICATION— third-party GHG inventory verification -
SCOPE3_CAT1_SUPPLIER_SURVEY— Scope 3 Category 1 upstream data collection -
EU_ETS_VERIFIED_EMISSIONS— EU ETS verified emissions report (April 30) -
SEC_10K_CLIMATE_DISCLOSURE— SEC Rule 33-11275 Scope 1/2 (if un-stayed) -
CSRD_AUDITOR_ASSURANCE— limited assurance by external auditor -
ESMA_GREENWASHING_REVIEW— ESMA greenwashing supervisory review response
{
"name": "ESG Compliance Deadline Tracker",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1-5"
}
]
}
},
"name": "Weekday 8AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
250,
300
],
"id": "sched-2"
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT d.id, d.entity_id, d.deadline_type, d.due_date, d.status, e.name, e.tier, e.email FROM esg_compliance_deadlines d JOIN entities e ON d.entity_id = e.id WHERE d.due_date <= NOW() + INTERVAL '60 days' AND d.status NOT IN ('COMPLETED','WAIVED') ORDER BY d.due_date ASC LIMIT 200"
},
"name": "Query Deadlines",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.3,
"position": [
450,
300
],
"id": "pg-1"
},
{
"parameters": {
"jsCode": "const items = $input.all();\nreturn items.map(item => {\n const d = item.json;\n const due = new Date(d.due_date);\n const now = new Date();\n const days = Math.ceil((due - now) / 86400000);\n let level = 'NORMAL';\n if (days < 0) level = 'OVERDUE';\n else if (days <= 7) level = 'CRITICAL';\n else if (days <= 14) level = 'HIGH';\n else if (days <= 30) level = 'MEDIUM';\n return { json: { ...d, days_until_due: days, urgency_level: level } };\n});"
},
"name": "Classify Urgency",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
650,
300
],
"id": "code-2"
},
{
"parameters": {
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.urgency_level }}",
"rightValue": "NORMAL",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
]
}
},
"name": "Filter Actionable",
"type": "n8n-nodes-base.filter",
"typeVersion": 2,
"position": [
850,
300
],
"id": "filter-1"
},
{
"parameters": {
"conditions": {
"conditions": [
{
"leftValue": "={{ ['OVERDUE','CRITICAL'].includes($json.urgency_level) }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
}
}
]
}
},
"name": "Critical/Overdue Branch",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1050,
300
],
"id": "if-1"
},
{
"parameters": {
"resource": "message",
"channel": "#esg-compliance-critical",
"text": "={{ ':rotating_light: ' + $json.urgency_level + ' \u2014 ' + $json.deadline_type + ' for ' + $json.name + ' (' + $json.tier + ') due ' + $json.due_date + ' (' + $json.days_until_due + ' days). Escalate immediately.' }}"
},
"name": "Slack Critical",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.1,
"position": [
1300,
200
],
"id": "slack-1"
},
{
"parameters": {
"fromEmail": "compliance@flowkit.ai",
"toEmail": "={{ $json.email }}",
"subject": "={{ 'ESG COMPLIANCE ALERT: ' + $json.deadline_type + ' deadline in ' + $json.days_until_due + ' days' }}",
"text": "={{ 'Automated ESG compliance alert. Deadline: ' + $json.deadline_type + '. Due: ' + $json.due_date + '. Status: ' + $json.urgency_level + '. Immediate action required.' }}"
},
"name": "Email Alert",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1300,
350
],
"id": "email-6"
},
{
"parameters": {
"resource": "message",
"channel": "#esg-compliance-queue",
"text": "={{ ':calendar: ' + $json.deadline_type + ' \u2014 ' + $json.name + ' due ' + $json.due_date + ' (' + $json.days_until_due + ' days, ' + $json.urgency_level + ')' }}"
},
"name": "Slack Queue",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.1,
"position": [
1300,
500
],
"id": "slack-2"
}
],
"connections": {
"Weekday 8AM Trigger": {
"main": [
[
{
"node": "Query Deadlines",
"type": "main",
"index": 0
}
]
]
},
"Query Deadlines": {
"main": [
[
{
"node": "Classify Urgency",
"type": "main",
"index": 0
}
]
]
},
"Classify Urgency": {
"main": [
[
{
"node": "Filter Actionable",
"type": "main",
"index": 0
}
]
]
},
"Filter Actionable": {
"main": [
[
{
"node": "Critical/Overdue Branch",
"type": "main",
"index": 0
}
]
]
},
"Critical/Overdue Branch": {
"main": [
[
{
"node": "Slack Critical",
"type": "main",
"index": 0
},
{
"node": "Email Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Slack Queue",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 3: GHG Scope 1/2/3 Emissions Real-Time Monitor
Runs hourly. Flags EU ETS permit threshold breaches (Scope 1 >10,000 tCO2e), Scope 3 Category 1 tracking events, GHG Protocol Scope 2 dual-method divergence above 20%, and SFDR PAI 1 high absolute GHG exposure. Inserts flagged emissions into a review queue and fires Slack alerts.
GHG flags generated:
-
EU_ETS_PERMIT_THRESHOLD_EXCEEDED_2003_87_EC— Scope 1 facility > 10,000 tCO2e, EU ETS permit required -
CSRD_ESRS_E1_SCOPE3_CAT1_TRACK— Scope 3 Cat 1 (purchased goods) measurement event — log for ESRS E1 disclosure -
GHG_PROTOCOL_SCOPE2_DUAL_METHOD_DIVERGENCE— Scope 2 market-based vs location-based diverges > 20% — disclose both -
SFDR_PAI_1_HIGH_ABSOLUTE_GHG— absolute GHG emissions of investee > 100,000 tCO2e — PAI indicator 1 material event
{
"name": "GHG Scope 1/2/3 Emissions Real-Time Monitor",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 * * * *"
}
]
}
},
"name": "Hourly Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
250,
300
],
"id": "sched-3"
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT e.facility_id, e.scope, e.ghg_category, e.activity_data, e.emission_factor, e.co2e_tonnes, e.measurement_period_end, f.name as facility_name, f.country_code, f.business_unit FROM ghg_emissions e JOIN facilities f ON e.facility_id = f.id WHERE e.measurement_period_end >= NOW() - INTERVAL '1 hour' ORDER BY e.co2e_tonnes DESC"
},
"name": "Query New Emissions",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.3,
"position": [
450,
300
],
"id": "pg-2"
},
{
"parameters": {
"jsCode": "const items = $input.all();\nreturn items.map(item => {\n const e = item.json;\n const flags = [];\n // EU ETS threshold: installations emitting >10,000 tCO2e/yr require permit\n if (e.scope === 'SCOPE_1' && e.co2e_tonnes > 10000) flags.push('EU_ETS_PERMIT_THRESHOLD_EXCEEDED_2003_87_EC');\n // CSRD ESRS E1 Scope 3 Cat 1 (purchased goods) >50% total emissions = enhanced disclosure\n if (e.scope === 'SCOPE_3' && e.ghg_category === 'CAT_1_PURCHASED_GOODS' && e.co2e_tonnes > 0) flags.push('CSRD_ESRS_E1_SCOPE3_CAT1_TRACK');\n // GHG Protocol: Scope 2 market-based vs location-based divergence >20%\n if (e.scope === 'SCOPE_2' && e.market_based_co2e && Math.abs(e.co2e_tonnes - e.market_based_co2e) / e.co2e_tonnes > 0.20) flags.push('GHG_PROTOCOL_SCOPE2_DUAL_METHOD_DIVERGENCE');\n // SFDR PAI 1: absolute GHG emissions of investee company\n if (e.co2e_tonnes > 100000) flags.push('SFDR_PAI_1_HIGH_ABSOLUTE_GHG');\n return { json: { ...e, ghg_flags: flags, requires_review: flags.length > 0 } };\n})"
},
"name": "GHG Flag Engine",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
650,
300
],
"id": "code-3"
},
{
"parameters": {
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.requires_review }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
}
}
]
}
},
"name": "Filter Flagged",
"type": "n8n-nodes-base.filter",
"typeVersion": 2,
"position": [
850,
300
],
"id": "filter-2"
},
{
"parameters": {
"operation": "insert",
"table": "ghg_review_queue",
"columns": "facility_id,scope,ghg_category,co2e_tonnes,flags,detected_at,status",
"additionalFields": {}
},
"name": "Insert GHG Review Queue",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.3,
"position": [
1050,
300
],
"id": "pg-3"
},
{
"parameters": {
"resource": "message",
"channel": "#ghg-emissions-alerts",
"text": "={{ ':factory: GHG FLAG \u2014 ' + $json.ghg_flags.join(', ') + ' | Facility: ' + $json.facility_name + ' (' + $json.country_code + ') | Scope: ' + $json.scope + ' | ' + $json.co2e_tonnes + ' tCO2e | ' + $json.ghg_category }}"
},
"name": "Slack GHG Alert",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.1,
"position": [
1300,
300
],
"id": "slack-3"
}
],
"connections": {
"Hourly Trigger": {
"main": [
[
{
"node": "Query New Emissions",
"type": "main",
"index": 0
}
]
]
},
"Query New Emissions": {
"main": [
[
{
"node": "GHG Flag Engine",
"type": "main",
"index": 0
}
]
]
},
"GHG Flag Engine": {
"main": [
[
{
"node": "Filter Flagged",
"type": "main",
"index": 0
}
]
]
},
"Filter Flagged": {
"main": [
[
{
"node": "Insert GHG Review Queue",
"type": "main",
"index": 0
}
]
]
},
"Insert GHG Review Queue": {
"main": [
[
{
"node": "Slack GHG Alert",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 4: SFDR PAI 14 Mandatory Indicators Annual Report Generator
Fires January 1 each year. Queries all 14 mandatory SFDR PAI indicators across the reference period, calculates aggregate and average values by investee company, and generates the PAI statement with publication deadline reminder. Stores in Postgres and alerts the compliance team to publish before June 30.
The 14 mandatory SFDR PAI indicators (RTS Annex I, Table 1):
- PAI 1: GHG emissions of investee companies (Scope 1+2+3)
- PAI 2: Carbon footprint
- PAI 3: GHG intensity of investee companies
- PAI 4: Exposure to companies in fossil fuel sector
- PAI 5: Share of non-renewable energy consumption and production
- PAI 6: Energy consumption intensity per high-impact sector
- PAI 7: Activities negatively affecting biodiversity-sensitive areas
- PAI 8: Emissions to water
- PAI 9: Hazardous waste and radioactive waste ratio
- PAI 10: Violations of UN Global Compact/OECD Guidelines
- PAI 11: Lack of processes to monitor UNGC/OECD compliance
- PAI 12: Unadjusted gender pay gap
- PAI 13: Board gender diversity
- PAI 14: Exposure to controversial weapons
{
"name": "SFDR PAI 14 Mandatory Indicators Annual Report Generator",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 6 1 1 *"
}
]
}
},
"name": "Annual Jan 1 Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
250,
300
],
"id": "sched-4"
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT\n i.indicator_number,\n i.indicator_name,\n i.unit,\n i.category,\n SUM(im.value) as aggregate_value,\n AVG(im.value) as average_value,\n COUNT(DISTINCT im.investee_id) as investee_count,\n DATE_TRUNC('year', NOW() - INTERVAL '1 year') as reference_period_start,\n DATE_TRUNC('year', NOW()) - INTERVAL '1 day' as reference_period_end\nFROM sfdr_pai_indicators i\nJOIN sfdr_pai_measurements im ON i.indicator_number = im.indicator_number\nWHERE im.measurement_date >= DATE_TRUNC('year', NOW() - INTERVAL '1 year')\n AND im.measurement_date < DATE_TRUNC('year', NOW())\nGROUP BY i.indicator_number, i.indicator_name, i.unit, i.category\nORDER BY i.indicator_number"
},
"name": "Query PAI Data",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.3,
"position": [
450,
300
],
"id": "pg-4"
},
{
"parameters": {
"jsCode": "const items = $input.all();\nconst year = new Date().getFullYear() - 1;\nconst paiReport = {\n report_year: year,\n generated_at: new Date().toISOString(),\n regulation: 'SFDR Art.4 \u2014 Regulation (EU) 2019/2088 + RTS (EU) 2022/1288 Annex I',\n publication_deadline: year + 1 + '-06-30',\n reference_period: year + '-01-01 to ' + year + '-12-31',\n mandatory_pai_indicators: items.map(item => item.json),\n total_indicators_reported: items.length,\n missing_indicators: 14 - items.length\n};\nreturn [{ json: paiReport }];"
},
"name": "Build PAI Report",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
650,
300
],
"id": "code-4"
},
{
"parameters": {
"operation": "insert",
"table": "sfdr_pai_annual_reports",
"columns": "report_year,report_json,generated_at,status"
},
"name": "Store PAI Report",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.3,
"position": [
850,
300
],
"id": "pg-5"
},
{
"parameters": {
"resource": "message",
"channel": "#esg-compliance-reporting",
"text": "={{ ':bar_chart: SFDR PAI Annual Report generated for ' + $json.report_year + '. Reference period: ' + $json.reference_period + '. Publication deadline: ' + $json.publication_deadline + '. ' + $json.total_indicators_reported + '/14 mandatory indicators reported. Missing: ' + $json.missing_indicators + '. Review and publish before June 30.' }}"
},
"name": "Slack Report Ready",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.1,
"position": [
1100,
300
],
"id": "slack-4"
}
],
"connections": {
"Annual Jan 1 Trigger": {
"main": [
[
{
"node": "Query PAI Data",
"type": "main",
"index": 0
}
]
]
},
"Query PAI Data": {
"main": [
[
{
"node": "Build PAI Report",
"type": "main",
"index": 0
}
]
]
},
"Build PAI Report": {
"main": [
[
{
"node": "Store PAI Report",
"type": "main",
"index": 0
}
]
]
},
"Store PAI Report": {
"main": [
[
{
"node": "Slack Report Ready",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 5: Weekly ESG Compliance KPI Dashboard
Every Monday morning: new entities onboarded, overdue ESG deadlines, GHG review flags, SFDR PAI indicators collected year-to-date, Scope 1 GHG emissions YTD, and compliance deadlines due in 30 days. One Slack message that tells you if the week needs firefighting.
KPIs tracked:
- New entities this week (onboarding compliance clock started count)
- Overdue ESG compliance deadlines (should be zero)
- GHG review flags this week vs. threshold
- SFDR PAI indicators collected YTD (target: 14 mandatory indicators)
- Scope 1 GHG emissions YTD in tCO2e (GHG Protocol tracking)
- Compliance deadlines due within 30 days
{
"name": "Weekly ESG Compliance KPI Dashboard",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 7 * * 1"
}
]
}
},
"name": "Monday 7AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
250,
300
],
"id": "sched-5"
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT\n (SELECT COUNT(*) FROM entities WHERE created_at >= NOW() - INTERVAL '7 days') as new_entities_7d,\n (SELECT COUNT(*) FROM esg_compliance_deadlines WHERE status = 'OVERDUE') as overdue_deadlines,\n (SELECT COUNT(*) FROM ghg_review_queue WHERE status = 'PENDING' AND detected_at >= NOW() - INTERVAL '7 days') as ghg_flags_7d,\n (SELECT COUNT(*) FROM sfdr_pai_measurements WHERE measurement_date >= DATE_TRUNC('year', NOW()) AND indicator_number <= 14) as pai_indicators_collected_ytd,\n (SELECT COALESCE(SUM(co2e_tonnes),0) FROM ghg_emissions WHERE scope = 'SCOPE_1' AND measurement_period_end >= DATE_TRUNC('year', NOW())) as scope1_ytd_tco2e,\n (SELECT COUNT(*) FROM esg_compliance_deadlines WHERE due_date <= NOW() + INTERVAL '30 days' AND status NOT IN ('COMPLETED','WAIVED')) as deadlines_30d"
},
"name": "KPI Query",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.3,
"position": [
450,
300
],
"id": "pg-6"
},
{
"parameters": {
"jsCode": "const d = $input.first().json;\nconst kpis = [\n { metric: 'New Entities (7d)', value: d.new_entities_7d, alert: false },\n { metric: 'Overdue ESG Deadlines', value: d.overdue_deadlines, alert: d.overdue_deadlines > 0 },\n { metric: 'GHG Flags This Week', value: d.ghg_flags_7d, alert: d.ghg_flags_7d > 3 },\n { metric: 'SFDR PAI Indicators Collected YTD', value: d.pai_indicators_collected_ytd, note: 'Target 14 mandatory' },\n { metric: 'Scope 1 GHG YTD (tCO2e)', value: d.scope1_ytd_tco2e, note: 'GHG Protocol Scope 1' },\n { metric: 'Compliance Deadlines Due in 30d', value: d.deadlines_30d, alert: d.deadlines_30d > 5 }\n];\nconst text = kpis.map(k => (k.alert ? ':warning: ' : ':white_check_mark: ') + k.metric + ': ' + k.value + (k.note ? ' (' + k.note + ')' : '')).join('\\n');\nreturn [{ json: { kpis, slack_text: text } }];"
},
"name": "Format KPIs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
650,
300
],
"id": "code-5"
},
{
"parameters": {
"resource": "message",
"channel": "#esg-kpi",
"text": "={{ ':seedling: ESG Weekly Compliance KPI \u2014 ' + new Date().toISOString().slice(0,10) + '\\n' + $json.slack_text }}"
},
"name": "Slack KPI Report",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.1,
"position": [
900,
300
],
"id": "slack-5"
}
],
"connections": {
"Monday 7AM Trigger": {
"main": [
[
{
"node": "KPI Query",
"type": "main",
"index": 0
}
]
]
},
"KPI Query": {
"main": [
[
{
"node": "Format KPIs",
"type": "main",
"index": 0
}
]
]
},
"Format KPIs": {
"main": [
[
{
"node": "Slack KPI Report",
"type": "main",
"index": 0
}
]
]
}
}
}
Customer Tier Reference
| Tier Flag | Primary Regulatory Obligation |
|---|---|
ESG_DATA_PLATFORM_SAAS |
CSRD ESRS E1 GHG inventory + ISSB IFRS S1/S2 |
SUSTAINABILITY_REPORTING_SAAS |
CSRD double materiality + EU Taxonomy Art.8 |
SUPPLY_CHAIN_ESG_SAAS |
CSRD ESRS E1 Scope 3 Cat 1 + ESRS S2 (value chain workers) |
CARBON_ACCOUNTING_SAAS |
GHG Protocol + EU ETS + CDP climate questionnaire |
ESG_FUND_SAAS |
SFDR PAI 14 mandatory + SFDR Art.9 product disclosure |
CORPORATE_ESG_SAAS |
CSRD ESRS full set + TCFD + EU Taxonomy Art.8 |
ESG_STARTUP |
CSRD phased entry (2027 wave) + SFDR entity-level PAI |
Key Compliance Facts for ESG/Sustainability Reporting SaaS
EU CSRD ESRS E1 (Climate Change): Scope 1 (direct), Scope 2 (energy), and Scope 3 (value chain) GHG emissions must all be disclosed following GHG Protocol Corporate Standard. Scope 2 requires both location-based and market-based figures. Scope 3 completeness (15 categories) is assessed via materiality — if Category 1 (purchased goods) >40% of total, it is always material.
EU Taxonomy Art.8: Large undertakings must disclose the percentage of turnover, capex, and opex from activities that are substantially contributing to one of six environmental objectives and doing no significant harm to the others. The alignment KPIs must match the ESRS sustainability statement. Auditors flag divergences between the two.
SFDR PAI reference period: January 1–December 31. The PAI statement is published by June 30 on the entity website. Financial market participants with fewer than 500 employees must report entity-level PAI at product level only for Art.8 and Art.9 funds.
GHG Protocol Scope 3 Category 1: For most manufacturing and retail companies, purchased goods and services represent 70–80% of total GHG footprint. CSRD ESRS E1 requires documentation of the methodology used to estimate Cat 1 emissions — primary supplier data, spend-based, or hybrid. Spend-based estimates require emission factor database sourcing (Ecoinvent, EPA EEIO).
CDP disclosure: CDP climate questionnaire opens in April and closes in July each year. CDP uses TCFD as its core framework. Companies with Science-Based Targets (SBTi) receive CDP scoring credit for Scope 3 reduction plans. CDP forest and water questionnaires align with ESRS E3 and E4.
Get All 14 FlowKit Templates
These 5 workflows are part of the FlowKit n8n Automation Template Library — 14 production-ready templates for compliance-sensitive SaaS vendors.
Each template includes:
- Full workflow JSON (import directly into n8n)
- Tier-segmentation logic (handle enterprise vs. SMB vs. startup differently)
- Compliance deadline tracking with urgency buckets
- Real regulatory citations (not placeholder text)
Get the full library at stripeai.gumroad.com
Disclaimer
These workflows are provided as engineering starting points. They are not legal or regulatory advice. Consult qualified ESG counsel, sustainability auditors, and compliance professionals before using in production for regulated activities.
Top comments (0)