Release notes / WP Sell Services
Free Plugin Plugin

WP Sell Services

Dokan and WC Vendors were built for physical products. Selling services on them means constant workarounds for requirements, milestones, and disputes. WP Sell Services was designed for service workflows from day one.

9 releases
v1.6.0 latest
August 18, 2026 shipped

v1.6.0 Latest

August 18, 2026
New 15 Improve 15 Fix 38 Security 3 Dev 21

New

  • Buyers can upload proof of an offline payment and an admin can approve or reject it, which marks the order paid and credits the vendor through the same path as a card payment. Off by default.
  • A paid order has a printable receipt the buyer can save as a PDF.
  • Email preferences are role aware, so a buyer is offered the five categories that apply to them rather than a vendor's eight.
  • The plugin does not email someone about a message while they are actively using the site. Off by default, and the window is filterable with wpss_presence_window.
  • Owners choose which billing fields checkout collects. Name and email are always collected; address fields suit physical goods and can be switched off for digital services.
  • [wpss_my_orders] is paginated. A buyer with more than one page of orders can now reach the rest of them.
  • [wpss_seller_card] renders a single seller card, so classic-editor and page-builder sites can place one without the block.
  • Buyer request blocks accept budget bounds, matching what the shortcode always supported.
  • Catalog prices carry their base amount in the markup, so a display-currency add-on can show an approximate price in the shopper's own currency without changing what is charged.
  • The order modal total now carries the same information, so the estimate follows the price as extras and quantity change.
  • New action wpss_payable_total_after fires wherever a payable total is shown, on both the cart summary and the checkout, so an add-on can state the charge currency at the last screen before payment.
  • Buyers can create their account during checkout instead of meeting a sign-in wall before they can pay. Off by default.
  • Members can see every device they are signed in on and revoke any one of them, without signing out everywhere.
  • Owners can point the site's header cart link at the marketplace cart, for sites running WooCommerce beside the built-in checkout. Off by default.
  • A Vendors directory page is created at install, so the Pages setting is no longer a mapping with nothing behind it.

Improve

  • An order now records the package the buyer actually bought, so editing or reordering a service later never changes what an existing order says was purchased.
  • Packages carry a stable id that does not shift when packages are reordered, and the REST API publishes it.
  • Every payment platform reports order status through one shared map, replacing three separate maps that disagreed with each other.
  • The member dashboard and [wpss_account] are one screen rather than two that had drifted apart, so both show the same sections.
  • Conversation messages render through one shared renderer everywhere, with clickable links and working attachments.
  • The setup wizard stops prompting a site that is already configured.
  • The plugin uses a single accent colour; the second, unrelated green palette has been retired.
  • Vendor and service grids run far fewer queries. A vendor grid dropped from 49 queries to 9 and a service grid from 70 to 30, with identical output.
  • Category choosers no longer load every category on the site. The limit is 200 and filterable with wpss_category_terms_limit.
  • Shortcodes and blocks that show the same thing now share one renderer and one template, so a theme override applies to both and they cannot drift apart again.
  • Prices are marked up identically for every visitor, so a page cache can never serve one shopper's currency to another.
  • Saving a vendor profile confirms with the same toast used everywhere else, rather than a banner above the fold the member was not looking at.
  • Losing bidders on a buyer request are told in the app rather than by email, so deciding a busy request no longer sends a burst of rejections.
  • The dashboard messages list is paginated, so a member with many conversations no longer loads all of them at once.
  • SureCart is no longer advertised in Settings or on the Upgrade page, which described an integration Pro does not include.

