← Back to Hub
Help

Frequently Asked Questions

Quick answers to the questions that come up most often. Filtered live as you type, or pick a tab to jump to a section.

How do I start an inspection on site?
+
  1. On your phone, open the Inspection Tool from your home screen (or visit /fra_inspection_tool.html).
  2. The Home screen shows jobs assigned to you. Tap the one for your current site.
  3. If you saved prep on the Pre-Inspection Tool, a green "Prep on file" banner appears on Setup. Confirm your use profiles, then tap Start inspection.
  4. You're now in the Walkthrough. Boxes mirror the 5 Notes Tool sections. Tap a box head to make it active, then capture.
What happens to my photos and voice notes if I lose signal mid-walk?
+

They're queued in your phone's local storage and automatically retry every 30 seconds plus the moment signal returns. A ↑ N pending badge appears in the topbar so you can see the count.

Even photos and prep transcripts you took offline rejoin the inspection cleanly when they finally upload — nothing is lost.

My phone is showing the page loading — what's it doing?
+

The overlay fires when you tap Start, tap into an assigned job, or resume a saved session. Behind the scenes it's:

  • Creating the inspection record
  • Loading sub-prompts for your selected use profiles
  • Loading your saved prep (if any)
  • Rehydrating any previous captures (on resume)

Should clear within 2-4 seconds. If it hangs more than 15s, check signal and try again.

How do prep mic spots work?
+

Each item in the "From your prep" section of a box has a 🎤 button. Tap it → the record modal opens with the prep prompt shown as the question. Say your finding, save → the transcript attaches to that specific prep item and surfaces under it in the Notes Tool when you write up.

You can also tap ✓ (verified), ⚠ (flagged), or 📝 (typed note) on the same row.

How do I flag a photo as a potential finding?
+

Tap the photo in the recent strip (above the action bar) or the gallery → the preview opens → tap the red 🚩 Flag as potential finding button. The thumbnail gains a red ring + 🚩 corner badge in both the Inspection Tool and the Notes Tool's Media panel.

The Notes Tool also gets a "🚩 Flagged" filter chip so you can isolate just the flagged ones while writing up.

When will my report be ready to write up?
+

When the background Whisper transcription finishes — usually 30 seconds to 2 minutes after submit, depending on how many voice notes you took. You'll get an email titled "Write-up ready: <premises>" with a direct link to the Notes Tool the moment it's done.

On the Hub Jobs board, the card pulses 🎙 Transcribing until it's done, then switches to ✓ Ready for notes.

My phone keeps locking during the walkthrough. What can I do?
+

It shouldn't — the Inspection Tool requests a Screen Wake Lock when you enter the Walkthrough, so the phone stays awake without you having to disable auto-lock in Settings.

If it's still locking, your iOS version may be below 16.4 (Wake Lock unsupported), or low-power mode might be denying the request. Plug it in or disable low-power mode while on site.

Will my photos save to the camera roll?
+

Today (PWA): No. Apple doesn't expose a Photos API to web apps. Your captures live in the inspection record (cloud + local IDB) but don't appear in Photos.

Coming soon (native iOS shell): Yes — silent camera-roll save on every shot, no extra taps. Currently waiting on Apple Developer enrolment to ship via TestFlight.

How do I know there's a report waiting for me?
+

Two places:

  • Email — you get one each time an assessor hits Submit for Review, with a direct link to the report.
  • Hub Home — the "For Approval" stat tile shows the count.
How do I return a report with comments?
+

Open the report in the Notes Tool. Walk through Step 3 onwards. In review mode you can flag specific sections + add review notes. When you're done, tap Return for changes at the bottom. The assessor gets an email with your reasoning, and the job flips to Returned on the board.

What does the assessor see when I return a report?
+

They open the Notes Tool in returned mode. Any sections you flagged are visually highlighted. Your review notes appear at the top of each affected section. They address the issues, tap "Mark addressed", then re-submit. The job goes back to With reviewer for you to re-check.

Can I edit the assessor's text directly?
+

In returned mode, yes — but the convention is to leave a review note instead so the assessor's authorship stays intact. Inline edits are for typos and small clarifications.

What's the difference between "Returned" and "Amendment"?
+

Both look similar but happen at different points in the lifecycle:

  • Returned — you (the reviewer) return a report before approval. Triggered by /api/reports/return. The job moves to the Returned column, assessor gets an email with your notes, and on resubmit it comes back to you for re-review.
  • Amendment — happens after delivery, when the customer requests changes via the portal. Triggered by /api/jobs/request-amendment. The job gets a sticky amendment_in_progress override that needs explicit clearing.

Both are sticky overrides — the stage won't auto-clear until somebody actively moves the job forward.

When I approve, does the customer get the report automatically?
+

No — Approval moves the report to report_complete but doesn't fire any customer email. That happens at the Delivery step (Admin marks Delivered → customer gets the PDF). Two separate actions for two reasons: (1) sanity check between approval and dispatch, (2) admin can re-render or add cover-letter customisations before sending.

