=== IDX Bloom ===
Contributors: idxbloom
Tags: idx, real estate, mls listings, property search, real estate website
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 2.4.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

AI IDX that sets itself up. Flip one switch and it places the right listings, search and lead form on every page of your real estate site.

== Description ==

**Most IDX plugins make you build it by hand:** a shortcode on every page, a saved search for every neighborhood, a page for every building. IDX Bloom does that work for you.

Install it, answer a few questions and flip the switch. IDX Bloom reads every page on your site, works out what each one is about (a neighborhood, a building, a price range, a property type) and places the right listings, a plain-words search box and a lead form on it. It never edits your pages. Turn it off and every page is exactly as it was.

= Starts in Preview mode (safe on a live site) =

A new install runs only on one private page, "IDX Bloom Preview", that only you can see while logged in. It uses clearly labeled sample listings. Nothing changes for your visitors or for Google until you click **Go live**.

= What you get =

* **Sets itself up.** No shortcodes, widgets or saved searches. One switch blooms the whole site.
* **Grows the pages you are missing.** Neighborhood and building pages with real counts, price range, median price and price per square foot. A page is only opened to Google when it has real listings behind it, you approve it and you add your own take.
* **Answer-first pages for AI search.** Each area and building page opens with a short direct answer, a dated key-facts table, a comparison table and an FAQ, backed by one clean structured-data graph.
* **Plain-words search in English and Spanish.** "3-bed condo with ocean view under $2M" or "condo de 3 recámaras con vista al mar".
* **AI Access Doctor.** Checks whether Google, Bing, ChatGPT, Perplexity and Claude crawlers can reach your pages, and fixes what the plugin controls with one click.
* **AI Visibility panel.** Shows visits from AI crawlers and visitors and leads that came from AI answers.
* **Leads with context.** Every lead arrives with the page, building, price range, language and source, ready for GoHighLevel or any webhook.
* **MLS display rules built in.** Brokerage attribution on every card, your disclaimer and a last-updated line on every page.
* **Never slows your site.** Listings are cached and refreshed in the background, so a page never waits on the data feed.

= What it will not do =

IDX Bloom does not promise rankings or AI citations. It makes your site easy for search engines and AI answers to read, and it measures the results.

= Requirements =

* WordPress 6.0+ and PHP 7.4+.
* Live listings need an IDX Bloom license and an approved MLS data connection. Showing MLS listings requires you (or your brokerage) to be an MLS participant. You can try everything with the bundled sample listings first.

== Installation ==

1. In WordPress go to Plugins > Add New > Upload Plugin, choose `idx-bloom.zip`, then Install Now and Activate.
2. Open **IDX Bloom** in the admin menu and click **See it on your preview page**.
3. When you like what you see, add your license key and click **Go live**.

== Frequently Asked Questions ==

= Does it edit my pages? =

No. Listings are added when a page is shown, never saved into your content. Deactivate the plugin and every page returns to exactly how it looked before.

= Will visitors or Google see anything while I test? =

No. In Preview mode IDX Bloom only runs on one private page that only logged-in editors and admins can open. It adds nothing to robots.txt, your sitemap or any other page.

= Do I need to be an MLS member? =

To show real MLS listings, yes. IDX rules let only MLS participants (or agents under a participating brokerage) display listings. The sample listings work for anyone.

= What if the listings feed is slow or down? =

Pages always load from the cache right away. The cache refreshes in the background.

= Do I need my own AI or API keys? =

No. No API keys live on your site. AI features run through the IDX Bloom service, using your license key.

= Does it work in Spanish? =

Yes. Search, listing cards, lead forms and grown pages all work in English and Spanish.

== Developer notes ==

= Filters =

`idxb_layout_top` ( bool $setting ): whether the "IDX Bloom first" top layout (search bar, status strip, key numbers, homes, directly under the page title) is used for this request. Receives the saved Settings > "IDX Bloom first" value and returns a bool. It runs at render time, so it can depend on the page, and it never changes the stored setting. An administrator's `?idxb_layout=top` / `?idxb_layout=classic` preview still wins over it. Example: `add_filter( 'idxb_layout_top', function ( $on ) { return is_page() ? true : $on; } );`. (A mu-plugin that writes the private `IDXB_Settings::$cached` through Reflection keeps working, but the filter is the supported way.)

Other filters: `idxb_new_install_defaults`, `idxb_hub_url`, `idxb_match_v2`, `idxb_set_cookies`, `idxb_crm_adapters`, `idxb_robots_rule_groups`.

== Screenshots ==

1. Listings, search and a lead form placed on an existing neighborhood page automatically.
2. A grown neighborhood page: direct answer, dated key facts, buildings table and listings.
3. The same on a Spanish page, fully in Spanish.
4. The admin: one switch blooms the site and shows what was placed where.

== Changelog ==

