DEEPFLOW SOFTWARE
DeepFlow
Field Certification Platform

Professional-grade certificates for PAT testing and gas safety records — built for contractors who care about quality.

PAT Test LIVE

Portable appliance testing with automated certificates

Gas CP12 LIVE

Gas safety records and landlord certificates

EICR SOON

Electrical installation condition reports

Fire Alarm SOON

Fire safety inspection and test records

Emerg. Lighting SOON

Emergency lighting test documentation

Job Management SOON

Schedule, invoice and track all your jobs

Welcome back
Sign in to your account to continue
Forgot password?

You cannot create an account directly. Submit a request and an admin will review it and add you to the system.

Enter your email address and we'll send you a link to reset your password.

Set New Password

Choose a strong password for your account.

OHM Certificates
Dashboard
Overview of all certificates
Total PAT Tests
All time
PAT Complete
Issued
PAT Renewals Due
Next 30 days
Total CP12s
All time
CP12 Complete
Issued
Gas Renewals Due
Next 30 days
Recent PAT Tests
View all
📋

No PAT tests yet

Recent CP12s
View all
🔥

No CP12s yet

New PAT Test
Test Date applies to all rows · Ctrl+S = Draft
Report Details
Property & Client
Required — do NOT put postcode in the address box above
Appliances
Asset # Description Instrument Date Period Next Due Result
Live Certificate Preview Use ⬇ PDF above for exact A4 output
Cert Status
 No data yet
Property
0
Appliances
✅ Pass0
❌ Fail0
Pass rate
Pages
Required Fields
PAT History
All portable appliance test records
📋

Loading…

Compliance
PAT & Gas renewals in one place

Loading…

New CP12
Company logo
Click to
add logo
Landlord/Homeowner Gas Safety Record
Landlord / Customer Details
Installation / Inspection Address
Engineer / Business Details
Defects / Immediately Dangerous / At Risk Notices Issued Warning
Notice Type
1
2
3
4
5
Remedial Action Required
Work Carried Out
Pipework / Installation Checks Satisfactory
/ Pass
Gas Tightness Test
Standing / Working Pressure Test
Gas Installation Visual Check
Meter / Governor Condition
Emergency Control Accessible
Record issued by the engineer:
Record received by (tenant / landlord / homeowner / agent):
ATTENTION — Next Gas Safety Check Due
This certificate must be kept safe and shown to your gas engineer at the next inspection.
Appliance Inspection Details
Certificate Ref:
App. No.
Location
Type
Manufacturer
Model
Owned by Landlord / Homeowner?
Inspected?
Type of Flue
Operating Pressure (mbar) / Heat Input
Safety Device(s) Op.
Ventilation Safety Checks
Visual Condition of Flue & Termination
Flue Operation Check
Combustion Analyser Reading
Serviced?
Safe to Use?
Sign Here
Use your finger or mouse to sign in the box below
CP12 History
All gas safety certificate records
🔥

Loading…

Settings
Company & application configuration
Choose Email Method
📧 Google Apps Script
Send via your Google account script URL
✉️ Brevo
Send via Brevo transactional email API
Google Apps Script Settings
Brevo Settings
Test Email
✉ Email Defaults
These apply to all certificate types — PAT, Gas CP12 and any future certificates. The Fallback Email is used when no client email is on the record. The BCC Email is always blind-copied on every send.
Used when a certificate has no client email set
Silently copied on every certificate email — all types
Company Information — PAT
These details print on every PAT certificate — header name, footer contact and VAT / Reg numbers.
PAT Test Defaults
Branding — Logos & Signature
Upload Logo
No Image
Upload
No Image
Upload
No Image
Upload
Certificate Colours
AI Handwriting Scan
Add a free Gemini API key for the best scan accuracy. If left blank, scans fall back to a free public OCR service automatically.
Get a free key at aistudio.google.com/apikey
📄 Certificate Content
Gas CP12 Settings
These details auto-fill every new Gas CP12 certificate — company header, engineer box, and footer contact.
Logos & Signature
Upload Logo
No Image
Upload Signature
🔢 Reference Number System
One reference system for all certificate types — PAT and Gas CP12 share the same base and format.
Format Preview
Your reference numbers will look like:
OHM6559/1 MARINA POINT
[BASE] + [MONTH] + [POSTCODE SCORE] / [DOOR + STREET]
Example: Base OHM655 + Month 9 + IG1 1JP score 44 / 1 MARINA POINT → OHM655944/1 MARINA POINT
Certificates Issued
PAT Reports
Gas CP12
Total Issued
Counts load when you open this tab.
Recent References Issued
Opens when you switch to this tab.
My Profile
Where Your Data Is Saved
📋 PAT Reports → Supabase
Table: pat_reports
Stores: ref number, test date, engineer, landlord, address, phone, email, status, appliances (JSON array with Asset ID / Description / Instrument / Period / Result)
🔗 Open in Supabase Table Editor
🔥 CP12 Gas Certificates → Supabase
Table: gas_certs
Stores: all CP12 form fields (installer/landlord addresses, engineer details, pipework checks, defects, appliance cards, signatures as base64, status)
🔗 Open in Supabase Table Editor
⚙ App Settings → Supabase
Table: app_settings
Stores: company name, phone, email, address, email method, PAT/Gas defaults — saved per user. Brevo API key stored here (never in source code).
🔗 Open in Supabase Table Editor
📝 Auto-save → Browser (localStorage)
While you fill in a form, CP12 data is auto-saved to your browser every 4 seconds (cp12_autosave_v1) and PAT data every 15 seconds (pat_autosave). This survives page refresh but is local to this browser only — not synced to the cloud until you click Save.
👥 Staff Setup — One-Time SQL Migration
Run this once in your Supabase SQL Editor to enable Staff Management. It adds role and is_active columns, sets up admin permissions, and makes mandeepdynamics@gmail.com an admin. Safe to run multiple times (all steps are idempotent).
-- Step 1: Add columns if they don't exist
ALTER TABLE public.profiles ADD COLUMN IF NOT EXISTS role TEXT NOT NULL DEFAULT 'engineer';
ALTER TABLE public.profiles ADD COLUMN IF NOT EXISTS is_active BOOLEAN NOT NULL DEFAULT true;