How do I add a job manually (not from SmartHub)?
+

On the Hub Jobs page, click + Add Job in the top right. Fill in premises, address, assessor, inspection date. The job lands at pre_inspection by default. You can override the starting stage if it's already partway through.

What do the job-card pills mean?
+
  • ✓ Form in / ⊖ No form — customer pre-inspection form status
  • 📋 Prep ready / Prep needed — assessor's prep status
  • 🎙 Transcribing (pulsing) — Whisper sweep in flight
  • ✓ Ready for notes — transcripts done, Notes Tool can open cleanly
  • 🚩 Flagged on photos — assessor marked as potential finding
  • 5d in stage — days since the job entered its current stage (only shows when stale)
  • ↺ Re-inspection — matches a previously delivered FRA at the same property
How do I mark a delivered report as sent?
+

From the job's detail panel on the Jobs page, click Mark Delivered. The job flips to sent, the customer is notified (if email on file), and the SmartHub opportunity moves to Completed.

How do I check whether SmartHub stage pushes are working?
+

Run a job through a stage change and watch Railway logs for:

[GHL] outbound: opp <id> → "inspection_complete" (stage <id>)

If you see no stage_id matched hub_stage="X", the SmartHub pipeline stage names don't contain the keyword. Rename the SmartHub stage to include the substring, or tell Marco to update the mapping.

What's the difference between job_overrides and fra_jobs?
+

job_overrides is the system-of-record. One row per premises. Holds every override, every JSONB blob (prep_briefing, preinspection_responses, internal_notes), every GHL ID, archive + delivery flags. This is what we write to.

fra_jobs is a derived denormalised mirror — just the canonical stage + assessor for fast querying. Auto-synced via sb_upsert_job(). If the two ever disagree (rare; usually a failed write), job_overrides wins.

How does re-inspection detection work?
+

The function compute_property_key(address) derives a stable identifier from house number + UK postcode, lowercased and stripped of whitespace. Example: "10 Manor Mews, St Ives, PE27 5UW" → 10_pe275uw.

This means address-text noise (county vs city, comma placement, etc.) doesn't break the match. When a fresh booking lands, the Hub checks for any previously delivered FRA at the same property_key and surfaces a Re-inspection banner on the Pre-Inspection Tool with prior findings to verify.

How do "stuck" stages happen (returned, amendment)?
+

STAGE_OVERRIDE has two categories:

  • Auto-clearing: inspection, report_in_progress — set then auto-cleared when a higher-ranked stage email/event arrives.
  • Sticky: returned, amendment_in_progress, report_complete, sent — set and stay set until explicitly changed.

If a job's stuck on a sticky stage and the natural path won't clear it, use the Set Stage button on the Hub side panel to force an override.

A photo is stuck on "pending" — what now?
+

If you're online and a photo's been pending more than 30 seconds, tap the ↑ N pending badge in the topbar. You'll see what's in the offline retry queue. After 10 failed attempts the system drops items so they don't loop forever.

If a whole batch is stuck, force-refresh the page (drag-to-refresh is disabled to prevent accidental data loss — use the browser refresh button).

The Notes Tool isn't loading my inspection content.
+

Three checks:

  1. Is the inspection complete? The "Submit & finish" overlay needs to have fired. Drafts won't load.
  2. Have transcripts finished? If the green banner says "N audio still transcribing", wait for the sweep to finish (usually under a minute).
  3. Is the premises name matching? If you used a slightly different premises name in the Inspection Tool, the Notes Tool may not match. Check the URL has ?pn=<exact name> or load via the Jobs page.
Where are pre-inspection prep, captures, and transcripts actually saved?
+

Prep: Supabase job_overrides.prep_briefing JSONB column.

Captures (photos/video/voice): Supabase Storage bucket inspection-media, metadata in the inspection_media table.

Transcripts: Patched into the transcript column on the same row by the Groq sweep.

The Notes Tool textareas (when you save) live in the fra_reports.session_data JSONB column.

An assessor's email isn't being delivered.
+

Check /api/email-status — returns the last error from Resend or Gmail. Common causes: rate limit on Resend, sandbox-mode for unverified recipients, or wrong env var.

You can also send a test to yourself: /api/test-email?to=marco.fiore@cambsfiresafe.com.

SmartHub cancelled an appointment but the Hub didn't archive the job.
+

Two possibilities:

  1. The appointment was deleted, not cancelled. GHL doesn't fire the Appointment Status trigger on hard-deletes. Always set the appointment status to Cancelled rather than deleting.
  2. The webhook fired but found no match. Railway logs show [GHL] cancel: no Hub job found. Usually means the job was created before SmartHub IDs were captured. Archive manually from the Hub.
My deploy isn't showing my latest changes.
+

Hard-refresh first (⌘⇧R on Mac, Ctrl+Shift+R on Windows). HTML caches aggressively.

