{"id":343323,"date":"2026-07-21T14:36:48","date_gmt":"2026-07-21T14:36:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dordam-request-a-quote-negotiation\/"},"modified":"2026-07-23T06:49:39","modified_gmt":"2026-07-23T06:49:39","slug":"dordam","status":"publish","type":"plugin","link":"https:\/\/fr-ca.wordpress.org\/plugins\/dordam\/","author":23535795,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.6","stable_tag":"1.3.6","tested":"7.0.2","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Dordam: Request a Quote + Negotiation","header_author":"NexVibe","header_description":"Lets customers request a custom quote on selected products, and lets store admins send back a negotiated price via a unique, secure checkout link. Built for B2B \/ wholesale \/ custom-order WooCommerce stores.","assets_banners_color":"534acc","last_updated":"2026-07-23 06:49:39","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/nexvibepro.com","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":84,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.2.1":{"tag":"1.2.1","author":"nexvibe","date":"2026-07-21 14:36:35"},"1.3.6":{"tag":"1.3.6","author":"nexvibe","date":"2026-07-23 06:49:39"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3619504,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3619504,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.1","1.3.6"],"block_files":[],"assets_screenshots":{"Screenshot-1.png":{"filename":"Screenshot-1.png","revision":3617317,"resolution":"1","location":"assets","locale":"","width":1071,"height":771},"Screenshot-2.png":{"filename":"Screenshot-2.png","revision":3617317,"resolution":"2","location":"assets","locale":"","width":1064,"height":750},"Screenshot-3.png":{"filename":"Screenshot-3.png","revision":3617317,"resolution":"3","location":"assets","locale":"","width":1069,"height":729},"Screenshot-4.png":{"filename":"Screenshot-4.png","revision":3617317,"resolution":"4","location":"assets","locale":"","width":1920,"height":936},"Screenshot-5.png":{"filename":"Screenshot-5.png","revision":3617317,"resolution":"5","location":"assets","locale":"","width":1920,"height":940},"Screenshot-6.png":{"filename":"Screenshot-6.png","revision":3617317,"resolution":"6","location":"assets","locale":"","width":1906,"height":942}},"screenshots":[]},"plugin_section":[],"plugin_tags":[10553,46833,5055,13770,286],"plugin_category":[45],"plugin_contributors":[272659],"plugin_business_model":[],"class_list":["post-343323","plugin","type-plugin","status-publish","hentry","plugin_tags-b2b","plugin_tags-negotiation","plugin_tags-quote","plugin_tags-request-a-quote","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-nexvibe","plugin_committers-nexvibe"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/dordam\/assets\/icon-128x128.png?rev=3619504","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/dordam\/assets\/Screenshot-1.png?rev=3617317","caption":""},{"src":"https:\/\/ps.w.org\/dordam\/assets\/Screenshot-2.png?rev=3617317","caption":""},{"src":"https:\/\/ps.w.org\/dordam\/assets\/Screenshot-3.png?rev=3617317","caption":""},{"src":"https:\/\/ps.w.org\/dordam\/assets\/Screenshot-4.png?rev=3617317","caption":""},{"src":"https:\/\/ps.w.org\/dordam\/assets\/Screenshot-5.png?rev=3617317","caption":""},{"src":"https:\/\/ps.w.org\/dordam\/assets\/Screenshot-6.png?rev=3617317","caption":""}],"raw_content":"<!--section=description-->\n<p>Built for B2B, wholesale, and custom-order WooCommerce stores where\nprices aren't fixed. Instead of \"Add to Cart\", quote-enabled products\nshow a \"Request a Quote\" form. The admin reviews the request, sets a\nper-unit price, and the plugin emails the customer a unique link that\nadds the product to their cart at exactly that price and takes them\nstraight to checkout.<\/p>\n\n<h3>How it works<\/h3>\n\n<ol>\n<li>Go to any Product &gt; Edit &gt; General tab and check \"Enable Request a Quote\".\nOptionally set a minimum quantity.<\/li>\n<li>Customers visiting that product see a quote request form instead of\nAdd to Cart.<\/li>\n<li>You get an email + a new entry under the \"Quote Requests\" admin menu.<\/li>\n<li>Open the request, set your price per unit, and click \"Send Offer to\nCustomer\". They get an email with a unique accept link.<\/li>\n<li>When they click it, the product is added to their cart at the\nnegotiated price (locked server-side, cannot be altered by the\ncustomer) and they're taken straight to checkout.<\/li>\n<li>Once their order is completed, the quote is marked \"Accepted\" and\nthe link can't be reused.<\/li>\n<\/ol>\n\n<h3>How multi-round negotiation works (v1.1.0)<\/h3>\n\n<ol>\n<li>Admin sends an offer. The customer receives a link to a negotiation\npage (not straight to checkout).<\/li>\n<li>On that page the customer can either \"Accept &amp; Continue to Checkout\"\nor submit a counter-offer (a proposed price + optional note).<\/li>\n<li>If they counter, the admin is emailed and can review it under\nQuote Requests in wp-admin, then send a new offer \u2014 which re-opens\nthe same page for the customer.<\/li>\n<li>This can repeat up to a configurable round limit (default: 5,\nchange with the <code>dordam_max_negotiation_rounds<\/code> filter) to prevent\nendless back-and-forth.<\/li>\n<li>Whenever the customer clicks Accept, the price is locked server-side\nand they're sent straight to checkout, same as before.<\/li>\n<\/ol>\n\n<h3>Roadmap \/ Not yet included<\/h3>\n\n<ul>\n<li>A logged-in customer dashboard showing their own quote history.<\/li>\n<li>Role-based \/ bulk pricing rule automation.<\/li>\n<li>Quote expiry (auto-expire offers after N days of inactivity).<\/li>\n<li>Admin-side \"reject quote\" action (currently admins simply stop\nresponding, or send a very high offer, to end a negotiation).<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Zip the <code>dordam<\/code> folder (already zipped as\ndordam.zip if you downloaded it that way).<\/li>\n<li>In wp-admin: Plugins &gt; Add New &gt; Upload Plugin &gt; choose the zip &gt; Install &gt; Activate.\n(Or drop the folder into wp-content\/plugins\/ via FTP\/SFTP and activate from Plugins.)<\/li>\n<li>Make sure WooCommerce is installed and active.<\/li>\n<li>Edit a product, check \"Enable Request a Quote\" under Product Data &gt; General.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Fix: the quote button now displays as a full-width block button (like most themes' Add to Cart) with consistent spacing above\/below, instead of an inline button that could visually collide with Add to Cart on themes with different button widths.<\/li>\n<\/ul>\n\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Fix: the quote button was narrower than the real Add to Cart button, since it sits outside WooCommerce's own flex-laid-out cart form (which is what stretches Add to Cart to full width). The button is now explicitly full-width with matching padding, so it visually matches Add to Cart on any theme.<\/li>\n<\/ul>\n\n<h4>1.3.6<\/h4>\n\n<ul>\n<li>Fix: Plugin Check nonce-verification warning on the Settings page's \"saved\" notice \u2014 documented as a read-only display flag (the actual save is already nonce-verified in handle_save()).<\/li>\n<\/ul>\n\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Fix: the quote button now copies the real Add to Cart button's CSS classes and stretches to full width via JavaScript, so it visually matches the theme's actual button styling (size, color, font) instead of looking like a separate, oddly-sized element next to it.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Fix: the quote button\/form was rendering wherever PHP hook priority happened to place it, which didn't match the actual Add to Cart position on themes that don't follow WooCommerce's standard priority layout. Positioning (before\/after\/replace) is now done in JavaScript by moving the button next to the real, rendered <code>form.cart<\/code> element in the DOM \u2014 this matches the visible Add to Cart position exactly, regardless of theme\/page-builder quirks.<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Fix: \"replace\" mode still wasn't reliably hiding WooCommerce's Add to Cart form on some themes\/setups, since remove_action() timing can vary. Added a CSS-based fallback that hides the Add to Cart form for that specific product (scoped via WordPress's own postid-{ID} body class), which works regardless of hook order or how the theme renders the page.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Fix: \"replace\" button position never actually removed WooCommerce's Add to Cart button. Both were hooked at the same priority (30), and WooCommerce's own callback (registered first) always ran before ours could call remove_action() on it \u2014 too late to have any effect. The removal now happens in its own earlier-priority (5) callback, before WooCommerce's Add to Cart template ever fires.<\/li>\n<li>Fix: the \"Request a Quote\" toggle button now uses WooCommerce's own <code>single_add_to_cart_button<\/code> class, so it inherits your theme's normal Add to Cart button styling instead of looking like a plain bordered box. The boxed\/bordered styling now only applies to the expanded form, not the button itself.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fix: the Settings page is now a tab inside \"Quote Requests\" (?page=dordam-quotes&amp;tab=settings) instead of a separate WordPress submenu page. The separate submenu link was sometimes generated without the required \"admin.php?page=\" prefix by WordPress core's own menu-rendering logic, leading to a broken link \/ 404. Using a tab on the existing page avoids that class of issue entirely.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: quote-enabled products now show a \"Request a Quote\" toggle button instead of the full form by default; clicking it reveals the form. Button text and position (replace\/before\/after Add to Cart) are configurable under Quote Requests &gt; Settings.<\/li>\n<li>New: customers now get a confirmation email when they submit a quote request (previously only the admin was notified).<\/li>\n<li>New: honeypot field on the quote request form to quietly filter out basic bot spam.<\/li>\n<li>New: optional data cleanup on uninstall (Quote Requests &gt; Settings &gt; \"Delete all quote request data when this plugin is deleted\"), off by default.<\/li>\n<li>Changed: default negotiation round limit lowered from 5 to 2 (still filterable via <code>dordam_max_negotiation_rounds<\/code>).<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: prefixed a template-local variable ($display_price -&gt; $dordam_display_price) flagged by the PrefixAllGlobals sniff in templates\/quote-response-page.php.<\/li>\n<li>Updated Author to \"NexVibe\" and Contributors to \"nexvibe\". Text Domain and plugin slug remain \"dordam\" (unchanged).<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fix: renamed all functions, classes, constants, hooks, post type, and meta keys from the \"rqn\" prefix (too short) to \"dordam\" (matches plugin slug), per WordPress.org Plugin Review Team feedback.<\/li>\n<li>Fix: replaced echoed inline <code>&lt;style&gt;<\/code> block in the admin quote screen with a properly enqueued stylesheet (assets\/css\/dordam-admin.css), loaded only on our own admin page via admin_enqueue_scripts.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Renamed plugin to \"Dordam: Request a Quote + Negotiation\".<\/li>\n<li>Text Domain changed from \"request-a-quote-negotiation\" to \"dordam\" to match the new plugin slug.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fix: short description rewritten again with simpler, more common wording (still flagged as \"non-standard English\" after the first rewrite).<\/li>\n<li>Fix: remaining nonce-verification warnings \u2014 phpcs:ignore only silences the single following line, so a few $_GET\/$_POST reads sitting on their own line right after an ignore comment were still being flagged; each now has its own comment.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: removed placeholder \"example.com\" Plugin\/Author URI (flagged by Plugin Check as a discouraged domain).<\/li>\n<li>Fix: Text Domain now matches the plugin slug (was \"rqn\", now \"request-a-quote-negotiation\").<\/li>\n<li>Fix: replaced strip_tags() with wp_strip_all_tags() per WordPress coding standards.<\/li>\n<li>Fix: properly escaped remaining dynamic output in the admin quote screen.<\/li>\n<li>Fix: readme short description rewritten in plain standard English; Tested up to updated to 7.0.<\/li>\n<li>Docs: documented why the accept\/negotiation links use a per-quote secret token instead of a WordPress nonce (they're emailed to anonymous customers and must stay valid for days).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: multi-round customer counter-offers with a dedicated\nnegotiation response page (accept or counter-offer).<\/li>\n<li>New: configurable round limit (<code>dordam_max_negotiation_rounds<\/code> filter).<\/li>\n<li>New: \"Countered\" status with color-coded status badges in wp-admin.<\/li>\n<li>Admin can now respond to a \"countered\" quote with a new offer,\npre-filled with the customer's proposed price.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial MVP release.<\/li>\n<\/ul>","raw_excerpt":"Add a request-a-quote and price negotiation feature to your WooCommerce store.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/343323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=343323"}],"author":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nexvibe"}],"wp:attachment":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=343323"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=343323"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=343323"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=343323"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=343323"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=343323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}