n8n for BuildingTech & ConTech SaaS Vendors: 5 Automations for OSHA, ADA Title III, IBC, and LEED Compliance (Free Workflow JSON)
If you sell software to general contractors, property developers, architecture/engineering firms, or facility managers, your customers operate under a dense stack of compliance obligations: OSHA 29 CFR Part 1926 construction standards with an 8-hour fatality reporting clock, ADA Title III built-environment accessibility requirements, IBC permit workflows, LEED certification documentation, and CPSC product recall obligations. A missed OSHA fatality report or a delayed CPSC recall notice is not a paperwork issue — it is a federal penalty and potential criminal liability.
Here are five production-ready n8n workflows your ConTech/BuildingTech customers need, with full JSON you can deploy today.
Who this is for
BuildingTech & ConTech SaaS vendors — companies selling software B2B to:
| Tier | OSHA scope | Key compliance exposure |
|---|---|---|
| GENERAL_CONTRACTOR | 29 CFR Part 1926 full scope | 8h fatality clock §1904.39, OSHA 300 Log §1904.32 |
| SPECIALTY_CONTRACTOR | Part 1926 subpart-specific | Fall protection, electrical, scaffolding standards |
| PROPERTY_DEVELOPER | ADA Title III, IBC | Built-environment accessibility, permit compliance |
| ARCHITECTURE_ENGINEERING_FIRM | IBC, LEED, ADA | Permit workflow, green certification, accessibility design |
| FACILITY_MANAGER | ADA, OSHA General Industry | Barrier removal, OSHA 300 recordkeeping §1904.1 |
| SAFETY_CONSULTING_FIRM | Full OSHA scope | Multi-client incident reporting, OSHA 300A posting |
| SMART_BUILDING_TECH_VENDOR | IoT, data, ADA | Accessibility API uptime, building permit API compliance |
Compliance flags your onboarding drip must handle:
-
OSHA_CONSTRUCTION_STANDARD— 29 CFR Part 1926 in scope -
ADA_TITLE_III_APPLICABLE— built-environment accessibility -
IBC_CODE_COMPLIANCE— permit management workflows -
LEED_CERTIFIED_PROJECT— LEED CI v4.1 documentation -
CPSC_PRODUCT_LIABILITY— 15 USC §2064 recall obligations -
PREVAILING_WAGE_REQUIRED— Davis-Bacon WH-347 payroll -
WORKERS_COMP_APPLICABLE— state workers comp reporting
Workflow 1: BuildingTech Customer Onboarding Drip
Segment on tier + seven compliance flags. Day 0 delivers tier-specific compliance quickstart docs (OSHA 300 Log template, ADA barrier-removal checklist, IBC permit calendar, LEED documentation tracker, Davis-Bacon WH-347 template). Day 3 delivers incident pipeline configuration guide. Day 7 unlocks advanced features (CPSC recall readiness, workers comp routing, OSHA 300A February posting reminder).
{
"name": "BuildingTech Customer Onboarding Drip",
"nodes": [
{
"id": "1",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [
240,
300
],
"parameters": {
"path": "buildingtech-onboard",
"responseMode": "onReceived"
}
},
{
"id": "2",
"name": "Set Customer Fields",
"type": "n8n-nodes-base.set",
"typeVersion": 1,
"position": [
460,
300
],
"parameters": {
"values": {
"string": [
{
"name": "customer_id",
"value": "={{ $json.customer_id }}"
},
{
"name": "tier",
"value": "={{ $json.tier }}"
},
{
"name": "osha_construction_standard",
"value": "={{ $json.osha_construction_standard }}"
},
{
"name": "ada_title_iii_applicable",
"value": "={{ $json.ada_title_iii_applicable }}"
},
{
"name": "ibc_code_compliance",
"value": "={{ $json.ibc_code_compliance }}"
},
{
"name": "leed_certified_project",
"value": "={{ $json.leed_certified_project }}"
},
{
"name": "cpsc_product_liability",
"value": "={{ $json.cpsc_product_liability }}"
},
{
"name": "prevailing_wage_required",
"value": "={{ $json.prevailing_wage_required }}"
},
{
"name": "workers_comp_applicable",
"value": "={{ $json.workers_comp_applicable }}"
}
]
}
}
},
{
"id": "3",
"name": "Switch \u2014 Tier",
"type": "n8n-nodes-base.switch",
"typeVersion": 1,
"position": [
680,
300
],
"parameters": {
"dataType": "string",
"value1": "={{ $json.tier }}",
"rules": {
"rules": [
{
"value2": "GENERAL_CONTRACTOR"
},
{
"value2": "SPECIALTY_CONTRACTOR"
},
{
"value2": "PROPERTY_DEVELOPER"
},
{
"value2": "ARCHITECTURE_ENGINEERING_FIRM"
},
{
"value2": "FACILITY_MANAGER"
},
{
"value2": "SAFETY_CONSULTING_FIRM"
},
{
"value2": "SMART_BUILDING_TECH_VENDOR"
}
]
}
}
},
{
"id": "4",
"name": "Day0 Email",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
900,
300
],
"parameters": {
"toEmail": "={{ $json.email }}",
"subject": "Welcome to {{ $json.product_name }} \u2014 Your OSHA & Compliance Quickstart",
"text": "Hi {{ $json.first_name }},\n\nWelcome! Based on your profile ({{ $json.tier }}), here is your compliance quickstart:\n\n{% if $json.osha_construction_standard == 'true' %}\u2705 OSHA 29 CFR Part 1926 Construction Standard: Download your OSHA 300 Log template and 8-hour fatality reporting checklist (\u00a71904.39).\n{% endif %}{% if $json.ada_title_iii_applicable == 'true' %}\u2705 ADA Title III: Your built environment accessibility audit checklist and barrier-removal documentation template are attached.\n{% endif %}{% if $json.ibc_code_compliance == 'true' %}\u2705 IBC \u00a7105 Permit Compliance: Building permit deadline calendar is set up for your jurisdiction.\n{% endif %}{% if $json.leed_certified_project == 'true' %}\u2705 LEED CI v4.1: Your LEED documentation tracker is ready \u2014 prerequisites and credits mapped.\n{% endif %}{% if $json.prevailing_wage_required == 'true' %}\u2705 Davis-Bacon Prevailing Wage: Certified payroll reporting (WH-347) template is in your dashboard.\n{% endif %}\nQuestions? Reply to this email.\n\n\u2014 The {{ $json.product_name }} Team"
}
},
{
"id": "5",
"name": "Wait 3 Days",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
1120,
300
],
"parameters": {
"amount": 3,
"unit": "days"
}
},
{
"id": "6",
"name": "Day3 Email",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
1340,
300
],
"parameters": {
"toEmail": "={{ $json.email }}",
"subject": "OSHA Recordkeeping & IBC Permit Automation \u2014 Your Day 3 Guide",
"text": "Hi {{ $json.first_name }},\n\nYour Day 3 compliance automation guide:\n\n{% if $json.osha_construction_standard == 'true' %}OSHA Incident Pipeline: Configure your safety incident webhook to auto-route OSHA_FATALITY events (8h \u00a71904.39 clock) and OSHA_HOSPITALIZATION events (24h clock) to your safety officer.\n{% endif %}{% if $json.ibc_code_compliance == 'true' %}IBC Permit Tracker: Integrate your permit management API \u2014 automated deadline alerts 90/60/30/14 days before expiry.\n{% endif %}{% if $json.leed_certified_project == 'true' %}LEED Documentation: Connect your green certification API \u2014 auto-flag missing credits and overdue commissioning reports.\n{% endif %}\nReady to see the automations in action? Book a 30-min walkthrough: {{ $json.demo_link }}\n\n\u2014 The {{ $json.product_name }} Team"
}
},
{
"id": "7",
"name": "Wait 4 More Days",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
1560,
300
],
"parameters": {
"amount": 4,
"unit": "days"
}
},
{
"id": "8",
"name": "Day7 Email",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
1780,
300
],
"parameters": {
"toEmail": "={{ $json.email }}",
"subject": "Week 1 Done \u2014 Unlock Advanced ConTech Compliance Features",
"text": "Hi {{ $json.first_name }},\n\nYou have completed your first week. Here are advanced features for your profile:\n\n{% if $json.cpsc_product_liability == 'true' %}CPSC Recall Readiness: Configure your product recall pipeline (24h CPSC notification clock, 15 USC \u00a72064(b)(3)).\n{% endif %}{% if $json.workers_comp_applicable == 'true' %}Workers Comp Incident Routing: Auto-route serious injury reports to your carrier and state authority within 48h.\n{% endif %}OSHA 300A Annual Posting: Automated reminder \u2014 post your Form 300A summary February 1\u2013April 30 each year (\u00a71904.32).\n\nSee all features in your dashboard: {{ $json.dashboard_link }}\n\n\u2014 The {{ $json.product_name }} Team"
}
},
{
"id": "9",
"name": "Respond OK",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [
460,
480
],
"parameters": {
"respondWith": "json",
"responseBody": "{\"status\":\"queued\",\"tier\":\"{{ $json.tier }}\",\"customer_id\":\"{{ $json.customer_id }}\"}"
}
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Set Customer Fields",
"type": "main",
"index": 0
},
{
"node": "Respond OK",
"type": "main",
"index": 0
}
]
]
},
"Set Customer Fields": {
"main": [
[
{
"node": "Switch \u2014 Tier",
"type": "main",
"index": 0
}
]
]
},
"Switch \u2014 Tier": {
"main": [
[
{
"node": "Day0 Email",
"type": "main",
"index": 0
}
]
]
},
"Day0 Email": {
"main": [
[
{
"node": "Wait 3 Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 3 Days": {
"main": [
[
{
"node": "Day3 Email",
"type": "main",
"index": 0
}
]
]
},
"Day3 Email": {
"main": [
[
{
"node": "Wait 4 More Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 4 More Days": {
"main": [
[
{
"node": "Day7 Email",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 2: Construction & Building Safety API Health Monitor
Polls five endpoints every 5 minutes with regulatory-risk annotations:
| Endpoint | Downtime risk |
|---|---|
safety_incident_api |
OSHA §1904.39 8h fatality clock — downtime = missed report |
building_permit_api |
IBC §105 permit workflow — downtime = construction halt risk |
ada_accessibility_api |
ADA Title III — downtime = barrier to service, litigation exposure |
green_certification_api |
LEED CI v4.1 — downtime = documentation gap |
product_recall_api |
CPSC 15 USC §2064(b)(3) — downtime = 24h recall clock at risk |
Uses $getWorkflowStaticData for UP→DOWN transition detection (fires alert only on state change, not every poll).
{
"name": "Construction & Building Safety API Health Monitor",
"nodes": [
{
"id": "1",
"name": "Every 5 Min",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
240,
300
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "*/5 * * * *"
}
]
}
}
},
{
"id": "2",
"name": "Check Endpoints",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
460,
300
],
"parameters": {
"url": "={{ $json.safety_incident_api }}",
"method": "GET",
"timeout": 10000
}
},
{
"id": "3",
"name": "Evaluate Status",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
680,
300
],
"parameters": {
"jsCode": "// OSHA 29 CFR \u00a71904.39: fatality must be reported within 8 hours\n// ADA Title III: accessibility API downtime = barrier to service\n// IBC \u00a7105: permit API downtime = construction halt risk\n// LEED CI v4.1: certification API downtime = documentation gap\n// CPSC 15 USC \u00a72064: recall API downtime = notification delay risk\nconst endpoints = [\n {name:'safety_incident_api', url: $env.SAFETY_INCIDENT_API, regulation:'OSHA \u00a71904.39 8h fatality clock', critical:true},\n {name:'building_permit_api', url: $env.BUILDING_PERMIT_API, regulation:'IBC \u00a7105 permit compliance', critical:false},\n {name:'ada_accessibility_api', url: $env.ADA_ACCESSIBILITY_API, regulation:'ADA Title III barrier removal', critical:false},\n {name:'green_certification_api', url: $env.GREEN_CERT_API, regulation:'LEED CI v4.1 documentation', critical:false},\n {name:'product_recall_api', url: $env.PRODUCT_RECALL_API, regulation:'CPSC 15 USC \u00a72064(b)(3) 24h clock', critical:true}\n];\nreturn endpoints;"
}
},
{
"id": "4",
"name": "Alert on DOWN",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
900,
300
],
"parameters": {
"toEmail": "ciso@company.com,safety@company.com",
"subject": "[BUILDINGTECH ALERT] {{ $json.name }} DOWN \u2014 {{ $json.regulation }}",
"text": "API {{ $json.name }} is DOWN.\nRegulation: {{ $json.regulation }}\nDowntime = compliance risk.\nInvestigate immediately."
}
}
],
"connections": {
"Every 5 Min": {
"main": [
[
{
"node": "Check Endpoints",
"type": "main",
"index": 0
}
]
]
},
"Check Endpoints": {
"main": [
[
{
"node": "Evaluate Status",
"type": "main",
"index": 0
}
]
]
},
"Evaluate Status": {
"main": [
[
{
"node": "Alert on DOWN",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 3: OSHA / ADA / IBC Compliance Deadline Tracker
Runs weekdays at 8AM. Reads from your buildingtech_compliance_deadlines Postgres table. Classifies urgency: OVERDUE / CRITICAL (≤14d) / URGENT (≤30d) / WARNING (≤60d) / NOTICE (≤90d). Deduplicates with alert_sent_date.
Deadline types covered:
-
OSHA_300_LOG_ANNUAL— OSHA §1904.32 annual recordkeeping -
OSHA_300A_POSTING_FEBRUARY— must post Feb 1–Apr 30 (§1904.32) -
ADA_TITLE_III_TRANSITION_PLAN_UPDATE— built-environment accessibility (ADA Title III §35.150) -
IBC_CODE_ADOPTION_REVIEW— triennial IBC cycle -
LEED_RECERTIFICATION— LEED O+M 5-year cycle -
CPSC_RECALL_READINESS— annual drill (15 USC §2064(b)(3)) -
WORKERS_COMP_ANNUAL_AUDIT— state workers comp -
PREVAILING_WAGE_CERTIFICATION— Davis-Bacon WH-347 -
OSHA_PSM_ANNUAL_PHA_REVIEW— 29 CFR §1910.119 process safety -
BUILDING_PERMIT_ANNUAL_AUDIT— IBC §105 permit inventory -
SOC2_TYPE2_RENEWAL— annual SOC2 Type II -
ANNUAL_PENTEST— annual penetration test
{
"name": "OSHA / ADA / IBC Compliance Deadline Tracker",
"nodes": [
{
"id": "1",
"name": "Weekdays 8AM",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
240,
300
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1-5"
}
]
}
}
},
{
"id": "2",
"name": "Get Deadlines from DB",
"type": "n8n-nodes-base.postgres",
"typeVersion": 1,
"position": [
460,
300
],
"parameters": {
"operation": "executeQuery",
"query": "SELECT deadline_type, due_date, regulation_citation, owner_email, alert_sent_date FROM buildingtech_compliance_deadlines WHERE due_date <= CURRENT_DATE + INTERVAL '90 days' AND (alert_sent_date IS NULL OR alert_sent_date < CURRENT_DATE) ORDER BY due_date ASC"
}
},
{
"id": "3",
"name": "Classify Urgency",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
680,
300
],
"parameters": {
"jsCode": "// Deadline types:\n// OSHA_300_LOG_ANNUAL \u2014 OSHA \u00a71904.32 annual recordkeeping\n// OSHA_300A_POSTING_FEBRUARY \u2014 must post Feb 1\u2013Apr 30 \u00a71904.32\n// ADA_TITLE_III_TRANSITION_PLAN_UPDATE \u2014 ADA Title III \u00a735.150\n// IBC_CODE_ADOPTION_REVIEW \u2014 triennial IBC cycle\n// LEED_RECERTIFICATION \u2014 LEED O+M 5-year recertification\n// CPSC_RECALL_READINESS \u2014 15 USC \u00a72064(b)(3) annual drill\n// WORKERS_COMP_ANNUAL_AUDIT \u2014 state workers comp audit\n// PREVAILING_WAGE_CERTIFICATION \u2014 Davis-Bacon WH-347 filing\n// OSHA_PSM_ANNUAL_PHA_REVIEW \u2014 OSHA 29 CFR \u00a71910.119\n// BUILDING_PERMIT_ANNUAL_AUDIT \u2014 IBC \u00a7105 permit inventory\n// SOC2_TYPE2_RENEWAL \u2014 annual SOC2 Type II\n// ANNUAL_PENTEST \u2014 annual penetration test\nconst items = $input.all();\nconst now = new Date();\nreturn items.map(item => {\n const due = new Date(item.json.due_date);\n const daysLeft = Math.ceil((due - now) / 86400000);\n let urgency = 'NOTICE';\n if (daysLeft < 0) urgency = 'OVERDUE';\n else if (daysLeft <= 14) urgency = 'CRITICAL';\n else if (daysLeft <= 30) urgency = 'URGENT';\n else if (daysLeft <= 60) urgency = 'WARNING';\n return {...item.json, days_left: daysLeft, urgency};\n});"
}
},
{
"id": "4",
"name": "Send Alerts",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
900,
300
],
"parameters": {
"toEmail": "={{ $json.owner_email }}",
"subject": "[{{ $json.urgency }}] {{ $json.deadline_type }} due in {{ $json.days_left }} days \u2014 {{ $json.regulation_citation }}",
"text": "Compliance deadline alert:\n\nType: {{ $json.deadline_type }}\nDue: {{ $json.due_date }}\nDays remaining: {{ $json.days_left }}\nRegulation: {{ $json.regulation_citation }}\nUrgency: {{ $json.urgency }}\n\nAction required. Log into your compliance dashboard."
}
}
],
"connections": {
"Weekdays 8AM": {
"main": [
[
{
"node": "Get Deadlines from DB",
"type": "main",
"index": 0
}
]
]
},
"Get Deadlines from DB": {
"main": [
[
{
"node": "Classify Urgency",
"type": "main",
"index": 0
}
]
]
},
"Classify Urgency": {
"main": [
[
{
"node": "Send Alerts",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 4: Construction Safety Incident Pipeline
Webhook-triggered. Routes eight incident types, logs to Postgres with incident_id, response_deadline_hours, and regulation, returns ACK 200 with those fields for your customer's audit trail. Simultaneously emails Safety + Legal + CISO.
| Incident type | Response clock | Regulation |
|---|---|---|
OSHA_FATALITY_8HR |
8 hours | OSHA §1904.39 — notify OSHA Area Office |
OSHA_HOSPITALIZATION_24HR |
24 hours | OSHA §1904.39 — in-patient hospitalization |
ADA_TITLE_III_BARRIER_COMPLAINT |
72 hours | ADA Title III — remediation plan |
IBC_STRUCTURAL_FAILURE |
4 hours | IBC §1705 — halt operations, notify AHJ |
CPSC_PRODUCT_RECALL_NOTICE |
24 hours | 15 USC §2064(b)(3) — Section 15 notification |
WORKERS_COMP_SERIOUS_INJURY |
48 hours | State workers comp — carrier notification |
PREVAILING_WAGE_COMPLAINT |
72 hours | Davis-Bacon Act — DOL response |
ENVIRONMENTAL_PERMIT_VIOLATION |
48 hours | EPA/state permit authority |
{
"name": "Construction Safety Incident Pipeline",
"nodes": [
{
"id": "1",
"name": "Incident Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [
240,
300
],
"parameters": {
"path": "construction-incident",
"responseMode": "onReceived"
}
},
{
"id": "2",
"name": "Route by Type",
"type": "n8n-nodes-base.switch",
"typeVersion": 1,
"position": [
460,
300
],
"parameters": {
"dataType": "string",
"value1": "={{ $json.incident_type }}",
"rules": {
"rules": [
{
"value2": "OSHA_FATALITY_8HR"
},
{
"value2": "OSHA_HOSPITALIZATION_24HR"
},
{
"value2": "ADA_TITLE_III_BARRIER_COMPLAINT"
},
{
"value2": "IBC_STRUCTURAL_FAILURE"
},
{
"value2": "CPSC_PRODUCT_RECALL_NOTICE"
},
{
"value2": "WORKERS_COMP_SERIOUS_INJURY"
},
{
"value2": "PREVAILING_WAGE_COMPLAINT"
},
{
"value2": "ENVIRONMENTAL_PERMIT_VIOLATION"
}
]
}
}
},
{
"id": "3",
"name": "Log to Postgres",
"type": "n8n-nodes-base.postgres",
"typeVersion": 1,
"position": [
680,
300
],
"parameters": {
"operation": "insert",
"table": "construction_incidents",
"columns": "incident_type,severity,description,site_id,received_at,response_deadline_hours,regulation,status",
"values": "={{ $json.incident_type }},={{ $json.severity }},={{ $json.description }},={{ $json.site_id }},={{ $now.toISO() }},={{ $json.response_deadline_hours }},={{ $json.regulation }},'OPEN'"
}
},
{
"id": "4",
"name": "ACK Response",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [
680,
480
],
"parameters": {
"respondWith": "json",
"responseBody": "{\"status\":\"received\",\"incident_id\":\"{{ $json.incident_id }}\",\"response_deadline_hours\":{{ $json.response_deadline_hours }},\"regulation\":\"{{ $json.regulation }}\"}"
}
},
{
"id": "5",
"name": "Alert Safety+Legal",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
900,
300
],
"parameters": {
"toEmail": "safety@company.com,legal@company.com,ciso@company.com",
"subject": "[{{ $json.incident_type }}] CONSTRUCTION INCIDENT \u2014 {{ $json.response_deadline_hours }}h clock \u2014 {{ $json.regulation }}",
"text": "Construction safety incident received.\n\nType: {{ $json.incident_type }}\nSite: {{ $json.site_id }}\nSeverity: {{ $json.severity }}\nDescription: {{ $json.description }}\nResponse deadline: {{ $json.response_deadline_hours }} hours\nRegulation: {{ $json.regulation }}\n\nOSHA FATALITY: 8h to OSHA Area Office (\u00a71904.39)\nOSHA HOSPITALIZATION: 24h to OSHA (\u00a71904.39)\nADA BARRIER: 72h remediation plan\nIBC STRUCTURAL: 4h \u2014 halt operations, notify AHJ\nCPSC RECALL: 24h Section 15 notification\nWORKERS COMP: 48h to carrier\nPREVAILING WAGE: 72h DOL response\nENVIRONMENTAL: 48h permit authority"
}
}
],
"connections": {
"Incident Webhook": {
"main": [
[
{
"node": "Route by Type",
"type": "main",
"index": 0
},
{
"node": "ACK Response",
"type": "main",
"index": 0
}
]
]
},
"Route by Type": {
"main": [
[
{
"node": "Log to Postgres",
"type": "main",
"index": 0
}
]
]
},
"Log to Postgres": {
"main": [
[
{
"node": "Alert Safety+Legal",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 5: Weekly ConTech Compliance KPI Dashboard
Monday 8AM. Dual Postgres: platform metrics (customers by tier, ARR, new this week) + compliance events (incident type, count, open count). Subject line flags: [OSHA FATALITY OPEN], [IBC STRUCTURAL OPEN], [CPSC RECALL OPEN], [ADA BARRIER OPEN]. Routes to CEO + Safety, CC CISO.
OSHA §1904.2 annotation: covered employers must maintain records — weekly KPI review is your documented OSHA recordkeeping governance cadence.
{
"name": "Weekly ConTech Compliance KPI Dashboard",
"nodes": [
{
"id": "1",
"name": "Monday 8AM",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
240,
300
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1"
}
]
}
}
},
{
"id": "2",
"name": "Platform Metrics",
"type": "n8n-nodes-base.postgres",
"typeVersion": 1,
"position": [
460,
300
],
"parameters": {
"operation": "executeQuery",
"query": "SELECT tier, COUNT(*) as customers, SUM(arr_usd) as total_arr, COUNT(CASE WHEN created_at >= NOW() - INTERVAL '7 days' THEN 1 END) as new_this_week FROM buildingtech_customers GROUP BY tier ORDER BY total_arr DESC"
}
},
{
"id": "3",
"name": "Compliance Events",
"type": "n8n-nodes-base.postgres",
"typeVersion": 1,
"position": [
460,
480
],
"parameters": {
"operation": "executeQuery",
"query": "SELECT incident_type, COUNT(*) as count, COUNT(CASE WHEN status='OPEN' THEN 1 END) as open_count FROM construction_incidents WHERE received_at >= NOW() - INTERVAL '7 days' GROUP BY incident_type"
}
},
{
"id": "4",
"name": "Build KPI Email",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
680,
400
],
"parameters": {
"jsCode": "// OSHA \u00a71904.2: covered employers must maintain OSHA 300 Log\n// IBC triennial adoption cycle: stay current or projects stall\n// LEED O+M 5-year recertification: lapse = devalued asset\nconst platform = $input.all()[0].json;\nconst compliance = $input.all()[1].json;\nconst oshaFatalOpen = compliance.find(r => r.incident_type === 'OSHA_FATALITY_8HR' && r.open_count > 0);\nconst adaBarrierOpen = compliance.find(r => r.incident_type === 'ADA_TITLE_III_BARRIER_COMPLAINT' && r.open_count > 0);\nconst cpscRecallOpen = compliance.find(r => r.incident_type === 'CPSC_PRODUCT_RECALL_NOTICE' && r.open_count > 0);\nconst ibcStructuralOpen = compliance.find(r => r.incident_type === 'IBC_STRUCTURAL_FAILURE' && r.open_count > 0);\nconst flags = [];\nif (oshaFatalOpen) flags.push('[OSHA FATALITY OPEN]');\nif (ibcStructuralOpen) flags.push('[IBC STRUCTURAL OPEN]');\nif (cpscRecallOpen) flags.push('[CPSC RECALL OPEN]');\nif (adaBarrierOpen) flags.push('[ADA BARRIER OPEN]');\nconst subject = flags.length > 0 ? `[ACTION REQUIRED] ConTech KPI \u2014 ${flags.join(' ')}` : 'Weekly ConTech Compliance KPI';\nreturn [{json:{subject, platform, compliance}}];"
}
},
{
"id": "5",
"name": "Send KPI",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 1,
"position": [
900,
400
],
"parameters": {
"toEmail": "ceo@company.com,safety@company.com",
"ccEmail": "ciso@company.com",
"subject": "={{ $json.subject }}",
"text": "Weekly ConTech & Building Technology KPI\n\nPlatform: {{ $json.platform }}\nCompliance Events: {{ $json.compliance }}\n\n---\nPowered by n8n | OSHA \u00a71904.2 recordkeeping compliant workflow"
}
}
],
"connections": {
"Monday 8AM": {
"main": [
[
{
"node": "Platform Metrics",
"type": "main",
"index": 0
},
{
"node": "Compliance Events",
"type": "main",
"index": 0
}
]
]
},
"Platform Metrics": {
"main": [
[
{
"node": "Build KPI Email",
"type": "main",
"index": 0
}
]
]
},
"Compliance Events": {
"main": [
[
{
"node": "Build KPI Email",
"type": "main",
"index": 1
}
]
]
},
"Build KPI Email": {
"main": [
[
{
"node": "Send KPI",
"type": "main",
"index": 0
}
]
]
}
}
}
Why ConTech customers want self-hosted n8n
| Compliance driver | Self-hosting argument |
|---|---|
| OSHA §1904.39 8h fatality clock | Safety incident API must fire within 8h of a fatality. Cloud iPaaS queue latency is untestable. Self-hosted n8n = demonstrable SLA on your infrastructure. |
| IBC §105 permit audit trail | Building permit compliance requires an immutable log of permit issuance and expiry dates. Cloud vendor workflows are outside your document control — self-hosted = your records on your servers. |
| ADA Title III litigation hold | ADA demand letters trigger a litigation hold. Cloud iPaaS logs are owned by the vendor — self-hosted keeps accessibility audit records under your direct legal custody. |
| LEED CI v4.1 documentation integrity | LEED recertification auditors require a complete, unaltered documentation trail. Git-versioned n8n workflows on your server = auditor-ready chain of custody. |
| CPSC 15 USC §2064(b)(3) recall data | CPSC civil investigative demands can reach cloud iPaaS providers independently. Self-hosted n8n keeps recall notification logs within your legal perimeter — one less subpoena target. |
5 buyer questions your ConTech sales team will face
1. We have OSHA 29 CFR Part 1926 construction sites — can n8n guarantee the 8-hour fatality reporting window to OSHA?
Self-hosted n8n fires the incident webhook from your own server — the 8-hour clock starts the moment your safety officer submits the report, not when a cloud vendor processes a queued event. You control the infrastructure SLA, not a third party.
2. Our projects require IBC §105 permit compliance across multiple jurisdictions — how does n8n handle multi-jurisdiction permit tracking?
The deadline tracker workflow reads from your Postgres table with jurisdiction-specific deadline_type and regulation_citation fields. Each jurisdiction gets its own row. The workflow runs weekdays at 8AM, classifies urgency (OVERDUE/CRITICAL≤14d/URGENT≤30d), and routes to the correct permit officer. Git-versioned workflow = IBC code adoption review audit trail.
3. We are subject to ADA Title III for built environments — how do we demonstrate barrier removal compliance if we receive a DOJ complaint?
The ADA_TITLE_III_BARRIER_COMPLAINT incident pipeline generates a timestamped Postgres record the moment a complaint is received, with a 72h remediation response deadline. That log is your DOJ investigation defense — showing the exact time you received notice and when you responded. Self-hosted means those records are under your document control, not a vendor's.
4. We pursue LEED CI v4.1 certification on projects — how does n8n integrate with green certification APIs?
The API health monitor polls your green_certification_api every 5 minutes and fires a LEED CI v4.1 documentation gap alert if it goes down. The deadline tracker includes LEED_RECERTIFICATION (5-year O+M cycle) and auto-routes to your sustainability lead 90/60/30/14 days before expiry. LEED auditors accept git-versioned workflow logs as documentation chain of custody.
5. We have CPSC product liability exposure for components installed in buildings — what happens when a recall is initiated?
The CPSC_PRODUCT_RECALL_NOTICE incident type triggers a 24-hour notification clock (15 USC §2064(b)(3)), logs to Postgres with incident_id, and emails Safety + Legal + CISO simultaneously. The CPSC_RECALL_READINESS annual deadline keeps your recall response plan current. Self-hosted n8n keeps recall notification records out of cloud vendor scope — one fewer target for CPSC civil investigative demands.
Try these workflows
All five workflows are available as ready-to-import JSON files at stripeai.gumroad.com — the BuildingTech / ConTech compliance automation pack.
Drop questions below or connect on the n8n community forum.
Top comments (0)