DEV Community

Alex Kane
Alex Kane

Posted on

n8n for HRTech & Workforce Management SaaS: 5 Automations for FLSA Overtime, ACA Reporting, I-9 Compliance, and OSHA 300 Log Sync

If you're building HR technology — workforce management SaaS, payroll platforms, benefits administration software, time-tracking systems, or employee self-service portals — your platform sits at the intersection of some of the most heavily regulated data in enterprise software.

FLSA overtime thresholds. ACA employer mandate reporting. I-9 employment eligibility. OSHA 300 injury logs. Every one of these has a federal clock, a penalty schedule, and an audit trail requirement. When your cloud iPaaS is in the data path, it shares responsibility for that clock.

Self-hosted n8n is different. Your workflow logic runs inside your HR platform's infrastructure. Employee PII, I-9 records, and benefits data never flow through third-party servers. The workflow JSON is a git-versioned artifact you can produce for DOL audits, IRS inquiries, or EEOC investigations.

Here are 5 production-ready n8n automations for HRTech SaaS vendors.


1. FLSA Overtime Alert & Manager Notification Workflow

Who it's for: Time-tracking SaaS, workforce scheduling platforms, payroll software

The problem: FLSA §207 requires 1.5x pay for non-exempt employees working over 40 hours/week. The penalty is back wages + equal amount in liquidated damages + attorney fees. Most violations happen because managers don't know until payroll closes — 5–7 days after the overtime already occurred.

The workflow:

  • Trigger: Cron (daily 18:00 local) or webhook from time-tracking system
  • Nodes: HTTP Request (pull weekly hours per employee) → Code (flag anyone ≥38h by Wednesday, ≥40h any day) → IF (overtime threshold crossed) → Slack DM to manager + Gmail to HR → Sheets (log overtime_alert with timestamp) → Wait until payroll close → HTTP Request (verify correction)

Import-ready JSON:

