DEV Community

Alex Kane
Alex Kane

Posted on

n8n for BuildingTech & ConTech SaaS Vendors: 5 Automations for OSHA, ADA Title III, IBC, and LEED Compliance (Free Workflow JSON)

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
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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)