Support for displaying individual domain logos in Related Domains cards across the Standard Page and all available layouts.
Domain Attributes on the Standard Page, under Settings → Single Page → Standard Page. Choose which facts appear under the domain description and in what order — Character Length and Extension — or turn them off with Show domain attributes.
Display style for Domain Attributes. Summary line keeps the familiar one-line look ("15 characters, .com"). Info boxes, a row of labelled highlight boxes, and the Age, Offer Count and Custom attributes are available in Pro.
Fixed
Issue where the default domain description was displayed instead of the domain's own description. The domain's custom description is now shown when available, with the default description used as a fallback.
A fixed-price domain whose Purchase method is Proposal Form headed that form "Purchase Now", over a button reading "Send proposal" — it promised a checkout the form does not have. It now reads "Make an Offer", as it already did on domains that also accept offers below the asking price.
A settings toggle whose description ran long pushed the row wider than the card it sat in, and the text was clipped at the edge. Descriptions now sit under the label and wrap.
3.8.0
5 new5 improvements2 fixes
New
Form Builder, under Settings → Sales Forms → Form Builder → Form fields. Build the Fixed price and Make an offer forms visually: drag fields to reorder them or pair them side by side, hide the ones you do not need, choose which a buyer must fill in, and reword every label, placeholder, help line and button. Name, Phone and Proposal can each be hidden or made optional; Email and the amount always stay, because confirmation mail and the minimum-offer check depend on them. Your existing labels, field order and button wording carry over as they are, and nothing on the site changes until you save.
Fixed-price domains have a form layout of their own, separate from Make an offer. Its Offer field appears only on domains that also accept offers below the asking price, and its button takes over from the old "Send proposal button label" setting.
The browser's own validation messages ("Please enter a valid email address.") now use your wording. Set it once under Messages & Errors → Required Field Error and Invalid Field Error, or give any field its own error message in the builder; the same text is shown whether the browser or the server catches the mistake.
Insert tag, on every email setting under Notifications and on the messages that take tags. A small button opens a searchable list of the tags that field accepts, each named in plain words, or type `{` in the field to pick one as you write. The old "Available tags" lines are gone.
`{all_fields}` lists every answer the buyer gave, one "Label: value" per line, and `{field:key}` inserts a single one. When a field is hidden, a line such as "Phone: {phone}" is removed from your emails automatically instead of arriving empty.
Improved
The phone field accepts international numbers — a leading +, spaces, brackets and dashes — and no longer shows number spinner arrows. It was a number input, which rejected "+44 20 7946 0958" outright.
The Make an offer button reads "Send offer" by default rather than "Send proposal" — the buyer is naming a price, and with the Proposal field hidden there is no proposal to send. The Fixed price form keeps "Send proposal". A site that has set its own button wording keeps it.
The name field accepts accented letters and apostrophes. "José" and "O'Neil" were rejected by a pattern that allowed only unaccented letters and digits.
Required fields are now checked on the server as well as in the browser, and an offer only records the fields its form actually asks for. Previously any extra value posted to the form was stored and mailed along with the offer.
The Field labels group, the Make an offer Button Label and the Fixed price "Send proposal button label" settings are replaced by the builder, which carries their saved wording.
Fixed
Help text under a field was white on the light form card in the shortcode layouts, and so unreadable.
Uneven spacing between fields — a field paired beside another left a gap under its row that a field on its own did not.
3.7.0
1 new1 improvement2 fixes
New
Domain Mapping, under Settings → Domain Mapping. Point any domain you own directly at a Domain listing or Template — visitors who type that domain in see the listing with no redirect, the domain staying in their address bar the whole time, and no separate WordPress install to run for it. The domain's own DNS still has to point at this server, and your hosting account still has to be told the domain shares this site's files; the field itself documents both. Add, edit and remove mappings from one screen, with a search picker to find what to map and an on-demand check for whether a mapped hostname is currently reachable. Canonical URLs and Yoast/Rank Math's own canonical output are set to the mapped domain automatically, so search engines are told the mapped address is the real one rather than treating it as duplicate content.
Improved
An offer no longer records the buyer's approximate location. It came from a third-party IP lookup (ipwhois.app) called on every page view, which had begun returning 403 on its free tier and logged an error in the browser console. Offers still record the buyer's IP address, device, browser, platform, screen, language, page and referrer, and offers taken before this update keep the location they were saved with.
Fixed
The offer/proposal form's Name, Email, Phone and Proposal fields could render with no visible background or border under some themes, Blocksy among them — the fields blended invisibly into the card behind them. Their styling depended on CSS custom properties that a theme's own form reset could stop from resolving, and a custom property failing to resolve drops the whole declaration it appears in rather than falling back to anything. The fields now carry fallback values of their own and are protected against a theme's global form styling overriding them.
The offer form could not be submitted from a mapped domain — it failed with an empty "Error" dialog. The form posted to admin-ajax.php on the site's own configured domain, which from a mapped domain is a different origin, so the browser blocked the response before the page ever saw it. It now posts to the host the visitor is actually on, which the same WordPress install already answers, and mapped hostnames are additionally registered as allowed origins so a host that refuses to serve /wp-admin/ on anything but the primary domain still works.
3.6.1
6 improvements4 fixes
Improved
The editor's sidebar is one card. Everything it used to spread over three or four panels — the preview controls, status, where the record is placed and the shortcode that places it, and a domain's landing page, logo and categories — reads top to bottom in Publishing, above the Move to Trash / Reset / Update row. Each panel had been a card header restating the label of the single control beneath it.
That card stays pinned as the form scrolls past it, so Preview and Update are reachable from anywhere in a long form. On a window too short to hold it, the rows inside it scroll while the actions stay on its bottom edge, rather than the card being cut off at the fold.
The preview toggle is no longer a button floating over the bottom-right corner of the screen, where it covered whatever sat beneath it and stood two cards away from "Open preview in new tab". Both preview controls sit together at the top of the Publishing card.
The placeholder reference — {domain}, {price} and the rest — moves from a sidebar panel into a "Dynamic placeholders" button that opens the full list on click. It is a lookup read once while writing the copy, and as a panel it was the longest thing in the sidebar, pushing everything actually edited further down the page.
The Pro features card no longer shows in the Template and Listing editors, whose Publishing card is pinned — a second card under a pinned one leaves the upsell on screen while the record being edited scrolls away. It stays in the Domain editor, whose sidebar scrolls with the form and is not pinned for that reason.
The "Upgrade to Pro!" menu item opens in a new tab. It is the one item in that menu that leaves the site, and following it in place cost the admin whatever screen they were on, an unsaved editor included.
Fixed
Pages could not be edited with Elementor while the plugin was active — the editor stopped on "Sorry, the content area was not found in your page." A template set to replace the theme took over every front-end request, including the one Elementor loads to find the content area it attaches to, so the editor never saw a page to edit. The takeover now stands down inside a page builder's editor and its editing preview — Elementor, Beaver Builder, Divi, WPBakery, Oxygen, Bricks, Brizy, Thrive Architect, Breakdance, Zion Builder and SiteOrigin — while the public front end renders exactly as before.
A listing had nowhere to copy its shortcode from. It was suppressed on the grounds that the Publishing card carried it instead, which only ever held true for templates. Every record that has a shortcode now shows it in one place.
The Offers filter bar left the right half of a wide card empty — three fixed-width selects huddled on one line with the date range and search dropped to the next. The filters now share the row evenly and reflow to fewer per line, then to one, as the screen narrows.
The editor's loading skeleton drew a screen the editor stopped having several releases ago — a 220px nav rail down the left and a single card. It now draws the sidebar the editor actually paints.
3.6.0
6 new7 improvements11 fixes3 security
New
Landing page, per domain — the standard single page, or the design of the template that selects it. It sits under the domain name, in its own sidebar card.
Default landing page, under Settings → Single Page, deciding for domains that have not chosen one. Existing domains keep the page they already render.
A Domain Listing block for the block editor. Pick a listing in the sidebar and it renders in place — cards, search, sort and pagination — and the preview behaves exactly as the published page does, so a listing can be arranged without leaving the editor.
Settings → Single Page → Assign Template decides which design draws your domains, as a rule rather than a setting written onto each one. Point every domain at one design and changing that rule changes every page it covers; changing it back restores them. Replaces the site-wide default landing page and the "apply to all domains" sweep. Rules that segment a catalogue — by category, or by domains named one by one — and lists of rules read top-down are available in the Pro version.
{length} and {extension} placeholders, so a description can say "a 7-character .com" and stay true as the catalogue changes. Bare-number forms — {lengthChars} — are there for copy that supplies its own wording, and a domain with no name yet resolves them to nothing rather than to a guess. {age}, which reads the registration date from the domain registry, is available in the Pro version.
Bulk editing on the Domains screen — select any number of domains, pick a field, set one value, apply. Available in the Pro version.
Improved
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.
Uninstall honours "Clean-up Data on Deletion" as before, but now clears everything the plugin created — including posts left behind by earlier releases, per-user screen preferences, scheduled events, and every site on a multisite network. It no longer loads the plugin to do it, so an error elsewhere cannot leave the cleanup half-finished. Options belonging to the Pro plugin are deliberately left alone.
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.
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.
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.
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.
Design pickers are searchable, which on a portfolio of hundreds of near-identical names is the difference between typing and hunting.
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.
The template editor's preview pane showed the domain's page instead of the template being edited, for the same reason — the preview URL is the one the domain owns. The pane now pins the template it is previewing.
Layout 01 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.
Templates rendered in the Elementor editor fell back to the browser's serif instead of the font they were set to. The widget renders after the page has printed its font stylesheet, so the fonts were never requested; the editor preview now loads them, and every font setting carries a sans-serif fallback for when a web font cannot load.
Importing a CSV that matched a draft domain or listing inserted a second copy beside it on every run, because the "does this already exist?" lookup only searched publicly readable posts.
Opening a domain and saving it silently re-pointed its page. The editor pre-filled the Landing page field 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. The field now keeps whatever is stored, blank included, and says in words what draws the page and where that came from.
A segmented control lit its first segment before anything was chosen, so a control that appeared to be set to "Automatic" saved no such thing. Nothing is lit until a choice is made, and an unanswered control now draws as buttons rather than as flat words.
A dialog taller than the window could not be scrolled — its head and foot stayed off-screen with no way to reach them.
A dropdown opened inside a dialog ignored the mouse wheel; its list could only be moved by dragging the scrollbar.
A select with nothing chosen rendered as an empty box, saying neither what it was for nor that it was unset.
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.
Security
Exported CSVs neutralize values a spreadsheet would run as a formula. Offer proposals and domain names are typed on a public form, so an export opened in Excel, LibreOffice or Sheets was a path from a stranger's keyboard into the seller's machine. Applies to the offers export and to every domain/listing export.
The "resend verification" and "send congratulations" admin actions now require a request token as well as the capability, so a page an administrator merely visits can no longer make their browser send those emails.
Added the missing direct-access guard to fourteen PHP files, so requesting one by URL exits instead of executing.
3.5.2
1 improvement4 security1 change
Improved
Replaced direct filesystem calls in CSV import/export with the WordPress Filesystem API, and standardized on wp_json_encode throughout.
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.
The "resend verification" and "send congratulations" admin actions now require the dashboard capability instead of being reachable while logged out.
Hardened unserialize calls storing offer data against PHP object-injection.
Added missing sanitization/unslashing on request data across the admin and frontend, and moved raw SQL table-name interpolation onto prepared statements where supported.
Changes
Credit: Thanks to Labda for responsibly disclosing the broken access control issue in the Offers and Dashboard REST endpoints.
3.5.1
1 fix
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.
3.5.0
5 new3 improvements1 fix
New
Completely redesigned admin area, rebuilt as a modern React single-page application.
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.
Reworked Post List and Post Editor screens with bulk actions, one-click shortcode copy, and an integrated rich text editor.
shadcn/ui component system across the admin (calendar, popover, hover card, dialogs, dropdowns, toast notifications, and more) for a consistent, accessible UI.
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.
Replaced Toastify with shadcn/ui Toast for consistent in-app notifications.
Added internationalization (i18n) support throughout the React admin.
Fixed
Hash-based route navigation for Offers, Transactions, Settings, and Help pages.
3.4.5
2 improvements
Improved
`Tested up to` set to WordPress 6.9.
`Requires PHP` bumped to 8.0.
3.4.4
1 improvement1 fix
Improved
Admin preview now displays correctly on responsive devices.
Fixed
Minor CSS issues in the admin panel.
3.4.3
1 fix1 change
Fixed
An issue where domain titles were being automatically normalized to lowercase
Changes
Tested: WordPress 7.0
3.4.2
1 fix1 change
Fixed
The Dashboard link now navigates via hash routing, consistent with all other React sub-pages.
Changes
Cleanup: Removed unused file to reduce plugin size.
3.4.1
2 fixes
Fixed
Critical bug in 3.3.0 migration that blanked domain_name when old key was absent — loop now skips keys that don't exist.
Recovery script restores domain_name from post_title for any template where domain_name was wiped by the 3.3.0 migration.
3.4.0
4 new1 improvement1 fix
New
React-based Dashboard page for the free version with live stat cards (Total Domains, Total Offers, Total Impressions, Domain Listings).
REST endpoint GET /domain-for-sale/v1/dashboard returning live plugin stats.
Pro upgrade preview section on the Dashboard with blurred analytics screenshot and upgrade CTA.
Domain view/impression tracking — creates wp_dfs_domain_views table and records views for shortcode, replace_theme, and singular dfs_template modes automatically.
Improved
Admin submenu order — Dashboard, All Domains, Add New Domain, Domain Listing, Offers, Settings, Tools, Recommended, Lite vs Pro, Get Help.
Fixed
Help page slug conflict — renamed internal slug from domain-for-sale to dfs-help so Dashboard and Get Help pages no longer collide.
3.3.2
1 improvement1 change
Improved
Refactored domain meta keys for improved consistency.
Changes
Cleanup: Removed unnecessary files to reduce plugin size.
Changelog published by the developer, in their original language.