Fix

  • Vendors could not submit a fixed-price proposal. A hidden milestone field was marked required, so the browser blocked the form and reported nothing the vendor could see.
  • Orders placed before this release could show the wrong package name and price once a service was edited. Existing orders are repaired on update using what the buyer actually paid.
  • The category archive listed buyer requests alongside services.
  • Pages with the same title could not be told apart in the Pages settings dropdowns.
  • The dashboard Disputes section white-screened for everyone, in both the list and the detail view. It now renders.
  • An offline order could not be marked as paid from the admin. The control existed only on a screen that was never reachable.
  • The admin order detail screen fataled for every order.
  • Cancelling a dispute returned an error and left the order stuck as disputed. The cancel now completes or rolls back as one unit.
  • [wpss_vendors], [wpss_top_vendors], [wpss_vendor_profile] and the vendor sections of [wpss_account] fataled instead of rendering.
  • The buyer requests block listed expired requests that the shortcode correctly hid, so sellers could pitch for closed work.
  • columns="" was ignored by the services and categories grids, which always rendered a single stacked column.
  • Category cards and the search form rendered differently depending on whether the block or the shortcode was used.
  • A dispute opened automatically for a late order stored a translated label where a reason code belongs, which left non-English sites with an untranslatable reason.
  • The disputes table was unreadable on phones, with values pushed to the right against blank labels.
  • Demo data sized vendor withdrawals against earnings still inside the clearance window, leaving negative available balances, and re-running the seeder credited every order again.
  • Docblocks across the plugin cited @since versions that were never released; every one now names the version it actually shipped in.
  • On a site running Easy Digital Downloads, a checkout could complete and mark itself paid before the marketplace had loaded, so no order was created and no vendor was credited.
  • Accepting a proposal created an order whose service resolved to whichever page happened to be rendering, so the order showed the wrong title.
  • Paying for an existing order offline never recorded the payment method, leaving an order no admin could confirm and no buyer could send proof for.
  • Proposals produced no in-app notification at all; the notification types had existed since the first release and nothing ever wrote one.
  • A dispute conversation was stored in two places, so each screen showed only half of it.
  • A completed order with an open dispute showed no sign of that dispute on the admin order screen.
  • A completed order hid the review prompt but never showed the review the buyer had already written.
  • Vendor links across the site landed on the directory instead of the vendor's own profile.
  • The Become a Vendor page offered registration to members who were already vendors.
  • The messages unread count was hidden by a stylesheet rule, so a correct number rendered as a bare dot.
  • Settings deep links used a query argument the settings screen no longer reads, and five of them pointed at the wrong section.
  • The Create Service page was published but empty; it now sends the member to the service wizard.
  • The cart page took the generic /cart/ slug and accumulated orphaned duplicates on sites that already had one.
  • The admin screens never loaded the design tokens, so the retired green palette survived in every colour fallback.
  • The single service sidebar did not stick at all when a theme clipped overflow, so the price and Order button scrolled out of reach.
  • The sticky offset assumed the WordPress admin bar was the only fixed bar on the page and ignored a theme's own sticky header.
  • Mapped pages rendered two headings, the theme's and the plugin's.
  • The earnings banner offered a withdrawal to vendors whose balance was negative, because it counted money from orders still in progress.
  • Ten JavaScript strings were never sent for translation, so every message the favourites feature shows a buyer appeared in English in all locales.
  • The skip-email-when-online setting could never fire, because the code that records when a member was last active was never hooked to anything.
  • The cart accepted a stable package id and returned an array position, so a client could not match a cart line back to the package it bought.
  • The setup wizard rendered an empty browser tab title once setup was complete.

Security

  • Mobile app tokens now expire, 30 days after last use or 90 days after they are issued, and are rejected at authentication instead of staying valid forever.
  • An app token can no longer be presented in place of the account password to mint further tokens.
  • The public vendor search no longer matches WordPress login names, which allowed usernames to be discovered one letter at a time.

