Every release.
Fully documented.
MLS Genie™ ships updates weekly. This is the public record of every feature, fix, and improvement — version by version. Built from real agent feedback.
Release history
- Fixed: The calendar day popover was centred on the window rather than the page, so it sat left of centre on a desktop.
- Fixed: The task list and calendar ignored the Team View switch — a manager saw everybody's tasks in both views. Both now follow it.
- Changed: The Tasks count in the sidebar always shows your own overdue tasks, in either view. It is a prompt to act, and nobody can act on somebody else's.
- Fixed: Counts never appeared on plain sidebar items such as Tasks — only on groups and their sections. Tasks now shows its overdue count.
- Changed: The "viewing as" bar now sits along the bottom of the screen instead of pushing the page down from the top.
- Fixed: The Tasks count in the sidebar showed nothing while the dashboard reported overdue tasks. It now counts the same tasks the dashboard does, following Team View, and counts only what is genuinely overdue.
- Fixed: The All tick on the permissions grid only reached the sections that were already open.
- Changed: The permissions grid is now grouped the way the sidebar is — Marketing, Research, Team and GenieScout hold their sections rather than listing everything flat.
- Added: An All tick at the top of each user level, for turning a whole level on or off at once.
- Fixed: Refusing Unclaimed or Archived would have closed the whole Leads list, and refusing one GenieScout section would have closed the other.
- Added: Contacts appears in the permissions grid.
- Added: An IP address column is now recognised on import, so a contact brought in from another CRM keeps the address they arrived from. Anything that is not a valid address is left out rather than shown as though it were real.
- Changed: Related contacts now hold a first and last name, matching the rest of the CRM. Existing entries are split on update, and making somebody a lead now carries their name across exactly rather than guessing where the surname began.
- Fixed: The loading bar appeared when filtering or sorting a list, even though the page was not reloading.
- Changed: Sorting, the figure cards and paging now work without reloading the page, as search and the filter chips already did.
- Changed: Removed the heavy coloured edge from rounded panels and cards.
- Changed: Prospects now shows figures suited to prospecting — how many are in the pool, what they are worth, and how many nobody has contacted. The last is clickable and filters the list to exactly those.
- Added: Each prospect type now carries its count, so you can see which pools are worth opening without opening them.
- Changed: The filter panel is wider on a desktop.
- Fixed: Contacts showed the dashboard instead of its own page.
- Added: Contacts in the sidebar, for everybody a team works with who is not a lead — referring agents, title officers, lenders, vendors. The module is on its way; the page explains what it will do.
- Changed: GenieScout now sits above Marketing in the sidebar. Listings come in far more often than campaigns go out.
- Fixed: Add related contact did nothing. The script behind it was only being loaded on the import screen.
- Fixed: The marketing consent tick boxes were stretched across the drawer with their wording crushed beside them. The tick is now its own size with the label next to it.
- Fixed: The marketing consent tick boxes on the Edit Lead drawer now sit to the left of their wording, on one line.
- Fixed: On the Edit Lead drawer the marketing consent tick boxes sat above their wording instead of beside it.
- Added: Partner agent, first-time buyer, closing anniversary, last login and login count are now imported and shown on the contact — the personal details with the contact information, the logins with the site activity.
- Added: A rewards points balance on the contact, imported from your export and shown on its own card. Later exports update the figure.
- Fixed: A band of empty space beside the file picker on the import screen. The fields were laid out as a table holding a column open for labels that are no longer there.
- Fixed: An imported secondary contact was only attached when the lead was new. It now attaches when an existing lead is updated too, and running the same file twice will not create the person twice.
- Fixed: Merging two contacts now carries their related contacts across, in both directions.
- Fixed: Deleting a contact now clears the relationships pointing at it, so nothing is left linked to a record that has gone.
- Changed: An imported secondary contact is no longer also written to the old fields, where it would have gone stale the moment anyone edited it.
- Changed: The name column on the Leads list now holds a minimum width rather than a maximum, so short names keep the column steady and long ones still wrap.
- Changed: On a phone the lead figures now sit one per row, with the label on the left and the number on the right, instead of two cramped across and one wrapped underneath.
- Fixed: On a phone the Add Lead button sat on a row of its own below the title. It now sits beside it, which gives a row of the page back to the figures.
- Changed: On a phone, Add Lead is now a round button in the top corner rather than a band across the width of the page.
- Fixed: Cards on the lead page sat flush against each other. The columns now space their cards, so anything added later is spaced without having to be told.
- Changed: Cards on the lead page now space their own contents, so every panel is consistent and a new one cannot arrive with everything crowded together.
- Changed: Add Lead no longer appears on the Unclaimed list, and Hide Archived no longer appears on Archived — the Leads menu already covers the second, and the first would create a lead that belongs somewhere else.
- Added: Related contacts on a lead — spouses, siblings, partners and anyone else. A lead can have as many as it needs, each with a relationship, and imported secondary contacts land here.
- Added: Any related contact can be made a lead of their own. They get their own pipeline, tasks and notes, and the two stay linked so the connection is visible from either side.
- Added: Unlink, for when a relationship ends. The connection goes; both leads and all their history stay exactly as they are.
- Changed: An incoming quality score from another CRM is no longer picked up automatically — it arrives as the same number on every row, and your own score is worked out from behaviour.
- Fixed: Spacing on the import screens. The heading sat against the list below it, and the buttons sat against the block above them.
- Added: The first import screen now explains what the next few steps hold, and makes clear that nothing is imported until you confirm on the last one.
- Fixed: The importer asked you to select an agent before reading the file, even though that choice now comes from the file itself.
- Added: The importer now works in four steps — file, columns, agents, then check and import.
- Added: A live preview of the first three leads while mapping columns, so a wrong column shows up before the whole file carries it.
- Added: An agents step listing every agent named in the file with their lead counts. Names the CRM recognises are matched automatically; anything else can be assigned to somebody or left unclaimed, before any lead is written.
- Added: A choice over leads already in the CRM — update them or leave them alone — with name-only matches handled separately and brought in as new leads by default.
- Fixed: Imported contacts no longer set off new-lead reminders. They came from another system rather than your website, and they keep the date they were originally added.
- Changed: Large imports now run in blocks with a progress bar and a time estimate, instead of one request that would time out part-way through a big file. If it stops, running the file again carries on from where it left off.
- Fixed: The duplicate check covered only the first 2,000 rows of a file. It now checks every row.
- Changed: The note on the Archived list now sits below the search bar, matching Unclaimed, so both views read the same way.
- Changed: Ask Genie now covers unanswered-lead reminders and where the call connect rate lives.
- Fixed: Some recent styling was added to a template rather than a stylesheet.
- Fixed: Unclaimed and Archived refused entry even when ticked in Permissions. The check was looking up a different key from the one the grid saves.
- Fixed: The permissions grid listed All Leads as though it could be switched off separately from Leads itself. Only the narrowed views — Unclaimed, Archived, Import — are listed, and each works.
- Fixed: Being refused an area showed an unstyled block of text inside the CRM. It now shows the proper screen, with an explanation and a way back to the dashboard.
- Fixed: Agents were refused the Leads list while the menu still offered it. All Leads is the Leads area itself and is no longer treated as a separately deniable view.
- New on-page listing content — a compliant, factual market paragraph (median price, days on market, months of supply) for the listing's city, plus dynamic links to the community page and housing-market report.
- Adds unique, indexable content to every listing page without touching the MLS remarks.
- Drop-in shortcodes with theme-native markup and class hooks, documented in the Listing Tools tab.
- Listings now render a complete social preview card (OpenGraph + Twitter image) when shared on Facebook or X.
- A new Default Social Sharing Image covers pages without their own photo, like city and area pages — listings still use their own photo first.
- Duplicate social tags emitted by the theme are removed, leaving one clean set per page.
- Intelligent Meta — SEO titles and descriptions adapt to each listing: optional bracketed sections appear only when the data exists, and zero values (0 beds/baths/sqft) are hidden.
- Listing price renders as formatted currency, and Terms Manager renames (e.g. House) flow through to titles and descriptions while schema stays standards-valid.
- One template now reads correctly across houses, land, boat slips, and everything else.
- Listing structured data now carries the full photo gallery (up to 12 images) instead of a single image.
- Corrected price specification, Google-valid availability status, and a brand added — richer, standards-valid listing markup.
- Active listing updates (price, status, days on market, photos) now appear within about 15 minutes of reaching the MLS feed instead of potentially taking hours.
- The nightly full sync remains as a safety net, and property-history timelines refresh on the next view rather than waiting out the cache.
- Your brokerage now publishes a connected business graph — organization data with the cities you serve, per-office map links, geo coordinates, and hours of operation.
- Your team members appear as agent structured data on the homepage, and when one of your agents is the listing agent on a property they are credited in that listing's structured data.
- A Featured Service Areas control publishes your cities automatically or by selection; third-party listings are unaffected.
- Unified lead attribution across every intake path — Form Bridge, native Genie forms, and AI Chat now resolve through one canonical engine.
- Source shows the real channel (Google, Social, Direct…) while Lead Action carries the form type (Valuation Request, Buyer Inquiry).
- AI Chat leads attribute through the same path and read "AI Assistant" as the lead action.
- New Communication Manager sends branded lead and inquiry confirmation emails automatically on every intake path.
- Settings → Notifications tab inside GenieCRM™ — control the confirmation copy and per-event notifications without leaving the CRM.
- Default confirmation copy is a single source of truth, shown as the live placeholder so you see exactly what sends.
- Listings that arrive without photos now show a clean map image instead of a blank placeholder.
- Applies everywhere — the property hero, listing cards, theme widgets, and GenieCMA™ comp cards.
- Handled entirely in the import layer, with no theme edits required.
- Mobile pull-to-refresh — pull down at the top of any CRM page to refresh, with a spinning refresh indicator.
- Closed and sold transactions can now surface as a dated event on the property history timeline.
- Performance hardening — faster public property pages and search via postmeta indexing, batched backfills, and removal of slow per-request queries.
- Resolves the elevated-CPU regression some sites experienced, and a GeoGenie™ quarantine check that was slowing property search.
- Global CINC on/off toggle — pause CINC lead forwarding site-wide with one switch, without losing the configured forwarding address.
- Houzez 4.3 form-hook compatibility so lead capture keeps flowing into GenieCRM™.
- Team management moved into the CRM — Team Members, Team Chat settings, and the Settings navigation are now all inside GenieCRM™, no wp-admin trips.
- Manage Teams stays gated to the Brokerage tier.
- Market Data Library — a precomputed store so market-data KPI shortcodes render inline and instantly.
- Smooth dim-then-brighten seeding for every market-data shortcode.
- Address-correction engine — parcel-verified displayed addresses, corrected and title-cased from authoritative parcel data.
- Drives the correct city taxonomy and listing slug, applied theme-agnostically through the Scout writer, with a per-AOR toggle.
- GenieScout Engine Live Search draw tools rebuilt — polygon and circle draw-to-search on the map.
- Draggable shapes, a reliable finish anchor, and re-search by dragging a completed shape.
- Persistent, sortable Lead Score engine with a learning scaffold and priority-framed labels.
- Ask Genie upgraded — web research, a broader help mandate, and real usage metering.
- Property Lookup by APN as well as address, and Search MLS auto-routing by county.
- Search Intent on lead profile — paid keyword (utm_term), organic referrer query (DuckDuckGo, Bing, Yahoo, Brave, Ecosia + 7 more), or inferred from landing-page slug.
- Assigned-agent pill becomes an inline dropdown — reassign a lead in one tap without leaving the profile.
- Auto-log every reassignment to Notes & Activity with the previous and new agent names.
- Server-side first-touch capture — reads HTTP referrer, Sec-Fetch-Site, and User-Agent directly from the request. Invisible to ad blockers, Brave/Safari/Firefox privacy modes, and visitors with JavaScript disabled.
- Honest source labels for "Direct" traffic — "Facebook App", "Instagram App", "TikTok App", "Gmail App", "Direct (typed or bookmark)", "Cross-site (referrer hidden)" — no more vague fallback.
- Hover tooltip on every Source value explaining exactly how the label was derived and how much to trust it.
- Hero row refinements on Lead Detail — assigned agent surfaced as a pill alongside the type badge, no scrolling required.
- Pipeline stage pill now colored to match the stage (New = slate, Contacted = blue, Nurturing = amber, Hot = red, Under Contract = violet, Closed = green).
- Tighter visual rhythm — consistent padding across stage, type, and agent pills.
- Inline pipeline-stage dropdown on the Lead Detail page — change a stage in one tap without navigating to the board.
- Auto-logged stage transitions in Notes & Activity — *"Stage changed: New Lead → Contacted"* with timestamp + agent name on every move.
- Same code path as drag-drop on the Pipeline board — identical permissions, history-table writes, and notification hooks.
- Tracked Pages — pick non-property pages (Free Home Valuation, Schedule Tour, Contact, etc.) to surface on lead profiles.
- Two tiers: Conversion (gold-star highlight + optional real-time email alerts to the assigned agent) and Engagement (subtle eye icon, contextual logging only).
- Works for visitors who block Google Analytics — first-party tracker runs on your own domain, not subject to ad-blocker lists.
- Conversion hits add a new "Conversions" stat to the Site Activity card and appear in the chronological Visitor Journey timeline.
- Privacy-Conscious Visitor indicator — surfaced when a visitor's browser blocked Google Analytics (≈30–40% of real traffic today).
- Framed as a known, normal scenario rather than a data gap — hover tooltip educates the agent that contact details were still captured normally.
- Honest framing of attribution depth, not a "data missing" warning.
- Verified phone numbers now show a green checkmark next to the number on the Lead Detail page.
- Visual confirmation that the carrier check cleared the number — no more hovering to read the tooltip.
- VoIP and unverified numbers keep their existing amber and red indicators.
- Form name now displays correctly on Forminator-sourced leads instead of the generic "Contact Form" placeholder.
- Switched to the documented Forminator_API for form lookup with a CPT-title fallback for resilience.
- GenieScout MLS Rules registry — self-healing install + backfill so the registry populates automatically on first load.
- Detection of multiple feeds (CRMLS + BBAOR + future additions) now correctly tags each listing's originating MLS.
- Improved MLS detection for multi-feed brokerages so each listing is correctly tagged with its originating MLS.
- First-touch attribution beacon now fires for every visitor on first landing, not just visitors arriving with UTM parameters.
- Captures the referrer header server-side so anyone who later submits a form has full attribution context, even days later.
- GA4 async enrichment pipeline — automatically queries Google Analytics for source, medium, campaign, device, and session count on every new lead.
- Retry schedule handles GA4's 24–48 hour processing delay; verified leads earn a green "Verified via GA" pill in their profile.
- GA4 Client ID captured at form-submit time from the `_ga` cookie — stored alongside every lead for cross-referencing GA sessions and audience export.
- Lead Action field — captures the form name (Forminator title, Houzez "Property Inquiry" / "Contact Agent" / "Schedule Tour", CF7 / WPForms / Elementor form name) on every submission.
- Campaign field — pulls first-touch utm_campaign for every lead and resolves it through your campaign mappings.
- Guaranteed-non-empty Source contract — every lead now lands with a human-readable source, no exceptions.
- Five-tier resolution: explicit upstream value → derived from UTM / cookie / referrer → form-name fallback → default-source floor → audit token stamped on the row.
- Sitewide visitor cookie and UTM capture — visitor identity persists across the entire site, not just property pages.
- A visitor who arrives via a Google Ads UTM, browses /about/, leaves, and returns days later still has full attribution when they submit a form on any page.
- Dual-column timestamps (local + GMT) across the activity table — eliminates a whole class of DST and timezone bugs.
- Role-based access system — `mlsg_agent`, `mlsg_manager`, `mlsg_team_admin`, `mlsg_team_lead` roles with the custom `mlsg_manage` capability gating every admin page.
- WordPress administrators automatically inherit `mlsg_manage` — no double-permission setup.
- GenieScout cron architecture hardened — MLSG_Cron_Manager always-loaded, schedules registered at every page load.
- Nightly imports trigger at 1am local time; refresh runs cursor-paginated batches of 50; jobs page run every 30 seconds with a 2-minute stagger to keep the host happy.
- Genie CRM — full standalone shell at /genie-crm/, no WordPress chrome, hardcoded asset injection so no theme dependency.
- Commission Manager, Lead Tags, CINC integration, and the Form Bridge module all ship inside the shell.
- GeoGenie™: Extracted all quarantine logic into new shared MLSG_GeoGenie class — single source of truth across all entry points.
- GeoGenie™: Phase 2 area string now built from listing's own MLSAreaMajor → City → PostalCode — works for every property regardless of import origin.
- GeoGenie™ batch: Added geocoded area centroid as third check; area_major and state now collected per listing.
- GeoGenie™ single: run_geogenie_single() now delegates to MLSG_GeoGenie::evaluate_single().
- GeoGenie™: Reimport from MLS now re-evaluates single-listing geo-validation.
- Phase 1: median centroid of sibling listings from same import job (50km threshold).
- Phase 2: Google-geocoded job area centroid (25km threshold, cached 30 days).
- Self-healing: listings that pass after coordinate correction are automatically un-quarantined.
- ListingGenie™ v1.0 — 6-step pre-listing package wizard.
- CMA packet with Include/Exclude toggles on comp cards.
- Pricing fields with Conservative/Recommended/Optimistic auto-compute (25th/50th/75th percentile $/sqft).
- Net Proceeds table and Comparable Sales Analysis on share page.
- DB schema v1.1: subject_address, subject_data_json, agent_notes, pricing_json columns added.
- Fixed Python string splice boundary error in content parser (content[end+4:] → content[end:]).
- Node.js PHP syntax scanner now runs on every modified file before zip assembly.
- Property data lookup caching improved to 24h transient.
- GenieLayers™ boundary packs (.mlsgpack format) — domain-locked HMAC-SHA256 license keys.
- Settings UI upload/remove for boundary packs.
- Big Bear AOR pack v1.0.2 — Moonridge, Sugarloaf, Big Bear City.
- BoundaryLabel now uses google.maps.OverlayView (no close buttons or tails).
- Google OAuth migration to the MLS Genie™ project.
- Root cause fix: nonce mismatch on Analytics connection.
- Houzez CRM reactivation confirmed non-conflicting with GenieCRM.
- Genie Social: migrated to new social publishing backend.
- All user-facing surfaces continue to display "Genie Social" — vendor never exposed.
- Fixed CSS/JS loading in genie-crm-shell.php (direct link/script tags, no wp_head dependency).
- Version 1.0 released and the platform built out fast — GenieCRM, automated MLS import, area pages, and the schema engine — across rapid daily iteration from v1.0.0 through the v1.6 series.
- Early development and architecture groundwork.
- MLS Genie project created — the first working build.