-- Step 2: Make mandeepdynamics@gmail.com an admin
UPDATE public.profiles SET role = 'admin'
  WHERE email = 'mandeepdynamics@gmail.com';

-- Step 3: Drop old restrictive policies and add admin-read-all policy
DROP POLICY IF EXISTS "Users can read own profile" ON public.profiles;
DROP POLICY IF EXISTS "Admin read all profiles" ON public.profiles;
DROP POLICY IF EXISTS "Admin update profiles" ON public.profiles;

CREATE POLICY "Users can read own profile" ON public.profiles
  FOR SELECT USING (auth.uid() = id);

CREATE POLICY "Admin read all profiles" ON public.profiles
  FOR SELECT USING (
    EXISTS (
      SELECT 1 FROM public.profiles
      WHERE id = auth.uid() AND role = 'admin'
    )
  );

CREATE POLICY "Admin update profiles" ON public.profiles
  FOR UPDATE USING (
    EXISTS (
      SELECT 1 FROM public.profiles
      WHERE id = auth.uid() AND role = 'admin'
    )
  );

-- Step 4: Allow admins to insert new profiles (for add-staff flow)
DROP POLICY IF EXISTS "Admin insert profiles" ON public.profiles;
CREATE POLICY "Admin insert profiles" ON public.profiles
  FOR INSERT WITH CHECK (
    EXISTS (
      SELECT 1 FROM public.profiles
      WHERE id = auth.uid() AND role = 'admin'
    )
  );

-- Step 5: Add must_change_password column (first-time login enforcement)
ALTER TABLE public.profiles ADD COLUMN IF NOT EXISTS must_change_password BOOLEAN NOT NULL DEFAULT false;

-- Step 6: Create staff_requests table (anyone can submit, only admins can read/update)
CREATE TABLE IF NOT EXISTS public.staff_requests (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  full_name TEXT NOT NULL,
  email TEXT NOT NULL,
  message TEXT,
  status TEXT NOT NULL DEFAULT 'pending',
  created_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE public.staff_requests ENABLE ROW LEVEL SECURITY;

DROP POLICY IF EXISTS "Anyone can submit request" ON public.staff_requests;
CREATE POLICY "Anyone can submit request" ON public.staff_requests
  FOR INSERT WITH CHECK (true);

DROP POLICY IF EXISTS "Admin read requests" ON public.staff_requests;
CREATE POLICY "Admin read requests" ON public.staff_requests
  FOR SELECT USING (
    EXISTS (SELECT 1 FROM public.profiles WHERE id = auth.uid() AND role = 'admin')
  );

DROP POLICY IF EXISTS "Admin update requests" ON public.staff_requests;
CREATE POLICY "Admin update requests" ON public.staff_requests
  FOR UPDATE USING (
    EXISTS (SELECT 1 FROM public.profiles WHERE id = auth.uid() AND role = 'admin')
  );
App & Database Links
Live App (GitHub Pages)
ohmdeepcerts.github.io/certificates
Open ↗
Source Code (GitHub)
github.com/ohmdeepcerts/certificates
Open ↗
Supabase Dashboard
Project ID: iihnfgmsfshrgrhargxz
Open ↗
Supabase Auth (Users)
Manage logins, reset passwords
Open ↗
Supabase API Keys
anon key, service role key, JWT secret
Open ↗
Audit Log
All system activity
📄

Loading…

Staff Management
Manage team members, roles and access
👥

Loading…

Loading…
DayMonthYear