= 2.4.0 =
* New: one-click setup. Click Activate and a pop-up opens over WordPress with ONE screen, everything filled in from your site (your market, where leads go, Match my site on; "Change" opens the fields, none is required). One button, "Bloom my site", starts your free 7-day trial (no card, no key, no login), connects it, saves your answers, matches your site's look, adds listings to your pages and publishes (a new website stays on a private preview with sample listings until the MLS approves it, then goes live by itself). It shows on any admin page until setup is done, so a bulk activation or a plugin that redirects after activating cannot hide it; "Not now" leaves a "Finish IDX Bloom setup (1 minute)" notice. "I already have an account" emails a 6-digit code. "I already have a key" stays as a small link. Needs Hub 1.12.0.
* New: "Match my site". IDX Bloom reads your own home page (a hidden frame in wp-admin: body text, headings, links, your most prominent button, photo and card corners, spacing) and copies its colours, fonts, button style and corner radius, with every colour pair repaired to AA contrast, so listings, search, cards and building pages look custom-built. A new install uses it by default; an existing install keeps its design and gets a "Match my site" button in Settings, Look. When the page cannot be read it uses your theme's own settings (theme.json, Divi, Customizer). No JavaScript runs on your visitors' side for this.
* Changed: activating no longer redirects to a separate full-screen page on a site that has not finished setup (the pop-up opens on the page you land on). The step-by-step setup is still at IDX Bloom, Home, "Use the classic setup".
* The Doctor explains, in plain words, where the one-click setup stopped.
* New: no key, no login, no email to start. Pressing "Bloom my site" asks the Hub for a 7-day trial bound to your site (one per domain, proved by the site itself; a reinstall on the same site keeps its days). Activating alone changes nothing. The pop-up is ONE screen with everything filled in (market read from your site, leads to your admin email, Match my site on) and one button; "Change" opens the fields. "I already have an account" emails a 6-digit code; "I already have a key" still works.
* New: "Property Search" ("Buscar propiedades" on a Spanish site) is added to your main menu when your site goes live (classic menus, block themes, Divi, Elementor), never twice. If your site already has a property search (a menu item, or a page of IDX Broker, iHomefinder, Showcase IDX, Realtyna, IDXBoost...), the screen names it and asks, box unticked: "Replace it with IDX Bloom?". Ticked, that item is re-pointed (label and position kept); Settings has "Restore my old search".
* New: back up first. The screen opens with "Before IDX Bloom changes anything, back up your site" and a link to your host's backup help (Cloudways, Hostinger, WP Engine, SiteGround, Kinsta, GoDaddy). Every change Bloom makes to your menus, pages and options is written to an undo log.
* New: clean exit. Deactivating removes the menu link (or restores your old search), sets the pages IDX Bloom made to draft and, if an IDX Bloom shortcode is still in a page, writes a small file that hides it and redirects its old URLs; reactivating puts everything back exactly. Deleting the plugin removes everything it added. The Plugins screen offers your leads as a CSV first.
* New: free trial vs paid. The trial includes listings on your pages, search, AI search, Match my site, the Property Search link and the dashboard. Leads, the MLS sitemap and SEO/GEO (schema, AI-crawler rules, IndexNow, the writing studio) show as locked cards with "Unlock for $49/month" and switch on by themselves when your key is paid. After an unpaid trial your visitors see nothing broken and you see "Keep IDX Bloom". "Keep IDX Bloom" asks for your email, mails you a 6-digit code, then opens a secure Stripe payment page ($49 a month after your 7-day trial); the moment you pay, leads, the sitemap and SEO switch on by themselves. While payments are not connected it says "Payments open soon" and keeps your email.
* New: after an upgrade IDX Bloom refreshes the pages that carry its blocks gently, 20 pages every 5 minutes through your cache plugin's per-page purge (LiteSpeed, WP Rocket, W3 Total Cache, WP Super Cache, SiteGround, Varnish/Breeze), never a purge-all. The dashboard shows "Refreshing pages: N of M" with a Pause button.

* Review (2.4.0): a page-type menu item ("Search Homes" linking a page) is really re-pointed when you tick "Replace it" (it becomes a custom link, label and position kept) and comes back exactly on undo; your name is never required in the pop-up; the trial request is proved by the website itself (a signed answer only this plugin can give), so nobody can take your site's trial; WP Super Cache and SiteGround refresh one page at a time, never the whole cache; the page refresh resumes by itself after a deactivation.

* Patch (JSR compatibility, still 2.4.0): new filter `idxb_layout_top` (see "Developer notes"). The status strip and the key numbers of the top layout now style correctly on every theme (the old selectors never matched, so a theme's list styles won: bullets, a vertical strip, stacked numbers). The search box's example chips name the page's own place and kind of home (a West Palm Beach page no longer offers "House with a pool in Miami"). The front page gets its block like any page unless you tick "Leave the front page alone" (a page with no place shows the market's luxury picks). "Listed 1 day ago" / "Publicado hace 1 día". Sold strips and sale grids show sales only (never a lease or a monthly rental). A page titled just "Condos for Sale" can no longer end with the search box alone.