Dev

  • GET /orders/{id} answers 404 for an order that does not exist, rather than 403.
  • An admin-only denial answers wpss_not_admin instead of reusing the ownership code.
  • The REST error codes are documented, with a committed contract smoke that checks them across anonymous, buyer, vendor and admin callers.
  • New actions wpss_payment_receipt_submitted, wpss_payment_receipt_verified and wpss_payment_receipt_rejected.
  • Orders record the paying platform's own order reference, so a platform that uses string ids can be linked back to its order.
  • Helper functions moved from one 6,187-line file into eleven files grouped by domain. No function was renamed or resignatured, so no call site changes.
  • wpss_admin_order_actions now fires on the order screen admins actually use.
  • New wpss_category_card_link and wpss_category_card_classes filters, and a category-card template that themes can override.
  • Translation templates regenerated for both plugins, and ambiguous translator comments corrected.
  • Hardcoded English fallbacks removed from JavaScript across both plugins, so every message shown to a user is translatable.
  • The translation check now fails when the plugin version and the translation template disagree, which is how a template for the previous version shipped before.
  • One actor shape across the API: every endpoint describes a person as id, name, avatar and deleted.
  • One date format across the API: every timestamp is ISO-8601 with an offset, replacing a mix of that and MySQL datetimes carrying no timezone.
  • One service card shape: /services and /favorites return the same keys from a single shared builder.
  • Every API change this release is additive, so the REST contract version is unchanged and existing clients keep working.
  • New GET /auth/sessions and DELETE /auth/sessions/{uuid} list and revoke a member's app sign-ins.
  • New filters wpss_app_token_lifetime and wpss_token_recovery_routes control how long a token lives and which routes stay reachable with an expired one.
  • New filter wpss_sticky_top_offset lets a theme declare the height of its own sticky header.
  • New filter wpss_messages_per_page sets the dashboard conversation page size.
  • wp wpss preflight now asks Action Scheduler, which the plugin actually uses, instead of reporting every job as unscheduled.
  • Static analysis and the full test suite run in CI; both had been failing to run at all.

v1.4.0

August 1, 2026
New 6 Improve 10 Fix 10 Dev 8 Compat 2

New

  • Milestone phases, tips and paid extensions can be paid on WooCommerce; the link opens a real WooCommerce order-pay page, so it works from an email with no cart session.
  • GET /orders/{id}/timeline returns one merged, chronological event history for an order.
  • GET /auth/devices lists a user's registered push devices, and POST /reviews works as an alias for the order review route.
  • New filter wpss_pay_order_url is the single seam for "send the buyer somewhere they can pay this order".
  • Returning from an off-site card authentication now shows the outcome instead of the checkout form again, so a buyer cannot pay twice for the same order.
  • Settings shows whether the Stripe webhook is actually receiving events, so an owner is not left guessing whether setup worked.

Improve

  • When WooCommerce, Easy Digital Downloads, FluentCart or SureCart is active, that platform now owns all payment; the plugin's own gateways and payment routes stay out of the way.
  • Switching e-commerce platform never rewrites past orders, and webhooks from the gateway that took the payment keep working.
  • Notification text is now plain, with HTML composed only where it belongs, in email.
  • Billing details are remembered on every payment method, not only Stripe, so a returning buyer confirms one line instead of retyping their address.
  • Order numbers are shorter and easier to read out to support, and no longer carry the time the order was placed.
  • Menu visibility is set one role at a time with plain "visible" toggles, rather than a grid of tick-to-hide boxes that meant the opposite of what it looked like.
  • Notifications name the order the way the rest of the site does, and a proposed milestone says which phase and how much.
  • Messages list every conversation by the person it is with, with a preview and what it is about.
  • Dashboard sections share one card style, so borders and corners match from screen to screen.
  • Every money value now carries a minor-unit integer alongside the decimal, so zero- and three-decimal currencies stay exact.

