=== Ultimate Multisite – WordPress Multisite SaaS & WaaS Platform ===
Contributors: aanduque, superdav42, vvwb, surferking
Donate link: https://github.com/sponsors/superdav42/
Tags: multisite, domain mapping, wordpress multisite, multisite saas, waas
Requires at least: 5.3
Requires PHP: 7.4.30
Tested up to: 6.9
Stable tag: 2.10.1
License: GPLv2
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Ultimate Multisite turns your WordPress network into a WaaS platform with subscriptions, site provisioning, and domain mapping.

== Description ==

**Ultimate Multisite** is a WordPress Multisite plugin designed to help you build, sell, and manage a Website-as-a-Service (WaaS) platform on your own infrastructure.

With Ultimate Multisite, you can create subscription plans, provision new sites from templates, map custom domains, and manage customers across your WordPress Multisite network — all from one integrated system built specifically for Multisite.

Launch niche site builders, productized services, franchise networks, or internal platforms without stitching together dozens of plugins. From checkout to provisioning to ongoing management, Ultimate Multisite provides the core building blocks for running a modern, scalable WordPress multisite platform.

Formerly known as **WP Ultimo**, Ultimate Multisite is now community-maintained and actively improved.

= Also Known As =

Ultimate Multisite is commonly searched for as:

- Ultimate Multisite plugin
- Ultimate Multisite WordPress
- Multisite Ultimate
- WP Ultimo

If you are looking for **WP Ultimo**, this is the community-maintained successor.

= Key Features =

Everything you need to build and scale a WordPress Multisite SaaS platform:

- **Fast Site Creation** – Self-serve signup that provisions new sites instantly from templates
- **Domain Mapping** – Custom domains with automated DNS verification and guided setup
- **Payments & Subscriptions** – Stripe and PayPal support for recurring plans and one-time fees
- **Flexible Plans & Limits** – Package features and enforce quotas across your multisite network
- **Template Library** – High-converting site templates customers can launch in minutes
- **Customer Dashboard** – Branded UI for managing billing, sites, domains, and settings
- **White-Label Ready** – Rename, rebrand, and customize the experience
- **Hosting Integrations** – Cloudflare, GridPane, Cloudways, WPMU DEV, and more
- **Developer-Friendly** – Hooks, filters, and an extensible add-on system

= Who Is Ultimate Multisite For? =

- Agencies productizing WordPress into recurring plans
- Creators launching niche or industry-specific site builders
- Hosts and MSPs offering white-label WordPress platforms
- Franchises and multi-location brands managing many similar sites
- Universities and organizations provisioning sites at scale
- Internal teams deploying microsites and campaigns

= Popular Use Cases =

- Productized website services with recurring billing
- Franchise and multi-location networks with brand-consistent sites
- Industry-specific “site builder” platforms
- Private networks for events, departments, or communities
- Educational institutions provisioning program or class sites

= Why Choose Ultimate Multisite =

- **Built for WordPress Multisite** – Not retrofitted from single-site assumptions
- **Open & Community-Maintained** – Transparent development and frequent updates
- **Proven Architecture** – Templates, plans, and domain mapping built-in
- **Extensible by Design** – Add-ons, actions, filters, and hosting integrations
- **You Own the Stack** – No forced SaaS lock-in or proprietary hosting

If you searched for “Ultimate Multisite” on the WordPress plugin directory, this plugin provides the full multisite SaaS and WaaS functionality you are looking for.

= Get Started in Minutes =

1. Enable WordPress Multisite on a staging or production site
2. Install and **Network Activate Ultimate Multisite**
3. Run the setup wizard and create your first plan and template
4. Share your signup page and start provisioning sites

== Documentation ==

