CaptureOS

Capture Intelligence Platform

⚙ Connect Supabase
CaptureOS uses Supabase for real authentication. Free tier handles thousands of users. Setup takes 5 minutes.
1. Go to supabase.com → New project
2. Settings → API → copy Project URL & anon key
3. Authentication → Providers → enable Email + Google
4. SQL Editor → run the schema below → Paste keys & save
5. Team setup: The first person to sign up owns the workspace. To add teammates, also run captureos-org-security-fix.sql, deploy the backend worker, then use your avatar menu → Manage Team to add them by email. (Never set org_id in user_metadata — it's user-editable and grants nothing.)
▶ Required SQL — run once in Supabase SQL Editor
-- PER-RECORD TEAM DATA MODEL (v2)
-- Every deal, customer, contact, grant, and activity entry is its
-- own row, so teammates can edit different records at the same time
-- without overwriting each other. Conflicts on the same record
-- resolve by newest edit. Deletes are soft (tombstones) so they
-- propagate correctly across devices.

create table if not exists crm_org_settings (
  org_id text primary key,
  org_name text,
  created_at timestamptz default now()
);

create table if not exists crm_records (
  org_id     text not null,
  collection text not null,   -- 'gov_opps', 'gov_customers', ...
  id         text not null,   -- the record's own id
  data       jsonb not null,
  updated_at timestamptz not null default now(),
  updated_by text,
  deleted    boolean not null default false,
  primary key (org_id, collection, id)
);
create index if not exists crm_records_org_coll
  on crm_records (org_id, collection);

alter table crm_records      enable row level security;
alter table crm_org_settings enable row level security;

-- TEAM MEMBERSHIP — authorization lives in this table, NEVER in
-- user_metadata (which users can edit themselves).
create table if not exists org_members (
  org_id       text not null,
  user_id      uuid not null,
  member_email text,
  added_by     uuid,
  created_at   timestamptz not null default now(),
  primary key (org_id, user_id)
);
create index if not exists org_members_user on org_members (user_id);
alter table org_members enable row level security;
create policy "member sees own, owner sees roster" on org_members
  for select using (user_id = auth.uid() or org_id = auth.uid()::text);
create policy "owner adds members" on org_members
  for insert with check (org_id = auth.uid()::text);
create policy "owner removes, member leaves" on org_members
  for delete using (org_id = auth.uid()::text or user_id = auth.uid());

-- Authorization: the owner is the user whose id IS the org id;
-- members resolve to the org they were added to.
create or replace function get_org_id() returns text
language sql stable security definer set search_path = public as $$
  select coalesce(
    (select org_id from org_members where user_id = auth.uid()
      order by created_at asc limit 1),
    auth.uid()::text
  );
$$;

create policy "team read"   on crm_records for select using (org_id = get_org_id());
create policy "team insert" on crm_records for insert with check (org_id = get_org_id());
create policy "team update" on crm_records for update
  using (org_id = get_org_id()) with check (org_id = get_org_id());
-- No delete policy on purpose: deletes are soft (deleted = true).

create policy "org settings" on crm_org_settings for all
  using (org_id = get_org_id()) with check (org_id = get_org_id());

-- OPTIONAL but recommended: live sync between teammates' screens
alter publication supabase_realtime add table crm_records;

-- UPGRADING from the old one-blob-per-table setup? Just run the
-- statements above. Leave your old crm_opportunities / crm_customers
-- / etc. tables alone — CaptureOS reads them once on your next login
-- and migrates everything into crm_records automatically. If you had
-- teammates set up the old way (user_metadata.org_id), also run
-- captureos-org-security-fix.sql to carry their memberships over.
Saved

CEO Dashboard

Pipeline health at a glance

Logo
CaptureOS Capture Intelligence Platform
Pipeline by Product Line
Pipeline Health
Pipeline by Stage
🔥 Deals Closing This Quarter
OpportunityAccountProductStageValueClose DateOwner
📋 Follow-Ups DueView All
📄 RFPs UpcomingView All
RFPDeadlineValue
Recent Opportunities
OpportunityAccountStageProductValueNext ActionOwner
⚡ Team Activity Feed Shared across your team
Score 🔥 80–100 = Smoking hot ⚡ 60–79 = Warm ❄ <60 = Cool
OpportunityScoreStage ValueCloseOwnerWhy Hot
Opportunity Account Stage Product Prob% Total Value Close Date Next Action Due Owner Last Touch Health ↕ Actions
Deal Overview
Timeline & Activity
🎯
Deal Coach
Analyzing deal…
HIGH
Log next action →
click to open activity log
Add your Anthropic key in
Company Brain → Settings
to activate Deal Coach
Next Action
Contacts
Relationship Map
Financials
Upcoming Meetings
No meetings linked yet
Status Opportunity Account Next Action Due Date Stage Owner Actions
Status Opportunity Account Product Stage Value Last Touch Days Silent Owner Health ↕ Actions
RFP Name Agency / State Release Date Deadline Days Left Est. Value Status Owner Actions
OpportunityAccountProduct OwnerLicenseConsultingRecurring TotalClose DateCampaign Source

Stage Funnel & Avg Time in Stage

How long deals spend at each stage · where pipeline stalls

Avg Days to Close by Product

Won deals only

Rep Velocity

Avg days to close by owner

Stall Risk — Open Deals

Deals sitting longest relative to avg close time for their stage

DealAccountStage Days in StageStage AvgStall IndexValue
All
In Progress
Planned
Completed
📞 Cold Call Campaigns
Campaign Name TypeStart EndStatus ContactsRespondedOpps CreatedActions
Revenue by Source
Deals Won by Source
Won Deals with Campaign Source
OpportunityAccountProductLead SourceCampaignValueOwnerClose Date
1
Choose Type
2
Upload CSV
3
Map Fields
4
Preview
5
Done
How to export from Salesforce — exact steps
1
In Salesforce, go to Setup → search Data Export → click Export Now
2
On the Data Export screen, check Replace carriage returns with spaces (already checked by default — keep it on)
3
Under Exported Data, check exactly these boxes — nothing else needed:
Opportunity
Contact
OpportunityHistory
OpportunityContactRole
Task (calls/emails/tasks)
Event (meetings)
Account
Campaign (optional)
Everything else (Contract, Approval, Lead, RecordType, etc.) can be left unchecked.
4
Click Start Export. Salesforce emails you a download link when ready (usually a few minutes). You'll get a ZIP with multiple CSV files inside.
5
From the ZIP, upload these files here in this order:
1st Opportunity.csv → select Opportunities
2nd Contact.csv → select Contacts
3rd Task.csv + Event.csv → select Activities / Tasks
Opportunities must be imported first — Contacts and Activities link to them by Opportunity Name.
What are you importing?
📈
Opportunities
Deals, pipeline, won/lost
📞
Activities / Tasks
Calls, emails, meetings linked to opps
👤
Contacts
People linked to opportunities
📣
Campaigns
Marketing campaigns
📄
RFPs / Bids
From opportunities marked as RFP
Name Role / Title Agency / Account Opportunity Email Phone Stage MQL
CustomerContract #Vehicle Ceiling ValuePeriod HealthEngagementRenewal RiskRenewal
Published posts are saved locally and can be exported to your website CMS.
All Posts
Published
Drafts
Opportunity Radar — Contracts You Could Win
📡 YOU are the vendor — these are RFPs you could win, not grants your customers apply for
Last scan: never · Click AI Scan to detect predicted opportunities
High Probability Opportunities 0
Emerging Opportunities 0

Budget Signals

Expiring Contracts

Recompete Radar — Incumbent Contracts Coming Up for Rebid
♻ Real awards from USAspending.gov — someone else's contract is your next opportunity
Never scanned · Configure targets below, then scan
Hunting Grounds
Target agencies (awarding agency, as named on USAspending)
NAICS codes (leave empty for all)
💰
Grant Tracker — Money Flowing TO Your Customers
Track federal grants & NOFAs that tribal programs can apply for. Alert customers to new funding → they get the grant → they fund your software. Looking for contracts where you are the vendor? → Opportunity Radar
Active NOFAs & Grant Opportunities
Federal money your customers can apply for · Alert them before deadlines → new grant = new budget for your software
Alert Your Customers
These customers may qualify. Send them a funding alert → they apply → new budget flows to your platform.
Coverage Map
Customer (active) Prospect (in pipeline) At-Risk Customer Lost Deal
All Pins
White Space
States with no presence
Templates
Select a template or create a new one

RFP Answer Library

Upload past RFPs → AI extracts Q&A pairs → Auto-match to new RFPs · ✦ AI-powered
Answer Library
No answers yet.
Upload a past RFP to get started.
Select a question
← Select a question from the library to view and edit its answer.
📚 Knowledge Library 🧠 FEEDS BRAIN
📚
Your Knowledge Library is empty
Everything you add here gets injected into the Company Brain when it's relevant to a question. Great things to add: blog posts about your solution, tribal policy articles, battle cards, customer stories, RiteTrack differentiators, federal funding updates.
Suggested Questions
📋 Pipeline
🏛 Customers & Renewals
💰 Grants & Funding
🎯 Strategy
Anthropic API Key
Key stays in your browser. Never sent anywhere else.
Context Included
All opportunities
Activity timelines
RFP tracker
Meeting logs from Memoro
Data Management
🧠
Company Brain
Ask anything about your pipeline, accounts, deals, or meeting history. I have full context across every opportunity and activity in this CRM.
Sequence Library
Active Enrollments
Your sequences
Sequence nameStepsTriggerActiveRepliedModified
No sequences yet
Total proposals
0
all time
Sent & viewed
0
awaiting response
Accepted
0
closed from proposal
Avg value
$0
per proposal
All proposals
ProposalAccountValueStatusTrackingCreatedExpires
No proposals yet — click + New Proposal to build one
Meetings today
0
on your calendar
This week
0
upcoming
Linked to deals
0
auto-matched
Calendar
--
not connected
Upcoming meetings
MeetingDate & timeLinked dealAttendees
No meetings yet
Google Calendar

Paste your Google Calendar API key to auto-import meetings. Meetings are linked to deals by matching attendee emails and account names.

Google Cloud Console → Create API key → enable Calendar API → paste above

Auto-link settings
NAICS Prospecting
Recompete Tracker
Competitor Wins
Agency Spending
Open Solicitations
12
matching your NAICS
90%+ Match
4
high-fit opportunities
Set-Asides
7
tribal / 8(a) / small biz
Closing This Week
2
respond fast
Open Solicitations
Synced today 6:00 AM
SolicitationAgencyNAICSValueSet-AsideIncumbentMatchCloses
📋
Add an Opportunity
📞
Log a Call
☀️
Morning Briefing
🏢
Add a Customer
🧠
Ask Company Brain
🎯
CaptureOS Assistant
● Online · Ready to help
How did the call go?
Log activity for
Went well Positive, moving forward
🔁
Needs follow-up Action required
Dead end No response / lost
📋 Meeting Prep
Preparing...
skip