Fix

  • Refunding a WooCommerce order now also reverses the tip, milestone phase or paid extension attached to it.
  • A refund started at the payment gateway is no longer sent back to the gateway a second time, which could return double the money.
  • A partially refunded order can be completed, and the vendor is credited on what the buyer actually paid rather than the original total.
  • A vendor can no longer stack withdrawal requests past their available balance; pending requests and funds still clearing are now counted.
  • A declined card says it was declined and why, instead of asking the buyer to complete an authentication step that does not exist.
  • The settings API reports an unmapped page as null rather than 0, so an app no longer builds a link to a page that cannot open.
  • An existing terms page on the site is picked up automatically instead of the setting staying empty.
  • The REST API answers 401 for a caller with no session and 403 for one who is signed in but not allowed; a client refreshing an expired token no longer reads it as a permanent denial.
  • A 403 now names its reason so an app can act on it: wpss_not_vendor, wpss_vendor_pending, wpss_not_owner, wpss_not_admin, wpss_cannot_create or wpss_service_limit_reached, instead of one generic code for every refusal.
  • Submitting a delivery over the REST API now records it and notifies exactly as the dashboard does.

Dev

  • Removed the order actions accept and reject; they had no transition behind them. An order is accepted by being paid.
  • Removed the hooks wpss_order_accepted, wpss_order_rejected and wpss_order_delivered. Use wpss_order_paid, wpss_order_cancelled, and wpss_delivery_submitted / wpss_delivery_accepted.
  • The payment routes register only on the standalone rail; on a cart platform they are absent and answer rest_no_route.
  • Translation catalogs (.mo and .json) are generated in the build, with a CI gate to keep them current.
  • Every user-facing string in JavaScript is now translatable, including the whole wallet transactions table, which was English in every locale.
  • An accepted proposal records which order it produced, and existing accepted proposals are linked on upgrade where the match is unambiguous.
  • The dashboard credit is off by default; owners who want it can switch it on with the wpss_show_powered_by filter.
  • Documented the pay-order seam, the two REST namespaces, the milestone failure paths, and the three money settings tabs.

Compat

  • Aligned with WP Sell Services Pro 1.4.0. Install both updates together.
  • Milestone, tip and extension payment links are supported on Standalone and WooCommerce.

v1.3.0

July 28, 2026
New 2 Improve 7 Fix 17 Dev 3 Compat 1

New

  • Role-based menu visibility so you can show or hide marketplace menu items per user role.
  • Frontend dispute messaging: buyer and vendor can message and attach evidence on a dispute without leaving the order.

Improve

  • Full dark-mode support on every frontend surface, following the active theme's toggle (BuddyX, BuddyX Pro, Reign) instead of the OS setting.
  • The setup wizard no longer forces a payment gateway as the first step; offline payment works out of the box and the wizard guides you to configure a gateway when ready.
  • Fresh installs are sell-ready: manual/offline payment enabled, default service categories seeded, and new services publish without forced moderation.
  • Reworked the Upgrade screen with an in-plugin Pro feature tour, and pointed the upgrade calls-to-action at the product site so frontend vendors are not sent to wp-admin.
  • Added a Log Out link to the frontend dashboard navigation.
  • Add-to-cart now continues straight to checkout so the "Continue to Checkout" action matches its label.
  • Accessibility pass: visible keyboard-focus indicators, service metabox field labels, and search input plus category select ARIA labels.

Fix

  • Buyer request cards keep their actions on a single line as icon controls on mobile and tablet instead of overflowing off the card.
  • Dark mode no longer renders dark text on dark surfaces anywhere in the dashboard or on frontend pages.
  • PayPal checkout sends the full checkout context, handles multi-cart orders server-side, submits through its own seam, and no longer shows a dead Pay button.
  • Money precision now respects 0- and 3-decimal currencies, and refunds round to the currency's precision instead of a hardcoded two places.
  • Stripe pay-order flow for milestone phases and proposal orders creates the payment intent correctly.
  • Paused services can no longer be ordered from the service call-to-action, the order modal, or the cart API.
  • The order call-to-action is guarded against zero-price or unpriced packages.
  • The purchased item is cleared from the cart after a single checkout.
  • A buyer could get stranded on a pending-requirements order with no way to proceed; the flow now always offers a next step.
  • A purchase no longer appears under Sales Orders the moment the buyer pays.
  • Vendor public profiles no longer return 404 when a legacy user meta value is absent.
  • The service-search shortcode now submits to the services archive with moderation and vacation filtering, not WordPress core search.
  • Requirement choices use one schema across the wizard, admin, and buyer views, and drag-dropped requirement files now submit.
  • Admin service save preserves Unlimited (-1) revisions and allows clearing FAQs and requirements.
  • Confirmation prompts for milestones and order actions use the design-system dialog and are always clickable.
  • Dead "Upgrade to Pro" links in the service wizard now resolve to the correct destination.
  • Consolidated duplicated service-grid, empty-state, and card styles so the same component renders consistently on every surface.

