0.2.0
Vendwick 0.2.0 sells more than one product per checkout, adds pay what you want, free orders, bundles, order bumps and physical goods, and lets you refund orders and follow disputes from the admin. The admin moves into "Store" and "Store settings" folders that can be pinned under Content, with dashboard widgets, a setup wizard and redesigned pages.
Read full notes 47 changes
- Selling Cart: up to 20 lines, each with a quantity of 1 to 100, paid in one checkout as one order.
?add=product:plan[:qty]links, an "Add to cart" button, a cart drawer and avendwick-cartblock. Stripe and PayPal receive the individual lines and Razorpay lists them in the payment link; the charged total always equals the quote. - Selling Subscriptions in a cart: one subscription line per cart. Stripe takes one-time lines beside it; PayPal, Razorpay and Polar take a subscription only on its own, and the checkout offers to split the cart.
- Selling Pay what you want: plans with a minimum, a suggested and an optional maximum price. An amount outside the range is refused, never adjusted. Coupons skip these lines.
- Selling Free orders: per-IP and per-email limits, one free claim per email and plan (aliases of one mailbox, such as
+tagsand Gmail dots, share it), one unit of each item, Turnstile when configured, and an email confirmation before delivery. A limited coupon's use is taken when the buyer confirms, not held while the email waits. - Selling Bundles: a bundle plan lists up to 20 products and plans. It is priced, taxed and invoiced as one line, and each licensed item gets its own license under its own product, so downloads, updates and page access work as if bought alone. One subscription renews the whole bundle, and "Automatic renewals" sells it as a provider subscription. Several copies of a bundle renew one copy at a time.
- Selling Order bumps: optional extras offered on the checkout page at their own price, shown for the products you choose.
- Selling Physical goods (Physical Goods and Shipping module): a physical product type with SKU and weight, shipping zones with flat, order-value and weight rates and a free-shipping threshold, shipping addresses, stock with 60-minute holds while the buyer pays (at most 5 holding checkouts per visitor per hour), backorders, the exact count shown only when "Show how many are left" is on, shipments with carrier and tracking, "shipped" and "delivered" emails, and a packing slip.
- Back office Refunds from the admin: refund an amount, whole items or the shipping charge, optionally disable the refunded items' licenses, and restock physical units (on by default for units that have not shipped, whichever way you refund). No item, and not the shipping, can be refunded beyond what was paid for it, even when two refunds are sent at once. Each refund gets its own credit note, which credits the tax charged on the refunded lines, a report entry and an email. Admin refunds and refunds made in the provider's dashboard are recorded once, whichever arrives first. A refund the provider fails later is taken back, its restocked units are taken out of stock again, the order waits to ship again, and you are alerted. A refund whose job gets stuck shows in Needs attention and can be retried from the Refunds queue. Refunding one line of an order does not shrink the upgrade credit of the order's other licenses.
- Back office Disputes: Stripe, PayPal and Razorpay disputes suspend the order's licenses while open, restore them when won, and record a refund when lost. You are emailed when one opens.
- Back office Outgoing webhooks (Outgoing Webhooks module): signed JSON events for orders, refunds, disputes, licenses, subscriptions and shipments to up to 20 endpoints, with retries, a delivery log, redelivery and a test event. The audit log keeps endpoint URLs without credentials or query values.
- Back office PDF invoices: order invoices, credit notes and client invoices download as PDF (
&format=pdf), with A4 or US Letter paper and an optional Cloudflare Browser Rendering engine for scripts the built-in engine cannot draw. Emails link to the PDF. - Back office Store importer (Store Importer module): bring products, plans, customers, orders, license keys, activations, subscriptions and coupons over from FluentCart or Easy Digital Downloads with
clients/wordpress/vendwick-export.php, a dry run first, and resumable runs. Olditem_idvalues and slugs keep answering the license API. Running the import again never overwrites a license changed in this store since; it reports a conflict. - Back office 75 MCP tools (34 new): refunds and disputes, order bumps, shipping and stock, webhooks, import runs, invoice PDF links and store search.
- Admin The sidebar has two folders, "Store" (overview, orders, products, customers, subscriptions, licenses, invoices, reports) and "Store settings" (setup pages). Releases and Deliveries are tabs of Products and Orders.
- Admin "Pin the store" creates a "Product pages" content type, which moves the Store folder under Content. Product pages are long-form content linked to a product and shown on its store page.
- Admin Four EmDash dashboard widgets: Sales, Recent orders, Needs attention and Store setup.
- Admin A page whose module is off says which module and links to Modules, instead of an error with a retry button.
- Admin A Store panel in the content editor (limit an entry to buyers, see the linked product), an Access column in content lists and a product picker field.
- Admin Every page is rebuilt on one design: tables with sorting and paging, drawers, filters, charts, empty and loading states, and a responsive layout down to tablet width. Subscriptions and Integrations are real pages.
- Admin A setup wizard (store basics, payments, tax, first product, test purchase, go live) replaces the static checklist.
- Admin A header on every Vendwick page with the store name, the test or live badge, section links and a search for order numbers, emails and license keys.
- Admin Editors and other non-admin roles see an "Admins only" page instead of failed requests. Reports and the Sales widget stay readable for editors.
- Storefront A redesigned checkout: two columns with a sticky summary, live totals, country-aware address fields, inline errors with a summary, and a busy state on submit.
- Storefront A cart drawer built on the native
<dialog>element, with quantity steppers, price fields for pay-what-you-want lines and undo on remove. - Storefront Product pages with a gallery, a plan picker, "Buy now" and "Add to cart", bundle contents, stock, and schema.org
Productdata (<Product layout="page">). - Storefront The customer portal shows shipping status and tracking, credit notes and PDF links.
- Storefront Appearance tokens and presets cover the new parts: badges, order bump cards, the cart drawer, selected options and quantity steppers. The Appearance page sets the cart badge, the add-on card style and the side the cart drawer opens from, with a live preview.
- Storefront Emails list a bundle's contents under the bundle, as the invoice does.
- Fixed Two PayPal partial refunds of the same amount were counted as one. Each refund is now its own ledger entry.
- Fixed Reversing a refunded item found its licenses by product within the order, so disabling the licenses of one of two plans of the same product disabled both. Licenses are now matched by the order item that issued them.
- Fixed The live total on the checkout page never updated as the buyer typed: the script that fetches the quote never started.
- Fixed Turning off automatic renewal or canceling a provider subscription used the store's current payment mode, so a subscription started in test mode was sent to the live keys after the store went live. These calls, and refunds, now use the mode the payment was made in. A webhook signed with the other mode's secret is verified with that secret and applied only to checkouts of that mode.
- Fixed A stored secret that could not be decrypted with the current
EMDASH_ENCRYPTION_KEYfailed with a generic server error. Requests now fail withSECRETS_UNREADABLEand the admin shows a banner naming the setting; storefront answers do not name it. - Fixed An inclusive-tax receipt showed "Tax" where the invoice said the tax was included. It now says "Tax included".
- Fixed Searching Customers stopped after the first page of matches. Search now pages through every match.
- Fixed A slow or unreachable webhook endpoint could take most of every cron run. Each scheduled job now gets a fair share of the run, and outgoing deliveries run after the other jobs.
- Fixed The WordPress updater and the EmDash license client said "licence" in their notices. They now say "license". Status labels and the client-invoice cancellation email say "Canceled" (stored values are unchanged, and an email you already edited keeps your text).
- Changed Free orders wait for the buyer to confirm their email before delivery. Turn this off under Store settings, General, Free orders (
free_checkout_verify_email) for 0.1.0's instant delivery. Signed-in buyers, admin-issued licenses and Core Forms bridge orders are still delivered at once. - Changed A full refund now also gives the coupon use back and ends the provider subscription, besides disabling the order's licenses.
- Changed
checkout/quoteand the checkout routes return version 2 quotes, with per-line amounts (lines[].unitAmount,discount,tax,total),itemsSubtotalandshipping. Quotes frozen on checkouts started under 0.1.0 still settle. - Changed The
checkout/quotequantity limit is 100 (it was 1,000); a larger quantity is refused withVALIDATION_ERROR. - Changed A module that is off answers
MODULE_DISABLEDwith the module's name ("Coupons is turned off. Turn it on in Modules.") instead of its internal id. - Changed Sidebar pages are regrouped and renamed: "Commerce" is "Store overview", "Store settings" is "General", the order invoice settings page is "Invoice settings", "License" is "Vendwick license", and Releases and Deliveries left the sidebar.
- Changed Requires EmDash 1.5 (
emdashpeer range^1.5.0). Upgrade EmDash before installing this release. - Changed The MCP tool set changed, so admins must approve Vendwick's tools again after upgrading.
ping-webhook-endpointis marked like the other tools that send requests. - Changed The plugin asks for the new
network:request:unrestrictedcapability (outgoing webhooks) and theapi.cloudflare.comhost (PDF engine). Admins confirm them when upgrading. - Changed New provider webhook events to enable: Stripe
charge.refund.updated,refund.updated,refund.failed,charge.dispute.created,charge.dispute.closed; PayPalPAYMENT.CAPTURE.REVERSED,CUSTOMER.DISPUTE.CREATED,CUSTOMER.DISPUTE.RESOLVED; Razorpayrefund.failed,payment.dispute.created,payment.dispute.won,payment.dispute.lost,payment.dispute.closed; Polarrefund.created,refund.updated.