About Dealsplit

Revenue recognition for real estate teams, simplified.

Last deployed April 15, 2026 at 5:02 PM EST

Changelog

Changes on branch `beta`

Unreleased
Added
  • Multi-PDF Dashboard Upload: Upload up to 10 PDFs at once from the dashboard. Each file gets its own progress indicator, extractions run concurrently, and single-file uploads auto-navigate to the wizard when extraction completes. The upload path now flows through the same ingest pipeline as Google Drive auto-import, so both sources share worker, PubSub, and billing logic
  • Searchable Vendor Dropdown: Vendor-name matching in the deal wizard now uses a searchable select with keyboard navigation — much easier to find the right vendor in long lists
  • Expanded Golden Path Coverage: New real-deal test fixtures for Caza and Sarver brokerage statements (10+ new cases) to validate extraction across more statement formats
Changed
  • Compass Statement Extraction: Further improvements to Compass split handling, concession capture, and multi-agent split parsing — fewer manual corrections in the wizard for Compass deals
  • Centralized GL Keys & Display Helpers: Principal-agent detection, GL account key lookups, and display formatting consolidated into shared helpers so the wizard, journal preview, and posting destinations stay in lockstep
Fixed
  • A bunch of quality-of-life UX fixes: Journal entry rendering, wizard scroll behavior, duplicate flash messages on upload failure, double-navigation during multi-file selection, and assorted small polish throughout the dashboard and wizard
  • Billing Quota Enforcement on Multi-Upload: Per-file billing check now accounts for in-flight uploads, so users can't exceed their plan's deal quota by uploading multiple files at once
  • Orphan Deal Cleanup: Deals created during Drive ingestion are now cleaned up if the worker fails to enqueue, preventing stranded rows
  • Upload Error Surfacing: Local storage upload returns {:error, reason} instead of raising, so upload failures become flash messages instead of crash pages
Security
  • Force HTTPS in Production: force_ssl enabled in prod with secure cookies. Health check endpoints excluded from the SSL redirect so Fly's internal checks still work over HTTP
  • Changeset Trust Boundary: Enforced split between user-editable and server-controlled fields on deal schemas — user form submissions can no longer accidentally write to fields like user_id, status, or calculated values
Tech Debt / Refactor
  • Centralized GL account keys, principal-agent checks, and display formatting helpers
  • Upload rate limit now aligned with the dashboard uploader's max_entries
  • Drive ingest pipeline refactored to accept an upload-path entry point (finalize_upload_ingest/3, ingest_uploaded_file/4), unifying Drive polling and dashboard upload on the same worker flow
  • .worktrees/ ignored at the repo level to support isolated feature development

Changes on branch `gpt54`

Unreleased
Changed
  • GPT-5.4 Extraction Engine: Upgraded AI extraction from GPT-4o to GPT-5.4 with native PDF upload — PDFs are sent directly to the model instead of converting to images, improving accuracy especially on Compass statements and eXp notifications
  • Strict Schema Enforcement: Extraction output is now constrained by a strict JSON schema at the token level, eliminating malformed or missing fields
  • Better Bank Deposit Detection: 12 previously-failing extraction cases now correctly identify the bank deposit amount, particularly on Compass and referral deals
Fixed
  • QBO OAuth Tests: Fixed 3 tests that expected bare string from authorization_url/1 instead of {:ok, url} tuple

0.4.0 - 2026-03-28

Added
  • Company Dollar / Broker Fee Extraction: AI extraction now recognizes broker fee variants — "Company Dollar", "Company Commission", "Commissions to Office", "CAP"/"Pre-Cap"/"Post-Cap", "Broker Fee", "Office Fee", "Franchise Fee". Treated as negative amounts (money flowing back to brokerage)
  • Compass Statement Handling: Extraction handles Compass split structures (e.g., 85% commission + 5% incentive = 90% to agent), auto-calculates full GCI from partial, and extracts net company commission as negative broker_fee
  • New golden path test cases: Two new Coalition Properties golden test cases with source PDFs and expected outputs
  • Searchable Select Hook: JS hook for agent matching dropdowns with keyboard navigation and filtering
  • Google Picker Hook: JS hook for Google Drive spreadsheet selection
  • Dimensional Tags: Selectable QBO class/division tags on deals, with auto-defaulting from agent configuration
  • Sitemap Controller: SEO sitemap endpoint