Dev

  • Added a gateway-agnostic CheckoutIntent seam (resolve plus settle) so payment gateways plug in uniformly.
  • Base currency is now authoritative for money, with a display-currency hint provided through a catalog price-html seam.
  • The free plugin reaches zero wp i18n make-pot warnings, with translator comments added throughout.

Compat

  • Aligned with WP Sell Services Pro 1.3.0. Install both updates together.

v1.2.2

July 1, 2026
Fix 2 Dev 1

Fix

  • Migrated guest reviews with no linked account now show the original reviewer name across service pages, vendor profiles, and review moderation.
  • Review author name in the REST API and SEO review schema no longer falls back to "Anonymous" for migrated guest reviews.

Dev

  • Added a nullable reviewer_name column to the reviews table and a shared reviewer-name resolver so every review surface renders names consistently.

v1.2.1

July 1, 2026
Improve 1 Fix 1 Dev 1

Improve

  • Unified WooCommerce-style currency system so prices are formatted correctly out of the box.

Fix

  • Currency-aware price display and inputs across all admin and frontend surfaces.

Dev

  • Resolved all PHPStan analysis errors and repaired the static-analysis tooling.

v1.2.0

June 1, 2026
New 9 Improve 11 Fix 18 Security 1 Dev 5

New

  • Real-time updates (optional): live order messages and notification badges over WebSockets, powered by Pusher.com or a self-hosted Pusher-compatible server such as Soketi. Disabled by default; enable under Settings - Advanced.
  • Review Moderation admin page - approve, reject, and audit customer reviews with status filters and a four-card stats strip.
  • My Notifications admin page - a read-only mirror of your in-app marketplace notification stream.
  • Wallet ledger entries now link straight to the related order, tip, extension, or milestone.
  • Review moderation can now be switched on under Settings - Vendor; new reviews hold for approval and the API reports the same state.
  • Dispute timing is configurable: response window, reminder delay, auto-escalation, and a dedicated dispute notifications email under Settings - Orders.
  • Order amount limits, price decimal places, deadline-extension cap, buyer-request expiry, portfolio caps, and audit-log retention all have settings fields instead of fixed defaults.
  • Order Confirmation and Terms pages can be mapped under Settings - Pages.
  • Wallet provider selection under Settings - Payouts; the free plugin and Pro now resolve the same configured provider.

Improve

  • Unified dashboard shell across every frontend template so Services, Dashboard, and profile sections read as one product.
  • Premium UX uplift on all frontend surfaces - token-driven styling, designed empty states, consistent buttons, badges, and notices at AA contrast.
  • Lucide line icons throughout, replacing emoji in notifications, single-service highlights, and helpful-vote controls.
  • Dashboard sections now use pretty permalinks (/dashboard/section/) with a 301 fallback for legacy ?section= URLs.
  • The earnings area is now "Earnings & Payouts" with manual withdrawal plus extension points so Pro can add PayPal and Stripe payout rails in the same section.
  • Confirmation prompts and toast messages use a shared design-system dialog instead of the browser native pop-ups.
  • Marketplace pages (Dashboard, Cart, Checkout, Become a Vendor) now render full-width without the theme blog sidebar, with native layout support for the Reign and BuddyX themes and a sidebar-free fallback for any other theme.
  • Opening the dashboard lands active vendors on their Sales overview and buyers on My Orders.
  • Plugin admin screens hide unrelated third-party notices so the marketplace pages stay focused.
  • Vendor profile data (tagline, rating, review count, country, social links) now reads from the canonical vendor profile store everywhere: SEO schema, the vendors API, the Seller Card block, and proposal lists.
  • Single service pages show the vendor's real last delivery date.

