Frequently Asked Questions

Answers for the compliance officer in the room

The five questions we hear most often from environmental, EHS, and regulatory teams before they sign — answered with concrete references to the platform, not hand-waving.

Which regulations does SentinelIQ cover today?

A closed taxonomy of regulatory tags is enforced inside the dataset — free-form strings are never accepted. The six seed jurisdictions are seeded in src/lib/business/compliance/taxonomy.ts: EU Green Deal, US EPA Clean Air Act, US EPA Clean Water Act, California Air Resources Board, UK Environment Agency, and Australia NGER.

Live alerts drawn from data/regulatory-feed.json extend that surface as rules land — EPA NESHAP refinery fenceline monitoring, EPA CWA steam-electric ELG updates, CARB Advanced Clean Fleets phase-in, NYSDEC Part 212 NOx RACT updates, NYC Local Law 97 penalty schedule, EU CBAM Phase 2 embedded emissions, UK EPR public register changes, and Australian Safeguard Mechanism baseline tightening are all shipped live. Each entry already carries its regulatoryTags + effectiveDate so the platform cross-references new rules against the closed taxonomy as soon as the feed is updated.

What does a compliance report actually look like?

Reports are rendered from the HTML template at src/lib/business/compliance/template.ts and turned into a regulator-ready PDF by the installed pdf module. Every report ships with the same structure: a site / reporting-period meta block, regulatory-tag chips from the closed taxonomy, totals (readings counted, sensors reporting, metrics tracked), and the readings table itself with each reading's measured value, threshold, and pass/warn / fail status.

Want to see the shape before signing in? Each tier card on /pricing#tiers prints a live sampleOutput line taken straight from the production data model, and you can generate a full sample PDF in under a minute from the same page.

How is pricing structured — what does each tier include?

Three tiers, no add-on fees. The exact deliverables per tier are defined on src/app/(custom)/pricing/page.tsx and rendered live on /pricing:

  • Pilot — up to 3 compliance reports per month, the regulatory alerts feed (read-only), a basic risk-flag summary per report, and regulator-ready PDF export.
  • Professional — unlimited reports, the full alerts feed with site-level risk scoring, the report history + audit trail, and email notifications on threshold breaches.
  • Operations — everything in Professional, plus field crew dispatch and scheduling, the multi-site monitoring dashboard, and cron-automated report generation.
Do you have an API and webhook story?

Every per-tenant resource is exposed through an authenticated REST surface — you read and mutate app data exclusively via @/lib/api-client (apiFetch). The shipped endpoints today:

  • /api/reports and /api/reports/[id] — report CRUD, scoped by where: { userId: user.id }; see src/app/api/reports/route.ts and src/app/api/reports/[id]/route.ts.
  • /api/regulatory/alerts — the live regulatory feed.
  • /api/regulatory-tags — the closed taxonomy as JSON.
  • /api/crews/schedule — field crew dispatch.
  • /api/billing/summary — billing state for the authenticated tenant.
  • /api/pdf/document — programmatic PDF render backed by the installed pdf module (renderDocumentPdf).

Webhook honesty: outbound webhooks for report-published and threshold-breach events are on the Operations tier roadmap — they don't ship as a generic /api/webhooks/ surface yet. In the meantime, authenticated clients can poll /api/reports for new completions. Tell us your consumer format and we'll flag the priority of the rollout.

How do you handle data privacy, retention, and per-tenant scoping?

Per-tenant isolation lives in the route handlers, not the database: requireAuth() resolves the session, and every read and write is scoped by where: { userId: user.id } (or the matching aggregated group key for shared workspaces). There is no implicit global query path — if a handler forgets the scope, the data simply isn't returned.

Shared workspaces: every report carries optional orgId and orgLabel fields, so a compliance group can attach readings and reports to an organisation namespace without anyone outside that namespace seeing them.

Retention policy is explicit, not automated — there is no cron-driven purge job silently dropping rows. Reports persist until the account owner deletes them; deletion is irreversible and audited. If your procurement requires a fixed retention window (e.g. 7-year archive with tamper-evident hashing), say so during kickoff and we'll scope the Operations-tier tenant configuration to match.

Model training: your customer report data is never used to train shared or foundation models. The only place it lands is your tenant's own query results and exported PDFs.

Custom answers for your operations

Still have a hard one for your sector?

We've worked through emissions trading schemes, NYC-LL97-style building caps, cross-border CBAM declarations, and bespoke consent limits. Send us the rule and we'll come back with the short answer.

See pricing