= 2.3.6 =
* New: a "luxury" page that is for RENT starts at $8,000 a month (Josh, 2026-10-05). The sale floors ($1,000,000 condos, $2,000,000 houses) are unchanged and never apply to rent. JSR /luxury-rentals/ showed rentals from $1,750.
* Fixed: a building whose MLS street is not the street on its page (500 Brickell: page "500 Brickell Avenue", units filed at "55 SE 6th St") said "No homes for sale" while its own key facts said "For sale now 1", and showed its own unit under "Nearby". The block now accepts every street the Hub's record of the building is filed under (Hub 1.11.5 sends them), in the page's zip. With an older Hub it stays as in 2.3.5.
* Fixed: a sale block shows sale listings only. A $20,000-a-month rental appeared among Eighty Seven Park's sale units; every card whose listing type is not the ask's is dropped and the total follows. A rent block shows rentals only.
* Fixed: "waterfront" on an ocean-access page means the ocean, a bay, the Intracoastal or a canal, not an inland lake (the first card on JSR /miami-waterfront-homes/ was a lake house). The Hub filters on the MLS waterfront features (Hub 1.11.5) and the plugin keeps only cards that say ocean, bay, Intracoastal or canal. The setting `waterfront_scope` = any turns this off for a lake market.
* Fixed: a page named for a price says so. "/10-million/" read "Listings in Miami"; it now reads "Homes from $10M in Miami" (Spanish "Casas desde $10M en Miami"), and ranges read "Homes from $1M to $3M in Miami", "Casas de $1M a $3M en Miami".
* Fixed (High): a Hub read that FAILED (a timeout, a 429, an error answer, an answer with no listings list) was shown as "No homes for sale". Right after an upload, with the Hub's caches cold, about 150 JSR pages showed an empty block for an hour. A failed read is now never "0 results": it is not cached, the last copy of the answer is used when there is one (of any age), else the block shows one neutral line with a search link, and the page is kept out of the page cache (LiteSpeed, DONOTCACHEPAGE, no-cache headers) so it is not kept for hours. A failed ask also stops the building ladder: a later "Nearby" never answers for it.
* Fixed: a building page asks, in order, its page address, each other street of the Hub's record (the MLS address), its name, then nearby. If the Hub's own facts say the building has homes for sale, the block never says "No units are for sale" and never shows a contradicting "Nearby".
* Fixed: a building with nothing for sale is always followed by nearby homes: its page address, the streets of the Hub record, its name, a 0.6 then 1.5 km square, then its city or neighborhood with the luxury floor, then the same city without the floor. A neighborhood the list lacks shows the city its page names.
* Fixed: a pre-construction or loft page about condos keeps type condo on every step (the kind comes from the URL when the title has none); island neighborhoods (Star Island, Sunset Islands, The Moorings) show waterfront homes only; "Starting at $3 Million" is a floor, not a ceiling; "$1,000 per square foot" is not a price.
* New: the new logo (Geist wordmark with the mint switch) in the plugin admin header and the setup wizard.
* Review fixes: after a failed Hub read the Hub is left alone for 30 seconds (60 after a 429), so a down Hub never makes every uncached page view wait for its timeout; the neutral "updating" block keeps the lead form; a building whose facts say units are for sale but whose asks found only nearby homes shows them (cacheable) with a note that never says "No units are for sale"; the waterfront guard keeps a card that names no water and drops only inland (lake / pond) water, so a Hub that cannot narrow never empties a waterfront page; the island rule never applies to a city (Sunny Isles Beach, Bay Harbor Islands) or a condo page; a record street with under a tenth of the record's homes is not asked; a neighborhood the list lacks reads "Listings in <city>".

= 2.3.5 =
* Fixed: a page ABOUT a topic now shows homes that are that topic. "Miami Waterfront Homes" showed six ordinary inland houses; it now asks for waterfront homes only. The same for pet-friendly pages, new-construction pages and pages about homes with a pool (English and Spanish: "frente al mar / frente al agua", "mascotas", "preventa / obra nueva", "con alberca / con piscina"). Only the page's title and web address are read, never its text.
* Fixed: every step of the block keeps the topic: the exact place, the same place without the price or bedroom guess, and the nearby city. A waterfront page never fills up with homes that are not waterfront; with nothing to show it says "No waterfront homes for sale in Miami right now".
* New: the block heading names the topic ("Waterfront homes in Miami", "Waterfront condos in Brickell", "Pet-friendly condos in Brickell", "Propiedades frente al agua en Miami"). "See all" opens the search page with the same waterfront or pet filter, and the "Recently sold" strip carries the topic too.
* A building's name is not a topic: "Icon Beach Waterfront Residences" or "Bay Harbor One - Miami Waterfront Condos" is still a building page and keeps showing that building's own homes. The same for a neighborhood whose own name holds the word ("Intracoastal Park").
* Fixed: a page named for a price now asks for that price. "$10 Million and Above" was read as "up to $10 million" and showed $320,000 condos. The page's web address counts too ("10-million", "5-to-10-million", "500k-to-1-million", "over-5-million"), and a price-band page keeps its price on every step, so it never fills up with cheaper homes. "100 most expensive" lists the highest price first.
* Fixed: a penthouse page ("Miami Penthouses") showed ordinary houses. It now asks for condos whose unit is a PH or Penthouse.
* New: a page whose TITLE says luxury (or "lujo") shows homes from $1,000,000 (condos and unspecified) or $2,000,000 (houses). Area and general pages only; a building page is never filtered by its title. Decided by Josh on 2026-10-05.
* Fixed: a building page never says "none for sale" while its street address has homes for sale. Eighty Seven Park (8701 Collins Avenue) said "No units are for sale" while three were listed under another MLS name. A building page now asks for its own street number and street first (the address on the page, else the building's address from the Hub), then its name. A home on another street is never shown as the building's, except the street the building's own MLS record is filed under in the same zip (500 Brickell's units are listed at 55 SE 6th St).
* Fixed: a page about a building the plugin has no record of (248 on JSR) no longer shows its city's newest homes (the same six cards on 67 pages). It asks by the address on the page, else by the building's name, else it shows the honest empty state.
* Fixed: "Nearby" is now near. When a building has nothing for sale, the block shows condos for sale in a 0.6 km square around the building (widened once to 1.5 km), at least half the building's usual price, closest first, labelled "Nearby <building>". It used to show the whole city, newest first. With no coordinates it shows the building's own city, same kind of home, same price range, never another city.
* Fixed: a card could link to "Listing no longer available". Cards that are not active are dropped when the block is drawn, and a planted block never uses a cached answer older than one hour (it was up to six).
* New: a page with no place of its own (/property-search/, /sell/, /sustainable-condos/, /homes-for-sale/, /condos-for-sale/, /new-construction/) shows "Miami luxury picks": Miami and Miami Beach homes for sale from $1,000,000 (houses $2,000,000), newest first, never the whole county. About, Contact and Privacy pages are unchanged. Josh decided this on 2026-10-05; the cities come from the `featured_cities` setting (no screen yet).
* Fixed: an island page the MLS list does not have (Star Island) is asked by name inside the city the Hub finds for it before it shows an empty state.
* Fixed: a "new construction" page that is not a project follows the pre-construction rule: the new buildings when three or more exist, otherwise the plain block of the same place with a note, never an empty state.
* Fixed: "See all" on a block that asks for a kind of home, a price or bedrooms opens the search page with the same filters (it opened the grown page of every home). The block total no longer drops to the page count when a card is cut, and a card with no city is not shown on a page about a city.
* Fixed: an article titled with a city that names ONE building with a record (for example "Aria Reserve Miami: ...") shows that building's homes (cards only).
* Pre-deploy review fixes: "luxury" is a sale price floor only ("Luxury Rentals" asked rentals from $1,000,000 a month and was always empty); a building whose MLS street differs from the address on its page shows its own units again (500 Brickell, Plaza on Brickell, Shoma Bay); a building with no record asked by name and no city shows one city's homes and no "See all" link to a page that does not exist; an address with a unit or suite ("#904", "Suite 700") or two addresses ("A / B") is asked as the building; "1000 Brickell Plaza" never takes "1000 Brickell Ave" cards; an office address printed on many pages is never asked as a building's; when the Hub cannot answer (busy or down), a block keeps its last good homes instead of going empty.
* Needs Hub 1.11.4 for the pool and penthouse filters. Pages with no topic, price band or luxury word ask exactly what 2.3.4 asked.