Fix

  • Services archive no longer shows visitor-scoped data when set as the site front page.
  • Services archive and single templates - card borders, category-label overlay, button backgrounds, transparent popups, and sidebar filters.
  • Favorites now read and write a single canonical meta key, with a one-time lazy merge of the legacy key.
  • Resubmitting a rejected service re-queues it for moderation and clears the prior rejection reason.
  • Dashboard section header keeps the title on the left and groups the primary action with the Replay tour control on the right, with a clean wrap on mobile.
  • The set-up-payouts prompt no longer repeats on every dashboard tab; it stays within the Earnings & Payouts section.
  • Order conversation messages can be sent with only an image attached and no text.
  • Saving settings now shows a confirmation message instead of completing silently.
  • Service add-ons created from the admin service editor or WP-CLI now appear in the cart and checkout, not just the order modal.
  • Vendor vacation mode is now honored on the single service page - a notice banner shows the seller's message and return date and the order button is disabled, so buyers cannot purchase while the seller is away. Vendors and admins can set an optional return date.
  • Vendor SEO schema now includes the seller's title and aggregate rating; previously both were always empty.
  • Vacation mode and other profile changes persist reliably; failed saves now report an error instead of false success, and missing database columns self-heal on update.
  • Per-member email notification preferences are honored when sending; muted categories no longer email.
  • Admin service editor shows recurring billing fields and saves them with the same keys as the frontend wizard.
  • Admin Process Refund button performs the refund through the payment gateway instead of showing a placeholder notice.
  • Single service sidebar sticks smoothly while scrolling and scrolls internally when taller than the screen.
  • Delivery time and revision counts are consistent across the wizard, admin editor, REST API, SEO schema, and archive filters.
  • Vendors approved by an admin can set their PayPal payout email from their profile and it now saves.

Security

  • Gateway settings pages no longer print saved secret keys into the page HTML; secret fields are masked and keep the saved value when left blank.

Dev

  • REST status parameter on service update (publish or draft), owner-gated.
  • Service wizard extension hooks (wpss_wizard_service_data, wpss_wizard_pricing_after, wpss_wizard_sanitize_service_data, wpss_wizard_save_service_meta) let extensions inject fields into the frontend Create Service flow. New filters wpss_use_fullwidth_template, wpss_fullwidth_page_keys, wpss_dashboard_default_section, and wpss_realtime_settings.
  • New filters wpss_show_powered_by, wpss_stripe_refund_args, wpss_auto_approve_vendors and wpss_require_service_moderation (now live at the decision points), and action wpss_vendor_profile_saved on both profile save paths.
  • Static contract audit gate added to the release pipeline; the free/pro pair ships with a clean audit baseline.
  • audit/manifest.json refreshed; full inventory of REST routes, hooks, tables, shortcodes, and admin pages.

v1.1.1

Improve 1 Fix 1 Note 1

Improve

  • The release zip and the source repository are now both complete and self-contained - no extra setup step is required after install.

Fix

  • The plugin now activates cleanly from the downloaded zip on every install. Previously, on some hosts the plugin could fatal-error on activation if the install was missing a runtime dependency. The release zip now bundles everything the plugin needs to run.

Note

  • *Install & reliability**

v1.1.0

April 23, 2026
New 6 Improve 6 Fix 5 Note 41