If still wrong, check Railway → Deployments. The top entry should match your latest commit hash. If it's stuck or failed, click the three-dot menu → Redeploy. Build logs will show any failure.

Transcripts have been "in progress" for 10+ minutes.
+

Whisper usually finishes a small inspection in 30s. If it's been 10+ minutes the sweep has likely crashed silently — usually a Groq rate-limit (429) or transient 503.

Diagnose: Railway logs filter for [transcribe-sweep]. You'll see either:

  • ok (NN chars) per row → it's finishing, just slow
  • FAILED — HTTP Error 4xx → real failure, paste the response body
  • Nothing — sweep didn't fire. Re-fire via:
    curl -X POST https://robinsfirehub.co.uk/api/inspections/complete -H "Content-Type: application/json" -d '{"inspection_id":"<id>"}'

If Cloudflare's blocking us (error 1010 in the body), that's a User-Agent issue — flag to Marco; the fix is a non-default UA header in _groq_transcribe.

SmartHub cancellation didn't archive the Hub job.
+

Most common cause: the appointment was deleted rather than cancelled. GHL only fires the Appointment Status trigger on status changes. Hard-delete fires no webhook.

Always set the status to Cancelled (or "No Show") — never delete from the calendar.

If the appointment was cancelled correctly but the job is still on the board, check Railway logs for [GHL] cancel: no Hub job found. That means the appointment lookup couldn't match the booking — usually because the job pre-dates the appointment_id column. Archive manually from the Hub.

SmartHub stage push didn't fire after a Hub stage change.
+

Three checks in order:

  1. Does the job have a SmartHub origin? Manually-added jobs have no ghl_opportunity_id — outbound pushes silently no-op. Check the job detail panel.
  2. Does the SmartHub pipeline stage name contain the keyword? Hub looks for substrings (e.g. "post-inspection", "approval"). If a stage was renamed in SmartHub and lost the keyword, the push will log no stage_id matched.
  3. Is SMARTHUB_API_KEY valid? A revoked PIT silently fails outbound while inbound (webhook secret) still works.
Where are my photos actually stored?
+

Three layers, depending on the moment:

  • In flight (mobile, online) — held briefly in browser RAM as Blobs while uploading.
  • Offline-queued (mobile) — IndexedDB inspection_tool > pending store on your phone. Retried every 30s + on online event.
  • Permanent (server) — Supabase Storage bucket inspection-media, key <inspection_id>/<kind>-<stem>.<ext>. Metadata (caption, box_key, flagged flag, transcript) on the inspection_media row.

Notes Tool fetches signed URLs (1h TTL) via /api/inspection-content to render thumbnails without exposing the raw bucket.

A whole batch of captures is in the IDB queue but won't drain.
+

Items hit a MAX_RETRIES = 10 cap before being dropped. Before that point:

  1. Tap the ↑ N pending badge in the topbar — opens the diagnostic with the most recent error per item.
  2. Common errors: 400 (server validation, often a schema migration not run), 42P10 (UNIQUE constraint missing — apply inspection_media_unique_v1.sql), 401 (auth header malformed).
  3. The "Clear all" button at the bottom drops everything from the queue. Use this last — captures are gone after.
Hub Assistant chat isn't responding.
+

Hub Assistant proxies through /api/chat to Anthropic. Most likely causes:

  • ANTHROPIC_API_KEY unset on Railway — chat 500s.
  • Claude 429 — Anthropic rate-limited us; wait a minute then retry.
  • Network gateway timeout — Anthropic 30s+ response on long context. Trim the prompt.
Where do I view my report after delivery?
+

The Customer Portal at customer_auth.html on the same domain. Use the email address Cambs Fire Safe has on file. Login uses Supabase Auth — password or magic link.

Once in, you'll see every premises that's been assessed for you, with the latest delivered report against each.

Portal is currently in active development — some features may not be fully wired yet. Contact Cambs Fire Safe if anything's missing.

I need a change to the report — what do I do?
+

From the Customer Portal, open the report and tap Request Changes. Add a short note describing what's needed.

This creates an "Amendment" task that lands on the assessor's queue. They'll review your request, make the changes (or come back to you if more info's needed), and re-deliver. You'll get an email when the amended report is ready.

Can I share my report with someone else (e.g. contractor, broker)?
+

Yes — Cambs Fire Safe can generate a read-only share link for a specific report. Ask the team and they'll send you the link. The recipient sees just the report + action items, not your account.

Will I get reminders about action items?
+

Planned — automated action-item reminders via email aren't live yet but are on the roadmap. For now, the Customer Portal shows due dates and current status against each finding.

My pre-inspection form — what happens to my answers?
+

Your answers go straight to the assessor preparing for your visit. They're surfaced in the Pre-Inspection Tool so the assessor can read your context before arriving on site — which means a shorter, more focused inspection.

The form isn't a gate (the assessor will visit either way), but filling it in saves time and ensures nothing's missed.

Hub · System Map · Health