Fixed A domain whose landing page was designed by a template rendered without that design — no sale title, no offer tag, no contact block. A template and the domain it draws share a slug, the domain wins that URL, and a domain’s own record carries none of the copy the template holds. The domain’s page now renders the template built for it. Sites left with blank-looking landing pages after the domain/template split are the ones this fixes.
Fixed A domain set to Template design still rendered the standard page when its template had been built while the site default was the standard page. The page a domain asks for is now drawn as asked, rather than the question being answered twice with different answers.
Fixed A domain with no template attached, but set to Template design, rendered an empty hero instead of the standard page.
Fixed The template editor’s preview pane showed the domain’s page instead of the template being edited, the preview URL being the one the domain owns. The pane now pins the template it is previewing.
Fixed Layouts 01 and 02 opened on Make an Offer rather than Purchase Now on any site that had never opened Settings → Payments, contradicting “Make as Toggle Form”, which is on by default.
Fixed Templates in the Elementor editor fell back to the browser’s serif instead of their chosen font, because the widget renders after the page has printed its font stylesheet.
Fixed The admin no longer stays light when the system switches to dark with the theme set to System.
New Landing page, per domain — the standard single page, or the design of the template that selects it — with a Template picker for domains carrying more than one design. Both sit under the domain name, in their own sidebar card.
New Default landing page, under Settings → Single Page, deciding for domains that have not chosen one, and “Apply to all domains” for stating the choice on an entire catalogue at once.
New Landing Page is a CSV column, so the choice survives an export and import.
New A domain is its own record, separate from the template that designs it. Several templates can sell one domain, its price and status are edited in one place, and its logo travels with it. Adds a Domains screen, a “Select Domain” field, and a drawer for creating one without leaving the template editor.
New Domain auctions. Bids are stored records, a new bid outbids the last, the minimum next bid is enforced, and the auction resolves to one winner at its deadline. Sellers get a per-domain auction panel and a Bids tab covering the whole site.
New Public pages without designing one first — every domain’s own URL, a /domains/ catalogue and a page per category, all using the listing’s cards, filter bar and pagination. Opt out per domain for a bespoke design.
New Embeddable purchase. Paste the button or checkout widget your payment provider gives you and it replaces the proposal form on a fixed-price domain, rendered exactly as the provider intended.
New Rebuilt listing block — filter bar (search, sale type, price, category), four card presets with previews, and a Buyer controls tab deciding what visitors may narrow themselves.
New A Domain Listing block for the block editor. Pick a listing in the sidebar and it renders in place — filter bar, cards and pagination — and the preview searches, filters, sorts and pages exactly as the published page does, so a listing can be arranged without leaving the editor.
New Sales Forms → Form Builder gathers every buyer-facing word in one screen: shared field labels, separate copy per sale method, a footnote per form, Reply-to details for bidder emails, and bidder anonymization by position.
New Dynamic placeholders in template copy — {domain}, {price}, {description} and the rest resolve against the domain a template points at, editor preview included. Extensible via `domain_for_sale_pro_content_placeholders`.
New Settings → Single Page for the global page’s slug, width, header and footer; site-wide brand colours; and colour schemes a template can follow. Domain Categories move into the admin app, with counts that report domains rather than raw terms.
New Escrow.com credentials are verified when saved rather than failing weeks later at Buy now. Escrow Settings now follow the Enable Escrow.com Payment switch, and checkout needs both the switch and credentials that authenticate.
New Import and export travel between sites — ids that mean nothing elsewhere are written as names and resolved back — and domains, templates and listings export together as one bundle.
New Recommended domains on Layout 02/03 can come from categories instead of a typed list, so they stay current as domains sell.
Changed The listing tagline is a single-line field, being a single-line value; the asking and reduced prices share one row with the currency named once on its heading; and the tagline and description now say where they are read, since the Landing page choice governs neither.
Changed One “sale method” replaces the old Form options / Price options pair, and prices are named for what they are. Existing domains convert on upgrade: sell price becomes asking price, starting price becomes minimum bid.
Changed Uninstall honours “Clean-up Data on Deletion”. Left off nothing is touched; turned on it now clears every post type, table, option and term the plugin made, including rows earlier releases stranded.
Security Exported CSVs neutralize values a spreadsheet would run as a formula, so text typed on a public form cannot execute when the seller opens the file.
Improved One shared bidding component, one place deciding where a template reads its domain data, and duplicate names caught consistently across manual entry and every import — three sources of screen-to-screen disagreement, gone. Categories are stored only as real terms, with the stale meta copy dropped on upgrade.
Improved Admin polish throughout — dark mode reaches the Template and Listing previews, Offers and Bids match the rest of the app, save confirmations name what was saved, and Help keeps the settings rail on screen.
Removed The legacy list template and the old listing layout metabox, both superseded by the listing block’s own controls.
New Settings → Single Page → Assign Template decides which design draws which domains, as one ordered list read top-down where the first match wins. A rule covers all domains, the domains in chosen categories, or domains named one by one. Nothing is written onto a domain, so changing a rule changes every page it covers and changing it back restores them. Replaces the site-wide default landing page, the default template, the per-category template and both “apply to all domains” sweeps — four controls that answered one question in three places, with the order they outranked each other visible only in the code.
New Bulk editing on the Domains screen. Select any number of domains, pick a field, set one value, apply. Sale method, prices, auction settings, sale status, sold date, featured, tagline, categories and the landing page can all be set at once; categories can be added to or removed from what each domain already has rather than only replaced. Every field renders the control the single-domain editor uses, so the labels and validation cannot drift apart.
New {age}, {length} and {extension} placeholders, so a description can say “a 7-character .com registered 12 years ago” and stay true as the catalogue changes. Age is read from the domain registry over RDAP and cached for a day; the lookup only runs when the copy actually asks for it. Bare-number forms — {ageYears}, {lengthChars} — are there for copy that supplies its own wording, and any fact that cannot be established resolves to nothing rather than to a guess.
Changed A domain’s Landing page now offers Automatic as well as Standard and Template. Automatic is the default and hands the question to the assignment rules; the other two answer for that domain alone and outrank every rule. There was previously no way back: picking either side once excluded a domain from every rule thereafter.
Changed A template no longer has to name a domain. It is a design, and one design can draw a whole portfolio with each page still showing its own name, price and status. The Domain field stays as the preview subject and as the live source wherever a template is placed by shortcode, by replacing the theme, or on specific pages.
Changed Where a design is placed — shortcode, theme replacement, specific pages — moves into a Placement card in the template editor’s sidebar, with the shortcode itself at the foot of that card rather than three rows away under Publishing.
Fixed Opening a domain and saving it silently re-pointed its page. The editor pre-filled the Landing page fields with whatever the domain currently resolved to and wrote that back on save, turning an unstated answer into a stated one — which, once assignment rules existed, opted the domain out of them for good. Both fields now keep whatever is stored, blank included, and the picker says in words what draws the page and where that came from.
Fixed A segmented control lit its first segment before anything was chosen, so a bulk edit that appeared to set “Automatic” reported “Nothing to change”. Nothing is lit until a choice is made, and an unanswered control now draws as buttons rather than as three flat words.
Fixed A dialog taller than the window could not be scrolled — its head and foot stayed off-screen with no way to reach them.
Fixed A dropdown opened inside a dialog ignored the mouse wheel; its list could only be moved by dragging the scrollbar.
Fixed A select with nothing chosen rendered as an empty box, saying neither what it was for nor that it was unset.
Fixed Font size and line height inputs clipped their own digits behind the “px” badge on a narrow column — “40” reading as “4” — and the background position selects overlapped their neighbours.
Improved On upgrade, each domain’s current design is written down explicitly before anything changes, so every page renders exactly as it did. Domains carrying their own design are counted on the Assign Template screen, with one action to hand them back to the rules. Domains that had been stamped with “standard page” without anyone choosing it are unstamped, so the rules can reach them.
Improved The field picker in bulk edit and the template pickers throughout are searchable, which on a portfolio of hundreds of near-identical names is the difference between typing and hunting.
Security Fixed a broken access control issue where the Offers and Dashboard REST endpoints could be read or deleted without authentication because the permission check returned the required capability name instead of verifying it.
Security The “resend verification” and “send congratulations” admin actions now require the dashboard capability instead of being reachable while logged out.
Security Hardened unserialize() calls storing offer data against PHP object-injection.
Security Added missing sanitization/unslashing on request data across the admin and frontend, and moved raw SQL table-name interpolation onto prepared statements where supported.
Improved Replaced direct filesystem calls in CSV import/export with the WordPress Filesystem API, and standardized on wp_json_encode() throughout.
Credit Thanks to Labda for responsibly disclosing the broken access control issue in the Offers and Dashboard REST endpoints.
Fixed “Security Check Failed — Nonce verification failed” on sites using page caching — the form now fetches a fresh nonce right before submitting instead of relying on the (possibly cached and expired) one embedded in the page.
Fixed Blank error dialog on form submission failures — error responses were wrapped in a data envelope the frontend didn’t unwrap.
Improved Escrow API errors now report the actual cause (missing Escrow settings, connection failure, or an unexpected API response with its HTTP status) instead of a generic failure message, and connection details are written to the PHP error log.
Fixed Escrow API requests failing when the configured API URL has no trailing slash.
Fixed Escrow.com “Buy Now” transactions failing with “The title and description fields are required” — the domain description was never sent with the purchase request, and Template 2 didn’t include it at all.
Improved The Escrow transaction description now falls back to an auto-generated description when the sale content is empty, and is capped at Escrow’s 500-character limit.
Fixed The Domains, Offers, and Analytics screens showing no data when the permalink structure is set to “Plain” — a malformed REST request URL was silently failing.
New Completely redesigned admin area, rebuilt as a modern React single-page application.
New Migrated the entire admin away from the legacy Codestar options framework to a native React + REST API architecture, removing ~35,000 lines of legacy framework code for a lighter, faster plugin.
New React-based Settings, Offers, Transactions, Import/Export, Help, and License pages, all powered by a unified REST API and shared schema registry.
New Reworked Post List and Post Editor screens with bulk actions, one-click shortcode copy, and an integrated rich text editor.
New shadcn/ui component system across the admin (calendar, popover, hover card, dialogs, dropdowns, toast notifications, and more) for a consistent, accessible UI.
New Frontend single Domain Listing template for displaying listings on their own page.
Improved Admin navigation now intercepts WordPress menu clicks and routes through the React SPA, eliminating page reloads and menu flickering.
Improved Replaced Toastify with shadcn/ui Toast for consistent in-app notifications.
Improved Added internationalization (i18n) support throughout the React admin.
Fixed Hash-based route navigation for Offers, Transactions, Settings, and Help pages.
Fixed Admin preview issue.
Fixed Minor CSS issues in the admin panel.
Fixed An issue where domain titles were being automatically normalized to lowercase
Added Layout 03 — new domain landing page template with a modern, full-width design.
Added Layout 03 includes a prominent hero section with domain name display, price, and call-to-action button.
Added Layout 03 features a built-in inquiry/offer form with clean card-based layout.
Fixed The Dashboard link now navigates via hash routing, consistent with all other React sub-pages.
Cleanup Removed unused file to reduce plugin size.
Fixed Fatal memory exhaustion in `dfs_fetch_selected_page()` caused by self-merging arrays growing exponentially on each loop iteration.
Fixed `$single_page` variable used before initialization inside the loop.
Fixed `foreach()` warning — “argument must be of type array|object, string given” — caused by `dfs_fetch_selected_page()` returning a flat array of strings instead of the expected array of arrays.
Improved Refactored `dfs_fetch_selected_page()` to collect each template’s `multi_page` and `single_page` values as separate sub-arrays, matching the structure expected by the page-selection field renderer.