{
  "name": "FLSA Overtime Alert",
  "nodes": [
    {
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "Daily Check",
      "parameters": { "rule": { "interval": [{ "field": "hours", "hoursInterval": 24 }] } }
    },
    {
      "type": "n8n-nodes-base.httpRequest",
      "name": "Get Weekly Hours",
      "parameters": { "url": "={{ $env.HRIS_API_URL }}/hours/weekly", "method": "GET", "authentication": "genericCredentialType" }
    },
    {
      "type": "n8n-nodes-base.code",
      "name": "Flag Overtime Risk",
      "parameters": {
        "jsCode": "const employees = $json.employees || [];\nreturn employees.filter(e => e.hours_this_week >= 38).map(e => ({\n  json: { ...e, risk_level: e.hours_this_week >= 40 ? 'OVERTIME' : 'APPROACHING', checked_at: new Date().toISOString() }\n}));"
      }
    },
    {
      "type": "n8n-nodes-base.slack",
      "name": "Alert Manager",
      "parameters": { "channel": "={{ $json.manager_slack_id }}", "text": "⚠️ FLSA Alert: {{ $json.name }} has {{ $json.hours_this_week }}h this week. Status: {{ $json.risk_level }}" }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

2. ACA Employer Mandate — 1094-C/1095-C Data Aggregation Pipeline

Who it's for: Benefits administration SaaS, HRIS platforms, payroll software

The problem: ACA §4980H requires Applicable Large Employers (50+ FTEs) to offer minimum essential coverage or pay the employer shared responsibility payment. The IRS penalty is $2,970/employee/year (2024) for failure to offer coverage. The 1094-C/1095-C filing deadline is February 28 (paper) or March 31 (electronic).

The pain: ACA reporting requires combining data from payroll (hours), benefits (enrollment), and HR (headcount) — three systems that rarely sync automatically.

The workflow:

  • Trigger: Cron (monthly, 1st of month) + manual trigger for year-end
  • Nodes: HTTP Request (payroll hours) → HTTP Request (benefits enrollment) → HTTP Request (HR headcount) → Code (calculate FTE count, identify full-time threshold crossings, flag coverage gaps) → Google Sheets (1095-C data staging table) → Gmail (monthly summary to benefits admin)

Import-ready JSON:

{
  "name": "ACA Monthly Data Aggregation",
  "nodes": [
    {
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "Monthly Trigger",
      "parameters": { "rule": { "interval": [{ "field": "months", "monthsInterval": 1 }] } }
    },
    {
      "type": "n8n-nodes-base.code",
      "name": "Calculate FTE Count",
      "parameters": {
        "jsCode": "const employees = $json.employees;\nconst fullTime = employees.filter(e => e.monthly_hours >= 130);\nconst partTime = employees.filter(e => e.monthly_hours < 130 && e.monthly_hours > 0);\nconst pteFTE = partTime.reduce((s, e) => s + e.monthly_hours, 0) / 120;\nreturn [{ json: { full_time_count: fullTime.length, fte_equivalent: Math.round(fullTime.length + pteFTE), is_ale: (fullTime.length + pteFTE) >= 50, month: new Date().toISOString().slice(0,7) } }];"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

3. I-9 Employment Eligibility Expiration Monitor

Who it's for: HRIS platforms, onboarding software, compliance management tools

The problem: 8 U.S.C. §1324a requires I-9 re-verification for employees with temporary work authorization before their employment authorization expires. ICE Form I-9 audits carry civil penalties of $272–$2,701 per violation for paperwork errors and $698–$5,579 per unauthorized worker. Most HR teams lose track of expiring documents in spreadsheets.

The workflow:

  • Trigger: Cron (daily 07:00)
  • Nodes: HTTP Request (pull employees with expiring I-9 documents) → Code (bucket by days-to-expiry: 90d warning, 30d urgent, 7d critical, expired) → Switch (route by severity) → Gmail to HR specialist + manager (with re-verification checklist) → Sheets (log alert sent) → IF (expired AND no re-verification) → Slack escalation to legal/CHRO

Import-ready JSON:

{
  "name": "I-9 Expiration Monitor",
  "nodes": [
    {
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "Daily Monitor",
      "parameters": { "rule": { "interval": [{ "field": "hours", "hoursInterval": 24 }] } }
    },
    {
      "type": "n8n-nodes-base.code",
      "name": "Bucket by Urgency",
      "parameters": {
        "jsCode": "const today = new Date();\nreturn $json.employees\n  .filter(e => e.work_auth_expiry)\n  .map(e => {\n    const expiry = new Date(e.work_auth_expiry);\n    const days = Math.floor((expiry - today) / 86400000);\n    const severity = days < 0 ? 'EXPIRED' : days <= 7 ? 'CRITICAL' : days <= 30 ? 'URGENT' : days <= 90 ? 'WARNING' : 'OK';\n    return { json: { ...e, days_until_expiry: days, severity, checked_at: today.toISOString() } };\n  })\n  .filter(e => e.json.severity !== 'OK');"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

4. OSHA 300 Injury Log Sync & 300A Annual Summary Auto-Draft

Who it's for: EHS (environment/health/safety) SaaS, workplace safety platforms, HR compliance tools

The problem: OSHA 29 CFR §1904 requires employers with 10+ employees to maintain an OSHA 300 log of work-related injuries and illnesses. The OSHA 300A annual summary must be posted February 1–April 30 each year. Electronic submission (ITA portal) is required for establishments with 100+ employees in high-hazard industries.

The workflow:

  • Trigger: Webhook (incident.reported event from safety platform) + Cron (February 1 for annual summary)
  • Nodes: Webhook (new incident) → Code (classify by OSHA recordability criteria: days away, restricted duty, medical treatment, loss of consciousness, diagnosis of significant injury) → HTTP Request (post to OSHA 300 log database) → Gmail (supervisor notification + 24h follow-up reminder) → [Annual branch] Code (aggregate YTD, calculate incidence rates) → Google Docs (generate 300A draft) → Gmail (to EHS manager for review)

Import-ready JSON:

{
  "name": "OSHA 300 Incident Logger",
  "nodes": [
    {
      "type": "n8n-nodes-base.webhook",
      "name": "Incident Reported",
      "parameters": { "path": "incident-reported", "responseMode": "onReceived" }
    },
    {
      "type": "n8n-nodes-base.code",
      "name": "OSHA Recordability Check",
      "parameters": {
        "jsCode": "const i = $json.body;\nconst recordable = i.days_away_from_work > 0 || i.restricted_duty_days > 0 || i.medical_treatment_beyond_first_aid || i.loss_of_consciousness || i.significant_diagnosis;\nreturn [{ json: { ...i, osha_recordable: recordable, case_type: i.days_away_from_work > 0 ? 'DAYS_AWAY' : i.restricted_duty_days > 0 ? 'JOB_TRANSFER' : 'OTHER_RECORDABLE', logged_at: new Date().toISOString() } }];"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

5. New Hire Onboarding Compliance Checklist Orchestrator

Who it's for: HRIS onboarding software, HR service delivery platforms, employee experience tools

The problem: A compliant new hire onboarding involves I-9 (3 business days), W-4, state tax forms, benefits enrollment window (typically 30 days), direct deposit setup, mandatory training acknowledgments, and background check completion — each with its own deadline and legal consequence for missing it.

The workflow:

  • Trigger: Webhook (employee.hired event) or HRIS integration trigger
  • Nodes: Set (compute all deadline timestamps from hire date) → Code (generate checklist with deadlines) → Gmail Day 0 (welcome + I-9 instruction — "complete within 3 business days") → Wait 2d → IF (I-9 complete?) → Gmail reminder OR escalate to HR → Wait until Day 30 → IF (benefits enrolled?) → Gmail final warning OR log as declined → Sheets (track completion status for each item) → Code (generate compliance summary at Day 45)

Import-ready JSON:

{
  "name": "New Hire Compliance Orchestrator",
  "nodes": [
    {
      "type": "n8n-nodes-base.webhook",
      "name": "Employee Hired",
      "parameters": { "path": "employee-hired", "responseMode": "onReceived" }
    },
    {
      "type": "n8n-nodes-base.code",
      "name": "Compute Compliance Deadlines",
      "parameters": {
        "jsCode": "const hire = new Date($json.body.hire_date);\nconst addDays = (d, n) => { const r = new Date(d); r.setDate(r.getDate() + n); return r.toISOString(); };\nreturn [{ json: { ...$json.body,\n  i9_deadline: addDays(hire, 3),\n  benefits_deadline: addDays(hire, 30),\n  w4_deadline: addDays(hire, 7),\n  training_deadline: addDays(hire, 14),\n  compliance_review_date: addDays(hire, 45)\n} }];"
      }
    },
    {
      "type": "n8n-nodes-base.gmail",
      "name": "Day 0 Welcome",
      "parameters": {
        "toEmail": "={{ $json.work_email }}",
        "subject": "Welcome to {{ $json.company_name }} — Your First-Week Checklist",
        "message": "Hi {{ $json.first_name }},\n\nWelcome! To stay compliant, please complete:\n• I-9 Employment Eligibility: within 3 business days (by {{ $json.i9_deadline.slice(0,10) }})\n• W-4 Federal Tax: within 7 days\n• Benefits enrollment: within 30 days (by {{ $json.benefits_deadline.slice(0,10) }})\n\nYour HR team is here to help. Reply to this email with any questions."
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Why Self-Hosted n8n for HRTech Compliance Workflows

  1. Employee PII never leaves your infrastructure. Social Security numbers, I-9 documents, medical information, and salary data stay in your network. No third-party iPaaS server touches them.

  2. Audit trail is a git-versioned JSON file. When the DOL audits your overtime practices or ICE requests I-9 records, you produce the workflow JSON as part of your compliance documentation — timestamped, version-controlled, reproducible.

  3. The compliance clock is deterministic. n8n's built-in Wait node and Schedule Trigger fire on exact timestamps. You can prove to an EEOC investigator that the 3-business-day I-9 reminder fired on schedule.

  4. FlowKit ships these as ready-to-import workflow templates. Drop the JSON into your n8n instance, connect your HRIS API credentials, and the workflow is live in minutes — not weeks of custom development.


Free workflow templates for HRTech compliance automation: FlowKit on Gumroad

These workflows are starting-point templates, not legal advice. Verify compliance requirements with qualified employment law counsel before production deployment.

Top comments (0)