New

  • An 8-step admin walkthrough auto-opens on the WP Sell Services dashboard the first time an administrator lands there, covering the dashboard cards, services, vendors, orders, and settings.
  • A role-aware frontend walkthrough on the `[wpss_dashboard]` shortcode. Active sellers get a 9-step tour covering Orders, Requests, Services, Sales, Earnings, and Messages. Buyers-only see a shorter flow with a "Want to sell too?" prompt highlighting the Start Selling button.
  • A "Replay tour" button on both the admin and frontend dashboard headers so anyone can re-run the walkthrough on demand. Once finished or skipped, the tour never auto-opens again for that user.
  • Help tabs added to the Orders and Disputes admin screens, linking to the plugin docs and workflow guides.
  • Seven new email templates for the milestone (proposed / paid / submitted / approved) and extension (proposed / approved / declined) flows. Every template ships with a plain-text fallback for clients that don't render HTML.
  • Guides for Milestone Contracts, Paid Extensions, Proposal Contracts (Fixed vs Milestone), and the Earnings Ledger & CSV Export on the docs site.

Improve

  • Every recurring job the plugin runs (order lifecycle sweeps, dispute deadlines, sub-order cleanups, auto-withdrawal, vendor-stat refresh, seller-level recalc) is now powered by the more reliable Action Scheduler library. You can review and replay any background job from Tools > Scheduled Actions. Page loads are no longer slowed down when the dispute cron is due.
  • Empty lists (Orders, Disputes, the buyer-orders tab on the frontend dashboard, and the vendor profile services section) now show a designed empty state with an icon, a one-line explanation, and a call-to-action button - instead of a bare "No X found." sentence.
  • Orders and Disputes admin screens now use the same card-shell layout as Vendors, Withdrawals, and Moderation, so all six listing screens look and behave consistently.
  • The plugin's database setup / teardown code is now refactored so that adding or removing a plugin table is a single-line change. Uninstall removes tables in the correct dependency order - no more orphaned data after deactivation + delete.
  • Email rate-limiting now applies only to high-volume notification types. Milestone, extension, tip, and proposal events are never silently dropped.
  • Tips, paid extensions, and milestone payments now share a common credit / cleanup flow under the hood. Vendor wallets are credited consistently, and abandoned-payment cleanup behaves the same across all three.

Fix

  • Sending more than one tip on the same order now credits each one correctly.
  • When the final milestone of a contract is approved, the parent order now completes end-to-end - vendor stats update, the review prompt appears, and the completion email is sent.
  • Converting a buyer request into a milestone contract is now an all-or-nothing operation. Partial conversions no longer leak premature notification emails to vendors.
  • Buyers no longer receive a "Complete your requirements" email when they send a tip, request a paid extension, or pay a milestone. That email is only sent on the original order.
  • Vendor wallets no longer get credited twice if a payment gateway retries the "order paid" event.

