{"id":354061,"date":"2026-08-29T06:08:48","date_gmt":"2026-08-29T06:08:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-quotes-for-woocommerce\/"},"modified":"2026-08-29T06:08:33","modified_gmt":"2026-08-29T06:08:33","slug":"yuupee-smart-quote-drafting-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/yuupee-smart-quote-drafting-for-woocommerce\/","author":23549640,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.5","stable_tag":"0.4.5","tested":"7.1","requires":"7.0","requires_php":"8.1","requires_plugins":null,"header_name":"Yuupee Smart Quote Drafting for WooCommerce","header_author":"Abid","header_description":"Draft a branded, calculated quote from a plain-language request against your real product catalog \u2014 AI drafts the line items, the plugin computes every number.","assets_banners_color":"e9ecf0","last_updated":"2026-08-29 06:08:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Abdoudiba\/yuupee-smart-quote-drafting-for-woocommerce","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.5":{"tag":"0.4.5","author":"abdoudiba","date":"2026-08-29 06:08:33","revision":3671146}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3671161,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3671161,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3671161,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3671161,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.5"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,10553,5055,13770,286],"plugin_category":[45],"plugin_contributors":[278145],"plugin_business_model":[],"class_list":["post-354061","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-b2b","plugin_tags-quote","plugin_tags-request-a-quote","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-abdoudiba","plugin_committers-abdoudiba"],"banners":{"banner":"https:\/\/ps.w.org\/yuupee-smart-quote-drafting-for-woocommerce\/assets\/banner-772x250.png?rev=3671161","banner_2x":"https:\/\/ps.w.org\/yuupee-smart-quote-drafting-for-woocommerce\/assets\/banner-1544x500.png?rev=3671161","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/yuupee-smart-quote-drafting-for-woocommerce\/assets\/icon-128x128.png?rev=3671161","icon_2x":"https:\/\/ps.w.org\/yuupee-smart-quote-drafting-for-woocommerce\/assets\/icon-256x256.png?rev=3671161","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Every existing \"Request a Quote\" plugin is a manual form: the customer fills\nfields, a rep drafts the quote back by hand. AI Quotes turns a plain-language\nrequest into a structured line-item list automatically \u2014 then hands it to\nyou to review before anything is final.<\/p>\n\n<p>The AI only ever drafts loosely worded line items (what, and how many). This\nplugin resolves each one against your real product catalog and computes\nevery subtotal, tax amount, and total in PHP. The model never sees or sets a\nprice.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Plain-language request -&gt; AI-drafted line items, matched against your real catalog.<\/li>\n<li>Fully editable line-item table before anything is finalized \u2014 add, remove, or search for a different product.<\/li>\n<li>Calculation done in PHP from real WooCommerce tax data, never by the AI.<\/li>\n<li>Branded PDF output \u2014 your company name, address, logo, and payment details, configured once in settings.<\/li>\n<li>Finalized quotes lock in their numbers, so they don't change if a product's price changes later.<\/li>\n<li>Drafts using whichever AI provider you've already connected under Settings \u2192 Connectors (WordPress's built-in AI Client) \u2014 no separate API key to manage in this plugin.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin turns a rep's plain-language request into a draft list of line\nitems (description + quantity only \u2014 no prices, no product IDs, no customer\ndata) by calling WordPress's built-in AI Client, which forwards the request\ntext to whichever AI provider the site owner has connected under Settings \u2192\nConnectors. Nothing is sent unless a store rep actively triggers a draft.<\/p>\n\n<p>This plugin does not choose or hardcode a provider, and ships no API keys \u2014\ncredentials are entered and managed by WordPress core, not this plugin. The\nbuilt-in connectors available in WordPress 7.0 are:<\/p>\n\n<ul>\n<li><strong>OpenAI<\/strong> \u2014\n<a href=\"https:\/\/openai.com\/policies\/row-terms-of-use\/\">Terms of use<\/a> \u2014\n<a href=\"https:\/\/openai.com\/policies\/privacy-policy\/\">Privacy policy<\/a><\/li>\n<li><strong>Anthropic<\/strong> \u2014\n<a href=\"https:\/\/www.anthropic.com\/legal\/commercial-terms\">Commercial Terms of Service<\/a> \u2014\n<a href=\"https:\/\/www.anthropic.com\/legal\/privacy\">Privacy policy<\/a><\/li>\n<li><strong>Google<\/strong> \u2014\n<a href=\"https:\/\/policies.google.com\/terms\">Terms of service<\/a> \u2014\n<a href=\"https:\/\/policies.google.com\/privacy\">Privacy policy<\/a><\/li>\n<\/ul>\n\n<p>Only whichever provider the site owner has connected is ever called.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Requires WooCommerce active, and WordPress 7.0+ with an AI provider connected under Settings \u2192 Connectors (Anthropic, Google, or OpenAI ship built into WordPress 7.0).<\/li>\n<li>If installing from a release zip, the PDF library is already bundled. If running from source, run <code>composer install --no-dev<\/code> in the plugin directory first.<\/li>\n<li>Upload to <code>\/wp-content\/plugins\/<\/code> or install via Plugins \u2192 Add New \u2192 Upload. Activate.<\/li>\n<li>Set your company details under WooCommerce \u2192 Settings \u2192 AI Quotes.<\/li>\n<li>Use the AI Quotes menu to draft your first quote.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20my%20existing%20%22request%20a%20quote%22%20plugin%3F\"><h3>Does this replace my existing \"Request a Quote\" plugin?<\/h3><\/dt>\n<dd><p>No \u2014 it's a different piece of the same workflow. This plugin drafts and\ncalculates a quote document; it doesn't (yet) handle the customer-facing\nrequest form or checkout integration some B2B plugins provide.<\/p><\/dd>\n<dt id=\"does%20this%20send%20the%20quote%20to%20the%20customer%20automatically%3F\"><h3>Does this send the quote to the customer automatically?<\/h3><\/dt>\n<dd><p>Not in this version \u2014 it generates a PDF for you to download and send\nyourself. Automatic emailing is on the roadmap.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20ai%20matches%20the%20wrong%20product%3F\"><h3>What happens if the AI matches the wrong product?<\/h3><\/dt>\n<dd><p>Every drafted line is fully editable before you finalize \u2014 fix the\ndescription, price, or swap in the correct product from the search dropdown.<\/p><\/dd>\n<dt id=\"which%20ai%20provider%20does%20this%20use%3F\"><h3>Which AI provider does this use?<\/h3><\/dt>\n<dd><p>Whichever one you've connected under Settings \u2192 Connectors \u2014 this plugin\nhas no AI integration of its own. It calls WordPress's built-in AI Client\n(<code>wp_ai_client_prompt()<\/code>, core since WordPress 7.0), which routes the\nrequest to your connected provider. If no provider is connected, AI\ndrafting is disabled and you can still build a quote manually.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.5<\/h4>\n\n<ul>\n<li>Change: raised minimum PHP to 8.1 so <code>sabberworm\/php-css-parser<\/code> can go\nback to its latest release (<code>9.4.0<\/code>, was pinned to <code>9.0.0<\/code> in 0.4.4) while\nits <code>thecodingmachine\/safe<\/code> dependency resolves to <code>v3.4.0<\/code> instead of the\nold <code>v1.3.3<\/code> \u2014 <code>v3.4.0<\/code> uses explicit nullable-parameter types, so the\nPHP 8.4+ deprecation notices from 0.4.3\/earlier don't come back. Verified:\nzero deprecation notices with full error reporting on.<\/li>\n<li>Fix: the PDF template's stylesheet is now printed by WordPress core itself\n(<code>wp_print_styles()<\/code>), not hand-written markup. Every previous shape here \u2014\na literal <code>&lt;style&gt;<\/code> block, <code>file_get_contents()<\/code> echoed into one, a <code>&lt;link&gt;<\/code>\npointing at a local file path \u2014 kept getting flagged as \"not enqueued\" by\neither the automated check or a human reviewer, even backed by real\n  wp_register_style()\/<code>wp_enqueue_style()<\/code> calls. This removes all\nhand-written stylesheet markup from the plugin; dompdf fetches the\nresulting URL the same way it already fetches an optional logo image\n(<code>Options::isRemoteEnabled<\/code>). Verified dompdf correctly fetches and applies\na stylesheet served over HTTP.<\/li>\n<\/ul>\n\n<h4>0.4.4<\/h4>\n\n<ul>\n<li>Fix: removed a transitive dependency (<code>thecodingmachine\/safe<\/code> v1.3.3, pulled\nin by <code>sabberworm\/php-css-parser<\/code>) that emitted PHP 8.4+ \"implicitly\nnullable parameter\" deprecation notices on every request, even though this\nplugin never calls any of its functions \u2014 Composer loads all of a\npackage's <code>files<\/code>-autoloaded code unconditionally. Pinned\n  sabberworm\/php-css-parser to <code>9.0.0<\/code> (the last release before that\ndependency was added) instead of patching around the warnings. No\nfunctional change \u2014 verified the CSS-parsing dompdf relies on for quote\nPDFs still renders identical output, and that loading the plugin no longer\nemits any deprecation notices with full error reporting on.<\/li>\n<\/ul>\n\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>Fix: the PDF template's stylesheet is now genuinely registered and\nenqueued with <code>wp_register_style()<\/code>\/<code>wp_enqueue_style()<\/code> in\n  YSQD_PDF::build_html(), not just read from a file. The template outputs\na <code>&lt;link rel=\"stylesheet\"&gt;<\/code> for it, which dompdf resolves straight off\nlocal disk via <code>Options::setChroot()<\/code> (no HTTP round-trip, no dependency\non the site's own URL being publicly reachable). Rendered PDF output is\nunchanged \u2014 verified against a real generated quote PDF.<\/li>\n<\/ul>\n\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Fix: \"Tested up to\" bumped to 7.1 (was stale at 7.0, flagged by Plugin Check).<\/li>\n<li>No functional changes \u2014 re-confirmed via a fresh Plugin Check run that the\n0.4.1 PDF-template stylesheet fix (see below) still triggers zero\nenqueue-related findings.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Fix: the PDF template's stylesheet is no longer written as literal\ntemplate HTML \u2014 it's read from its own file (<code>assets\/css\/quote-pdf.css<\/code>)\nand echoed in PHP, which WordPress.org's Plugin Check tool now confirms\ntriggers zero enqueue-related findings (the plain <code>&lt;style&gt;<\/code> block, and a\n   alternative, both did). Behavior and rendered\noutput are unchanged \u2014 verified against a real generated PDF.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Change: AI drafting now goes through WordPress's built-in AI Client\n(<code>wp_ai_client_prompt()<\/code>) instead of calling OpenAI\/Anthropic directly.\nThe site owner connects a provider under Settings \u2192 Connectors; this\nplugin no longer stores or asks for an API key. <code>Requires at least<\/code>\nraised to WordPress 7.0 accordingly.<\/li>\n<li>Fix: quote.php's PDF template markup is a standalone HTML string handed\nto Dompdf, never a WordPress-served page \u2014 clarified in code comments\nafter a review flagged its inline <code>&lt;style&gt;<\/code> block as a missing\nwp_enqueue_style() call.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Rename: plugin renamed to \"Yuupee Smart Quote Drafting for WooCommerce\" (from\n\"AI Quotes for WooCommerce\") and internal prefix changed <code>waq_<\/code> -&gt; <code>ysqd_<\/code>\nfor distinctiveness and a 4+ character unique prefix.<\/li>\n<li>Add: documented third-party AI services (OpenAI, Anthropic) in this readme.<\/li>\n<li>Add: <code>Requires Plugins: woocommerce<\/code> header.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Add: REST endpoint (<code>POST \/wp-json\/ysqd\/v1\/quotes<\/code>) exposing the AI-draft\npipeline to external automation \u2014 always creates a draft, never a\nfinalized quote. Authenticated via WordPress core Application Passwords.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Improve: catalog matching for AI-drafted line items now retries with\nprogressively fewer trailing words when the full description doesn't\nmatch. WordPress's default search requires every word to match somewhere\nin the post, so a single trailing word in a different language than the\ncatalog (e.g. \"Keyboard\" against a French \"Clavier\" listing) could fail\nan otherwise-correct match on brand + model.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Fix: the Finalize button's redirect to the PDF download used an\nHTML-escaped nonce URL (from wp_nonce_url()) as a raw redirect target,\ncorrupting quote_id\/_wpnonce and showing \"The link you followed has\nexpired.\" Finalizing now redirects correctly.<\/li>\n<li>Fix: a free-text line item's tax used the settings fallback rate even on\na store with WooCommerce taxes disabled entirely, while product-linked\nlines correctly stayed untaxed \u2014 an inconsistency between the two. The\nfallback rate now only applies when the store has tax enabled at all.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fix: every form submission (New Quote, Save Draft, Finalize, Download,\nDelete) failed with a blank HTTP 400 \u2014 handlers were registered on the\nwrong WordPress hook (<code>admin_action_*<\/code> instead of <code>admin_post_*<\/code>, the\nhook admin-post.php actually dispatches on), so nothing ever ran.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release (Phase 1): AI-drafted line items, catalog matching,\neditable quote editor, PHP-computed totals, branded PDF export.<\/li>\n<\/ul>","raw_excerpt":"Draft a branded, calculated quote from a plain-language request \u2014 checked against your real catalog, computed by the plugin, never by the AI.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/354061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=354061"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abdoudiba"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=354061"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=354061"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=354061"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=354061"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=354061"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=354061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}