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_sslenabled 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/1instead 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.filescope (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_keyscorrects 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
/insightswith 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_aton 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_namefield — 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
/adminwith role-based access (:admin,:superuser) -
•
Billing enforcement disabled in dev/test:
Billing.enabled?/0feature 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.Admincontext module with cross-tenant queries (skip_user_id: true) for batch user/deal/subscription lookups -
•
Revrec.Billingcontext withFeaturesmodule as single source of truth for plan feature matrix -
•
Revrec.Drivecontext with Client, SyncedFile schema, and folder polling pipeline -
•
Revrec.Deals.Insightsmodule for aggregation queries and KPI calculations -
•
RevrecWeb.RateLimithelper andRateLimitPlugfor rate limiting infrastructure - • ADR-0005: DealSplit feature design documentation
Upgrade and Migration
-
•
Migration adds
payee_nameto fee_components,last_login_atto users,onboarded_atto users -
•
Migration creates
subscriptionstable for Stripe billing -
•
Migration adds Google Drive fields to agencies and creates
drive_synced_filestable - • 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.VendorSyncmodule withensure_vendors_for_deal/2for bulk vendor sync andsync_agent/2for single-agent sync - • QBO: Vendor sync summary included in posting audit logs (matched/created/skipped/errors counts)
-
•
Initialized
tkticket 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/1helper to cleanly separate principal from non-principal agents -
•
Extracted
get_gross_commission/1helper to calculate base commission from fee components -
•
Added
Qbo.Client.query_vendors/1andcreate_vendor/2for vendor API operations -
•
New
Qbo.VendorSyncmodule encapsulates fuzzy name matching (viaNameMatcher) 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_namecolumn todealstable