Changed
  • Google Integration Rework: Switched from broad folder access to per-file Google Picker with drive.file scope (non-sensitive, no CASA audit required). ConfigLive now separates Drive and Sheets connection flows
  • Component Polish: Prettier UI components with improved styling and selectable CSS classes throughout the app
  • Config Page Redesign: Better section organization and layout for the configuration page
  • Wizard Sticky Layout: Journal entry preview and PDF viewer now pin below the running tally header instead of overlapping it — both stay visible while deal content scrolls
  • Billing & Pricing: Billing banner and plan display improvements
  • QBO Token Refresh: Client reloads agency from DB before refreshing to avoid consuming stale single-use tokens
Fixed
  • Production discrepancies: Fixed feature flag evaluation and GL account mapping consistency in production
  • Stale GL mapping keys: Migration fixes stale GL mapping key references
  • GCI Stability: Adding non-principal agents no longer mutates gross commission
  • PDF Storage: Fixed upload controller PDF storage path handling
  • QBO Error Handling: Improved error categorization (retryable vs non-retryable)
Tech Debt / Refactor
  • Refactored deal wizard step names and component organization
  • Account key mapper improvements with new test coverage
Upgrade and Migration
  • Migration fix_stale_gl_mapping_keys corrects stale GL mapping key references

0.3.0 - 2026-03-10

Added
  • Admin Dashboard: Real-time business metrics at /admin — deal counts by status, posting success rates, destination breakdown (QBO/Sheets), recent activity feed with email filtering, and "Needs Attention" alerts for failed postings and stuck jobs. Auto-refreshes every 30 seconds
  • Office Insights Dashboard: User-facing analytics at /insights with period filters (month/quarter/year/all time) — office KPIs (GCI, net to office, deal count, avg deal size), agent-level breakdown, and trend indicators with % change vs previous period
  • Stripe Billing Integration: Full subscription lifecycle — Free (2 deals lifetime), Light (3/month, Sheets only), Pro (20/month, QBO + Sheets + Drive), Elite (200/month, all features + Insights). Feature flags gate deal creation and posting per plan
  • Google Drive Auto-Import: Automatic PDF ingestion from Google Drive — polling for new files, dedup via unique constraint, download→S3→deal→extract pipeline, PubSub broadcasts for real-time progress. Gated to Pro/Elite plans
  • Onboarding Product Tour: Driver.js-powered guided walkthrough on first login — branded step definitions targeting nav links and upload zone. Tracks completion via onboarded_at on user record
  • Cloudflare Turnstile CAPTCHA: Integrated on login and registration forms with auto-refresh on failed verification
  • Rate Limiting: Hammer ETS backend with IP-based and user-based rate checks, plug for controller pipelines, admin metrics tracking
  • Deal PubSub: Real-time updates for deal status changes (wizard posting progress) and dashboard list refresh on deal creation/update/deletion
  • Referral Fee Extraction: AI extraction now captures referral fee components with payee_name field — handles "Outside Referral" deductions across multiple agents contributing to the same referral partner
  • Golden Path Test Cases: Additional real-deal test fixtures for extraction validation
  • robots.txt and sitemap.xml: SEO infrastructure for search engine crawling
  • Google Analytics: GA measurement integration in app.js
Changed
  • Landing Page Redesign: New marketing site with pricing tiers, testimonials (embedded at compile time for release compatibility), and updated footer
  • Admin Routes: Double auth protection (plug + on_mount) at /admin with role-based access (:admin, :superuser)
  • Billing enforcement disabled in dev/test: Billing.enabled?/0 feature flag defaults false outside production
  • Swoosh email configuration: Updated for production delivery
Fixed
  • Referral fee amounts: Now correctly extracted with payee names and mapped to journal entries
  • Dimension handling: Fixed dimension tag application on deal entries
  • QBO token refresh: Client reloads agency from DB before refresh to avoid consuming stale single-use tokens
  • Running tally display: Various wizard UI fixes post-0.2.0
Tech Debt / Refactor
  • Revrec.Admin context module with cross-tenant queries (skip_user_id: true) for batch user/deal/subscription lookups
  • Revrec.Billing context with Features module as single source of truth for plan feature matrix
  • Revrec.Drive context with Client, SyncedFile schema, and folder polling pipeline
  • Revrec.Deals.Insights module for aggregation queries and KPI calculations
  • RevrecWeb.RateLimit helper and RateLimitPlug for rate limiting infrastructure
  • ADR-0005: DealSplit feature design documentation
