v2.0.0 Latest
October 12, 2026
New 4 Improve 14 Fix 53 Security 8 Dev 11 Compat 2
New
- Needs can state a budget per hour, visit, day, night, week or month, for rentals, stays and recurring services.
- Analytics shows the most favourited listings and the most saved searches for the chosen period, next to the keywords that found nothing; totals only, never who saved what.
- Settings > Credits > Receipts sets the buyer billing details asked at checkout, the tax rate and label, and the receipt number prefix, also through the REST route listora/v1/settings/billing.
- Gateway credit purchases get a Listora receipt with the site's receipt prefix, seller details, billing address and tax.
Improve
- Business Details is the one place for the seller name, address and tax ID, and every credit receipt and order uses it.
- Turning on Monetization turns listing expiry on, so plans run for their duration and can be renewed; turning it off keeps expiry dates already set.
- The Lead Capture Form is now the free plugin's one contact form, which stores every lead; Pro no longer shows a second form and the Lead Capture Form toggle is gone.
- The Buy Credits block names payment methods and explains checkout errors in Listora's words instead of the Credits SDK's English text.
- A plan's display price is an amount and a period shown in the site currency, so a currency change or converter applies to it; existing "$29/month" prices convert on update, and the plans REST payload adds price_amount and price_period.
- Pro stylesheets load as linked layered files instead of an inline @import, so cache plugins can combine and defer them.
- Every Pro admin screen shares Free's page header, and empty states and pagers use Free's components.
- My Needs pages 20 at a time instead of stopping at 50, and its menu badge still counts every need.
- Recurring jobs (analytics and audit-log cleanup, webhook log cleanup, digests, saved-search alerts, need expiry) are checked only by cron, wp-admin and WP-CLI, not on every visitor page.
- Comparison, Programmatic SEO, need responses, moderator queue and Buy Credits empty states use Free's shared empty-state card.
- Every credit pack is priced, shown and charged in the site currency; the per-pack currency choice is gone.
- A vendor's quote is a stored amount, shown as "Quote: $250" on the need page, My Needs, My Responses, the buyer's email and the wp-admin Need screen.
- Saved searches and search analytics count real searches: paging and tracking values are dropped, filter-only searches count, and a page with a map and a grid counts once.
- Pro's scheduled jobs join WB Listora's one job list, so admin pages no longer check them on every load, and deactivating Pro clears its webhook deliveries and import batches too.
Fix
- Photos attached to a review from the listing page upload instead of being dropped.
- The audit log records the real rating and listing for new reviews instead of "Rating: 0".
- Analytics counts one view or click per visitor, listing and event per minute, and the listing panel follows the selected 7, 30 or 90 day range.
- The daily digest greets the recipient by display name and uses a plural subject, and digest mode now sends credit and plan emails immediately.
- Programmatic SEO pages answer right after the feature is turned on, without re-saving permalinks.
- The first saved-search alert covers only listings added after the search was saved.
- Post a Need and its edit form reject a minimum budget above the maximum or a past deadline, and vendor quotes must be above zero and show in the need's currency.
- The Credits gateway card no longer says "Coming in v1.0.5" and links to Credits > Payments.
- With White Label on, plugin descriptions and Free's setup notice use your brand name.
- A pricing plan's perks, such as Featured, also apply to a listing already on that plan.
- Pressing Escape no longer clears the Compare selection, and infinite scroll keeps loading for a visitor still at the bottom.
- Dashboard tabs for Saved Searches, Analytics, My Needs and My Responses appear only while their feature is on.
- Saving the Features screen no longer turns off Google Maps provider, Coming Soon and Notification Digest, which have no toggle there.
- The Compare page is readable on phones, and the floating compare bar shows only beside Compare toggles so it no longer covers checkout or the Compare page.
- Save This Search opens as a popover under its button and no longer pushes the Filters button around.
- Buy Now on Buy Credits opens checkout in the same tab.
- Vendor quotes, credit pack fallback prices, payments, refunds and the activity feed use Listora's currency format.
- Quick view rating numbers use dark text for readable contrast, and BuddyPress reviews show labelled stars.
- Deleting a need from My Needs fires the same hooks as the REST route.
- Transactions, Monetization totals and Analytics windows cover exactly the chosen days on every server, using UTC for ledger and payment times and the site calendar for daily analytics, instead of the database server's clock.
- A coupon works through the whole of its expiry date in the site's calendar, at checkout and in the admin list, and the list shows that date instead of the day before.
- A need whose deadline has passed can still be edited, extended or closed; only a changed deadline is checked, and the Needs grid shows and ends the deadline on the site's calendar day.
- A Needs grid link past the last page shows the last page instead of "No needs found".
- Pro's rate-limited endpoints send Retry-After with the 429.
- Directory pages past the end point their previous-page link at the real last page.
- With infinite scroll and JavaScript off, the loading spinner and end message stay hidden.
- The compare bar is readable in dark mode, fits on one row of chips on phones, and the compare table keeps its row labels in view while scrolling sideways.
- Save This Search asks for a keyword or filter instead of saving an empty search that would email every new listing.
- Vendor quotes show the site currency, like the need budget above them, on the page and in the REST API.
- Review photos upload once when a review is sent again after a failed attempt.
- Listing analytics count one view per visitor per 30 minutes and one click per window even under parallel requests; filter wb_listora_pro_analytics_view_window sets the view window.
- Programmatic SEO pages no longer call every listing "verified", say "1 listing" for one result, and the default texts are translatable.
- The audit log stores and exports titles as plain text, so "Fish & Chips" no longer reads "Fish & Chips".
- White Label renames Pro in the license notice, the setup wizard, privacy export and erase tools and test webhooks; the plugin-dependency lines on the Plugins screen come from WordPress and keep the installed names.
- Pro stylesheets read only declared design tokens, so needs, credit purchase, quick view and the My Responses panel follow the theme and dark mode.
- Receipts keep the number, tax label and seller they were issued under after the receipt settings change.
- Needs use the site currency; a need in another currency is refused and older needs move to the site currency on update.
- Webhook logs keep 50 entries for every webhook, a failed delivery is not re-sent on its own, a rejected incoming webhook is logged once, and saving a webhook confirms it.
- Moderator queue times are stored in UTC, and bulk reassign reports an error instead of success.
- Visual import batches after the first belong to the member who ran the import, and licence check times show correctly.
- A coupon expiry must be a real date; free text is refused instead of making a coupon always or never expire.
- Auto-renew no longer renews and charges a listing twice in a day on sites behind UTC.
- Analytics keeps data for its retention setting, 365 days by default, instead of losing everything older than 90 days.
- Clearing a plan's amount removes its old text price, plan prices and need budgets print in full, and demo plans use the site currency.
- Quick view no longer requests the page itself through an empty image before a listing opens.
- Pro admin lists, SEO landing pages and My Needs show the last page for an out-of-range page number.
- SEO landing pages no longer print a second page title on themes that manage the title.
- Google Places import without an API key says where to add one instead of failing with a server error.
- With White Label on, a brand name that contains "Listora" is no longer doubled, and every notice uses the brand.
- Credit history, Transactions and receipts show the same translated line for every entry.
- The audit log records claim deletions.
- CSV exports and the visual importer no longer log deprecation notices on PHP 8.4 and later.
- The listing analytics panel, My Responses cards, the quote amount field, the empty compare table and quick view follow dark mode instead of staying light.
Security
- Review photo uploads follow the listing type's Reviews switch, are limited to 30 an hour, and a review holds at most its photo limit in total.
- Needs show the author's public name, or "Member" while the display name is still the login.
- Compare leaves out fields the owner hid, and service compare returns only services of published listings.
- Members post needs only through Listora's own route, which applies the hourly limit, quota and budget checks.
- Review photos accept JPG, PNG, GIF, WebP and AVIF only, one upload at a time per review, and only the reviewer's own uploads.
- Search, audit-log and transactions CSV exports neutralise spreadsheet formulas.
- Post a Need does not prefill a seeded or imported request for a visitor.
- SEO landing page structured data can no longer close its script tag.
Dev
- Removed the pre-1.2.0 hook names deprecated since 1.2.0 (wb_listora_need_*, wb_listora_coupon_*, wb_listora_service_book, wb_listora_service_booking_url, wb_listora_plan_activated, wb_listora_moderator_assigned, wb_listora_audit_log); listen to their wb_listora_pro_* names.
- Removed the legacy Updater class, Email_Helpers::html_to_text(), Receipt::latest_receipt_url_for(), Audit_Log::CRON_HOOK and wb_listora_pro_ensure_monetization_pages(), all deprecated since 1.1.0 to 1.8.0.
- The /listings/{id}/contact route and the wb_listora_pro_before_submit_lead, wb_listora_pro_after_submit_lead, wb_listora_pro_lead_per_listing_daily_cap and wb_listora_pro_email_lead_notification_subject hooks are deprecated in favour of the free plugin's contact-form route and hooks, and will be removed in 2.2.0.
- The credit purchase notice class is now listora-credits__notice (was listora-credits__empty); update custom CSS that targeted it.
- Every Pro email passes `wb_listora_send_notification`, and the digest holds back only events it can deliver.
- New filters `wb_listora_pro_review_max_photos`, `wb_listora_pro_review_photo_max_bytes` and `wb_listora_pro_analytics_click_window`.
- `Reverse_Listings::delete_need()` and `Badges::delete_badge()` are the single delete paths for the admin and REST.
- `Pro_Plugin` is split into job classes (Monetization, App_Config and the Admin screens); `Pro_Plugin::filter_app_config()` and `has_purchase_path()` still delegate.
- Pro boots on `wb_listora_loaded` and calls Free helpers directly, with no older-Free fallbacks.
- The deprecated lead hooks' notices say they are removed in 2.2.0, and the hooks reference now lives in the free plugin's documentation.
- Webhook deliveries, saved-search alert batches and visual-import batches are queued through the free plugin's scheduler.
Compat
- Requires WB Listora 2.0.0 or later; install both updates together.
- Requires PHP 8.1 or later.
v1.9.0
September 30, 2026
New 11 Improve 12 Fix 45 Dev 3 Compat 1
New
- Needs cards show the type, location, posted age, deadline and budget with its unit; Post a Need has a budget unit and currency; Needs, Post a Need, Buy Credits and Compare take the full page width.
- Members can edit, close and delete their needs; requests expire and waiting quotes close with them; matching uses location; the vendor whose quote is accepted gets the buyer's contact.
- Needs admin: read a request in full, correct it, see its quotes, reject with a note to the member, and moderators can moderate needs.
- Pricing Plans list what each plan gives, "What's included" points show on plan cards, and a plan can be taken off sale while listings on it keep it.
- Badges have plain-English rules, a guided rule builder, holder counts and reordering.
- Coupons, Badges, Moderators, Needs, Audit Log, Webhooks, Transactions and Analytics use the shared admin table with filters, member search and readable entries.
- Webhooks report Failing after three failed attempts in a row and pause after ten, emailing the site owner.
- Analytics has a views and clicks chart with change on the previous period; the member Analytics tab has a range and chart.
- Pro's emails can be switched, edited and previewed in Settings > Notifications, appear in Listora > Email Log, and members can opt out of credit, plan and need emails.
- Settings > Credits has Payments, Receipts and Needs sub-tabs; the rate reads "Credits granted per 1 USD paid" and warns when a pack's credits do not match price x rate.
- Dashboard shows money received, listing views, leads, needs awaiting review and completed purchases.
Improve
- Plan cards show credits only, the Most popular badge is not shown on a plan the member cannot afford, the picked plan shows a check, and the grid fits the plan count.
- Transactions tiles follow the Period filter, "Hold released" is no longer shown as a Refund, and the For column links the listing or need.
- Directory Quick view and Verified carry visible labels; the Google map fits the listing cluster and keeps the marker-cap notice current.
- The license notice shows on Plugins and Settings > License, and once elsewhere until dismissed.
- Pro settings tabs sit in task groups with one switch per behaviour (Infinite Scroll, Google Maps, Visibility, Digest), and Pagination style sits under General.
- Visual Import is the only CSV importer and reads the active listing types; migration cards say Installed, Not installed or No data.
- Coupons read "20% off" and "3 of 50 used", and name the plans they apply to.
- Demo photo reviews use a photo of the reviewed place instead of a random image.
- Settings > Credits warns when a pack grants a different number of credits than its price buys at your credit rate, and offers to add or remove credit packs saved by the setup wizard in earlier versions.
- The Transactions button is now Remove credits; the window says it does not refund the payment, links to the WooCommerce order, and warns when the member has already spent those credits.
- In the block editor, a listing refused for review is saved as a draft with a link to where its plan can be paid, instead of leaving the editor stuck on Pending; Bulk Edit and WP-CLI say it was not sent to review.
- A Stripe key in the wrong format is refused with a message under that field instead of being saved.
Fix
- Needs pages showed raw type slugs and broken markup; My Responses now pages 20 at a time.
- The Audit Log sorted wrongly when no order was given, and the Moderators screen's counts disagreed with each other.
- Deactivating Pro no longer demotes Listora Moderators.
- All Listings hides the Moderator column until the site has an active moderator.
- Google geocoding passes the country's ISO code so listings file under one country term.
- Saved-search links and alert emails now open the site's own directory page with the new filter names, instead of a fixed /listings/ address.
- The Credits balance and history API responses again say which unit the balance is in, with the amount in money and the currency on sites that sell credits for money.
- Two quotes sent at the same moment can no longer overdraw a vendor's credits. Both passed the balance check before either was charged, so a vendor with enough for one quote could send two and go below zero.
- A quote whose credit charge fails is no longer delivered. The buyer received it while the vendor paid nothing, and sending it again was refused as a duplicate.
- Vendors without enough credits to respond to a need now get a Buy credits link, next to the balance warning and in the error after sending. Both said "Top up" with no way to do it from the page.
- After sending a paid quote the confirmation says how many credits were charged, and the outdated balance notice is removed.
- The response count on the needs grid and the need page now matches the responses that exist. It only ever went up, so a response removed later left it permanently high.
- Activating plans on two listings at the same moment can no longer overdraw a member's credits; the balance check and the charge are now one step.
- Saving a listing as a draft no longer charges for its plan; the plan is charged once, when the listing is submitted, and a listing that has already paid for its plan is never charged again.
- A coupon applied on the plan step is now taken off the price charged at submission. Members were shown the discounted price and charged the full one.
- The plan is charged to the listing's author, not to an admin who verifies or submits it for them.
- Listings can no longer be sent for review without a plan from wp-admin (block editor, Classic Editor, Quick Edit, Bulk Edit), WP-CLI or the WordPress REST API; authors are asked to use the Add Listing page, where a plan is chosen. Filter wb_listora_pro_require_plan_on_admin_save turns this off.
- Refunding a credit purchase from Listora > Transactions now removes the refunded credits. It added them instead, doubling the member's balance.
- The Refund window now offers the purchase's credit amount; it offered the amount in cents, which was then refused as too high.
- A member whose credit purchase is refunded now gets an email saying the credits were removed, with the right number, instead of one saying credits were returned to their account.
- With Monetization switched off, members can no longer start a credit purchase; balances stay visible.
- The credit packs API now lists only packs members can actually buy, the same ones as the Buy Credits page. It listed packs from the setup wizard that nothing sold, including ones whose checkout granted no credits.
- The setup wizard now creates Stripe / PayPal packs that go on sale once a payment gateway is connected, with credits that match your credit rate.
- The Active Mappings table stays readable in narrow windows instead of breaking words.
- Refunding a credit purchase now also takes offline the listings those credits paid for and returns their plan charge, so a refund reverses everything the purchase bought.
- A refund only reverses listings bought with the refunded credits, starting with the first listing paid after the purchase; older listings paid from other credits stay live.
- A listing waiting for credits goes to review once paid on directories that moderate new listings, instead of staying in Awaiting credits and sending another activation email on every top-up.
- Credits already taken back by a WooCommerce refund can no longer be removed a second time from Listora > Transactions.
- Fractional credit amounts such as 12.5 are shown and removed exactly on the Transactions screen and in credit emails; they were rounded or cut to whole credits.
- Pro's emails (credits, plans, needs, leads, digests, saved-search alerts, moderator reassignment) now appear in Listora > Email Log.
- With Monetization off, credit products sold through WooCommerce, MemberPress or Paid Memberships Pro can no longer be bought; orders already paid are still credited.
- The Buy Credits page stays up with Monetization off and says credit purchases aren't available right now.
- A member can no longer send an expired, rejected or awaiting-credits listing back to review from wp-admin, WP-CLI or the WordPress REST API without paying; it keeps its status and the message says where to pay.
- The credits API history and the Transactions CSV export show credit amounts in credits; they showed them 100 times too high.
- The low-balance email is sent again after a member tops up and runs low a second time, and always states the balance in credits.
- A plan with a duration of 0 shows and uses your standard expiration period; plan cards said Never expires while those listings did expire.
- Free's renewal can republish a paid expired listing again under the new plan gate.
- Stripe and PayPal settings and the Needs marketplace settings are saved by the Credits tab's Save Changes; they were lost unless you found their separate save buttons.
- The visual importer keeps HTML in listing descriptions, including when re-importing over an existing listing.
- A plan id that is not a published plan is treated as no plan; the listing was parked awaiting credits for a plan that does not exist.
- The Credit Purchase block asks for the billing details Stripe and PayPal checkout needs; every purchase failed for members without them.
- The Remove credits window opens on phones and tablets, and its fields line up with labels above them.
- Quick view can be closed on a phone; its close button sat under the Save to favorites button.
- Quick view shows no broken image for a listing without a photo.
- Turning a feature on or off refreshes the site's URLs; switching Needs on left every request page on a 404 until Permalinks were re-saved.
Dev
- New meta _listora_need_budget_unit, _listora_need_reject_reason, _listora_need_contact_phone, _listora_plan_highlights and webhook health meta; GET /dashboard/responses; credit history rows gain type_label; Email_Catalog and one Email_Helpers::send() path for every Pro email.
- The credits balance API returns can_buy, false while Monetization is off.
- The credits API history accepts page and per_page and returns X-WP-Total and X-WP-TotalPages.
Compat
- Requires WB Listora 1.9.0. Install both updates together.
v1.8.0
September 23, 2026
New 4 Improve 2 Fix 15 Security 4 Dev 3 Compat 1
New
- Private and Coming Soon have an Applies To setting: hide the directory only, so your blog, pages and shop stay public, or the whole site. Sites already Private or Coming Soon keep hiding the whole site after updating.
- Give a member credits from their WordPress user profile. Adding credits worked through the API for several releases with no screen anywhere to do it from.
- Change a credit mapping instead of deleting it and adding it back. The Active Mappings table had only a Remove link, so correcting a typo in a credit amount meant taking the mapping down and rebuilding it, and a customer part-way through checkout in that window received nothing.
- Active Mappings has a Pricing column. It shows what a Direct (Stripe or PayPal) pack costs; WooCommerce, PMPro and MemberPress do not report a price to Listora, so those rows show a dash and say where the price is set rather than inventing a figure.
Improve
- Stripe and PayPal settings are now shown on the Credits tab by default. They were hidden while the purchase flow was still being finished; that flow shipped in 1.7.0, and until now setting up a gateway meant hand-written PHP.
- The admin notice about enabling a gateway no longer prints a code snippet to paste. It links to the settings that are now on screen.
Fix
- Credit balances, refunds and purchases degrade instead of fataling when another Wbcom plugin on the site loads an older copy of the shared credits library.
- Gateway settings can now be saved. The Stripe and PayPal fields rendered with no Save button and no form around them, so credentials entered there were discarded on reload without any error.
- A configured payment gateway now reaches the Buy Credits page. With Stripe enabled and keyed, every pack showed "Checkout unavailable" and no buy button was drawn, so members could not buy credits on any site.
- Pricing plans no longer advertise "Analytics dashboard access" and "Priority support". Neither was ever enforced, so both were sold and not delivered; the Featured listing perk is unchanged and still works.
- Messages sent through the basic contact form now count as leads in Analytics when Lead Capture Form is off. They reached the owner but were never counted.
- The listing count above a grid now grows as you press Load More. It stayed on the first page's range while the grid filled up beneath it, so a grid showing forty listings still read "Showing 1-20".
- The plan step no longer offers a plan restricted to a different listing type. It was listed until you submitted, and only then refused.
- Pricing plans have a Clear selection button under Listing types and Categories, so a restricted plan can be offered to every type again without Ctrl or Cmd-click.
- Switching off Needs, Outgoing Webhooks, Notification Digest or saved-search alerts now also cancels their queued background jobs. They stayed queued and failed with "no callbacks are registered" in Tools > Scheduled Actions.
- Editing a listing that is already live no longer asks for a plan; the Plan step shows only for a new listing or a draft.
- Receipt links, unsubscribe links, email verification links and the payment webhook work while the directory is Private or Coming Soon.
- "Close this need" now asks for confirmation before closing, so a stray tap no longer stops new quotes.
- When WB Listora is missing its bundled Credits SDK, Pro now says it is switched off and to reinstall WB Listora, instead of telling you to update it.
- WB Listora Pro now tells the site owner when WB Listora is deactivated. Before, Pro stopped silently with no notice.
- Pro's "WB Listora is missing or needs an update" notices now show only to users who can manage plugins, not to editors.
Security
- A Private or Coming Soon directory no longer shows listings through the REST API, sitemaps, embeds, SEO landing pages or the BuddyPress activity stream.
- A plan limited to certain categories can no longer be used for a listing in other categories when the listing is submitted through the API.
- A Private or Coming Soon directory can no longer be read over the REST API by changing the letter case of the address.
- A Private or Coming Soon directory can no longer be read over the REST API with a trailing newline in the address, through ?post_type[]= on the front end, or through the rendered content of a page that shows the directory.
Dev
- wb_listora_pro_show_gateway_settings still hides those settings for a site that wants them hidden; pass __return_false.
- wb_listora_pro_visibility_should_gate still overrides the gate per request, wb_listora_pro_visibility_hide_from_search keeps listings in site search, and wb_listora_pro_visibility_rest_allowed_routes lists REST routes that stay open.
- Credit and plan emails now pass the recipient address as the fourth argument of wb_listora_send_notification, matching Free, so a listener written for Free's signature no longer errors on a Pro email.
Compat
- Aligned with WB Listora 1.8.0. Install both updates together.
New 4 Improve 9 Fix 22 Dev 6 Compat 1
New
- Turning on Reverse Listings now creates the Post a Need and Browse Needs pages, the way Compare and Buy Credits already did. The feature used to switch on with both of its entry points leading nowhere, and nothing said a page had to be made or which block belonged in it. Sites already running the feature get the pages on update.
- A plan can renew itself from the member's credit balance. Tick Auto-renew on any plan with a listing duration; when the listing reaches the end of that duration the plan cost is deducted and it keeps running. No card is charged and no gateway is involved - members buy credits up front, so a renewal is only a deduction.
- A listing whose owner is short of credits at renewal pauses instead of expiring, and resumes automatically as soon as they top up.
- A pricing plan can be restricted to specific categories, so one part of the directory can be priced differently from another even when both share a listing type.
Improve
- Switching a feature on from Settings still creates its page, since that is you asking for it.
- The Credits Page setting is now only in Settings > General > Pages, alongside every other page, instead of also having a second picker on the Credits tab that wrote the same setting.
- Buy Credits appears in Settings > General > Pages alongside the other pages, so it can be re-mapped and its status seen. It stays on the same setting, so nothing moves on update.
- Needs has one address instead of two. The listings lived at both /needs/ and /browse-needs/, so a site owner customised one page while visitors, shared links and the "View Need" button led to the other, which ignored their layout. The page now answers /needs/ and the duplicate archive stands down for it.
- Existing sites are moved onto the single address on update, and the old /browse-needs/ address redirects to it permanently, so bookmarks, menu links and search results keep working. A site that already has its own page at /needs/ is left exactly as it is.
- The profile tab holding a member's own reviews is now called "Reviews I Wrote" instead of "My Reviews". On a listing page the two sat side by side and read as the same thing at a glance - especially in German, where they rendered as "Bewertungen" and "Meine Bewertungen" - so members looking for a listing's reviews opened their own history and concluded the listing had none. Site owners can change the wording with the wb_listora_pro_bp_reviews_nav_label filter.
- The Buy Credits link on a plan the member cannot afford saves their listing as a draft before leaving, so nothing typed into the submission form is lost while they go and buy credits.
- That link is a full-size tap target on phones, rather than a line of text under half the usual size.
- The monetization notice names the route members can actually buy through, rather than only confirming that one exists.
Fix
- The credit-packs API no longer advertises a Buy link for a pack that has no real checkout destination. A pack whose URL points back at the Buy Credits page reached apps and other API clients as a working link, while the website already hid it - so the same pack offered a dead button in one place and an honest "Checkout unavailable" in the other. Each pack now also states checkout_available.
- Activating Pro no longer publishes pages onto your site uninvited. Comparison, Buy Credits and Reverse Listings each want a page, so activating with any of them already enabled added that page to your menus and sitemap without asking. Pro now tells you which pages are missing and creates them only if you press the button.
- A need waiting for moderation no longer shows as Open. It read the marketplace status and ignored whether the need was actually published, so an owner was told their need was live and taking responses while nobody could see it. It now reads Awaiting review, on the dashboard and on the need page.
- A need with no usable posted date shows Date unknown instead of November 30, -0001.
- The My Needs badge counts down as you accept or reject, instead of holding the old number until the page is reloaded.
- Activating Pro could fail outright with a fatal error naming a class, introduced earlier in this release cycle. Activation now completes.
- The Compare link no longer disappears when you rebuild the Compare page with your own layout, and no longer goes stale for up to an hour after you re-map it.
- Buy Credits and Compare Listings no longer create a duplicate page when you edit the one they made. Both are created through the same single path as every other Listora page now.
- A page whose Needs page has been deleted serves the listings again rather than a dead link. The archive returns automatically whenever no page holds the address, and stands down again when one is created.
- A need owner can see and act on the responses they receive again. The badge reported "1 response (1 pending)" while the list underneath said nobody had responded, so there was no way to accept or reject anyone - a dead end for the whole needs marketplace.
- Posting a need no longer reports a failure that did not happen. The need was created, then a JavaScript error replaced the success message with "Cannot read properties of undefined", so members retried and posted twice.
- My Needs and My Responses appear on the member dashboard as soon as Reverse Listings is turned on. Both tabs waited until the member had a need or a response before showing themselves, so a vendor with zero responses - exactly who the tab is for - could not see it, and turning the feature on appeared to do nothing.
- Plugin and author links point at wbcomdesigns.com. They referenced a domain that no longer resolves.
- Members who buy credits through a mapped WooCommerce, MemberPress or Paid Memberships Pro product can see their Credits tab and balance again.
- A directory selling credits only through a mapped product reports as ready instead of claiming no credit packs exist.
- The Credit Transactions screen shows credit counts, so a 50-credit purchase reads as 50 rather than 5000.
- The Credits Issued and Credits Used totals report credits instead of raw ledger values.
- The Item ID column shows a dash on top-up rows instead of a meaningless zero; the purchase reference remains in the Note column.
- The refund dialog lays out as a centred panel with its fields stacked and aligned.
- Total Revenue follows the site currency instead of always showing a dollar sign.
- Credit Rate and Receipt Business Details on the Credits settings tab line up with every other field on the tab, instead of sitting flush left with no spacing above or below.
- The Supported Payment Plugins list on Settings no longer breaks a provider's name mid-word or produces rows of uneven height; each provider is now a single full-width row.
Dev
- Added the wb_listora_pro_feature_page_map filter for mapping a feature toggle to the pages it needs.
- Added the wb_listora_needs_has_archive filter to restore the previous two-address behaviour on a site that needs it.
- BuddyPress profile links are built through one version-aware resolver instead of calling functions BuddyPress has flagged for removal, and the profile menu is skipped rather than rendering relative links when BuddyPress cannot place the member yet.
- Removed three admin methods that nothing could reach: the leftover Credit Mappings and Tools page renderers, whose menu entries have redirected to Settings since 1.2.0, and a duplicate verified-badge emitter the Verification feature already owns.
- RTL admin and frontend stylesheets across Pro are generated from their LTR originals instead of hand-maintained, closing gaps of up to a thousand lines where RTL admins were seeing different CSS than everyone else.
- Credit surfaces resolve through Free's `wb_listora_credit_purchase_paths()` rather than a second answer maintained here, so the two plugins can no longer disagree about whether a site can sell credits.
Compat
- Requires WB Listora 1.7.0. Install both updates together.
New 3 Improve 6 Fix 14 Dev 2 Compat 1
New
- Members are emailed once when their credit balance falls to the configured threshold, which the setting has always promised and nothing delivered.
- A pricing plan can be restricted to specific listing types, so a plan only appears for the types it applies to.
- The Moderators screen paginates, offers bulk actions, and searches all users, so moderators can be managed beyond the first fifty.
Improve
- Outgoing webhooks offer only events that can actually be delivered, read from the trigger registry rather than a hand-maintained list.
- Every webhook payload carries a schema version and a per-subscriber delivery id, and uses the same entity shapes the REST API returns.
- Badge pill icons are rendered on the server, so they appear on the front end instead of staying blank.
- Monetization setup appears on the Listora dashboard checklist, in the order it has to be done, and is hidden when monetization is off.
- Comparing listings of different types now shows one table with every listing side by side, instead of a separate table per type.
- The unlicensed-site notice describes only what an owner can act on today: updates are paused, website features are unaffected.
Fix
- Saving a badge returns to the badge list instead of leaving the form open.
- The Pro welcome banner no longer appears on a directory that is already live, and dismissing it is permanent.
- Activating the licence on the Plugins screen is reflected in the Pro setup wizard, and the reverse.
- The Saved Searches and Analytics dashboard tabs title the page after themselves.
- Active Mappings shows the provider and product names, and falls back to their identifiers rather than blank cells.
- Buy Credits, the member dashboard, Transactions and Credit Mappings all report the same monetization status.
- The "Open Features" button shown when monetization is off now opens the Features settings, instead of a page that refuses access.
- The compare shortcode renders the same table as the block, so both entry points behave identically.
- Comparison column headers align with the values beneath them.
- The /needs/ archive now shows the needs marketplace with search and filters, instead of a plain post list.
- Quick Edit no longer clears a plan's listing-type restriction.
- The claim audit trail records the listing a claim targets, and records approvals made from wp-admin.
- Bulk moderator actions report how many rows were actually changed.
- Posting a need with a listing type that does not exist is rejected, and existing needs that carried one are cleared on upgrade.
Dev
- New filters `wb_listora_pro_email_credits_low_view_data` and `wb_listora_pro_email_credits_low_subject`, plus an overridable `emails/credits-low.php` template.
- Claim and credit action listeners accept fewer arguments without fatal errors, so a third-party integration firing a public action cannot take the site down.
Compat
- Requires WB Listora 1.6.0. Install both updates together.
New 4 Improve 12 Fix 18 Security 4 Dev 3 Compat 1
New
- A Payments screen shows what the gateway actually charged for each transaction, so an owner can reconcile a refund against the payment that produced it.
- Member suspensions are recorded in the audit log alongside every other moderator action.
- The License screen now shows which product the key is for, who it is licensed to, and how many of its sites are in use, so those questions no longer need a support ticket.
- Members can activate a listing that is paused for credits once their balance covers the plan, without waiting for another top-up.
Improve
- Pro is translated for the first time, with 200 shipped strings exposed and ten locales complete.
- Multi-criteria review averages respect member blocking, so the score matches the reviews the reader can see.
- Post a Need and Needs Grid no longer appear when the reverse listings feature is off; previously the form rendered and submitting it failed.
- Needs calls to action now resolve to the pages a member can actually reach rather than pointing at wp-admin.
- The Transactions screen and the Credits settings tab are hidden while monetization is off, so credit rates and payment gateways can no longer be configured for a subsystem that is not running.
- The Coupons screen is paginated and its counter shows the real total; previously only the 50 newest coupons were reachable and the count always read 50.
- The webhook delivery screen is paginated, and every declared list limit is now enforced instead of being accepted and ignored.
- Moderator queue sizes are accurate above 500 items and load in a single query instead of one per moderator.
- Need responses, audit log, webhook delivery, and the Transactions summary are faster on large sites.
- Reassigning a listing clears only the affected posts from the object cache rather than flushing all of it.
- An unlicensed site is now told that app access is switched off too, rather than discovering it later.
- Repeated licence activation attempts are throttled, so the form cannot be used to guess keys.
Fix
- Deactivating a licence now clears every stored record of it; one was left behind, which could leave the site still counted as licensed.
- Activating a licence on the Plugins screen and in Settings now report the same status; activating in one place could leave the other showing Not activated.
- A listing paused while carrying only its assigned plan is now resumed by a top-up; previously no top-up could ever release it.
- The listing detail page no longer shows the Verified badge twice when both plugins draw it.
- Review webhooks now send the rating the reviewer left; every review webhook previously reported a rating of 0.
- The setup wizard's third step creates a pricing plan, as its label always claimed.
- Google Places imports keep both halves of a day that has a lunch break, instead of storing only the evening shift.
- Both CSV exports are correct: one returned every row regardless of the range requested, the other stopped silently part-way.
- Credit figures in the Needs quote notice read in credits rather than the ledger's internal units.
- Pro's own admin notices no longer hide themselves.
- A lead is counted however the message arrived, rather than only when it came through one particular route.
- Sites behind a CDN or load balancer now apply rate limits per visitor instead of treating all visitors as one, which could return "too many requests" to everyone.
- The required WB Listora version is now enforced accurately, so an out-of-date free plugin is reported instead of leaving premium features silently inactive.
- Quotes with nothing in them are no longer charged for.
- A webhook that fails to deliver is retried rather than dropped once the sweep reached its bound.
- Programmatic SEO pages detect whether the theme already printed the page heading instead of assuming it did, so the heading is no longer duplicated.
- Approving a listing that was held for moderation now posts the BuddyPress activity that publishing it directly would have.
- Translations are no longer shadowed by a stale compiled catalogue, which could serve older wording while every completeness check reported the language as fully translated.
Security
- Pricing plans can now only be created, edited, or deleted by users who can manage Listora settings. Previously any user able to publish posts could add a zero-cost plan and apply it to their own listing.
- Editing, closing, or deleting a posted need now requires being signed in as its author.
- Signed receipt links now expire.
- A need response is blocked when either party has blocked the other.
Dev
- New wb_listora_pro_plan_capabilities filter restores the previous pricing-plan permissions for sites that intentionally delegated them.
- Every outbound network call now carries a timeout, so a slow third-party service cannot hold a request open.
- Database indexes added to need responses, audit log, and webhook log. The upgrade runs automatically on activation.
Compat
- Aligned with WB Listora 1.5.0. Install both updates together.
Fix 4 Compat 1
Fix
- Permanently deleted listings now clean up their need responses and coupon usage records through the free plugin's new delete cascade; payment and audit records are kept for accounting and audit history.
- The visual importer no longer stops with an error on uploaded files containing malformed rows, list-valued taxonomy properties, or incomplete geometry.
- The audit log screen no longer errors on change entries recorded as plain text.
- Saved searches, badges, photo reviews, and credit packs tolerate corrupted or legacy-shaped stored data instead of erroring.
Compat
- Aligned with WB Listora 1.4.1. Install both updates together.
Improve 1 Fix 5 Dev 1 Compat 1
Improve
- The lead form advertises its own REST route so the client no longer hardcodes it.
Fix
- Custom badges appear on directory cards and in Quick View, not only on the listing detail page.
- A featured listing no longer shows the Featured label twice; a badge is suppressed when the surrounding card or modal already draws that chip itself.
- A card badge no longer covers the favourite button; the badge column drops below it when one is shown.
- Removed a Credits plans route that was registered but never reachable, and the unused code behind it.
- The plan-selection step no longer relies on a stylesheet override to stay visible in the single-page submission layout, so a theme cannot hide it.
Dev
- New filters: wb_listora_pro_card_native_badge_slugs, for a theme that draws its own Featured or Verified chip, and wb_listora_pro_quick_view_badges for the Quick View badge list.
Compat
- Ships in lockstep with WB Listora 1.4.0. Install both updates together.
New 1 Fix 22 Dev 1 Compat 1
New
- Credit Rate setting under Listora - Settings - Credits, so owners can run a non 1-to-1 credit economy from the admin instead of the database.
Fix
- Payment webhook no longer marks a payment completed before the credits actually land; a failed credit releases the row to pending and the gateway retry heals it, so a charged member is never left with a zero balance.
- Refunds use the credit rate the purchase was bought at (snapshotted on the payment), so changing the rate later only affects new purchases and never mis-credits a past refund.
- Refund by payment id now applies the credit rate correctly for non 1-to-1 rates and non-two-decimal currencies.
- Public REST rate limiter is now atomic on shared hosting without an object cache (Redis or Memcached), using a MySQL counter, so per-IP caps hold under concurrency.
- Deleting the plugin only removes data when Delete data on uninstall is enabled, matching Free; it no longer wipes plans, coupons, badges, needs, or webhooks unless the owner opted in.
- Uninstall now drops every Pro table, including the search-terms and rate-limit tables that were previously left behind.
- Publishing a saved draft on a monetized site now runs the plan and credit path, so a plan-gated listing can no longer go live without a credit hold.
- Coupon list REST endpoint is paginated instead of returning every coupon.
- Need creation is gated on a capability, need responses are rate limited, and need-response errors return their real HTTP status.
- Badge edit form no longer stranded on the left of the admin card with an empty gutter.
- Pro feature-flag cache is invalidated in the same request when a toggle changes.
- Visual import upload response returns a filename instead of the server absolute path.
- A failed plan activation or need response no longer reverses an earlier, already-committed charge, so vendors can no longer end up with a free plan or lead.
- The payment webhook no longer activates a paused listing twice, so the plan cost is charged only once per top-up.
- Credit receipts show the correct credit amount instead of raw storage units.
- Concurrent duplicate refunds of the same purchase are now rejected atomically, so credits are never refunded twice.
- Single-use and limited coupons can no longer be redeemed more than allowed under concurrent submissions.
- A payment webhook that omits a transaction id no longer re-credits on a delayed gateway retry.
- Programmatic SEO pages and BuddyPress profile listings show the real star rating and review count, and SEO pages sort higher-rated listings first.
- Uninstall removes the reverse-listing (needs) capabilities from every role.
- The Compare page link refreshes immediately when the page is repointed in Settings instead of serving a stale URL for up to an hour.
- Direct Stripe partial refunds no longer over-revoke credits, and direct-gateway top-ups and refunds use the correct credit amount (applies when direct gateway checkout is enabled).
Dev
- Feature defaults, the Free-Pro purchase-path check, and credit-surface gating each derive from one source to prevent drift.
Compat
- Ships in lockstep with WB Listora 1.3.0. Install both updates together.
Fix 1 Compat 1
Fix
- Restores credit-based features and license updates on fresh installs, which the free plugin's 1.2.1 package broke by shipping incomplete bundled SDKs.
Compat
- Requires WB Listora 1.2.2. Install both updates together.
Improve 2 Fix 4
Improve
- The comparison block now ships compiled JavaScript with a build gate, so it loads reliably without a local build step.
- The admin stylesheet no longer loads on the frontend; comparison styles moved into the block for a lighter frontend.
Fix
- Quick View overlay no longer renders on non-Listora pages.
- Analytics now tracks logged-in clicks and shares, and the comparison View Listing button works correctly.
- Comparison browse and remove actions, plus the activation redirect, are fixed.
- Pro defers to the Free setup wizard so both plugins no longer launch a second wizard.
New 11 Improve 3 Fix 6 Security 1 Dev 2 Compat 1
New
- Monetization is now opt-in: new installs start with credits and paid plans OFF so visitors can submit listings free; enable the Monetization toggle on the Features screen when you are ready to charge. Existing sites keep their current behavior.
- Printable receipts and invoices for credit purchases: browser-print friendly, linked from credit history and the purchase confirmation, with your business details from Settings - Credits.
- Token-signed public receipt links embedded in refund emails, so buyers can open their receipt without logging in.
- Admin Refund credits flow on the payments screen: idempotent, over-refund guarded, with a buyer notification email and refund-cause pause copy.
- Search analytics: keyword recorder on every search, a search_terms aggregate table, and a Search tab on the Analytics screen with onward actions.
- Competitor migration runs in the background on the shared import pipeline, with retry on failure, progress messages, and a View Listings link.
- Pricing plans support a trial or free-tier duration, and plan or credit-pack admin screens surface the store currency.
- Coupon usage is visible on three surfaces: an admin redemption column, the customer receipt, and credit history.
- Webhook delivery log REST surface with per-delivery retry.
- Privacy-tools exporter and eraser cover audit-log rows and lead-form submissions.
- Buy Credits onboarding prompts surface gateway and credit-pack configuration gaps instead of dead-ending.
Improve
- BP profile My Listings and My Reviews tabs are fully styled (card grid, pagination, empty states) and respect the directory per-page setting.
- Shared bot detection with the free plugin and a retention-health readout on the Analytics screen.
- Translations regenerated at 1.2.0 with French sync and JS translation files.
Fix
- Comparison table labels wrap inside their column instead of painting over the adjacent value cell.
- Refund modal opens reliably; refund clicks no longer collide with delete-confirm delegation.
- HivePress migration routes through the standard migrator registry.
- Needs Grid block clamps a 0 columns value, which previously collapsed the layout to zero columns (same hardening as the free plugin's listing blocks).
- Credit Packs block clamps a fractional columns value that slipped past its guard, and Needs Grid floors its per-page value at 1.
- Switching notification mode from digest back to instant now cancels the recurring digest task, so Action Scheduler no longer logs a daily failure for an orphaned job with no handler.
Security
- The public token receipt endpoint is rate limited per IP, closing a volumetric token-guessing gap.
Dev
- 14 internal hooks renamed to the wb_listora_pro_ namespace with deprecated bridges kept until 2.0.
- Relocated QA artifacts from tests/qa to docs/qa and corrected three QA journey checks (cron hook inventory, webhook audit-log query, deprecated-hook grep).
Compat
- Requires WB Listora (free) 1.2.0. Install both updates together.
New 3 Improve 2 Fix 16 Security 2 Dev 2 Compat 1
New
- Programmatic SEO landing pages now render inside the active theme.
- Public read REST endpoints are rate-limited.
- Pro feature toggles register into Free's Features screen; the separate Pro tab is removed.
Improve
- BuddyPress Listings and Reviews profile tabs, the Outgoing Webhooks admin list, and the dashboard Needs feed are paginated, removing several N+1 queries.
- Saved-search alert cron and reverse-listings counts use bounded count-only queries, and the notification queue, map styles, and credit packs options no longer autoload.
Fix
- Payment webhooks are idempotent: credits are recorded before being granted, replayed events are ignored, and a webhook without a transaction id can no longer double-credit.
- Refunds deduct the real refunded amount, and a refund arriving after plan activation rolls the plan back.
- Saving a coupon no longer triggers a "headers already sent" warning or a blank page; the action is handled before output.
- Private visibility no longer returns 403 for every non-admin viewer.
- Notification digests no longer drop review notifications, and owner digest emails send to the stored recipient address.
- Listing-paused and listing-resumed emails use real palette keys instead of emitting undefined-key warnings.
- SEO pages defer head meta and schema to the active SEO plugin, the sitemap provider registers through wp_register_sitemap_provider, and unrated listings stay in the grid.
- Infinite scroll rel-prev/next links honour active search filters, and the result counter no longer undercounts.
- Comparison and Quick View are enabled by default, and Quick View gallery arrows meet the 44px tap target.
- The Load More button disables while fetching, and lead-form submission results are announced to screen readers.
- The Visibility settings tab only appears when Coming Soon is enabled, and the Coming Soon splash supports dark mode.
- The Reverse Listings admin budget column respects each need's currency.
- The analytics tracker declares its wp-api-request dependency, and BuddyPress loop templates no longer reference undefined view data.
- Photo-review and criteria-average styles moved to the frontend stylesheet, and customer-facing buttons drop the theme button class.
- The White Label feature description now matches its actual scope (plugin name and admin menu relabel).
- Analytics and Photo Reviews REST endpoints return structured listora_unauthorized (401) / listora_forbidden (403) codes on denial, and ownership failures now correctly return 403.
Security
- Audit log IP capture is hardened against spoofing.
- Saved-search update and delete enforce an ownership guard as defence in depth.
Dev
- Pro consumes Free's bundled EDD SL SDK and reads verified badges through the wb_listora_is_verified() resolver.
- Need Matcher proximity routes through Free's geo_query service, and the codebase passes PHPStan level 7.
Compat
- Requires WB Listora (free) 1.1.0. Install both updates together.
New 1 Improve 2 Fix 4 Security 1 Dev 1 Compat 1
New
- Executable QA journeys and Pro smoke supplements protect every release.
Improve
- All 7 scheduled jobs run on Action Scheduler; consistent design primitives across the 5 Pro blocks.
- Webhook receiver enforces strict HMAC signatures with replay rejection by default.
Fix
- Coupon-create page rendered blank when Pricing Plans was disabled.
- Paid pricing plans bypass moderation correctly.
- Outgoing webhooks fire on listing approve and reject again.
- Visibility gate applies site-wide for non-admins instead of listings only.
Security
- Lead form and analytics endpoints verify per-listing nonces with daily caps.
Dev
- Credits SDK consumed from the free plugin; Pro options renamed to the wb_listora_pro_ prefix with one-shot migration.
Compat
- Requires WB Listora (free) 1.0.4. Install both updates together.
New 6 Compat 1
New
- Google Maps and Places integration with address autocomplete and custom map styles.
- Credit-based payment economy with pricing plans, coupons, and payment webhooks.
- Payment integrations: WooCommerce, WooCommerce Subscriptions, MemberPress, PMPro, and WooMemberships.
- Advanced and saved search with email alerts and infinite scroll.
- Multi-criteria and photo reviews, lead forms, and verification badges.
- Analytics, audit log, outgoing webhooks, and white-label mode.
Compat
- Requires WB Listora (free) 1.0.0. Install both updates together.