v1.8.0 Latest
October 7, 2026
New 8 Improve 15 Fix 28 Security 6 Dev 6 Compat 1
New
- Members can report a service or a seller from the service page and the vendor profile, and each report reaches the Member Reports screen.
- Express delivery per package: a vendor can offer a faster turnaround at its own price and delivery time.
- A Log In page with the marketplace's own sign-in form, which every Log in link on the site follows once it is selected under Settings > Pages.
- Vendors can cancel a withdrawal request while it is still pending.
- Buyers can add and remove attachments when editing a request, and sellers see them in the app.
- Pending proposals can be withdrawn by the seller who sent them.
- The command wp wpss repair:stripe-tax corrects Stripe orders whose tax was counted twice, with a dry run by default.
- The command wp wpss utc-migrate previews and runs the one-time conversion of stored dates to UTC.
Improve
- Every stored date is now UTC, and dates written by earlier versions are converted once in the background after updating.
- Settings are regrouped into one card per concern, with a warning before unsaved changes are lost.
- The member dashboard works on phones and tablets, with an off-canvas menu at 1024px and below.
- Admin lists for orders, vendors, withdrawals, disputes and moderation hold their layout at tablet width and stack cleanly on phones.
- The Orders list has triage tabs, shows payment and due date on each row, and filters by vendor and buyer.
- The admin order screen shows the payment, the activity and the money first, using the same blocks as the member order view.
- The Audit Log reads in plain language and shows the note entered with a status change.
- Every confirmation dialog opens with Cancel selected, so pressing Enter cannot approve a payout or suspend an account by reflex.
- The reason and details entered when cancelling an order are shown to the buyer, the vendor and the site owner, and in the Order Cancelled email.
- On block themes the member dashboard uses the theme's wide width instead of its reading width.
- Order lists show the order number, amount, due date, late badge and next action on each row.
- Shortcodes and blocks carry their own styling, so they look the same on a plain page in any theme, including inside a pattern or widget.
- Deleting demo content removes the demo vendors as well, from Settings and from the command line alike, and keeps any demo service a buyer has ordered.
- Gateway scripts load only on pages where a payment can happen.
- The earnings cards on the vendor dashboard stay readable at every screen width.
Fix
- One payment can pay only one order on every path, including the REST API and gateway webhooks.
- A site acts only on Stripe and PayPal payments it started itself, so a staging copy or second store on the same gateway account cannot mark an order paid or refunded.
- A buyer who is charged for a service that can no longer be ordered is refunded automatically.
- A Stripe payment that reaches the site by webhook before the browser returns creates the order with the correct tax, add-ons and delivery time.
- Each gateway refund is counted once, and a full refund reaches the order's paid extensions and tips.
- A full refund closes the order's open dispute without moving money a second time.
- Commission is taken on the price without tax, in tax-inclusive mode too.
- Add-on prices come from the service on every checkout path, never from the checkout request.
- Revenue has one definition on every screen: paid orders minus refunds.
- A paused or unpublished service cannot be ordered through any route, and is left out of the cart total and the cart count.
- Services from a vendor on vacation are left out of the services shortcode, blocks, Related services and live search, as they are in the catalog and search.
- A service whose seller is on vacation can no longer be paid for from a cart, a saved checkout link or the app.
- A buyer request that has a proposal can be closed but no longer deleted, and deleting a request from the dashboard moves it to the trash.
- Files a buyer attached to a buyer request now show on the order and download, and the requirements API returns them.
- Submitting requirements on an order made from a buyer request keeps the request's description and files on the order.
- The buyer request API returns the request's deadline and saves a changed one.
- Sorting the services shortcode or block by rating, sales or price no longer hides services that have no rating or sales yet.
- A refunded order shows no earnings on the vendor's Sales list, and the earnings total says that it includes tips.
- Milestone phases are credited when the buyer approves them, and the requirements clock starts at payment.
- Auto-complete counts from the latest delivery, and revisions run on their own deadline.
- Closing vendor registration applies to logged-out visitors and to every sign-up path.
- Guest checkout works with every gateway after the account step.
- PayPal tells the buyer what happened when a capture is refused, and returns them to their order.
- A file removed from a buyer request is deleted, and files stay on the request once a seller has sent a proposal.
- Deleting demo content no longer removes the site's own empty service categories.
- Updating the plugin no longer creates a Log In page or changes how an existing site signs in.
- A long transaction ID wraps inside its box on the order summary.
- Column headings on the Vendors list line up with their values.
Security
- Batch API requests cannot contain another batch.
- Guest rate limits can no longer be reset with a spoofed address header.
- Public profile and portfolio uploads accept images only, and request attachments require a signed-in member.
- A payment that has already paid an order is no longer refunded when a repeated confirm request for it fails, on Stripe and PayPal.
- The app's pay-an-existing-order route only accepts a payment started by that buyer for that order.
- A buyer request with a proposal, and the files attached to it, can no longer be deleted by the buyer.
Dev
- New filters and actions are listed in the hook reference, including wpss_enqueue_dashboard_assets for loading dashboard assets where a shortcode is placed outside page content.
- REST date fields are ISO 8601 with a +00:00 offset, where about 20 fields previously returned a bare date and time.
- GET /cart marks lines that can no longer be bought with unavailable and unavailable_reason.
- PUT /buyer-requests/{id} accepts attachments, and two new 409 codes are returned: wpss_payment_already_used and wpss_file_in_use.
- Dashboard sections, the order row and the order filters are theme-overridable templates.
- The plain-text email templates that nothing loaded were removed.
Compat
- Aligned with WP Sell Services Pro 1.8.0. Install both updates together.
v1.7.2
September 23, 2026
New 2 Improve 3 Fix 35 Dev 3 Compat 1
New
- Members can withdraw a dispute they opened, or ask a site administrator to review one, from the dispute screen. Both already worked over the API but had no button.
- The notifications list is paginated, so notifications older than the newest 50 can be reached.
Improve
- The service wizard says when you have added more tags than the limit, instead of accepting them and dropping the extras on save. The limit is filterable.
- Remove buttons on wizard extras, FAQs, requirements, deliverables and gallery images are visible and named for screen readers.
- The link from Review Moderation opens Settings at the section holding the setting.
Fix
- A service that is paused or deleted while it sits in a cart stays on the cart screen with a plain reason, is left out of the total, and stops checkout until the buyer removes it. It used to disappear and the total simply shrank, with nothing to explain where the item went.
- Checkout refuses to take payment while anything in the cart is no longer for sale, and names what it is. A cart holding one available service and one the seller had paused was charging for both.
- A service that is already live but does not meet the publishing checklist can be edited again through the API. Every edit was being refused, including the one that would have filled in what was missing, while the same edit through the editor or WP-CLI was accepted.
- Settings tells the site owner the setup wizard has been completed, instead of reporting a completion date of January 1, 1970 on sites upgraded from a version that recorded it differently.
- A vendor and the reviewer can open a service that is waiting for approval. Holding it back correctly hid it from the public and hid it from them too, so the reviewer could not see what they were being asked to approve.
- Withdraw and Escalate stay available on a dispute after the other party replies, which is when they matter most.
- A long requirement answer can be expanded. The Show more control was being clipped away by the same rule that shortened the text.
- Removing a requirement row in the service wizard no longer logs JavaScript errors.
- The Reports screen keeps its confirmation step when the plugin menu has been renamed, so Suspend and Close account still ask before they act.
- File evidence on a dispute is visible to the site owner. Uploaded files were rendering as empty messages on the admin dispute screen.
- Creating or updating a service through the REST API follows the same rules as the wizard: the tag limit, no repeated gallery image, and the checks that decide whether a service is ready to publish. This also covers the Pause and Publish control on the vendor dashboard.
- Right-to-left sites get the right stylesheet on the order screens, the order conversation and the vendor dashboard.
- An extra with no price is refused instead of being published to buyers as a free add-on.
- Mark all as read stays available when the unread notifications are on a later page, and a custom page size can no longer empty the list.
- A custom project completes when its last remaining phase is cancelled, instead of staying In Progress with nothing left to do.
- The Edit control on checkout underlines on hover again.
- Add Image in the service wizard can be reached with a keyboard, wizard messages are announced by screen readers, and the pricing fields are linked to their labels.
- The back link on a dispute is styled, and keeps its colour on themes that restyle links inside content.
- A brand colour set under White Label now reaches the plugin's own controls on the Vendors screen. Status badges keep their own colours, because green means completed and red means cancelled.
- Analytics and sales figures follow the site's timezone. Ranges were built in UTC while orders are recorded in site time, so totals covered the wrong window on any site not set to UTC.
- Today is available on the vendor analytics API and on the free Sales tab.
- An add-on is charged for when it is the only one selected. Picking just the first add-on on a service showed it on the order but left it out of the amount charged, so the buyer paid the base price and the vendor lost the add-on.
- Add-ons created through the API, an import or a migration are saved with the service and shown to buyers. Only the service wizard and the editor were storing them.
- An add-on saved with a negative number of extra delivery days is treated as no extra days. It was being stored as that many days later, so an add-on meant to speed delivery up slowed it down.
- A service created through the API, an import or a migration is held as a draft until it meets the same publishing checklist the wizard applies, instead of going live incomplete and purchasable.
- The service editor no longer tells a site owner that a published service is being held as a draft. It now says the service is live and lists what it is still missing.
- A service using only the Basic package can be published. Switched-off Standard and Premium tiers were being validated and their empty fields reported against Basic.
- A Standard or Premium tier that is switched on but left empty is refused, on the Pricing step and at Publish.
- Services awaiting approval no longer go live when a vendor publishes from the dashboard. Moderation now applies however a service is published, and services already published without approval return to the review queue on upgrade.
- A Yes/No requirement offers both answers. It showed only Yes, and when the question was required Yes was the only answer a buyer could give.
- A custom project is only marked complete once a phase has actually been delivered. Cancelling every phase marked the order complete and blocked proposing a new one.
- The vendor detail screen in wp-admin works when the plugin menu has been renamed. Its tabs previously sat on Loading forever.
- The selected order filter stays readable on themes that recolour content links.
- The checkout steps appear before the payment form on phones.
- Removing a wizard extra no longer logs JavaScript errors.
Dev
- The REST catalogue's version is taken from the plugin itself rather than a value kept by hand, which had left it a release behind.
- The REST catalogue documents the period parameter on the earnings and analytics routes, including every value it accepts. Clients generated from the published document were rejecting valid values.
- Removed templates/order/order-confirmation.php, which no rail rendered, along with its stylesheet rules. This retires three actions that only that template fired: wpss_before_order_confirmation, wpss_order_confirmation_details and wpss_after_order_confirmation. A site hooking them was never being called, because the template was never loaded.
Compat
- Requires WP Sell Services Pro 1.7.2. Install both updates together.
v1.7.1
September 18, 2026
New 5 Improve 17 Fix 59 Security 6 Dev 10 Compat 1
New
- Review window setting.
- Vendors get Proposals and Reviews sections in the dashboard, with review replies and declined-proposal status.
- Notifications for review replies, expired requests, dispute escalation and cancellation, withdrawal progress, service moderation decisions and tip receipts, each with an admin toggle.
- Setting to allow vendor-initiated refunds, off by default.
- Vendors opening a dispute now choose from reasons that describe their side: buyer unresponsive, payment or chargeback issue, abusive behaviour, requirements changed after acceptance, or work outside the agreed service.
Improve
- Upgrading preserves access for people who were already selling, including author-role sellers, and tells the owner who was migrated.
- The audit log now records withdrawals, dispute outcomes, vendor status changes, commission changes, moderation decisions, payments and every ledger entry; retention defaults to one year.
- Dispute pages show the outcome, refund amount and admin note to both parties; the link after posting a request opens the request list.
- The dashboard menu collapses on small screens so content comes first, and the vendor sales list can be filtered by status and searched.
- Personal data export now covers disputes, deliveries, requirements, withdrawals, proposals, reports and notifications.
- Replaced emoji and text stars with icons, fixed status labels and plural copy, and added accessible names and tab roles on the service page.
- The orders API loads a page of orders with a fixed number of queries.
- One setup notice tells the owner when a mapped page is missing, no payment method is enabled, or the selected store plugin is inactive; links to unpublished pages are hidden.
- Dashboard lists, favourites and the vendor directory are paginated, the vendor directory can be sorted and filtered, admin counts are cached, and new indexes keep review moderation and the vendor directory fast on large sites.
- The delete-data setting now says that mapped pages are left in place, and pages the plugin creates are marked so a future release can offer to remove them.
- The "What happens next" steps now sit beside the order summary on checkout, where buyers see them before paying rather than after the payment form.
- Adding a package, add-on, requirement or FAQ in the service editor opens it ready to fill in, and each row's remove button is visible.
- Tipping is now part of Pro. Without Pro, buyers see no tip option and tip records are hidden; a tip a buyer already paid for is still credited to the vendor and still appears in their wallet history.
- Dispute emails name whoever actually opened the dispute, and the copy to the admin says which side they were on.
- The Open Dispute notice speaks to whoever is reading it, so a vendor is no longer told to settle with the seller.
- Analytics stays in Settings once Pro is active and points to the Analytics screen, instead of disappearing the moment Pro is installed.
- A vendor on a paid subscription plan can create up to that plan's service limit rather than the site-wide default.
Fix
- Refunds made in the PayPal or Razorpay dashboard now update the order and reverse the vendor credit.
- A Stripe payment webhook arriving before checkout finishes no longer creates a duplicate order, and cart refunds land on the right order.
- Offline and manual gateway refunds are marked as pending manual payment instead of being reported as sent.
- Service content limits apply on every save path, and a proposal can only be accepted once.
- New orders carry the package's revision count, so buyers can request revisions and vendors see the revision notes.
- Deleting a user keeps and anonymises the other party's orders, ledger and reviews instead of deleting them; order files are removed when an order is deleted.
- Demo delete removes only demo content.
- Every command that writes or deletes data now asks first and refuses on a production site without --force.
- Pay buttons for tips, milestones, extensions and proposals are hidden on a store rail that cannot take a single-order payment instead of linking to a page it ignores.
- A store rail that cannot take a catalog purchase now says so instead of adding to the cart and looping.
- Orders left without requirements now auto-start by default instead of being cancelled after the timeout.
- Price decimals and currency position settings are applied; minimum and maximum order amounts are enforced at checkout.
- Password reset over REST accepts a username as well as an email, private order files can be downloaded by app clients, and repeated failed logins lock the account temporarily.
- Commission is locked when the order is paid, partial refunds can be issued more than once and each reverses the right vendor share, and orders created from proposals are taxed.
- Vendor earnings totals are computed from the ledger everywhere, so the profile, earnings page and ledger agree.
- Uninstall with delete data now removes scheduled jobs, order files and every plugin user meta.
- Usage tracking is no longer switched on without the owner opting in.
- Order, payment and moderation emails are never dropped by the message cooldown, review and requirement mails are sent once, and failed sends are logged and retried.
- Notification checkboxes control the event named on the label, so turning off cancellation notices no longer silences a different event.
- Suspended vendors receive a suspension notice instead of the rejection wording.
- Dispute numbers are generated, the vendor profile page carries the vendor's name in its title, and several PHP notices on email and admin pages are gone.
- Order requirements use one schema on every surface, so requirement forms show the vendor's questions and REST submissions validate correctly.
- The review window filter is honoured by the API as well as the website, and review replies go through one writer.
- Vendor detection now requires an approved seller profile; the author role no longer receives seller capabilities.
- Vendor statistics refresh for every approved seller, and marketplace search returns only active vendors.
- A repeated payment webhook no longer resets a paid order or resends its notifications.
- Tax is charged on multi-item cart checkout and on PayPal checkout, matching the single-service total.
- The notification list runs one query instead of two identical ones.
- Closing a dispute from the admin restores the order, a dispute cannot be resolved twice, and disputes cannot be opened on unpaid orders.
- The Active count on the Sales and Orders screens matches the Active filter beside it.
- The service gallery lightbox opens, zooms and moves between images, and a tall image no longer stretches the page.
- A service page no longer blanks its own title: search-engine structured data, the social share title, the breadcrumb and the gallery image alt text all carry the service name again.
- The cart page follows the theme's dark mode. Every colour on it referenced a token that did not exist, so it was locked to light.
- The become a vendor card and the standalone account panel no longer stay white when the theme goes dark, which had made their headings unreadable.
- Outline buttons take their colours from the design system again, so they follow the theme instead of a fixed grey.
- The Contact Seller button no longer keeps the browser's default grey, which left it unreadable when the theme is dark.
- The Featured badge on portfolio items uses dark text on amber so the label is legible.
- A rejected service stays in the Rejected tab of Moderation with its reason, and the Total Services count no longer drops when one is rejected.
- Services created in the admin now follow the same rules as the vendor wizard: a category, a main image, a delivery time and the minimum price are required before one can go live.
- A withdrawal is checked against the vendor's balance again at the moment it is paid, so a payout approved before a refund cleared the earnings can no longer overdraw the vendor.
- Opening a dispute now shows the opening statement in the messages panel instead of "No messages yet", and lists it once on the activity timeline.
- Approving or rejecting a vendor sends one email instead of two.
- Buyer requests show every category they were filed under, on both the request card and the request page, instead of only the first.
- The service wizard offers the same eight requirement answer types as the admin editor, and the type names now mean the same thing on both.
- The services archive at /service/ shows the same number of services per page as the mapped services page, and the count above the grid matches what is listed.
- Date fields follow the site's light or dark mode instead of the visitor's operating system.
- The View action in My Services is styled as a button alongside Edit and Pause.
- The floating cart button no longer sits on top of the package card or the seller details while a buyer is choosing or paying.
- Buttons in older templates keep their own colours instead of taking the theme's link colour, which left some labels unreadable against their own background.
- The Earnings and Payouts tiles sit in even rows, so Total Withdrawn is no longer stranded on a line of its own.
- A showcase video fills the service gallery instead of half of it.
- The review countdown no longer reads zero days left while a review can still be left.
- Add New Service and the service links on the WooCommerce My Account tabs open the frontend wizard instead of an admin screen vendors are not allowed to use.
- The WooCommerce My Account service tabs load the plugin's styles and icons, and the vendor dashboard tab fits the column it sits in.
- On a phone the order list is reachable without scrolling past every stat card first.
- Dashboard sidebar headings and order filter counts meet contrast requirements in both light and dark mode.
- The order search button keeps its own hover colour instead of the theme's, and View looks the same in orders, sales and disputes.
- Controls that named a style the plugin never defined render as intended, including the focus ring and the file upload area.
- The delivery and requirements file type filters fire again, so a site restricting either upload keeps its rule.
Security
- Message, contact and dispute attachments are stored privately like deliveries, dispute evidence checks ownership, and vendor payout details are encrypted at rest.
- Payment receipts are stored privately like deliveries instead of in the media library.
- Buyers and vendors can no longer refund or cancel orders outside their allowed steps; retired accept and decline actions removed.
- Repeated failed sign-ins now lock the account on the website as well as the API.
- Only the site owner can mark a service as Featured; a vendor can no longer promote their own service into the featured slot.
- Attachment names are shown with direction and formatting characters removed, so an uploaded file cannot disguise what it is in a dispute or an order.
Dev
- Stored files record which storage provider holds them.
- Payment intents carry the vendor id for every order type.
- New wpss_auth_login_challenge filter for two-factor plugins.
- Unique keys on wallet transactions and reviews, and an index on order transaction ids.
- Retired the unused service requirements and add-ons tables; post meta is the single store.
- Pay-order URLs are read-only; rails create store orders through the new wpss_ensure_pay_order seam.
- CI now runs the integration, REST and contract suites; run-tests.sh works on a fresh clone; OpenAPI marks Pro-only routes.
- The pay-order support matrix lives in one place and the docs check now validates link anchors and hook names.
- New filters wpss_tipping_enabled, wpss_vendor_max_services, wpss_user_can_feature_service, wpss_service_editor_url and wpss_analytics_page_url, plus the wpss_register_tipping_settings action.
- wpss_get_dispute_reasons() takes a role, and the wpss_dispute_reasons filter receives it; GET /disputes/options adds reasons_by_role and reason_labels.
Compat
- Requires WP Sell Services Pro 1.7.1. Install both updates together.
New 11 Improve 13 Fix 17 Security 1 Dev 4 Compat 1
New
- A submitted milestone phase can be sent back for changes, with your notes reaching the seller and the order conversation.
- A completed milestone contract opens with a Project complete summary: phases approved, total paid, and the date it finished.
- Offline payments can have several named methods, each with its own instructions and its own on/off switch, edited from Settings > Payment Gateways.
- The method a buyer chose is recorded on the order, so renaming or removing a method later never changes what a past order says.
- My Orders has status filter chips. Nothing is hidden by default; the list is ordered so the orders needing the buyer come first.
- A marketplace Create Account page, mapped like the other pages. Register links across the site point at it instead of the WordPress login screen.
- A logged-out buyer reaches checkout with their package and add-ons intact and creates their account there, rather than meeting wp-login.php with their selection lost.
- The owner is warned when payments are live and no Terms page is mapped. Dismissible, and it returns if another gateway is enabled.
- Marketplace data reaches the WordPress privacy tools: orders, messages, reviews, profile and earnings are exported and erased with the account.
- Message emails can be held for a few minutes and re-checked before sending, so a reply read on site does not also arrive by email.
- Pretty URLs for viewing an order and for paying one.
Improve
- The Become a Vendor page leads with what the marketplace offers, how selling works, and the sign-up form, instead of a narrow card in an empty page.
- The buyer's brief reads the same way for the buyer, the seller and the site owner.
- Buyer-facing prices carry what a display-currency switcher needs, so a converted hint can appear on request budgets, proposals, cart lines and the order confirmation rather than only on service cards.
- Order files are stored outside the web root and served through a link that checks the caller is the buyer, the seller or an admin.
- Order files are protected on IIS as well as Apache.
- Files uploaded before this release move into the protected store the first time someone opens them, so existing links keep working and stop being public as they are used.
- Checkout prefills a signed-in buyer's name and email from their account instead of asking for what the site already knows.
- The vendors directory lays out correctly beside a sidebar: avatars are round, metadata lines up across cards, and the column count yields when tiles get too narrow.
- A vendor whose balance is below zero is told what it means and what clears it, rather than shown a bare minus figure labelled Available for Withdrawal.
- The owner is shown which vendors hold a negative balance, on the Vendors screen.
- The Become a Vendor page states the real service limit for the site rather than promising unlimited listings, and no longer promises a Pro analytics dashboard.
- The conversation panel on an unpaid order says when messaging opens instead of inviting a message it will refuse.
- The Payouts screen describes what the plugin does with the money rather than implying automatic payment.
Fix
- Tax shown at checkout was never charged: the buyer approved one total and was billed the package price without it.
- The order then applied that tax a second time, and commission was taken on the tax as well as on the price.
- A milestone contract showed a total of 0.00 on the order summary and on the service line even after every phase was paid.
- The buyer's brief was not shown when the service had no requirement questions, leaving the seller nothing to work from.
- Paying a tip, a paid extension or a milestone phase sent the buyer to a requirements step that does not apply to those orders.
- My Orders counted different orders in its summary cards than in its filter chips, so the two disagreed.
- Orders with no platform recorded were left out of a buyer's order counts entirely.
- A partial refund returned the buyer the entire order total. The admin screen had no amount field and the refund ran with no amount, which was read as everything.
- A withdrawal could ADD to a vendor's balance. One legacy row stored a negative amount and the sign was applied again, overstating one vendor by 100.00.
- A disabled payment gateway could still start a payment if a stale checkout page was submitted.
- Paying an existing order by an offline method recorded the gateway but not which method, so those orders showed the wrong instructions.
- Defining named offline methods left buyers with no payment instructions at all, because the instructions were read from the setting the migration removes.
- Service add-ons saved in the admin did not appear on the single service page.
- A disputed order had no link to its dispute; it could only be reached from the Disputes menu.
- Eleven order actions were vetoed by a status list that had drifted from the actions themselves.
- status__not_in on GET /orders is declared in the API schema, on the route that reads it rather than one that ignores it.
- Several screens named the same thing two different ways, and a dashboard link named a section it did not open.
Security
- A suspended vendor kept full access to the money REST surface. Reads were login-only while writes were vendor-gated, and the vendor gate never consulted the suspension check.
Dev
- New filters wpss_order_status_groups, wpss_offline_methods, wpss_offline_method_slots and wpss_vendor_benefit_listings_copy.
- New hooks wpss_vendor_pitch_stats, wpss_vendor_pitch_steps, wpss_requirement_field_label and wpss_milestone_revision_requested.
- A generated hook reference covering every hook in both plugins, regenerated from source and checked on every commit.
- Five tables that no install has created for several releases are named in the schema with a pointer to where their data lives now, and reported by wp wpss preflight.
Compat
- Requires WP Sell Services Pro 1.7.0. Install both updates together.
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.
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.
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.
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.
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.
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.
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.
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).
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)