Upgrade and Migration
  • Migration adds payee_name to fee_components, last_login_at to users, onboarded_at to users
  • Migration creates subscriptions table for Stripe billing
  • Migration adds Google Drive fields to agencies and creates drive_synced_files table
  • Migration renames plan tiers for billing consistency

0.2.0 - 2026-02-03

Added
  • Google Sheets: Added "Gross to Office" column for principal agent's gross commission
  • Google Sheets: Added Agent 3 Name and Agent 3 Split columns (now supports 3 non-principal agents)
  • Google Sheets: Agent overflow warning when deal has more agents than available sheet slots
  • QBO: Auto-create vendors when posting journal entries - agents without a QBO vendor ID get matched to existing vendors via fuzzy name matching, or created as new vendors
  • QBO: Qbo.VendorSync module with ensure_vendors_for_deal/2 for bulk vendor sync and sync_agent/2 for single-agent sync
  • QBO: Vendor sync summary included in posting audit logs (matched/created/skipped/errors counts)
  • Initialized tk ticket system for project task tracking
Changed
  • Google Sheets: Agent splits now show GROSS commission (base commission component) instead of NET (fee_amount) to match journal entries
  • Google Sheets: Agents now sorted by gross commission amount (highest first) instead of insertion order
  • Google Sheets: Principal agent separated from non-principal agents - principal goes to "Gross to Office", others fill Agent 1/2/3 slots in order of commission
  • QBO Poster: Now runs vendor sync before posting journal entries - preloads deal_parties with agents
  • Row formatter now preloads agent association to detect principal status via agent.role == :principal
Fixed
  • Google Sheets: Agent split amounts now match journal entry "Commissions Paid Out" values (gross, not net)
  • Google Sheets: Consistent ordering between UI display and sheet output
  • Deal Wizard: Running tally no longer overlaps the Progress sidebar
  • Deal Wizard: Journal Entry Preview now shows full account names on hover (tooltip)
  • Dark Mode: Fixed overly bright chips and badges throughout the app (status badges, fee component tags, dimension tags, role badges)
Tech Debt / Refactor
  • Extracted partition_agents/1 helper to cleanly separate principal from non-principal agents
  • Extracted get_gross_commission/1 helper to calculate base commission from fee components
  • Added Qbo.Client.query_vendors/1 and create_vendor/2 for vendor API operations
  • New Qbo.VendorSync module encapsulates fuzzy name matching (via NameMatcher) and vendor lifecycle
Upgrade and Migration
  • Users must add "Gross to Office" column to their Google Sheets and refresh mappings
  • Users may add "Agent 3 Name" and "Agent 3 Split" columns for 3-agent deals

0.1.0 - 2026-01-11

Added
  • Deal Wizard Redesign: Real-time accounting workbench with running tally showing Gross Commission, Agent Splits, Expenses, and Net to Office as you edit
  • Edit Tracking System: Visual badges (AI/Edited/User) show what came from extraction vs. user corrections
  • Collapsible Review Sections: Extraction Summary, Agent Matching, Deal Knowledge, Revenue Configuration, and Dimensional Tags organized by correction category
  • Golden Path Integration Tests: End-to-end test framework comparing AI extraction + corrections against expected journal entries for real deals
  • New account types: broker_review_fee, charitable_contributions, stock_purchase (equity account)
  • Brokerage name field on deals for NAME dimension in journal entries
  • About page: Accessible via header link, displays changelog with semantic styling
Changed
  • Wizard flow reduced from 5 to 4 steps: Upload and Extract merged into single step with auto-extraction
  • Journal entries now use deal-side-specific accounts: Listing deals → listing_income/agent_listing_splits, Buyer deals → buyer_income/agent_buyer_splits, etc.
  • Always per-agent entries: Each agent gets separate expense line (no more aggregation mode)
  • Consistent entry ordering: Revenue (credits) → Agent splits → Fee components → Referral fees → Undeposited Funds
Fixed
  • Principal handling: Principal commissions correctly stay with office, not recorded as expenses
Removed
  • Zero-balance placeholder entries removed from journal output
  • Simple/aggregated agent expense mode removed
  • Separate Extract step removed from wizard flow
Tech Debt / Refactor
  • FeeComponentEditor extracted as reusable LiveComponent
  • Edit state computation decoupled into EditTracker module
  • Running tally computed from deal state, not stored
Upgrade and Migration
  • Migration adds brokerage_name column to deals table

Built with care for real estate professionals who deserve better tools for managing their business.