Quick answers to the questions that come up most often. Filtered live as you type, or pick a tab to jump to a section.
/fra_inspection_tool.html).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.
The overlay fires when you tap Start, tap into an assigned job, or resume a saved session. Behind the scenes it's:
Should clear within 2-4 seconds. If it hangs more than 15s, check signal and try again.
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.
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 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.
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.
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.
Two places:
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.
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.
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.
Both look similar but happen at different points in the lifecycle:
/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./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.
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.
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.
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.
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.
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.
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.
STAGE_OVERRIDE has two categories:
inspection, report_in_progress — set then auto-cleared when a higher-ranked stage email/event arrives.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.
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).
Three checks:
?pn=<exact name> or load via the Jobs page.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.
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.
Two possibilities:
[GHL] cancel: no Hub job found. Usually means the job was created before SmartHub IDs were captured. Archive manually from the Hub.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.
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 slowFAILED — HTTP Error 4xx → real failure, paste the response bodycurl -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.
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.
Three checks in order:
ghl_opportunity_id — outbound pushes silently no-op. Check the job detail panel.no stage_id matched.SMARTHUB_API_KEY valid? A revoked PIT silently fails outbound while inbound (webhook secret) still works.Three layers, depending on the moment:
inspection_tool > pending store on your phone. Retried every 30s + on online event.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.
Items hit a MAX_RETRIES = 10 cap before being dropped. Before that point:
↑ N pending badge in the topbar — opens the diagnostic with the most recent error per item.inspection_media_unique_v1.sql), 401 (auth header malformed).Hub Assistant proxies through /api/chat to Anthropic. Most likely causes:
ANTHROPIC_API_KEY unset on Railway — chat 500s.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.
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.
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.
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.
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.