Release notes / WB Ad Manager Pro
Premium Plugin Plugin

WB Ad Manager Pro

Selling ad placements one-by-one does not scale. WB Ad Manager Pro turns the site into a self-serve advertising portal: members top up credits through your existing WooCommerce or membership billing and run their own campaigns.

7 releases
v1.6.0 latest
May 25, 2026 shipped

v1.6.0 Latest

May 25, 2026
New 4 Improve 3 Fix 11 Security 2 Dev 3

New

  • Buy ad credits directly with Stripe or PayPal. Advertisers can top up their credit balance using a card or PayPal account without going through a WooCommerce / EDD / PMPro checkout. The hosted-checkout flow is server-authoritative and resilient to gateway retries, so a single click can't be charged twice.
  • Weekly performance report. Admins now receive an opt-in weekly email summarising impressions, clicks, CTR, and top-performing placements across the whole site. Useful for monitoring trends without opening the dashboard every day.
  • Target ads by user role and BuddyPress member type. The ad-targeting module now respects both standard WordPress roles and BuddyPress member types, so you can show different creatives to "Gold members" vs "Editors" without writing any code.
  • "Visitors Reached" metric on the analytics dashboard. The previous Unique Visitors counter was harder to interpret at a glance; the new Visitors Reached tile is end-user-focused and clearly labelled.

Improve

  • Membership lifecycle emails (subscribe, switch, cancel, reactivate, payment-failed, and 3 more) are now stored as theme-overridable template files instead of being hard-coded in PHP. Sites can customise the markup without forking the plugin.
  • The `[wbam_submit_ad]` shortcode markup is now a theme-overridable template, so custom submission forms no longer require child-class extensions.
  • Replaced a confirm-dialog implementation with the shared accessible modal used elsewhere in the plugin - keyboard users no longer hit a native browser confirm.

Fix

  • "Unique Visitors" was being inflated on busy campaigns. The number now reflects actual unique visitors instead of double-counting some events.
  • The "Performance Over Time" chart on the analytics dashboard now actually loads. Previously the chart could come up blank or showing zero on every day.
  • The "Top Placements" widget was reading from the wrong analytics table on some installs, so the list could be empty or out-of-date. It now uses the same data source as the rest of the dashboard.
  • The Device Breakdown chart now reflects real traffic instead of all-Unknown. (This release wires Pro to consume the device-type signal that the free plugin started recording in 2.8.1.)
  • Editing a "Rich Content" ad from the backend no longer reverts the ad type back to the default on save. A one-time migration also normalises any ads that had been stored with the old "rich" type slug.
  • Re-running the setup wizard no longer creates a duplicate advertiser record for the site owner. The wizard now detects an existing advertiser profile and reuses it.
  • The "Switch Plan" confirmation modal now shows the real prorated amount you will be charged or credited, instead of the new plan's full price. (The actual charge was always prorated correctly - only the modal was wrong.)
  • The active-listings count and the categories count on the classifieds admin screen no longer disagree. Both numbers now use the same query.
  • Confirmation dialogs on the advertiser dashboard now appear consistently - previously some confirm prompts could silently no-op on certain themes.
  • Closed 6 QA-rejected bugs in the campaign list, analytics filtering, and campaign override flows. Closed 2 QA-rejected bugs in the advertiser portal.
  • 9 previously-shipped customer fixes were re-browser-verified during the 1.6.0 audit pass - every one is now covered by an automated upgrade-path test (Free → Pro), so they won't silently regress in a future release.

Security

  • 6 REST endpoints that previously read `__return_true` for their permission check now use an explicit `REST_Permissions::public_read` gate so the intent is auditable. No behaviour change for legitimate clients.
  • Bundled Wbcom Credits SDK bumped to v1.3.0. Adds a server-authoritative pricing resolver so the direct-pay checkout endpoint cannot accept client-supplied prices. This release introduces the first WBAM feature to use direct-pay (Stripe / PayPal Buy Credits), so the SDK upgrade ships in lockstep with the new gateway flow.

Dev

  • 36 unused capability registrations removed from the database (Database schema 4.0.0). The plugin now registers only the capabilities it actually checks against.
  • Manager classes (Custom_Field_Manager, Geolocation_Manager, Review_Manager, Package_Manager, Advertiser_Manager, Credits_Bridge, Billing_Manager) now return `WP_Error` objects on failure instead of `false`, so callers can surface the actual reason. The new `Manager_Interface` contract makes the pattern enforceable.
  • Centralised advisory-lock helper now wraps every cron callback, so two overlapping cron runs can no longer corrupt analytics counters.

