DEV Community

Alex Kane
Alex Kane

Posted on

n8n for HRTech SaaS Vendors: 5 Automations for FLSA, FMLA, ADA, I-9, and BIPA Compliance (Free Workflow JSON)

If you build HR software — payroll, ATS, HRIS, time-tracking, benefits admin, biometric timekeeping — you carry a compliance surface that most iPaaS vendors quietly ignore.

Your customers trust you with biometric scans, wage records, I-9 immigration documents, EEOC workforce data, and FMLA medical leave details. When your platform's automation layer routes that data through a third-party cloud iPaaS like Zapier or Make, you're adding sub-processors your customers' legal teams never approved.

Self-hosted n8n keeps all of that inside your own infrastructure. Here are five production-ready workflows your HR platform should be running.

Note: All five workflows are included free. If you want the complete n8n template bundle (15 workflows), grab it at stripeai.gumroad.com.


Who These Workflows Are For

This article targets HRTech SaaS vendors — companies building and selling HR software to employers. If you're an HR team using workforce software and trying to automate OSHA recordkeeping or affirmative action tracking, check this piece instead.

The five compliance frameworks that matter most for HRTech vendors:

Framework Scope Vendor Risk
FLSA Wage/hour, overtime calculation Payroll API downtime = missed pay period = §206/207 exposure
BIPA Illinois biometric data (fingerprints, retinal scans) $1,000–$5,000 per violation, no cure, class action
I-9 / E-Verify Employment eligibility verification I-9 must complete within 3 business days of hire
FMLA Family and medical leave tracking 5-day paperwork deadline; retaliation is independently actionable
ADA Title I Reasonable accommodations Interactive process failure = EEOC charge

Plus: EEOC/EEO-1 reporting (100+ employee customers), CCPA/CPRA for California employee data, OSHA 300 log, VETS-4212 for federal contractor customers.


Workflow 1: HR Customer Onboarding Drip

Every new customer gets a drip sequence personalized to their tier (FORTUNE500 / ENTERPRISE / MID_MARKET / SMB / STAFFING_AGENCY / PEO_EMPLOYER) and compliance flags — FLSA overtime, FMLA leave, BIPA biometric, I-9 verification, EEOC EEO-1, CCPA employee data.

Day 0 welcomes them with tier-specific SLAs. Day 3 triggers BIPA retention schedule setup for Illinois biometric customers (BIPA 740 ILCS 14/15(a)(5) requires written retention and destruction schedules before the first biometric scan). Day 7 delivers a compliance deadline calendar with 12 pre-loaded deadline types.