1. [Ultimate Multisite Getting Started Guide](https://ultimatemultisite.com/2026/01/27/getting-started-ultimate-multisite-guide/)
2. [Full Ultimate Multisite Documentation](https://ultimatemultisite.com/docs/)

== Frequently Asked Questions ==

= Can I use Ultimate Multisite on a regular WordPress site? =

No. Ultimate Multisite requires **WordPress Multisite** and is designed specifically for network installations.

= Does Ultimate Multisite support custom domains? =

Yes. Ultimate Multisite includes robust domain mapping with automated DNS verification and guided setup for end users.

= Which payment gateways are supported? =

Stripe, PayPal, and manual payments are supported out of the box.

= Can I migrate from WP Ultimo? =

Yes. Ultimate Multisite is a community-maintained fork of WP Ultimo 2.x. Migration happens automatically when the plugin is activated.

= Will Ultimate Multisite work with Multisite with Subdirectories? =

Yes. Ultimate Multisite supports both subdirectory installs and subdirectory installs.

= Will Ultimate Multisite work with Multisite with Subdomains? =

Yes. Ultimate Multisite supports both subdirectory installs and subdomain installs.

= Can I use Ultimate Multisite to limit which Plugins and Themes users can use? =

Yes. With Ultimate Multisite you can select which plugins and themes are available to each plan on your network.

= Can I use Ultimate Multisite to limit the number of posts a user can create on their site?=

Yes. With Ultimate Multisite you can establish post quotas for every available post type on your network. You can also limit the number of users the admin can invite, the amount of disk space, and much more.

= Does Ultimate Multisite support Site Templates? =

Yes. With Ultimate Multisite you can create as many Site Templates as you want. Site Templates are not themes, they are normal sites on your network. You can activate plugins, themes, and customize that Site Template in any way you want. If a user selects that template, his or her site will be created as a copy of that template, with all the customizations in place.
You can also set a particular template for a plan. By doing that, every user that signs up on that plan will have his or her site created as a duplicate of that Site Template.

= Does Ultimate Multisite integrate with WooCommerce? =

Yes!
If you want your network users to have WooCommerce available for them, allowing them to set up stores, that is possible using Ultimate Multisite. You can even limit the number of products your clients will be able to create on each plan tier.
In terms of subscription payments for Ultimate Multisite, you can use the [Ultimate Multisite: WooCommerce Integration Add-on](https://ultimatemultisite.com/product/woocommerce-integration/) to allow your Ultimate Multisite clients to pay using WooCommerce gateways on your main site. In that way, you can tap into the huge library of payment gateways developed for WooCommerce and use them to bill your Ultimate Multisite clients.

= Is there a way to migrate subscriptions from WPMUDEV Pro Sites? =

Yes, Ultimate Multisite now offers you a helpful tool to get you to migrate your Pro Sites network.

= Why is the “Allowed Plugins” tab empty on my Plan Edit Page? =

Ultimate Multisite only lets you allow or deny access to plugins not network-activated on your network. When a plugin is network-activated, by its very nature, it will be loaded by default on every site of your network.
If you do not see any plugins listed on the “Allowed Plugins” tab, check if the desired plugin is network-active or not.

= Can I use my own Pricing Table design? =

Yes. Since version 1.4.0, Ultimate Multisite supports template overrides.

= Does Ultimate Multisite work with WP Engine? =

Yes. Ultimate Multisite was always supported by WP Engine, but getting domain mapping to work required manual extra steps from the admin (adding the domain to the WP Engine panel). This is no longer the case since version 1.6.0. Ultimate Multisite integrates directly with the WP Engine API and domains get added to the panel automatically after mapping.

= Which hosting provider do you recommend? =

Ultimate Multisite should work with any hosting provider. The only difference is that some hosting company like Closte, Serverpilot, WPMUDEV, WP Engine, Cloudways, Gridpane and Runcloud.io has a tighter integration for domain mapping capabilities so they work out of the box. For other hosts that don't use cpanel, you may need to set up domain mapping manually.
For a private server with a dedicated IP, the webserver can be setup to serve the wordpress install by default and no extra steps are required for domain mapping.

= Site screenshots show a Cloudflare challenge page instead of the actual site =

Ultimate Multisite uses [Microlink](https://microlink.io/) as its primary screenshot provider and falls back to [thum.io](https://www.thum.io/) if Microlink is unavailable. If your network is behind Cloudflare with Bot Fight Mode or similar protections enabled, the screenshot service may be blocked and return a Cloudflare challenge page instead of your site screenshot.

**Solution:** Create a Cloudflare WAF exception rule to allow the screenshot service crawlers, or temporarily disable Bot Fight Mode for screenshot generation.

**Note:** Screenshots require sites to be publicly accessible. Local development environments cannot generate screenshots regardless of Cloudflare settings. Microlink's free tier allows 50 screenshot requests per day without an API key — this is generally sufficient since screenshots are only taken once per site at creation time.

== Requirements ==

- WordPress Multisite 5.3 or higher
- PHP 7.4.30 or higher
- MySQL 5.6 or higher

== Screenshots ==

1. Ultimate Multisite settings pages.
2. Creating products and subscription plans.
3. Managing sites across the multisite network.
4. Registration and checkout form builder.

== Support ==

For support, please open an issue on the [GitHub repository](https://github.com/superdav42/wp-multisite-waas/issues).

== External Services ==

This plugin connects to external services to provide optional functionality. All services are disclosed during setup and can be enabled or disabled as needed.

= Geolocation Services =

**MaxMind GeoLite2**
- Downloads a geolocation database (no personal data sent)
- Used only when geolocation features are enabled
- https://www.maxmind.com/en/privacy-policy

**IP Lookup APIs**
- Used to determine public IP address (no data stored)
- Services include IPify, IPinfo.io, IP-API, and others

= Plugin Updates and Add-ons =

**Ultimate Multisite Update Server**
- Sends site URL, plugin version, and license metadata
- Used for plugin and add-on updates
- https://ultimatemultisite.com/privacy-policy/

= Payment Processing =

**Stripe**
- Processes card payments and subscriptions
- When using the Stripe integration, a 3% fee per-transaction is applied to support ongoing development. This fee is waived for sites that have purchased any addon from ultimatemultisite.com. The fee is collected by Stripe as part of the payment and does not affect the amount charged to your customers.
- https://stripe.com/privacy

**PayPal**
- Processes PayPal payments
- https://www.paypal.com/us/legalhub/privacy-full

= Site Screenshots =

**Microlink** (primary)
- Generates site thumbnail screenshots using a headless browser
- Sends only the target site URL; no user data is transmitted
- Free tier: 50 requests per day without an API key
- https://microlink.io/privacy

**thum.io** (fallback)
- Used as a fallback when Microlink is unavailable
- Sends only the target site URL; no user data is transmitted
- https://www.thum.io/

= Hosting Integrations =

Integrations may send site configuration data and API credentials only when explicitly enabled.

Supported providers include:
- Cloudflare
- Closte
- Cloudways
- GridPane
- WPMU DEV

= Usage Tracking (Opt-In) =

Anonymous telemetry is **disabled by default** and requires explicit opt-in.

Data collected includes:
- WordPress and PHP versions
- Plugin version and enabled add-ons
- Anonymized usage ranges

No personal data, domains, IP addresses, or payment information are collected.

== Changelog ==
Version [2.10.1] - Released on 2026-05-05
- Fix: Unavailable templates are now hidden from the customer panel template grid
- Fix: Template switching no longer truncates the current template description text
- Fix: Fatal error prevented when global $wp_query is null during early-hook query access
- Fix: Stripe checkout preflight now correctly handles null or WP_Error customer objects
- Fix: Site deletion now propagates errors to prevent silent redirect on failure

Version [2.10.0] - Released on 2026-05-05
- New: PayPal guided setup wizard for manual credential entry with OAuth flag gate for seamless gateway configuration
- New: Template switch customer panel redesigned with current-template card, persistent grid, and "Reset current template" button
- Fix: Template switching no longer hangs the UI on AJAX failure
- Fix: Template switching permission states secured against unauthorized access
- Fix: Site override inputs validated before saving
- Fix: Billing address prompt now shown when address is empty
- Fix: PHP 8.1 null-to-string deprecation notices resolved
- Fix: Currents lazy-loaded before init hook to prevent timing issues
- Fix: Filtered SSO path respected across all login flows
- Fix: Blank site identity options preserved on save

Version [2.9.3] - Released on 2026-05-04
- Fix: Mapped domain URLs no longer contain duplicate port numbers
- Fix: Redirect hosts and cookie domains now strip port numbers, preventing authentication failures on non-standard ports
- Fix: CyberPanel integration now correctly uses child domains for domain mapping
- Fix: Cookie-less cross-domain SSO token redirects are handled reliably in all cases
- Fix: SSO login flow correctly carries return_url through cross-domain redirects, including when visiting the main login page while already logged in
- Fix: 13 bugs in site template switching (override_site) that could cause customer site corruption are resolved
- Fix: Checkout form editor is now fully functional on mobile devices
- Fix: Auto-generated site URLs now use available domains correctly

Version [2.9.2] - Released on 2026-05-01
- Fix: Screenshot URLs no longer contain a doubled https:// scheme when the site URL already includes a protocol
- Fix: Add-on sunrise.php path now resolved relative to WP_CONTENT_DIR instead of WP_PLUGIN_DIR, fixing add-on activation on non-standard WordPress installs

Version [2.9.1] - Released on 2026-05-01
- New: Checkout Forms added to admin bar quick links
- Fix: Trial period now correctly applied for returning customers whose cancelled subscription had zero renewals
- Fix: Site import no longer fails when the target URL has no http:// scheme
- Fix: Export modal now downloads the ZIP file immediately on synchronous export
- Improved: Screenshot provider switched to Microlink (free, 1024x768 viewport) with thum.io fallback, replacing unreliable mShots

Version [2.9.0] - Released on 2026-04-30
- New: Single-site export and import added under Tools > Export & Import
- Fix: Export ZIP files now served through an authenticated download endpoint
- Fix: SQL injection risk and query issues in pending export/import queries corrected
- Fix: Pending site not published when admin manually verifies customer email
- Fix: Orphaned pending_site records cleaned up when membership is missing
- Fix: Settings nav padding and search anchor navigation corrected
- Fix: Pending sites now shown first in the All Sites view
- Fix: Screenshot provider (mShots) User-Agent header added to prevent 403 errors
- Fix: Import cron schedule circular dependency resolved
- Fix: Tour IDs normalised to underscores in user settings keys
- Improved: ZipArchive now used instead of Alchemy/Zippy for better compatibility

Version [2.8.0] - Released on 2026-04-29
- New: Enable Jumper toggle added to Other Options settings UI
- New: Status column added to the checkout forms list table
- New: Addon sunrise file loader for custom MU-plugin sunrise extensions
- Improved: Removed error-reporting opt-in setting from settings page
- Fix: Thank-you page site card — image now constrained and links styled correctly
- Fix: Screenshot provider switched from thum.io to WordPress.com mShots
- Fix: Enable Registration and Default Role now set correct defaults on fresh install
- Fix: get_site_url() no longer returns empty when domain includes a port
- Fix: Clone media files now copied correctly when copy_media setting was empty
- Fix: Object cache invalidated correctly after network-activate sitemeta write
- Fix: Custom domain auto-promoted to primary on DNS verification for 3-part domains
- Fix: Pending membership cancelled when expired payment is cleaned up
- Fix: Password strength checker rebound after inline login prompt dismissed
- Fix: Infinite page reload stopped on thank-you page when site already created
- Fix: WP core registration option synced on plugin activation and settings save
- Fix: Null expiration guard added in calculate_expiration for PHP 8.4 compatibility
- Fix: Duplicate signups blocked when customer already has an active membership
- Fix: Null check added for date_expiration in checkout
- Fix: Site provisioning hardened — limitations, membership inference, domain promotion
- Fix: Pre-install check status label corrected to NOT Activated when check fails
- Fix: Checkout domain used for email verification URLs
- Fix: Auto-login after checkout when no password field is present
- Fix: Free memberships no longer expire — treated as lifetime
- Fix: Email verification gate holds site publish until customer verifies email
- Fix: SES v2 API endpoint base path and identity route corrected
- Fix: wu_inline_login_error hook emitted in pre-submit catch block

Version [2.7.0] - Released on 2026-04-22
- New: Inline login hooks for smoother user experience during checkout and signup
- Fix: Reclaim orphan pending_site on WooCommerce order completion
- Fix: Prevent duplicate WordPress users on checkout retry
- Fix: Preserve pending_site in transient when membership is cancelled
- Fix: Add null-guard for $this->membership in downgrade cart type paths
- Fix: Fix set_demo_behavior fatal TypeError on PHP 8 when null passed via attributes()
- Fix: Fix various PHP warnings
- Improved: Replace captcha-specific code with generic JavaScript hooks

Version [2.6.3] - Released on 2026-04-17
- Fix: Reverted billing-period switch scheduling as a downgrade — the feature introduced in 2.6.2 caused unexpected renewal behaviour and has been rolled back for further refinement.
- Fix: Site duplication now falls back to subdomain for blogname when the site title is empty, preventing malformed hostnames.
- Fix: Core wp_blogs and wp_blogmeta tables are now protected from accidental DROP TABLE during site table management.
- Fix: Admin styles for wu-form modals now load correctly on addon pages.

Version [2.6.2] - Released on 2026-04-16
- Fix: Switching a membership from a longer billing period (e.g. yearly) to a shorter one (e.g. monthly) is now scheduled as a downgrade for the next renewal instead of being blocked with an "active agreement" error.
- Fix: Encrypted OAuth client secrets are now always regenerated during release builds, so connecting to ultimatemultisite.com no longer fails with "invalid_client / No client id supplied".
- Fix: Standardised GitHub owner slug to Ultimate-Multisite so badge URLs, installation links, and update checks all resolve correctly.
- Fix: Network activation error handler now shows the real WP_Error message when WordPress returns an array payload, instead of the generic fallback.
- Improved: GitHub releases are now published immediately instead of as drafts, so the zip is available right after tagging.

Version [2.6.1] - Released on 2026-04-15
- New: Template selection field added to single-step and multi-step checkout form templates.
- New: Network Activate button in setup wizard for non-network-active plugin installs.
- New: Atomic increment_item() method on BerlinDB Query class for safe concurrent updates.
- New: CyberPanel host icon SVG added.
- Improved: Renamed Cloudflare for SaaS to Cloudflare Custom Hostnames in user-facing strings.
- Improved: WordPress.org plugin directory listed as recommended installation method.
- Improved: Better guidance for users who install the wrong ZIP file.
- Improved: Renamed Composer package from devstone/ to ultimate-multisite/.
- Improved: Skip plugin autoloader when Bedrock root autoloader has already loaded dependencies.
- Fix: Default role in Login & Registration settings no longer incorrectly shows Administrator.
- Fix: Old WP Ultimo logo replaced with dashicons-networking SVG for menu icon.
- Fix: Network-activate handler moved to external JS file for reliable loading.
- Fix: Remaining network activation reliability gaps closed.
- Fix: Redirect integration wizard finish button to integrations settings tab.
- Fix: Replace missing Tailwind classes with WP button classes on setup wizard complete step.
- Fix: Write directly to sitemeta for reliable network activation during install.
- Fix: Autoloader no longer skips WP_Ultimo\Hooks when sunrise pre-loads BerlinDB.
- Fix: Preserve saved gateway and skip paid gateways on free carts at checkout.
- Fix: Prevent PWYW pricing type from being reset to free on save.
- Fix: Remove extra padding-right on number inputs and fix flex group overflow.
- Fix: Placeholder option falsy comparison corrected with explicit value attribute.
- Fix: Select list 'checked' attribute corrected to 'selected' for option elements.
- Fix: Success banner now shows immediately on multisite wizard complete page.
- Fix: Button type and data-ajax-nonce added to kses allowlist for AJAX buttons.

Version [2.6.0] - Released on 2026-04-13
- New: CyberPanel hosting integration with domain mapping and auto-SSL.
- Fix: Redirect loop and 403 error when accessing subsite wp-admin.
- Fix: PHP 8.1+ TypeError that hides Save button on Domain Mapping settings.
- Fix: Subdomain slug sanitization in wu_create_site to prevent malformed hostnames.
- Fix: Missing postmeta for nav_menu_item, attachment, and Elementor posts on site clone.
- Fix: Elementor Kit postmeta preserved across all URL replacement passes during duplication.
- Fix: Template switch guard when get_available_site_templates returns false.
- Fix: Stale is_publishing flag auto-reset to prevent infinite 'Creating' spinner.
- Fix: PayPal button branding skipped when checkout does not require payment.
- Fix: AJAX search_models and selectize templates restored after accidental removal.
- Fix: Default gateway pre-selection removed and dead valid_password validation cleaned up.
- Fix: mpdf psr-http-message-shim patch updated for v2 interface compatibility.
- Fix: Activity-stream assets skipped on non-network admin dashboard.
- Improved: Cloudflare integration loop guard, UI void types, and static analysis fixes.
- Improved: Checkout pending site creation dual retry path removed for reliability.

Version [2.5.2] - Released on 2026-04-10
- Fix: PHP return type declarations removed from base/abstract classes to restore addon compatibility.
- Improved: SVN deploy reliability in release workflow.
- Fix: DejaVuSansMono.ttf missing exception when viewing invoices.
- Fix: Command palette icons missing and console errors on WordPress 7.
- Fix: Menu icon not rendering on all admin pages (now uses SVG data URI).
- Improved: GitHub Actions CI upgraded to Node.js 24.
- Improved: Release workflow now validates WP_Ultimo::VERSION constant.

Version [2.5.1] - Released on 2026-04-09
- Fix: Dashboard activity-stream widget CSS not loading on network admin dashboard.
- Fix: Multi-network site routing failure caused by hard-coded site_id default.
- Fix: Domain normalization before root-domain comparison in wu_create_site.
- Fix: Client-side checkout validation no longer flags fields on other steps.
- Fix: Over-strict validation_rules() rejecting minimal abilities input.
- Fix: Template selection blocked when product uses default (allow all) mode.
- Improved: SVN deploy now downloads artifact instead of rebuilding with --no-dev.
- Improved: Dev files excluded from release archive.

Version [2.5.0] - Released on 2026-04-06
- New: Simple checkout form template with auto-generated credentials for streamlined signups.
- New: PayPal PPCP (PayPal Commerce Platform) integration with full compliance review.
- New: WordPress Command Palette replaces legacy Jumper navigation.
- New: Addon management infrastructure with manifest and CI workflow.
- New: WP REST API standard pagination on all wu/v2 collection endpoints.
- New: Resubscription flow for cancelled memberships.
- New: Reactivation flow for cancelled memberships.
- New: Client-side JavaScript validation on checkout forms.
- New: Cloudflare Custom Hostnames integration for automatic SSL on mapped domains.
- New: DNS record management for mapped domains.
- New: Template Library behind WU_TEMPLATE_LIBRARY_ENABLED feature flag.
- New: External Cron Service behind WU_EXTERNAL_CRON_ENABLED feature flag.
- New: Amazon SES transactional email integration.
- New: WordPress.org SVN deploy in release workflow.
- New: Downgrade handling in four limit classes.
- New: WP Performance Action in CI workflow with regression detection.
- New: Signup flow metrics and post-signup activity tracking.
- New: Plesk and Laravel Forge hosting integrations.
- New: Demo product support.
- New: Comprehensive unit test coverage across 90+ files (admin pages, gateways, models, managers, signup fields, list tables, API schemas).
- Fix: GlotPress compatibility for cross-domain SSO.
- Fix: PayPal merchant_id in purchase_units, debug header logging, and merchant status validation.
- Fix: Safari/iOS autofill not triggering password strength check on checkout.
- Fix: Pay-what-you-want product pricing bugs.
- Fix: Coupon removal button and duplicate field ID on checkout form.
- Fix: Site_Manager::get_collection_params() fatal error.
- Fix: REST API serialization bugs for Notes, Limitations, and Membership meta.
- Fix: Currency precision defaults to 2 to prevent wizard failures and NaN prices.
- Fix: Cookie domain scoped to most specific subdomain for subsite auth.
- Fix: Stripe deprecated redirectToCheckout replaced with direct URL redirect.
- Fix: Password reset stays on subsite domain.
- Fix: Addon pricing now only charges for new products during upgrades.
- Fix: Widen jetpack-autoloader constraint and fix paragonie/random_compat replace.
- Fix: PHP 8.2 compatibility improvements.
- Fix: Numerous admin UI, checkout, and SSO stability improvements.
- Revert: FrankenPHP integration removed pending further testing.

Version [2.4.13] - Released on 2026-XX-XX
- Fix: Selectize dropdowns with more than 1000 options (e.g. TLD lists) were silently truncated due to the library's default maxOptions limit.
- Fix: Returning to checkout after an abandoned signup no longer charges full price instead of the trial price.
- Fix: Returning to a checkout URL after a cancelled payment no longer shows an "invalid status" error.
- Fix: A declined credit card no longer permanently blocks the customer from starting a free trial.
- Fix: Choosing a site name that is already taken now shows a clear error message instead of silently adding a number to the name.
- Fix: Customers who cancel during an active trial are no longer incorrectly marked as having used their trial.
- Fix: If site creation fails during signup, the system can now retry automatically instead of getting stuck on "Creating your site" forever.
- Fix: Site screenshots are no longer taken before the template has finished copying, which was producing blank images.
- Fix: Site creation for complex templates no longer times out on servers with strict PHP execution limits.
- Fix: The "pending payment" popup no longer appears on every login after an abandoned checkout.
- Fix: Customers with an abandoned checkout can now choose a different plan without being blocked by the old pending payment notice.
- Fix: The "thank you" page now detects when a site is ready within seconds instead of waiting up to 4 minutes, even with payment gateways that process asynchronously (e.g. Stripe).
- Fix: The "thank you" page no longer breaks if the network connection drops briefly during site creation polling.
- Fix: The "thank you" page now works correctly with CDN and page caching plugins that serve stale content after site creation completes.
- Fix: PHP 8.2 compatibility issue in folder creation that could cause a critical error during the setup wizard.

Version [2.4.12] - Released on 2026-02-27
- New: Send Invoice and Resend Invoice workflows for payments.
- New: Standalone "Pay Invoice" checkout form for invoice payments without a membership.
- New: Payment Methods element displaying current card info and change payment method flow via Stripe Billing Portal.
- New: System events for invoice sent, recurring payment failure, and membership expired with email notifications.
- New: Checkout form debug autofill button when WP_ULTIMO_DEBUG is enabled.
- New: Domain meta table for storing metadata on domain records.
- New: Extensibility hooks on domain mapping widget and domain list table.
- New: Node Management capability interface for hosting integrations.
- Fix: Password strength validation no longer blocks checkout when the meter element is absent.
- Fix: %2F being stripped from SSO redirect URLs breaking some WooCommerce URLs.
- Fix: Stripe Checkout gateway updated to current API — uses price_data format, proper subscription/payment mode, and skips zero-amount items.
- Fix: Removed deprecated Stripe API version pin and product type parameter.
- Fix: Membership cancellation now properly cancels the gateway subscription before the local membership.
- Fix: Payments no longer require a membership, enabling standalone invoices.
- Fix: Cart no longer overrides duration for products with independent billing cycles.
- Fix: Network installer correctly sets core multisite table names.
- Fix: Admin page save handlers now return proper bool values.
- Improved: "Change Payment Method" replaces the destructive "Cancel Payment Method" flow.
- Improved: Integration wizard API key fields use password input type to prevent browser autofill.
- Improved: Integration wizard shows error state on test failure and improved navigation.
- Improved: Addon settings grouped under dedicated admin bar submenu.
- Improved: Select2 multi-select preserves saved option ordering.
- Improved: PayPal fires payment_failed event on IPN failures.
- New: Addon compatibility headers (`UM requires at least`) with network admin version mismatch notices.
- New: `wu_get_checkout_form_by_slug` filter for addon-registered virtual checkout forms.
- New: Cart filters `wu_cart_show_no_changes_error` and `wu_cart_addon_include_existing_plan` for addon checkout flows.
- New: `wu-register-domain` added to checkout element slug list for addon checkout pages.
- Fix: AJAX search_models not passing query parameters to model functions.
- Fix: Template validation failing when an addon product is selected at checkout.
- Fix: New subdomain sites created with http:// instead of https:// causing infinite redirects.
- Fix: mPDF PSR-log aware trait patch applied to wrong file on some Composer versions.
- Improved: Default minimum password strength lowered from "strong" to "medium" for better usability.
- Improved: Dashboard first-steps widget shows contextual action labels for completed steps.

Version [2.4.11] - Released on 2026-02-16
- New: Settings API for remote settings management.
- New: Pay-What-You-Want (PWYW) pricing with per-product custom amounts and recurring options.
- New: Billing-period controls for discount codes and membership creation.
- New: Better error page for customers and admins.
- New: Stripe Connect via secure proxy server — platform credentials no longer distributed in plugin code.
- New: Stripe Checkout Element with automatic billing address handling and removal of application fees.
- New: Multisite Setup Wizard — guides single-site installs through enabling and configuring WordPress Multisite.
- New: Modular hosting integration system with encrypted credential storage.
- New: Form field normalization CSS for consistent checkout and login styling across all themes and page builders.
- Fix: Password strength setting not being applied during checkout.
- Fix: Encoded characters stripped from URLs during SSO and domain mapping redirects.
- Fix: Inline login prompt stability and missing validation for existing emails at checkout.
- Fix: Site title field error caused by third-party plugin conflicts.
- Fix: URL replacement failing for Elementor content on subdirectory multisite installs.
- Fix: Country and state selection issues in checkout.
- Fix: Duplicate Country/ZIP fields appearing on Stripe checkout.
- Fix: Invoice PDF download failing with expired nonce.
- Fix: Settings page crash on PHP 8.4.
- Fix: Single-site compatibility issues and dashboard widget setup status detection.
- Fix: Rewrite rules now flushed when signup pages are created or modified.
- Improved: Admin pages no longer loaded on frontend and cron requests for better performance.
- Improved: Security hardening for input validation, credential storage, and cart processing.
- Improved: Expanded automated test coverage across checkout, payments, and admin functionality.

Version [2.4.10] - Released on 2026-01-23
- New: Configurable minimum password strength setting with Medium, Strong, and Super Strong options.
- New: Super Strong password requirements include 12+ characters, uppercase, lowercase, numbers, and special characters - compatible with WPMU DEV Defender Pro rules.
- New: Real-time password requirement hints during checkout with translatable strings.
- New: Themed password field styling with visibility toggle and color fallbacks for page builders (Elementor, Kadence, Beaver Builder).
- New: Opt-in anonymous usage tracking to help improve the plugin.
- New: Rating reminder notice after 30 days of installation.
- New: WooCommerce Subscriptions compatibility layer for site duplication.
- Improved: JSON response handling for pending site creation in non-FastCGI environments.

Version [2.4.9] - Released on 2025-12-23
- New: Inline login prompt at checkout for existing users - returning customers can sign in directly without leaving the checkout flow.
- New: GitHub Actions workflow for PR builds with WordPress Playground testing - enables one-click browser-based testing of pull requests.
- Fixed: Template switching now preserves images - URLs in post content are correctly updated when switching templates.
- Fixed: Email manager initialization during setup wizard - system emails are now correctly created.
- Fixed: Template switching permission and capability checks improved with better error messaging.
- Fixed: Multiple primary domains being set.
- Improved: Template selection logic with better null safety and smart fallbacks for pre-selected templates.
- Improved: Compatibility for legacy filter `wu_create_site_meta` from WP Ultimo v1.
- Improved: Added support for Runcloud V3 API

Version [2.4.8] - Released on 2025-11-21
- New: Added MCP (Model Context Protocol) Server integration.
- New: Added support for multi-network installations with network-specific customers, memberships, and products.
- New: Added magic login links for SSO when third-party cookies are disabled.
- New: Added admin notice when invalid COOKIE_DOMAIN constant is detected.
- Fixed: WooCommerce subscriptions incorrectly set to staging mode when site is duplicated.
- Fixed: Single-Sign-On (SSO) authentication issues with custom domains.
- Fixed: Template switching functionality and improved singleton pattern usage across codebase.
- Improved: Enhanced domain mapping element and login form handling.
- Improved: Better redirect handling for sites within the network.
- Improved: Faster site creation after checkout.

Version [2.4.7] - Released on 2025-10-31
- Fixed: Conflict with YesCookie plugin.
- Improved: Thumbnail image quality on template selection in the checkout.
- Fixed: Redirect from secondary domains to primary domain.
- Fixed: Choosing templates for checkout form builder.
- Fixed: Extra domain creation with subdirectory installation.
- Improved: Allow html in custom domain instructions.

Version [2.4.6] - Released on 2025-10-15
- Fixed: Toggle switches in RTL languages.
- Fixed: Rendering admin pages for legacy addons.
- Fixed: Some Stripe API errors.
- Improved: Better site URL autogeneration and added preview option.
- Fixed: Escaping too much HTML.
- Fixed: Saving HTML in credits field.
- Improved: Type safety in code.
- Fixed: Downgrading during a trial extending the trial period.


Version [2.4.5] - Released on 2025-09-30
- Fixed: Custom domain check when downgrading.
- Fixed: Bug in Action Scheduler.
- Fixed: Hosting integration wizard freezing during setup.
- Improved: More robust handling for login URL obfuscation when 404 template unavailable.
- Improved: Better error messaging for installer with sanitized HTML display.
- Added: Recommended plugins installer functionality.
- Added: New end-to-end testing framework.
- Added: Option to include a "Powered by..." message in the footer of customer sites.
- Added: Install recommended "user-switching" plugin during setup wizard.
- Improved: Autogeneration of site urls and usernames to be more human friendly.
- Improved: Code style and return type consistency across codebase.

Version [2.4.4] - Released on 2025-09-17
- Fixed: Saving email templates without stripping html
- New: Option to allow site owners to edit users on their site
- Fixed: Invoices not loading when logo is not set
- Fixed: Verify DNS settings when using a reverse proxy
- Improved: Lazy load limitations for better performance and compatibility
- New: Add Admin Notice if sunrise.php is not setup
- New: Option to not always create www. subdomains with hosting integrations
- Improved: Plugin renamed to Ultimate Multisite

Version [2.4.3] - Released on 2025-08-15
- Fixed: Bug in Slim SEO plugin
- New: Addon Marketplace
- Fixed: Custom logo not showing on emails and invoices
- Fixed: Limitations failing to load

Version [2.4.2] - Released on 2025-08-07
- Fixed: Authentication of the API
- Fixed: Saving checkout fields
- Fixed: Creating Products and Sites
- Fixed: Duplicating sites
- Improved: Performance of switch_blog
- Improved: Remove extra queries related update_meta_data hook and 1.X compat
- New: Addon Marketplace
- Improved: Update currencies to support all supported by Stripe
- Improved: Template previewer

Version [2.4.1] - Released on 2025-07-17
- Improved: Update Stripe PHP Library to latest version
- Improved: Update JS libs
- Fixed: Fatal error that may occur when upgrading from old name.
- Improved: Added check for custom domain count when downgrading.

Version [2.4.0] - Released on 2025-07-07
- Improved: Prep Plugin for release on WordPress.org
- Improved: Update translation text domain
- Fixed: Escape everything that should be escaped.
- Fixed: Add nonce checks where needed.
- Fixed: Sanitize all inputs.
- Improved: Apply Code style changes across the codebase.
- Fixed: Many deprecation notices.
- Improved: Load order of many filters.
- Improved: Add Proper Build script
- Improved: Use emojii flags
- Fixed: i18n deprecation notice for translating too early
- Improved: Put all scripts in footer and load async
- Improved: Add discounts to thank you page
- Improved: Prevent downgrading a plan if the post type would be over the limit
- Fixed: Styles on thank you page of legacy checkout

Version [2.3.4] - Released on 2024-01-31
- Fixed: Unable to check out with any payment gateway
- Fixed: Warning Undefined global variable $pagenow

Version [2.3.3] - Released on 2024-01-29

- Improved: Plugin renamed to Multisite Ultimate
- Removed: Enforcement of paid license
- Fixed: Incompatibilities with WordPress 6.7 and i18n timing
- Improved: Reduced plugin size by removing many unnecessary files and shrinking images

For the complete changelog history, visit: https://github.com/superdav42/multisite-ultimate/releases