v1.5.0

April 19, 2026
New 21 Improve 11 Fix 20 Security 2 Dev 6

New

  • Five site-owner modes (Publisher, Sponsored Advertisers, Paid Advertiser Portal, Classifieds Marketplace, Full Platform). Pick one during setup and switch anytime from Pro Settings > General. Switching never deletes data.
  • Per-advertiser billing mode (self-serve or managed) so one site can run wallet-based advertisers alongside admin-assigned contracts.
  • Impressions-only analytics option for Publisher mode. Hides Clicks, CTR, and Spent tiles across the portal and admin dashboards.
  • Managed-advertiser UX. Packages show "Contract: N impressions / N clicks / N days" instead of a price. Wallet tab and balance widget hidden. Public registration disabled.
  • Auto-flip to "Custom" mode when admin manually edits module toggles, with a "Reset to previous" path.
  • Complete membership state machine. Subscribe, switch plans with prorated refund, cancel at period end (keeps benefits until renewal date), reactivate while cancelled, past-due grace window for failed renewals.
  • State-aware portal UI. Cancelled and past-due banners, dynamic plan-card buttons (Subscribe, Switch, Current Plan, Current Plan ending).
  • Dedicated email templates for subscribe, switch, cancel, reactivate, and payment-failed events.
  • 3-step setup wizard on first activation. Site Mode, payment adapter, page setup.
  • Direct messaging on classified pages. Real-time conversation view between buyers and sellers.
  • Browse classifieds sort options. Newest, oldest, price low/high, featured first.
  • Classified expiry reminder emails with configurable days-before-expiration.
  • Seven HTML email templates replacing plain-text emails (fund request, welcome, registration, inquiry, report).
  • Admin activation notice with direct links to the pages the plugin created.
  • Seller info card on classified detail page.
  • Wallet tab shows inline credit packs grouped by adapter (WooCommerce, PMPro, MemberPress).
  • Demo data uses real stock images, seeds a campaign per ad, links taxonomy terms, and removes cleanly on uninstall.
  • Plug-and-play default settings seeded on activation across all module tabs.
  • Help page with Pro features, classifieds FAQ, and demo-data guide.
  • Full Lucide icon migration across admin and frontend (about 450 dashicons replaced).
  • Semantic CSS token layer with theme.json inheritance and prefers-color-scheme dark mode across 13 stylesheets. Plugin re-skins to the active theme's palette.

Improve

  • Admin onboarding. admin_as_advertiser defaults ON so site owners can self-test without creating a second user account.
  • Backfill orphan ads when an advertiser record is created.
  • Membership plans submenu moved from Advertisers to Classifieds with a scope note on the list screen.
  • Edit existing membership plans flow plus all fields surfaced on the admin editor.
  • Overview stat cards gate by enabled modules. Classifieds mode shows Active Listings instead of ad-centric cards. Active Campaigns section hidden when campaigns module is off.
  • Unified stat card pattern across Overview, Analytics, Wallet tabs.
  • Consistent empty states (icon, title, description, CTA) across all portal tabs.
  • Removed duplicate headings from Ads, Campaigns, Classifieds, Profile tabs.
  • Membership UI. Green active badge, current-plan card, dimmed current plan in the upgrade grid.
  • Only 2 essential pages auto-created on activation (Dashboard + Classifieds) instead of 5.
  • Package meta saved to the ad post for billing-badge display in the ads list.