= 2.3.4 =
* Fixed: one unit published by two MLS feeds that spell the street two ways ("1000 Brickell Plz" / "1000 Brickell Plaza") showed twice. The twin check now reads the USPS street words both ways (Plaza = Plz, Island = Isl, Harbor = Hbr, Center = Ctr and more), the same table as the Hub 1.11.3.
* Fixed: a Spanish neighborhood guide titled "<neighborhood>, <city>" ("Guía de Brickell, Miami") was matched to the whole city. A busy neighborhood of the same city named in the title now wins, as it already did on the English twin.
* Fixed: Spanish building pages printed "condominios" after the building name ("Datos clave de Brickell Flatiron: condominios"). The page title's "condominios en venta" is now cut like the English "Condos for Sale".
* Fixed: a neighborhood name shared by several cities could follow a smaller city that the page only names in passing (a map label of a neighbor): the Cocoplum page of Coral Gables picked a South Miami "Cocoplum" subdivision. A city the title or URL names always wins; a smaller city mentioned once or twice no longer beats the clear busiest city of the name.

= 2.3.3 =
* Fixed: the stat tiles (Active listings, Median price, Median $ per sqft) could stay at "0" or "$0", or stop part-way, when the count-up animation lost its frames (a background tab, a screenshot or link-preview tool, a search engine's renderer). The count now runs only where someone is watching, and the real figure always lands within about a second.
* Fixed: a planted block showed two ft² | m² switches (one under the search bar, one above the cards). It now shows one, beside the cards; the search bar keeps its own only when there are no cards. Pages cached before this update are tidied in the browser too.
* Fixed: switching to m² (or pesos) while the stat tiles were still counting, then back, could bring back a part-way figure ("$294" for "$429"). The tiles now always come back to the figure the server printed, and "Active listings" prints with its thousands separator (14,446) like the other tiles.
* Fixed: "Most common type" in a grown page's key facts is left out when the market is too big to read whole (it counted a sample: "Condos (25/14446)").

= 2.3.2 =
* Fixed: the homes on a page are the homes of THAT place. A neighborhood or subdivision is now asked by the MLS field it came from, inside its own city: "Cocoplum" is the subdivision "COCOPLUM SEC 1" in Coral Gables, not a one-home area in Dania Beach, and a page about it never shows another city's rental or house again.
* Fixed: no more "Closest matches" from somewhere else. When nothing is for sale in the exact place the block widens only inside the same city and the same kind of home (condo or house), and says so ("Nearby in Coral Gables"). With nothing honest to show, you get an empty state with the search bar, never random homes.
* Fixed: a page about buying shows what is for sale first. Rentals stay in the For rent tab and the status strip, unless the page itself is about renting.
* New: IDX Bloom first. A switch in Settings (and ?idxb_layout=top, for administrators only) puts the search bar, the status strip (For sale, For rent, Pending, Sold), the key numbers and then the homes right under the page title. Off by default: nothing changes for visitors until you turn it on.
* New: sold homes' own pages stay open for visitors but carry noindex, are left out of the IDX sitemap and are never sent through IndexNow. Switch "Let Google index sold listing pages" (SEO and AI) turns them back on.
* Fixed (review): the IDX Bloom first layout really sits first, right under the page title (it stayed after paragraph 2). A building called "Ocean House" or "ORA by Casa Tua" no longer gets a houses-only block. A page filed under Miami whose title says Miami Beach asks Miami Beach.
* Needs Hub 1.11.2 for the neighborhood and status-strip numbers; with an older Hub the homes are still asked narrowly (never wider) and the strip shows less.

= 2.3.1 =
* Fixed: a page you wrote about a building shows YOUR name for it everywhere on that page and its tabs: the facts heading, the page titles and headings, the buttons, "Listings in ...", the breadcrumbs and the structured data all use the page's own title (cleaned of tails such as "preventa en ..." or "Condos"; the English page's title for English, the Spanish page's for Spanish). Before, an address-style MLS name could show up ("Key facts about 2201 Collins Ave" on the W South Beach page). The MLS name is used only when the building has no page of yours, and it is now read as words ("7000 Island Blvd Williams Island", not "7000 Isl Blvd Williams Is").
* Fixed: a building name two cities share (Casa Grande, Ritz-Carlton Residences, Mr. C Residences) shows the building of the PAGE's city on the facts, stats and sold tabs, not the busiest city's. A page whose address names no city and whose title or link names one never takes a building from another city.
* Safe to upgrade: your own picks still win, nothing is read again, and visitors see no change before you go live.

= 2.3.0 =
* New: every property page blooms by itself. IDX Bloom now reads the street address a page prints under its title and finds the building at that address, so a page about "Setai South Beach" gets the Setai and never another building that merely shares a word. No more pages waiting for you to choose a building.
* New: the match is checked three ways. The page may not name a word the building does not carry, a name made only of place words ("Lofts at South Beach") never counts, and the page's city has to agree with the building's. A name two cities share (Ritz-Carlton Residences) is two buildings.
* New: a page about a building that is not built yet never takes an older building with a similar name. It gets the neighborhood or city block, headed "New construction near ..." when there are at least three new buildings nearby.
* New: a property page with no building in the MLS gets its neighborhood or city block from its own address, title or link. "Needs a match" is gone: pages the matcher was less sure about are planted already and listed under "Check these" on Pages > Your pages, where you can still choose another building or area.
* New: English and Spanish pages always share one answer.
* New: a page in your blog (a post) is never treated as a building page because of its category; only an exact building name or address counts.
* Changed: the market's place list is no longer cut at 8,000 buildings, so small buildings with one or two listings match too. The list is stored compactly (about 470 KB for the three South Florida counties).
* Changed: a building page a visitor opens reads only the one building it needs from the stored list (about 8 MB of memory instead of about 18 MB on a 12,000-building market). A page you pick by hand on "Check these" leaves the list at once.
* Safe to upgrade in any order: with a Hub older than 1.11.0 the street step is simply off and the other checks still protect every page. Your own picks always win, and a re-read never changes them. Sites read their pages again by themselves after the update; nothing changes for visitors until you go live.

= 2.2.0 =
* New: listing pages are complete. The page title reads "address | MLS# | For Sale", the description has the beds, baths, size, price and MLS number, and a listing that may be indexed carries real-estate structured data (nothing is printed for a hidden street address).
* New: more facts, only when the MLS gives them: price per sq ft and per m², HOA fee and what it includes, property tax with its year, parking, pets, furnished, waterfront, flooring, view, floors, year built. Interior features, exterior features, building amenities and parking features are separate lists.
* New: price and status history from the MLS dates (listed, price change, under contract, sold). It says what the feed carries and invents nothing.
* New: a heart on every listing page (works without an account), a link to the building page, "Get alerts for this building", similar homes that are always the same sale or rent and the same status (same building first), and "Recently sold nearby" while sold listings are on. A sold page offers "Get notified of similar homes" instead of a showing.
* New: the payment estimate opens filled in (tax and HOA from the listing, an example rate marked as an example) with a mortgage-insurance line while the down payment is under 20 percent. Share by WhatsApp.
* New: search filters for living area, year built, HOA, days on market, price per sq ft, parking, pets, furnished, waterfront, unit and ZIP; a Sold toggle; more sorts (price per sq ft, size, bedrooms, year built, recently sold); numbered pages; a live "View N homes" button; Reset all.
* New: the search box suggests street addresses, ZIP codes and MLS numbers as you type (from the Hub's index, cached), next to areas and buildings.
* New: "Search as I move the map": the visible map window becomes the search and is kept in the link.
* Fixed: counts and sorts. A market-wide search is now paged by the MLS itself, so the count, the sort and the last page are right however big the market is (a count made of merged duplicate listings says "About N homes").
* New: buyer accounts are on for new installs (existing sites keep their setting). A visitor can save homes and searches with only an email (no password), gets a confirmation, and alert emails go out only with your mailing address set. When the Hub's mail relay is on, these emails are sent from hello@idxbloom.com so they reach the inbox.
* Fixed (pre-deploy review + live checks on 2.1.0): building and listing pages printed no <title> on sites with Rank Math or Yoast; building stats / sold tabs answered 404 while the Hub's index was being rebuilt (they now say "Stats are being prepared"); building names read like the MLS ("PARC LOFTS CONDO") instead of "Parc Lofts", and the facts heading showed twice; facts now show the live price, size and $/sq ft ranges while the stats are being prepared; numbered pages stop at the last page the Hub can serve; the live "View N homes" count never runs a heavy search on your server; the m² switch also changes the "price per sq ft" label; sold / off-market pages show no old asking price in the description, history or payment estimate.

= 2.1.0 =
* New: every building gets its own pages: Overview, For sale, For rent, Pending, Sold and Stats, each with its own title, description and link. They hang under your own building page when you have one (or under the grown building page), in English and Spanish.
* New: a facts block with the date of the data, one plain sentence ("4 condos for sale at Parc Lofts, average list price $729.49 per sq ft"), and a residences table by bedroom count.
* New: the Sold tab is a real table you can sort (closed date, price, price per sq ft, size, beds, days on market) with 3, 6, 12 and 24 month chips and filters. One photo per sale, credited to its MLS.
* New: the Stats tab: price per sq ft (average, low, high), months of inventory, closed sales in 3, 6, 12 and 24 months, sold price per sq ft by period, median price, a quarterly chart that needs no script, and a rentals block. A period with no sales says so; it never shows $0.
* New: sticky "Ask about", "Get alerts for" and report buttons on every tab. Everything enters your CRM with the building and the tab.
* New: building facts only you know (total units, floors, developer, architect, pets, rental rules, floor plan links) under Pages > Grown pages. Blank fields never show.
* New: cards show the unit number, price per sq ft and "Listed N days ago".
* Fixed: the search "Parc Lofts" found a junk building named "a" and no homes; a name now matches whole words only and "Park Lofts" finds Parc Lofts. The Building list is grouped by neighborhood with readable names, without one-letter and plat entries.
* Fixed: a building link on a listing page no longer leads to a missing page. A grown building page names your own building page as its canonical.
* Fixed: a South Florida site no longer shows Stellar MLS homes.
* One switch for sold: with "Show sold listings" off (or the Hub's own switch off) there is no Sold tab, no sold number anywhere and no sold page in the sitemap.

= 2.0.1 =
* Fixed: a building listed twice (the same unit published by two MLS feeds, like Parc Lofts) now shows once, however the answer reached the site. Answers saved by an older version are no longer reused after an upgrade, and a safety check merges any twin that slips through.
* Fixed: long searches no longer stop after the first page of results.
* New: swipe through a listing's photos right on the card (up to 10; arrows on desktop, dots, keyboard friendly). Photos load only as you swipe. A sold listing keeps its one photo. Every photo keeps the MLS credit and no site watermark.
* New: while your site is in Preview, you (and only you) can click through from a previewed page to listing pages, building pages and search. Visitors and search engines still see nothing.
* Fixed: listing, building and neighborhood pages now always have a page title (address, price, beds and baths, site name).
* Fixed: the "Download PDF" flyer button now shows on every real listing (it was hidden on sites that are still showing demo-scope data).

= 2.0.0 =
* New: setup in 5 steps. Activate the plugin and IDX Bloom opens a full-screen setup: paste your key and press Connect, answer 5 quick questions (where listings go, your market, you, where leads go, a look), then Publish. Everything is pre-filled. Lost your key? "Email it to me again" sends it to your account's address.
* New: Publish asks once ("Your listings will be visible to visitors and Google"), then reads your site with the live map and shows what bloomed. "Keep it private for now" stays in Preview. Pressed Publish before your MLS approved your website? It goes live by itself once approved.
* New: "Pick a look" previews Clean, Blend and Bloom on one of your own pages, visible only to you.
* New: every listing photo credits the MLS it came from ("Photo courtesy of Beaches MLS"): on the photo, in the alt text and in the structured data.
* New: sold listings are on (your MLS feeds allow it). Building and neighborhood blocks show a short "Recently sold" row, one photo per sale, from the last 24 months. Add "Your MLS ID" in Settings and your own sales show with their full history, and your own listings get sitemap entries wherever they are.
* New: Pages has a search box (spelling-tolerant: "park lofts" finds Parc Lofts), quick filters (Buildings, Neighborhoods, Needs a match, Skipped), sorting, and loads fast on thousands of pages.
* Improved: listing photos can no longer be hidden by a theme or plugin that wraps images (lazy-load, watermark, lightbox). MLS photos opt out of site watermarks.
* Improved: the Clean design is quieter and photo-first (your theme's fonts, bigger photos, more space). No "Planted by" badge on photos any more.
* Improved: an address the MLS hides is never shown and its map pin is only approximate.
* Existing sites are not sent through the setup and nothing public changes until you publish.

= 1.9.1 =
* Fixed: a building page is never given a building of the same name in another city. Each page's own address, title, parent pages, translation and opening text say where it is (for example "/miami-lofts/" = Miami-Dade); a building in another county is refused and the page waits for a match instead.
* Fixed: Miami condo buildings that the MLS lists under their condo association ("PARC LOFTS CONDO", "VILAMUR CONDO") now match their page ("Parc Lofts", "Vilamur Lofts") and show their listings.
* Fixed: an English page and its Spanish translation now always show the same building (the better of the two matches is shared).
* Fixed: a page matched to a building is shown as a condo building in Pages (never "House").
* Fixed: a listing published by two MLS feeds shows once (search, building blocks, neighborhood counts, sitemaps).
* New: building listings now sit near the top of a building page, right after its introduction.
* New: in Preview, Pages > View opens your real page with the listings block it will get after Go live, marked "Preview: only you can see this" (administrators only, on that private link). Visitors and search engines still see your pages exactly as before.
* Search: typing a building's name ("Parc Lofts") finds that building's listings.
* Upgrade: every page is read again by itself in the background after the update. Nothing to click.

= 1.9.0 =
* New: "Lite". Your website stores no listings any more, only the names of your market's buildings and neighborhoods (a small compressed setting, refreshed by itself once a day). The IDX Bloom service keeps the listings, builds your listing sitemaps and tells you which pages changed. Made for ordinary shared hosting: no big listing table, no large background downloads.
* Changed: /idx-bloom-sitemap.xml and its listing files are streamed from the IDX Bloom service with every address on your own domain (kept one hour; if the service is briefly unreachable the last copy is served). Your robots.txt lines and sitemap address are unchanged.
* Changed: IndexNow asks the service which listing pages changed since the last ping.
* Changed: a listing that left the market is still handled the same way (30 days indexable, then noindex, then "410 Gone"), now using the date the service saw it leave.
* Upgrade: the old listing table ({prefix}idxb_market), its settings and its scheduled job are removed automatically on the first page load after the update. Nothing to click.
* Nothing changes while your site is in Preview: no sitemap, no search-engine ping, no robots or llms.txt change until you go live.

= 1.8.1 =
* New: building pages match in Preview too. With your license active and the live listings chosen, IDX Bloom now reads your market's buildings and neighborhoods from the IDX Bloom service while still in Preview (a private server-to-server read: nothing becomes public, no sitemap, no search-engine ping, no robots or llms.txt change until you go live).
* New: no market set? IDX Bloom works it out from your own pages (for example Miami-Dade, Broward and Palm Beach) and shows what it chose on Home, step 1, where you can change it. No extra step.
* New: when your market's buildings arrive, your pages are matched again on their own, in the background, and Pages, Your pages updates by itself. No need to Bloom again.
* New: a building page that is not in the market list (for example a building outside your counties) is looked up by its own name in the MLS; it is accepted only when the page really names that building (the same spelling rules and similar-name guards). Shown as "MLS search" in Pages.
* Fixed: the Pages tiles could show "0 pages read / 0 pages planted" next to a report of 470 planted.
* Fixed: IDX Bloom screens are never served from a page cache any more (an old copy of Pages could say "Nothing has bloomed yet"), and the screens re-check their numbers with the server when they open.
* Fixed: flipping "Bloom my site" off and on again always starts a new Bloom, and the screen never shows an older run's result as the new one.
* Fixed: the private preview page said "fictional sample listings" and "Living in Demo Bay" while showing real MLS listings. Its text now matches what it shows (only while it still has IDX Bloom's own text).
* Fixed: rentals in the map search showed "$0/mo per sq ft · 90% below the ... median". Rentals are never compared with a median, and a figure that rounds to $0 is never shown.

= 1.8.0 =
* New: smarter matching. IDX Bloom reads each page's title, address (slug), parent pages and categories and matches it against your market's real buildings, neighborhoods and cities, in English and Spanish, ignoring accents, "The", "Condos", "Residences", "Lofts" and "&" versus "and". A page named after a building gets that building's listings (and similar homes in its area as a fallback); a neighborhood page gets that area.
* New: spelling-tolerant. "Parc Lofts" finds Park Lofts, "Brickel Key" finds Brickell Key, and a missing, extra or swapped letter still matches ("Fontainbleau", "Fountianhead"). Different buildings with similar names are never mixed up: "Icon Brickell" is not Icon Bay, "One Thousand Museum" is not Museum Tower, "Park Tower" is not Park Lofts.
* New: a page that looks like a building or neighborhood page but cannot be matched is marked "Needs a match" and gets nothing planted until you pick the building or area in Pages, Your pages (one click, with suggestions). Never a generic block on such a page.
* New: every Bloom ends with a report: matched to a building, to a neighborhood, other pages, needs a match, skipped.
* New: "Where should IDX go?" is the first setup step: building pages, neighborhood pages, market reports, blog posts, other pages, or everywhere (the default), plus your market and name. Bloom waits for it.
* New: a live crawl graphic while Bloom runs: elapsed timer, "Reading N of TOTAL", time left, pages per second and a map of your whole site that lights up page by page (smooth at 1,600+ pages), ending in a share-able "Your whole site bloomed in 00:42" card.
* New: "Download PDF" on every real listing page: a one-page flyer with photos, price, facts, description, features, your photo, phone and WhatsApp, the listing courtesy line and MLS disclaimer, and the link back. Opens your browser's print window ("Save as PDF"). Not available for sample listings; the flyer is noindex and rate limited.
* New: three designs (Bloom, Blend and the new Clean) and a Style panel with a live preview: accent, button and text colours (always readable), button shape, card corners, heading and body fonts, card density and shadow. Only the fonts you pick are loaded; they can be copied to your own site for privacy, or you can use system fonts.
* New: pages you publish or change after the first Bloom are read automatically. No need to Bloom again.
* Changed: onboarding connects your listings with your license key (no hostname). Going live now needs an active license, an MLS-approved site and real listings coming back.
* Changed: Home shows an honest "Lead emails: ON / OFF" state with a one-click switch and a test email.
* Changed: works with the IDX Bloom service 1.6.0. When a free trial ends (or the site is removed from the account) the site keeps showing the listings it already saved, or sample listings, explains it in a notice with a link to your dashboard, and switches back on by itself once a card is added; the license is checked daily and when you open IDX Bloom.
* Fixed: uninstalling now also removes the "Search homes" page IDX Bloom created (if you did not change it) and its saved service state.

= 1.7.0 =
* New: every listing in your market. Set your state and counties, cities or zip codes (Settings, Google & AI) and IDX Bloom gives every active and pending listing in it a page and a sitemap entry. No WordPress pages are created; the listings come from the IDX Bloom service in the background.
* New: your listing sitemap is now an index: idx-areas.xml, idx-buildings.xml and idx-listings-active-N.xml, idx-listings-pending-N.xml (and sold) with at most 5,000 addresses each, honest last-changed dates and the first photo. Also listed in Rank Math, Yoast and WordPress sitemaps, and in robots.txt.
* New: an AI summary file at /idx-bloom-llms.txt (your market, area counts and median prices, sitemaps, newest listings) and the same section added to llms.txt when the plugin manages it. A real llms.txt file is never replaced.
* New: robots.txt lines for the IDX routes, sitemaps and the AI summary, including a Bingbot group. If your site has a real robots.txt file, an admin notice shows the lines to add.
* New: IndexNow is told about new, changed and status-changed listings, in batches, with a daily ceiling.
* New: "Show sold listings" (off by default; turn it on only after your MLS or data provider confirms sold display is allowed), and how many months of sold listings to show. A listing that sells while this is off reads "Off market" with no sale price.
* New: a listing page is never deleted once it exists. Expired or withdrawn listings stay indexable for a grace period (30 days by default), then carry noindex; if the MLS no longer has the listing at all the page answers 410 Gone.
* New: Settings, Google & AI shows an "SEO & AI" status panel: counts per sitemap, last refresh, the IndexNow queue, and why anything is held back.
* Nothing in this layer is announced while the site is in Preview mode, uses sample listings, is waiting on MLS approval, or is on a demo-only domain. Listing pages stay noindex then.
* Fixed: search, the map and the sitemap saw at most 24 live listings; they now page through the service and see the whole result.
* Fixed: with live listings, areas and buildings now come from your whole market (buildings were empty).
* Fixed: admin screens showed "idle" while a scan was running on sites behind LiteSpeed or another page cache. Every IDX Bloom REST answer is now uncacheable and the admin refresh adds a cache-buster.
* Faster scan: each batch now runs for up to about 18 seconds instead of a fixed 25 pages, the Pages screen keeps up to 5,000 rows (it used to show only the newest 500), and the admin refresh helps the scan along instead of waiting for WP-Cron.

= 1.6.1 =
* Fixed: with live MLS listings, search and grid cards now show the listing's first photo (lazy-loaded, with the address as its description) instead of the line-art placeholder. Sample listings, and listings without a photo, keep the line art.

= 1.6.0 =
* New: "Listings source" setting (Settings, Listings data): sample listings or live MLS listings. Live listings come through the IDX Bloom service with your license key. The plugin never holds MLS credentials and never contacts the MLS data provider itself.
* New: until your MLS approves your site, the live source answers "waiting on approval". The site keeps showing sample listings, keeps its cached data, shows an admin notice ("Live MLS data is waiting on approval"), and nothing is switched off or deleted.
* New: with live listings, every listing shows "Listing courtesy of" the listing office, and the MLS disclaimer shows in the compliance footer.
* Listings from a demo-only domain stay noindex: no listing schema, sitemap entries or IndexNow pings.

= 1.5.3 =
* Fixed: on themes with a narrow content column, split list + map view squeezed listing cards. The map now sits above the list when the search area is narrow, and cards go one per row when the list column is narrow.
* Fixed: a typo in the sample listing descriptions.
* Fixed: the confidence percentage on the Pages screen no longer wraps.

= 1.5.2 =
* Fixed: 1.5.1 could stop the search page with a PHP error. Filters stay a list inside PHP and are only sent to the browser as an object.

= 1.5.1 =
* Fixed: on a search page with no filters, the address bar could gain a broken "sort" value. Empty filters are now sent as an object, and the map script ignores built-in names.

= 1.5.0 =
* New: Dashboard: mode, data source, pages bloomed, leads, AI visibility, CRM status, AI Marketing and buyer activity on one screen.
* New: Leads inbox with filters, search, a plain-words lead summary (English/Spanish), CSV export and delete.
* New: CRM Connections: GoHighLevel, Follow Up Boss, HubSpot, Zoho, Salesforce, Lofty, BoldTrail, webhooks (Zapier/Make) and email, with automatic retry.
* New: AI Marketing studio (needs a license; listing text is only used when the listing-text setting is on).
* New: Buyer accounts: email sign-in link, favorites, saved searches, "Follow this area/building" with a market snapshot, and alerts (alert emails stay off until you turn them on).
* New: Map search with price pins, draw-an-area, near-me radius, sort, filter chips, shareable links and place suggestions.
* New: Search by street address, listing number or description words ("boat dock", "cocina blanca").
* New: Listing pages: photo gallery, map on tap, monthly cost calculator (with a foreign-buyer mode), WhatsApp and call buttons, request a showing, tour and share buttons.
* New: USD/MXN (at a rate you set) and ft²/m² switch for visitors.
* New: "Hot right now" returning buyers and "Buyers searching your building" (totals only) on the Dashboard.
* New: Spanish twin pages with hreflang, Open Graph share tags, and an optional contact-consent checkbox on the lead form.

= 1.4.3 =
* Data control: if the data provider refuses a site (key or domain revoked), every cached listing is deleted at once and nothing is shown until access is restored.
* Data control: AI-written listing text is off by default (new setting) until the provider confirms the MLS allows it.

= 1.4.2 =
* Fixed: no "See all" link in Preview mode (its page is off until Go live).

= 1.4.1 =
* Fixed: the admin logo could show an old cached image; the logo now carries the version.
* Fixed: section tabs are styled on every IDX Bloom admin screen.
* Improved: plugin description, install steps and FAQ.

= 1.4.0 =
* Added: Preview mode, the default for every new install. IDX Bloom shows itself only on one private page ("IDX Bloom Preview", visible to logged-in editors and admins), using the fictional sample listings. Nothing appears to visitors or search engines and no other page changes.
* In preview mode these are all off: planting on your pages, area/building/listing pages (they return your normal 404), robots.txt additions, sitemap additions (core, Rank Math, Yoast), IndexNow, llms.txt, JSON-LD and SEO tags outside the preview page, bot counting, AI-referral cookies, the tracking script and the dashboard stats sync. Front-end CSS/JS load only on the preview page.
* Added: leads from the preview page are saved as test leads and are not sent to GoHighLevel until you click "Send test lead".
* Added: a banner on every IDX Bloom admin screen with "View preview page" and "Go live" (with an on-page confirm step), and "Back to preview" in the settings.
* Existing installs that have already bloomed stay live after updating.
* The private preview page is deleted when the plugin is uninstalled.

= 1.1.0 =
* Fixed: abbreviated prices ("$1M", "$800k") were silently parsed as $1 / $800 (a word-boundary regex never matched a letter glued to a digit), which could zero out an otherwise-matching grid.
* Added: an inline lead form now renders after every planted grid (and on listing detail pages), plus ItemList/RealEstateListing JSON-LD for planted grids.
* Added: never render an empty grid -- filters relax step by step (beds, then price, then type) before falling back to a search box + lead form only.
* Added: page-language detection (Spanish stopwords/accents, Polylang-aware) -- Spanish-classified pages now render all front-end strings in Spanish.
* Fixed: "casas"/"casa" no longer loses to "condo" by array order; property type now goes to whichever type is actually mentioned more (title-weighted).
* Fixed: the admin coverage table now shows the matched building with its parent area in parens instead of silently showing just the area.
* Improved: a title that literally names the matched area/building now boosts confidence to at least 80%.
* Changed: admin copy no longer names the data provider anywhere in the UI.
* Redesigned: front-end blocks and the admin screen now use the "Ciao Bella Marketing family" look (new setting: Style -> Bloom/Blend), with a new brand mark.
* Bumped version to 1.1.0.

= 1.0.0 =
* Initial release.