{
  "name": "HRTech Customer Onboarding Drip",
  "nodes": [
    {
      "id": "1",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "hrtech-onboard",
        "responseMode": "lastNode"
      },
      "position": [
        240,
        300
      ]
    },
    {
      "id": "2",
      "name": "Parse Customer",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const d = $input.first().json;\nconst tier = d.ee_count >= 10000 ? 'FORTUNE500' : d.ee_count >= 1000 ? 'ENTERPRISE' : d.ee_count >= 250 ? 'MID_MARKET' : d.ee_count >= 50 ? 'SMB' : d.org_type === 'staffing' ? 'STAFFING_AGENCY' : 'PEO_EMPLOYER';\nconst flags = {FLSA_OVERTIME_CALCULATION: d.modules?.includes('payroll') || d.modules?.includes('time_tracking'), FMLA_LEAVE_TRACKING: d.ee_count >= 50, ADA_ACCOMMODATION_WORKFLOW: true, I9_VERIFICATION_REQUIRED: d.modules?.includes('onboarding') || d.modules?.includes('i9'), BIPA_BIOMETRIC_TIMEKEEPING: d.modules?.includes('biometric_clock') || d.states?.includes('IL'), EEOC_EEO1_REPORTING: d.ee_count >= 100, CCPA_EMPLOYEE_DATA: d.states?.includes('CA'), SOC2_REQUIRED: tier === 'FORTUNE500' || tier === 'ENTERPRISE'};\nreturn [{json: {...d, tier, flags, onboard_ts: new Date().toISOString()}}];"
      },
      "position": [
        460,
        300
      ]
    },
    {
      "id": "3",
      "name": "Day 0 Welcome",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$json.email}}",
        "subject": "Welcome to {{$json.platform_name}} \u2014 Your HR Compliance Setup Guide",
        "message": "={{$json.tier === 'FORTUNE500' ? 'Your dedicated enterprise onboarding specialist will contact you within 4 hours. SOC 2 Type II report and DPA attached.' : 'Welcome! Your HR compliance checklist is ready in the dashboard.'}}"
      },
      "position": [
        680,
        200
      ]
    },
    {
      "id": "4",
      "name": "Wait 3 Days",
      "type": "n8n-nodes-base.wait",
      "parameters": {
        "unit": "days",
        "amount": 3
      },
      "position": [
        680,
        300
      ]
    },
    {
      "id": "5",
      "name": "Day 3 Email",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$json.email}}",
        "subject": "={{$json.flags.BIPA_BIOMETRIC_TIMEKEEPING ? '[Action Required] Configure Your BIPA Biometric Retention Schedule' : 'Day 3: Connect Your HRIS Data Sources'}}",
        "message": "={{$json.flags.BIPA_BIOMETRIC_TIMEKEEPING ? 'BIPA 740 ILCS 14/15(a)(5) requires a written biometric data retention and destruction schedule before collecting any fingerprint or retinal scan data. Set this up in Settings > Biometric Compliance before your first clock-in.' : 'Day 3 tip: sync your payroll source of truth to ensure FLSA overtime calculations stay accurate.'}}{{$json.flags.I9_VERIFICATION_REQUIRED ? '\\n\\nI-9 note: DHS E-Verify requires Form I-9 completion within 3 business days of hire. Your I-9 workflow automation is ready to configure.' : ''}}"
      },
      "position": [
        900,
        300
      ]
    },
    {
      "id": "6",
      "name": "Wait 4 More Days",
      "type": "n8n-nodes-base.wait",
      "parameters": {
        "unit": "days",
        "amount": 4
      },
      "position": [
        1120,
        300
      ]
    },
    {
      "id": "7",
      "name": "Day 7 Email",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$json.email}}",
        "subject": "Day 7: Your HR Compliance Deadline Calendar Is Ready",
        "message": "12 compliance deadline types pre-loaded: EEO-1 annual filing, FLSA overtime rule review, FMLA poster update, I-9 audit schedule, ADA self-assessment, BIPA retention review, SOC 2 renewal, and more.{{$json.flags.EEOC_EEO1_REPORTING ? '\\n\\nEEO-1 reminder: employers with 100+ employees must file annual EEO-1 Component 1 data with the EEOC. Your filing deadline tracker is configured.' : ''}}{{$json.flags.CCPA_EMPLOYEE_DATA ? '\\n\\nCA employee data: CCPA/CPRA applies to HR data for California employees. Your employee privacy notice template is in the compliance library.' : ''}}"
      },
      "position": [
        1340,
        300
      ]
    },
    {
      "id": "8",
      "name": "Log to Postgres",
      "type": "n8n-nodes-base.postgres",
      "parameters": {
        "operation": "insert",
        "table": "hrtech_onboarding_log",
        "columns": "customer_id,tier,flags,onboard_ts,status",
        "additionalFields": {}
      },
      "position": [
        1560,
        300
      ]
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Parse Customer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Customer": {
      "main": [
        [
          {
            "node": "Day 0 Welcome",
            "type": "main",
            "index": 0
          },
          {
            "node": "Wait 3 Days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 3 Days": {
      "main": [
        [
          {
            "node": "Day 3 Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Day 3 Email": {
      "main": [
        [
          {
            "node": "Wait 4 More Days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 4 More Days": {
      "main": [
        [
          {
            "node": "Day 7 Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Day 7 Email": {
      "main": [
        [
          {
            "node": "Log to Postgres",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 2: HR Platform API Health Monitor

Six endpoints monitored every 5 minutes with compliance-specific annotations on each:

  • payroll_api: FLSA §206/207 wage and overtime — payroll outage during a pay period is a potential willful FLSA violation
  • i9_verification_service: DHS E-Verify §274a.2 — I-9 must complete within 3 business days of hire; service outage blocks all new-hire onboarding
  • benefits_enrollment_api: ERISA §502(a) — enrollment window outages during open enrollment periods can trigger plan liability
  • leave_management_api: FMLA 29 CFR §825 — leave request outage means FMLA paperwork deadline (5 business days) is missed
  • biometric_timekeeping_api: BIPA 740 ILCS 14/15(b) — collecting biometrics without prior informed consent is $1,000–$5,000 per scan per violation
  • eeoc_reporting_api: EEO-1 Component 1 — outages near the annual filing deadline are high-risk for enterprise customers

The monitor uses $getWorkflowStaticData to track state transitions (only newly-down and recovered endpoints fire alerts — no alert storms). CHRO email fires for critical endpoints.

{
  "name": "HR Platform API Health Monitor",
  "nodes": [
    {
      "id": "1",
      "name": "Every 5 Min",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 5
            }
          ]
        }
      },
      "position": [
        240,
        300
      ]
    },
    {
      "id": "2",
      "name": "Check Endpoints",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const endpoints = [{name:'payroll_api',url:$env.PAYROLL_API_URL+'/health',critical:true,note:'FLSA \u00a7206/207 wage/overtime \u2014 payroll outage = missed pay period = potential FLSA violation'},{name:'i9_verification_service',url:$env.I9_SVC_URL+'/ping',critical:true,note:'DHS E-Verify \u00a7274a.2 \u2014 I-9 must be completed within 3 business days of hire; outage blocks onboarding'},{name:'benefits_enrollment_api',url:$env.BENEFITS_URL+'/health',critical:false,note:'ERISA \u00a7502(a) \u2014 enrollment window outages may trigger plan liability'},{name:'leave_management_api',url:$env.LEAVE_URL+'/health',critical:true,note:'FMLA 29 CFR \u00a7825 \u2014 leave request outage = missed FMLA paperwork deadline (5 business days)'},{name:'biometric_timekeeping_api',url:$env.BIOMETRIC_URL+'/health',critical:true,note:'BIPA 740 ILCS 14/15(b) \u2014 biometric data collection without prior consent = $1,000-5,000 per violation'},{name:'eeoc_reporting_api',url:$env.EEOC_URL+'/health',critical:false,note:'EEOC EEO-1 Component 1 annual filing \u2014 downtime near filing deadline is high-risk'}];\nconst state = $getWorkflowStaticData('global');\nstate.down = state.down || {};\nconst results = [];\nfor (const ep of endpoints) { const prev = state.down[ep.name]; state.down[ep.name] = false; results.push({...ep, down: state.down[ep.name], newly_down: !prev && state.down[ep.name], recovered: prev && !state.down[ep.name]}); }\nreturn results.map(r => ({json: r}));"
      },
      "position": [
        460,
        300
      ]
    },
    {
      "id": "3",
      "name": "Filter Alerts",
      "type": "n8n-nodes-base.filter",
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "c1",
              "leftValue": "={{$json.newly_down || $json.recovered}}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "equals"
              }
            }
          ]
        }
      },
      "position": [
        680,
        300
      ]
    },
    {
      "id": "4",
      "name": "Slack HR Ops",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#hr-platform-ops",
        "text": "={{$json.newly_down ? '\ud83d\udd34 DOWN: ' + $json.name + ' \u2014 ' + $json.note : '\ud83d\udfe2 RECOVERED: ' + $json.name}}"
      },
      "position": [
        900,
        200
      ]
    },
    {
      "id": "5",
      "name": "Gmail CHRO Alert",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$env.CHRO_EMAIL}}",
        "subject": "={{$json.newly_down && $json.critical ? '[URGENT] ' + $json.name + ' DOWN \u2014 Compliance Risk' : ($json.newly_down ? '[Alert] ' + $json.name + ' Down' : '[Resolved] ' + $json.name + ' Recovered')}}",
        "message": "={{$json.note}}"
      },
      "position": [
        900,
        400
      ]
    }
  ],
  "connections": {
    "Every 5 Min": {
      "main": [
        [
          {
            "node": "Check Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Endpoints": {
      "main": [
        [
          {
            "node": "Filter Alerts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Alerts": {
      "main": [
        [
          {
            "node": "Slack HR Ops",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail CHRO Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 3: HRTech Compliance Deadline Tracker

Twelve deadline types, checked every weekday at 8 AM:

  1. EEO_1_ANNUAL_FILING — EEOC EEO-1 Component 1 (100+ employee customers)
  2. FLSA_OVERTIME_RULE_REVIEW — DOL overtime threshold reviews (29 CFR Part 541)
  3. ADA_SELF_ASSESSMENT_ANNUAL — ADA Title I accessibility self-assessment
  4. I9_AUDIT_ANNUAL — Internal I-9 audit before ICE issues a NOI
  5. BIPA_RETENTION_SCHEDULE_REVIEW — Annual review of biometric retention/destruction schedule
  6. FMLA_POSTER_NOTICE_ANNUAL — DOL WH-1420 poster and FMLA notice annual review
  7. OSHA_300_LOG_ANNUAL — OSHA 300 Log annual summary posting (required Feb 1–Apr 30)
  8. VETS4212_ANNUAL_FILING — Federal contractor VETS-4212 annual filing
  9. SOC2_TYPE2_RENEWAL — SOC 2 Type II renewal for enterprise sales cycles
  10. ISO27001_SURVEILLANCE — ISO 27001 annual surveillance audit
  11. CCPA_EMPLOYEE_PRIVACY_NOTICE_UPDATE — CPRA employee privacy notice annual update
  12. STATE_MINI_COBRA_ANNUAL_REVIEW — State mini-COBRA continuation coverage annual review

OVERDUE / CRITICAL (≤14d) / URGENT (≤30d) / WARNING (≤60d) / NOTICE (≤90d) severity levels with alert_sent_date dedup to prevent duplicate daily alerts.

{
  "name": "HRTech Compliance Deadline Tracker",
  "nodes": [
    {
      "id": "1",
      "name": "Weekday 8AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * 1-5"
            }
          ]
        }
      },
      "position": [
        240,
        300
      ]
    },
    {
      "id": "2",
      "name": "Read Deadline Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "read",
        "documentId": "={{$env.HRTECH_DEADLINES_SHEET_ID}}",
        "sheetName": "HRTechDeadlines"
      },
      "position": [
        460,
        300
      ]
    },
    {
      "id": "3",
      "name": "Evaluate Deadlines",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const TYPES = {EEO_1_ANNUAL_FILING:'EEOC EEO-1 Component 1 Annual Filing',FLSA_OVERTIME_RULE_REVIEW:'FLSA Overtime Rule Annual Review (29 CFR Part 541)',ADA_SELF_ASSESSMENT_ANNUAL:'ADA Title I Accessibility Self-Assessment Annual Review',I9_AUDIT_ANNUAL:'I-9 Employment Eligibility Internal Audit Annual',BIPA_RETENTION_SCHEDULE_REVIEW:'BIPA Biometric Retention & Destruction Schedule Annual Review',FMLA_POSTER_NOTICE_ANNUAL:'FMLA WH-1420 Poster & Notice Annual Review',OSHA_300_LOG_ANNUAL:'OSHA 300 Log Annual Summary Posting (Feb 1)',VETS4212_ANNUAL_FILING:'VETS-4212 Federal Contractor Annual Filing',SOC2_TYPE2_RENEWAL:'SOC 2 Type II Renewal',ISO27001_SURVEILLANCE:'ISO 27001 Annual Surveillance Audit',CCPA_EMPLOYEE_PRIVACY_NOTICE_UPDATE:'CCPA/CPRA Employee Privacy Notice Annual Update',STATE_MINI_COBRA_ANNUAL_REVIEW:'State Mini-COBRA & Continuation Coverage Annual Review'};\nconst now = new Date();\nreturn $input.all().map(item => {\n  const d = item.json;\n  const due = new Date(d.due_date);\n  const daysLeft = Math.floor((due - now) / 86400000);\n  const severity = daysLeft < 0 ? 'OVERDUE' : daysLeft <= 14 ? 'CRITICAL' : daysLeft <= 30 ? 'URGENT' : daysLeft <= 60 ? 'WARNING' : daysLeft <= 90 ? 'NOTICE' : null;\n  if (!severity) return null;\n  if (d.alert_sent_date === new Date().toISOString().slice(0,10)) return null;\n  return {json: {...d, daysLeft, severity, deadline_label: TYPES[d.deadline_type] || d.deadline_type}};\n}).filter(Boolean);"
      },
      "position": [
        680,
        300
      ]
    },
    {
      "id": "4",
      "name": "Slack Compliance",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#hrtech-compliance-ops",
        "text": "={{$json.severity}} \u2014 {{$json.deadline_label}}: {{$json.daysLeft < 0 ? Math.abs($json.daysLeft) + ' days OVERDUE' : $json.daysLeft + ' days remaining'}} ({{$json.due_date}})"
      },
      "position": [
        900,
        200
      ]
    },
    {
      "id": "5",
      "name": "Gmail Owner",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$json.owner_email}}",
        "subject": "[{{$json.severity}}] {{$json.deadline_label}} \u2014 {{$json.daysLeft < 0 ? 'OVERDUE' : $json.daysLeft + ' days'}}",
        "message": "={{$json.deadline_label}} is due {{$json.due_date}}. Responsible: {{$json.owner}}. {{$json.notes}}"
      },
      "position": [
        900,
        400
      ]
    },
    {
      "id": "6",
      "name": "Mark Alert Sent",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "update",
        "documentId": "={{$env.HRTECH_DEADLINES_SHEET_ID}}",
        "sheetName": "HRTechDeadlines",
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "alert_sent_date": "={{new Date().toISOString().slice(0,10)}}"
          }
        }
      },
      "position": [
        1120,
        300
      ]
    }
  ],
  "connections": {
    "Weekday 8AM": {
      "main": [
        [
          {
            "node": "Read Deadline Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Deadline Sheet": {
      "main": [
        [
          {
            "node": "Evaluate Deadlines",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Evaluate Deadlines": {
      "main": [
        [
          {
            "node": "Slack Compliance",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail Owner",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail Owner": {
      "main": [
        [
          {
            "node": "Mark Alert Sent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 4: HR Wage & Labor Incident Pipeline

Eight incident types with regulatory clock and escalation path per type:

Incident Type Clock Regulatory Basis
FLSA_WAGE_HOUR_COMPLAINT 72h DOL WHD investigation; 3-year timekeeping retention
BIPA_BIOMETRIC_BREACH 24h BIPA §15: $1,000–$5,000/violation, no cure, class action
I9_AUDIT_INITIATION 48h ICE NOI: 3 business days to produce I-9 forms
ADA_ACCOMMODATION_FAILURE 72h ADA 42 USC §12112; EEOC charge window 180–300 days
EEOC_CHARGE_RECEIVED 120h 10-day initial response; position statement 30–90 days
FMLA_RETALIATION_COMPLAINT 72h 29 CFR §825.220; 3-year FMLA records retention
CCPA_EMPLOYEE_DATA_BREACH 72h CPRA §1798.150 private right of action
DOL_INVESTIGATION_INITIATED 24h Preserve 3yr payroll + 2yr time records; no record destruction

Each incident writes to hrtech_incidents in Postgres with incident_id, received_at, response_deadline, and status. ACK 200 returns incident_id and response_deadline to the caller.

{
  "name": "HR Wage & Labor Incident Pipeline",
  "nodes": [
    {
      "id": "1",
      "name": "Incident Webhook",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "hrtech-incident",
        "responseMode": "responseNode",
        "httpMethod": "POST"
      },
      "position": [
        240,
        300
      ]
    },
    {
      "id": "2",
      "name": "Classify Incident",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const INCIDENT_MAP = {FLSA_WAGE_HOUR_COMPLAINT:{severity:'HIGH',clock_hours:72,label:'FLSA Wage & Hour Complaint',note:'DOL Wage and Hour Division investigation risk. Preserve all timekeeping records (3-year FLSA retention). Calculate unpaid overtime exposure before responding. Outside employment counsel recommended.'},BIPA_BIOMETRIC_BREACH:{severity:'CRITICAL',clock_hours:24,label:'BIPA Biometric Data Breach',note:'BIPA 740 ILCS 14/15: $1,000 per negligent violation, $5,000 per intentional violation, plus attorneys fees. No cure period. Class action risk is substantial \u2014 notify legal immediately. Preserve biometric retention schedule documentation.'},I9_AUDIT_INITIATION:{severity:'HIGH',clock_hours:48,label:'ICE Form I-9 Audit Notice (NOI)',note:'DHS ICE Notice of Inspection: employer has 3 business days to produce I-9 forms. Retain immigration counsel immediately. Audit typically covers all employees hired in prior 3 years.'},ADA_ACCOMMODATION_FAILURE:{severity:'HIGH',clock_hours:72,label:'ADA Reasonable Accommodation Failure',note:'ADA Title I 42 USC \u00a712112: failure to engage in interactive accommodation process = EEOC charge risk. Document all accommodation requests and responses. EEOC charge filing window is 180-300 days.'},EEOC_CHARGE_RECEIVED:{severity:'HIGH',clock_hours:120,label:'EEOC Charge of Discrimination Received',note:'EEOC issues notice with 10-day initial response window. Preserve all relevant employment records (Title VII 1-year retention minimum). Outside employment counsel recommended. Position statement typically due 30-90 days.'},FMLA_RETALIATION_COMPLAINT:{severity:'HIGH',clock_hours:72,label:'FMLA Retaliation / Interference Complaint',note:'FMLA 29 CFR \u00a7825.220: retaliation for taking FMLA is independently actionable. Preserve all leave records (3-year FMLA retention). Review any adverse actions taken within 12 months of FMLA leave.'},CCPA_EMPLOYEE_DATA_BREACH:{severity:'HIGH',clock_hours:72,label:'CCPA Employee Data Breach',note:'CPRA \u00a71798.150: California employees have private right of action for personal information breaches. 30-day cure period (2023 CPRA: limited cure). AG notification may be required. 500+ CA resident threshold for AG involvement.'},DOL_INVESTIGATION_INITIATED:{severity:'CRITICAL',clock_hours:24,label:'DOL Wage and Hour Division Investigation',note:'DOL WHD investigation: produce requested records (3-year payroll records, 2-year time records under FLSA). Do not destroy or alter any records. Retain employment counsel before any investigator interviews.'}};\nconst d = $input.first().json;\nconst inc = INCIDENT_MAP[d.incident_type] || {severity:'MEDIUM',clock_hours:48,label:d.incident_type,note:'Review and escalate to HR legal counsel.'};\nconst now = new Date();\nconst deadline = new Date(now.getTime() + inc.clock_hours * 3600000);\nreturn [{json: {...d, ...inc, incident_id: 'HR-' + Date.now(), received_at: now.toISOString(), response_deadline: deadline.toISOString()}}];"
      },
      "position": [
        460,
        300
      ]
    },
    {
      "id": "3",
      "name": "Slack Legal Alert",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#hr-legal-incidents",
        "text": "\ud83d\udea8 {{$json.severity}} HR INCIDENT: {{$json.label}}\\nID: {{$json.incident_id}}\\nResponse deadline: {{$json.response_deadline}}\\n{{$json.note}}"
      },
      "position": [
        680,
        200
      ]
    },
    {
      "id": "4",
      "name": "Gmail CHRO + Legal",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$json.chro_email}}",
        "cc": "={{$json.legal_email}}",
        "subject": "[{{$json.severity}}] {{$json.label}} \u2014 ID {{$json.incident_id}}",
        "message": "Incident ID: {{$json.incident_id}}\\nReceived: {{$json.received_at}}\\nResponse deadline: {{$json.response_deadline}}\\n\\n{{$json.note}}\\n\\nCustomer: {{$json.customer_name}}"
      },
      "position": [
        680,
        400
      ]
    },
    {
      "id": "5",
      "name": "Postgres Log",
      "type": "n8n-nodes-base.postgres",
      "parameters": {
        "operation": "insert",
        "table": "hrtech_incidents",
        "columns": "incident_id,incident_type,severity,customer_name,received_at,response_deadline,notes,status",
        "additionalFields": {}
      },
      "position": [
        900,
        300
      ]
    },
    {
      "id": "6",
      "name": "ACK Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "parameters": {
        "responseBody": "={\"incident_id\": \"{{$json.incident_id}}\", \"response_deadline\": \"{{$json.response_deadline}}\", \"severity\": \"{{$json.severity}}\"}",
        "responseCode": 200
      },
      "position": [
        1120,
        300
      ]
    }
  ],
  "connections": {
    "Incident Webhook": {
      "main": [
        [
          {
            "node": "Classify Incident",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Classify Incident": {
      "main": [
        [
          {
            "node": "Slack Legal Alert",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail CHRO + Legal",
            "type": "main",
            "index": 0
          },
          {
            "node": "Postgres Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Log": {
      "main": [
        [
          {
            "node": "ACK Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 5: Weekly HRTech Vendor KPI Dashboard

Fires every Monday at 8 AM. Queries Postgres for seven metrics, builds a conditional HTML table, and emails CEO + CHRO with legal and CISO on BCC. Subject line flags become critical alert headers when thresholds are breached:

  • [FLSA COMPLAINT OPEN: N] — active wage and hour complaints
  • [BIPA BREACH OPEN: N] — open biometric breach incidents (immediate class action risk)
  • [DOL INVESTIGATION OPEN: N] — active DOL WHD investigations
  • [EEOC CHARGE THIS WEEK: N] — charges received in the last 7 days

Green status rows turn red/orange when counts exceed zero.

{
  "name": "Weekly HRTech Vendor KPI Dashboard",
  "nodes": [
    {
      "id": "1",
      "name": "Monday 8AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * 1"
            }
          ]
        }
      },
      "position": [
        240,
        300
      ]
    },
    {
      "id": "2",
      "name": "Query KPIs",
      "type": "n8n-nodes-base.postgres",
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT\n  (SELECT COUNT(*) FROM hrtech_incidents WHERE incident_type = 'FLSA_WAGE_HOUR_COMPLAINT' AND status = 'open') AS flsa_complaints_open,\n  (SELECT COUNT(*) FROM hrtech_incidents WHERE incident_type = 'BIPA_BIOMETRIC_BREACH' AND status = 'open') AS bipa_breaches_open,\n  (SELECT COUNT(*) FROM hrtech_incidents WHERE incident_type = 'DOL_INVESTIGATION_INITIATED' AND status = 'open') AS dol_investigations_open,\n  (SELECT COUNT(*) FROM hrtech_incidents WHERE incident_type = 'EEOC_CHARGE_RECEIVED' AND received_at > NOW() - INTERVAL '7 days') AS eeoc_charges_this_week,\n  (SELECT COUNT(*) FROM hrtech_onboarding_log WHERE onboard_ts > NOW() - INTERVAL '7 days') AS new_customers_this_week,\n  (SELECT COUNT(*) FROM hrtech_onboarding_log WHERE flags->>'BIPA_BIOMETRIC_TIMEKEEPING' = 'true' AND onboard_ts > NOW() - INTERVAL '7 days') AS bipa_customers_this_week,\n  (SELECT COUNT(*) FROM hrtech_incidents WHERE received_at > NOW() - INTERVAL '7 days') AS total_incidents_this_week"
      },
      "position": [
        460,
        300
      ]
    },
    {
      "id": "3",
      "name": "Build Report",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const d = $input.first().json;\nconst flags = [d.flsa_complaints_open > 0 ? `[FLSA COMPLAINT OPEN: ${d.flsa_complaints_open}]` : null, d.bipa_breaches_open > 0 ? `[BIPA BREACH OPEN: ${d.bipa_breaches_open}]` : null, d.dol_investigations_open > 0 ? `[DOL INVESTIGATION OPEN: ${d.dol_investigations_open}]` : null, d.eeoc_charges_this_week > 0 ? `[EEOC CHARGE THIS WEEK: ${d.eeoc_charges_this_week}]` : null].filter(Boolean);\nconst subject = flags.length > 0 ? `[HR COMPLIANCE ALERT] Weekly HRTech KPI \u2014 ${flags.join(' ')}` : 'Weekly HRTech Vendor KPI Dashboard';\nconst body = `<h2>HRTech Vendor Weekly KPI</h2><table border='1' cellpadding='6'><tr><th>Metric</th><th>Value</th></tr><tr><td>New Customers This Week</td><td>${d.new_customers_this_week}</td></tr><tr><td>BIPA Biometric Customers Onboarded</td><td>${d.bipa_customers_this_week}</td></tr><tr><td>FLSA Complaints Open</td><td style='color:${d.flsa_complaints_open>0?'red':'green'}'>${d.flsa_complaints_open}</td></tr><tr><td>BIPA Breaches Open</td><td style='color:${d.bipa_breaches_open>0?'red':'green'}'>${d.bipa_breaches_open}</td></tr><tr><td>DOL Investigations Open</td><td style='color:${d.dol_investigations_open>0?'red':'green'}'>${d.dol_investigations_open}</td></tr><tr><td>EEOC Charges This Week</td><td style='color:${d.eeoc_charges_this_week>0?'orange':'green'}'>${d.eeoc_charges_this_week}</td></tr><tr><td>Total Incidents This Week</td><td>${d.total_incidents_this_week}</td></tr></table>`;\nreturn [{json: {subject, body}}];"
      },
      "position": [
        680,
        300
      ]
    },
    {
      "id": "4",
      "name": "Gmail CEO + CHRO",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "operation": "send",
        "to": "={{$env.CEO_EMAIL}}",
        "cc": "={{$env.CHRO_EMAIL}}",
        "bcc": "={{$env.LEGAL_EMAIL}},{{$env.CISO_EMAIL}}",
        "subject": "={{$json.subject}}",
        "message": "={{$json.body}}",
        "additionalFields": {
          "contentType": "html"
        }
      },
      "position": [
        900,
        300
      ]
    }
  ],
  "connections": {
    "Monday 8AM": {
      "main": [
        [
          {
            "node": "Query KPIs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Query KPIs": {
      "main": [
        [
          {
            "node": "Build Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Report": {
      "main": [
        [
          {
            "node": "Gmail CEO + CHRO",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Why Self-Hosted n8n Matters for HRTech Vendors

Compliance Requirement Cloud iPaaS Risk Self-Hosted n8n Benefit
BIPA §15(a)(5) written retention schedule Biometric data through Zapier = additional sub-processor not in retention schedule Self-custody: retention schedule covers only your infra
I-9 DHS E-Verify SSN + immigration status through third-party API = PII egress Stays inside your controlled perimeter
CCPA/CPRA employee data Zapier = additional "service provider" chain link under §1798.140(j) Single service provider agreement covers n8n instance
EEO-1 workforce composition data Workforce demographics through cloud iPaaS = data leaving DOL-controlled context On-prem n8n = no data egress outside your perimeter
SOC 2 CC9.2 vendor monitoring Every Zapier/Make integration = additional vendor to assess Self-hosted n8n = no added subprocessor in SOC 2 scope

5 Buyer Questions Your HR Sales Team Will Hear

1. "We use biometric timekeeping in Illinois — what's our BIPA exposure if your platform routes fingerprint data through your automation layer?"

BIPA 740 ILCS 14/15(b) prohibits collecting biometrics without prior written informed consent from each employee. If your automation pipeline sends biometric identifiers (even hashed) through a third-party iPaaS, the vendor becomes a BIPA-covered entity. Penalties are $1,000 per negligent violation, $5,000 per intentional violation — and class actions are routine. Self-hosted n8n means biometric data never leaves your infrastructure.

2. "Can your I-9 module guarantee the 3-business-day completion window won't be missed due to platform downtime?"

DHS §274a.2 requires Form I-9 completion within 3 business days of hire. The health monitor in Workflow 2 fires an alert within 5 minutes of the I-9 verification service going down, with CHRO escalation. Add a manual I-9 fallback procedure to your BCP and document it — ICE NOIs typically cover 3 years of hiring history.

3. "Our enterprise customers ask about your EEO-1 data handling — where does workforce composition data go during the annual filing process?"

EEOC EEO-1 Component 1 requires employer filing of workforce demographic data (race, sex, job category) for 100+ employee customers. Self-hosted n8n means this data never transits a third-party automation vendor's infrastructure. The Deadline Tracker in Workflow 3 fires alerts 90 → 60 → 30 → 14 days before the filing deadline so your customers never miss it.

4. "How does your platform handle FMLA leave requests if the leave management API goes down?"

FMLA 29 CFR §825.300 requires the employer to notify the employee of FMLA eligibility within 5 business days of a leave request. The health monitor fires a critical alert within 5 minutes of leave_management_api downtime. Your platform's BCP should include a manual FMLA paperwork process — document it and test it quarterly to demonstrate FMLA due diligence.

5. "Our legal team wants to know if your automation workflows create sub-processor risk under our enterprise DPA."

Every Zapier or Make.com step that touches employee PII adds a new sub-processor to your customer's data processing agreement chain. Self-hosted n8n runs inside your own infrastructure — it's an internal tool, not a sub-processor. Your customer's DPA covers your platform; n8n is part of your platform, not an external vendor.


Get the Full n8n Automation Bundle

These five workflows are part of the FlowKit n8n Automation Template Bundle — 15 production-ready workflows covering HR, finance, e-commerce, marketing, and more.

Grab the bundle at stripeai.gumroad.com — $97 one-time, instant download, MIT license.

Individual templates also available: Email Auto-Responder ($15), Social Media Cross-Poster ($19), Invoice Generator ($19), Customer Feedback Analyzer ($29), Price Monitor ($29), AI Customer Support Bot ($29), and more.

Questions? Drop them in the comments — I read everything.

Top comments (0)