Note

  • *Admin UX Consistency**
  • Vendors, Withdrawals, and Moderation admin pages now share the same shell - wrapper, heading, stats strip, and filter row - so operators see a consistent surface regardless of which list they open
  • Moderation gains a 4-card stats strip (Total / Pending / Approved / Rejected) matching the other two listing pages
  • Stats cards now use a single responsive grid that collapses from 5-up on desktop to 2-up on small phones, with no per-page styling required
  • color palette - green for active/approved/completed, amber for pending, red for suspended/rejected
  • *First-Time Guide (Admin + Frontend)**
  • New `wpss_tour_steps` filter and `POST /wpss/v1/tour/complete` REST endpoint let Pro (and other extensions) append custom steps and integrate with the completion flag.
  • *Reliable background jobs**
  • on the first admin page load after upgrading from a pre-1.1.0 install, the plugin migrates its old scheduled jobs to the new system automatically - no action required from you.
  • *Empty-state polish**
  • *Database housekeeping**
  • *Milestone Contracts (Upwork-style)**
  • Vendors choose Fixed or Milestone contract type when submitting a proposal
  • title, description, amount, days
  • count badge and see the full breakdown before accepting
  • creates every phase on the order timeline - no upfront parent checkout
  • step payment enforced on the server: phase N only unlocks after every earlier phase is approved or cancelled
  • hoc milestones can still be proposed during a contract for legitimate scope changes
  • completes when every phase is terminal - standard completion email and review prompt fire
  • paid phases stand, unpaid phases auto-cancel, paid-but-open phases route through dispute
  • *Paid Extensions (catalog orders)**
  • progress catalog orders can quote extra work with a price and extra days
  • Buyers accept and pay, or decline with one click
  • Commission is split at payment time; vendor wallet credited immediately
  • Parent order deadline extends by the quoted days on acceptance
  • a single order only ever shows one flow
  • *Vendor Intro Video**
  • Vendors can add an Introduction section with a short intro video to their public profile
  • MP4 upload or YouTube embed
  • Renders above the vendor's tagline and bio on the profile page
  • *Earnings Ledger & CSV Export (Pro)**
  • Earning, Tip, Extension, Milestone, Withdrawal, Credit, Debit, Dispute Refund
  • Last 30 Days, This Month, Last Month, This Year, All Time
  • CSV export streams the same rows plus a summary block (Total Credits, Total Debits, Net, Tips, Total Withdrawn)
  • Date, Type, Description, Reference (linkable), Currency, Amount (signed), Balance After
  • Compatible with QuickBooks, Xero, Wave, and spreadsheet tools
  • *Money-flow integrity**
  • *Architecture**
  • New REST endpoints for milestones, extensions, and the Fixed vs Milestone proposal contract type - mobile app developers get full parity with the web frontend.
  • *Documentation**
  • New architecture write-up explaining how tips, extensions, and milestones share a common backend pattern (useful for extension authors).

v1.0.0

April 2, 2026
Note 45

Note

  • *Marketplace Core**
  • style service marketplace with standalone checkout
  • step service creation wizard with live preview
  • tier pricing packages (Basic, Standard, Premium) with custom features
  • ons and extras for upselling
  • Image gallery, video embeds, FAQs, and requirements per service
  • and-drop ordering
  • *Order Workflow**
  • Complete order lifecycle with 11 distinct statuses
  • Requirements collection before work begins
  • File delivery system with buyer approval workflow
  • in messaging per order with file attachments
  • Revision request and deadline extension management
  • initiated order cancellation with vendor response flow
  • *Vendor System**
  • Vendor registration with open, approval, or closed modes
  • granted tiers
  • Unified vendor dashboard with earnings, orders, and analytics
  • Portfolio showcase, vacation mode, and profile customization
  • Commission tracking and withdrawal requests with admin approval
  • *Buyer Features**
  • Post buyer requests for vendors to bid on
  • Browse and compare vendor proposals
  • Favorites/wishlist, optional tipping, and complete purchase history
  • *Reviews, Disputes, and Notifications**
  • 5-star multi-criteria rating system with moderation queue
  • Structured dispute workflow with admin mediation and multiple resolution types
  • 26 configurable email notification types with template overrides
  • app notification center
  • *Payments and Earnings**
  • Standalone checkout with offline gateway (no WooCommerce required)
  • vendor commission rates (0-50%)
  • Earnings dashboard with automated withdrawal scheduling
  • *Developer Features**
  • 21 REST API controllers with 125+ endpoints and batch endpoint for mobile apps
  • 100% REST coverage for all user-facing features
  • 6 Gutenberg blocks and 19 shortcodes
  • Template override system compatible with any theme
  • SEO schema markup with Yoast and RankMath integration
  • 9 extension hooks for Pro plugin integration
  • CLI commands for bulk operations
  • 17 custom database tables with PSR-4 autoloaded architecture
  • 100+ action and filter hooks for extensibility
  • activation setup wizard with demo content importer
  • WP 6.7+ compatible (lazy-loaded translations)