← back to Lawyer Directory Builder

migrations/005_leads.sql

34 lines

-- Inbound consumer leads — the LendingTree-for-lawyers funnel.
-- Submitted via the public /find-a-lawyer form, reviewed/routed by admins.

CREATE TABLE IF NOT EXISTS leads (
  id                 BIGSERIAL PRIMARY KEY,
  full_name          TEXT NOT NULL,
  email              TEXT NOT NULL,
  phone              TEXT,
  practice_area      TEXT NOT NULL,    -- 'personal_injury' | 'family' | 'criminal' | 'immigration' | 'business' | 'estate' | 'other'
  zip                TEXT,
  city               TEXT,
  case_description   TEXT,
  budget             TEXT,             -- 'under_500' | '500_2k' | '2k_10k' | '10k_plus' | 'unsure'
  urgency            TEXT,             -- 'immediate' | 'within_week' | 'within_month' | 'just_researching'
  consent_to_contact BOOLEAN NOT NULL DEFAULT true,
  status             TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'matched', 'contacted', 'won', 'lost', 'spam')),
  matched_firm_ids   BIGINT[],
  admin_notes        TEXT,
  ip                 TEXT,
  user_agent         TEXT,
  source             TEXT,             -- 'public_form' | 'partner' | 'organic' | 'paid'
  created_at         TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  updated_at         TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_leads_status        ON leads(status);
CREATE INDEX IF NOT EXISTS idx_leads_practice_area ON leads(practice_area);
CREATE INDEX IF NOT EXISTS idx_leads_created       ON leads(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_leads_zip           ON leads(zip);

CREATE OR REPLACE TRIGGER trg_leads_updated
  BEFORE UPDATE ON leads
  FOR EACH ROW EXECUTE FUNCTION set_updated_at();