Fix

  • Fatal error on fresh install - Site_Mode class was not loaded in the installer.
  • Toast notifications were silently broken since launch. A nested block comment closed the outer JSDoc early so window.wbamToast was never defined. Fixed the syntax and added the missing dependency across 10 consumer scripts.
  • Ad edit form now pre-fills correctly when the ad was saved with the legacy meta-key convention (demo data, classic wizard). Title, image preview, Click URL, and alt text all populate.
  • My Ads cards show real view and click counts (previously always zero). Now reads from wbam_analytics_daily instead of stale post meta.
  • Membership current-plan card cleaned up. Removed empty "Status:" label and duplicate "Current Plan" text under the disabled button.
  • Proration refund on plan switch uses round half-up instead of floor, so a same-day switch gives back the full plan price.
  • Classified review step strips the hierarchical prefix from Category and Location, and omits the Condition row when no condition is picked.
  • Wizard step scroll honours theme sticky-header height so the step title is not hidden under pinned site headers.
  • Unauthenticated advertiser portal login card centered on all viewport sizes.
  • Package placement inheritance. Ads now display at package-configured placements correctly.
  • Ads tab pagination. Pager links no longer 404 inside the WP_Query loop.
  • Geolocation map shows for all users (not just non-owners). Duplicate location text removed.
  • Messaging. Single DM form replaces dual contact/message forms. "Send Message" scrolls to the form.
  • Membership race condition. Subscribe wrapped in a DB transaction with row locking.
  • Campaign status syncs to the ad enabled flag. Paused campaigns stop showing ads.
  • Missing wbam_get_placements() function that caused a fatal on the ad submission form.
  • Disabled module tabs show a "Feature Not Available" notice instead of a blank page.
  • Portal Inquiries tab rendered blank because of a user_id vs advertiser_id mismatch.
  • Setup wizard oversized text and unscrollable viewport at 125% and 150% browser zoom.
  • Classifieds mode dialog description now accurately reads "No paid ads, no link partnerships - classifieds-only marketplace".

Security

  • Replaced bare __return_true REST permission callbacks with named REST_Permissions helpers that gate on module state and emit WP_Error on denial.
  • Registered 12 previously-unsanitized options via Settings API with proper sanitize_callback (license key, credits URL, module configs, page IDs).

Dev

  • 25+ new public hooks documented in docs/HOOKS.md. wbam_pro_before_/after_ filters and actions on Advertiser, Campaign, Classified, and Package managers.
  • 4 ad submission wizard action slots (wbam_pro_ad_form_step_N_after_fields) plus wbam_pro_before_submit_ad filter.
  • REST response-shape filters on Packages and Classifieds APIs (wbam_pro_rest_prepare_*).
  • New Settings_Helper::get_free() cross-plugin bridge with wbam_pro_free_setting_{key} filter.
  • Email templates receive site defaults via the new wbam_pro_email_view_defaults filter.
  • Rotation_Engine memoizes settings per request. Cuts redundant autoload lookups on ad-dense pages.

v1.4.0

March 2, 2026
New 5 Improve 2 Fix 4

New

  • Pre-funded budget reservation system for CPM/CPC campaigns
  • Manual/bank transfer payment with admin approve/cancel flow
  • BuddyPress xProfile seller fields for classified listings
  • wbam_classified_meta table for classified-specific meta storage (DB 2.8.0)
  • Action hooks on all shortcode forms for extensibility

Improve

  • Billing transparency for advertisers
  • Ad submission uses campaign/reservation system

Fix

  • 6 critical plus 4 high-severity data flow issues
  • Campaign builder balance lookup and CPM/CPC validation
  • Double-credit, double-debit, and silent-failure vulnerabilities
  • Module settings save and error handling standardization

v1.3.0

Improve 4 Fix 1

Improve

  • Comprehensive admin documentation with screenshots
  • Add default packages creation on plugin activation
  • Module enable/disable checks across all 10 modules
  • Ad submission simplified to dashboard only

Fix

  • Distribution excludes development files and demo data

v1.2.0

New 4 Improve 1 Fix 1 Security 1

New

  • User Profile Integration - manage advertiser data from the WordPress user edit screen
  • Admin as Advertiser setting - automatically create advertiser accounts for administrators
  • Advertiser user meta for faster lookups
  • Comprehensive demo data generator

Improve

  • Database upgrade to version 2.3.0 with automatic migration

Fix

  • A/B Test winner logic, Link Scanner nonce verification, campaign budget race conditions

Security

  • A/B Test capability check and Stripe payment ownership verification

v1.1.0

Fix 6 Security 2

Fix

  • Campaign budget race condition in record_impression() and record_click()
  • Replace transient-based locking with database-level locks in classified billing
  • Floating-point precision in CPM/CPC calculations
  • Campaign billing race condition, idempotency, and refund negative balance
  • Classified API ownership check and payment order
  • 16 additional bugs from comprehensive audit

Security

  • Fix SQL injection risk in analytics API with whitelist validation
  • GDPR consent detection for CookieYes and other plugins

v1.0.0

Note 1

Note

  • Initial release with analytics, advertiser portal, classifieds, wallet, packages, campaigns, BuddyPress integration, REST API, and email notifications.