IT OPS

Daily Cloudflare Access vs HR Roster Reconciler

Each morning, pulls every Cloudflare Access app grant, compares it against the active-employee roster in your HR Postgres table.

CategoryIT Ops
Enginesim
Difficultyintermediate
Triggerschedule
Steps6
Setup~15 min

How it runs

The automated pipeline, trigger to output.

  • TriggerDaily schedule (07:00 local)
  • ActionList Cloudflare Access apps and user grantsCloudflareCloudflare
  • ActionQuery active employees from HR Postgres tablePostgreSQLPostgres
  • LogicDiff grants vs roster; classify orphaned access
  • ActionWrite grant snapshot to Postgres for audit historyPostgreSQLPostgres
  • OutputPost orphaned-access report to SlackSlack

What it does

Reconciles who *can* reach your internal apps through Cloudflare Access against who *should*, using your HR system as the source of truth. It surfaces grants tied to people who have left the company or were never on the roster, so orphaned access never lingers.

When to use it

Run this when you need a recurring, auditable check that access follows employment status. Ideal for SOC 2 / ISO access-review evidence and for catching offboarding gaps before an auditor (or attacker) does.

How it works

  1. 1A daily schedule fires the workflow.
  2. 2It calls Cloudflare to list Access applications and their assigned users/policies.
  3. 3It queries the HR Postgres table for all employees with status `active`.
  4. 4A logic step diffs the two sets, classifying each grant as matched, terminated, or unknown-identity.
  5. 5If any orphaned grants exist, it posts a formatted Slack report listing the app, the email, and the reason.
  6. 6The full grant snapshot is written back to Postgres for trend history and audit evidence.

Set it up

What you configure once, before turning it on.

  1. 1
    Connect CloudflareWorkers, Pages, R2, KV — the edge stack.
  2. 2
    Connect PostgresAny Postgres URL — query, write, migrate.
  3. 3
    Connect SlackChannels, DMs, threads, mentions.
  4. 4
    Set each agent's modelWe leave models unset so you pick the tier — fast + cheap, or top-quality.
  5. 5
    Tune it to your dataEdit the prompts, filters, and field mappings so it matches how your team works.
  6. 6
    Test, then turn it onRun once against a sample, confirm the output, then enable the trigger.

Run this workflow in your colony.

14-day trial. No DevOps. No Sales call. Provisioned in under a minute.