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.
Ad Folders screen. Browse ads as folders built from their advertiser and campaign links plus ad tags, with a House ads folder for unassigned ads. Quick actions on the folder: pause or resume the campaign, enable or disable every ad in the folder in one click.
Folder actions run server-side against the whole folder, so pausing a campaign or disabling a folder covers every matching ad regardless of list pagination.
Improve
Advertiser portal navigation is fully reachable and labelled on small screens, with a 40px tap floor at 390px wide.
Drag-and-drop upload validation speaks through the toast toolkit instead of browser alert dialogs.
Credit amounts read as money everywhere in the advertiser portal. The wallet balance, the Credit History rows and the pre-submit cost banner all use the site currency, so an advertiser is no longer comparing "600" in one place with "$84.78" in another.
The pre-submit banner says when credits are taken. Packages that need review say charging happens on approval, the rest say it happens on submit.
Fix
Buying credits by card works end to end: the checkout registers server-authoritative pricing, and credits land on return from the gateway without waiting for a webhook.
The gateway status badge honours each gateway's own required-credential flags, so optional fields no longer show a gateway as unconfigured.
After checkout the customer returns to their wallet tab instead of the site front page.
Rejecting an ad submission or a classified listing refunds exactly what was charged, netted from the ledger, and cannot be repeated for extra credits.
The classifieds listing-duration setting decides expiry, the inquiries toggle hides the whole contact surface, report-a-listing is reachable from the single view, and sidebar category counts roll up descendants to match the filter.
The submissions screen All count reads the real row total.
Membership plan saves follow POST-Redirect-GET, so refreshing the page cannot resubmit.
The analytics ad filter is bounded with search, keeping the dashboard flat on sites with thousands of ads.
Scheduled tasks register and clean up through one registry, so deactivation leaves no orphaned cron events.
Demo data import heals ad ownership on re-import, seeds real credit balances, recovers renamed legacy users, and stores names exactly as written.
Amounts in the portal are no longer rounded or truncated. A $29.99 package quoted "30 credits" and a $0.50 top-up vanished from Credit History as "+0"; both now show in full, and the balance keeps its cents.
Saving Settings > Modules no longer switches off a module whose control it had greyed out. With BuddyPress deactivated, one save of that screen turned the BuddyPress module off and activating BuddyPress later did not bring it back.
Saving the Analytics tab no longer clears the "Delete all data when plugin is uninstalled" setting chosen on the General tab.
Advertiser portal pages recover from a stale page ID instead of showing an empty screen, and the Pages settings tab stops reporting configured pages as unassigned.
The portal's Export CSV button produces a real export, and the favourite heart works on portal listing cards.
Ad Folders lists pending, draft, scheduled and private ads instead of showing only published ones, with each status labelled.
A classified report whose listing has since been deleted says so, instead of offering View and Edit buttons that lead nowhere.
Ad submissions are created as Pending rather than Draft, so they appear in the moderation queue.
Credit purchase options set as a flat list are recognised instead of reading as "credit purchases are not set up on this site yet".
The Analytics link on the General settings tab keeps the admin menu and the tab strip in agreement.
Classified review layout, star rating tap targets, seller card spacing and the messages pane hold together at small widths, and portal input fields have visible borders.
Dev
The bundled Credits SDK moves to libs/wbcom-credits-sdk and updates to 1.6.0, so vendor/ is dev-only. The 3.1.0 package previously carried roughly 8 MB of development tooling because the SDK lived inside vendor/.
"Can this member buy credits?" is answered by the SDK, which requires a mapped product's integration to actually be active. A product mapped to credits while its integration is switched off no longer shows advertisers a Buy Credits button that leads nowhere.
Credit amounts convert through the bundled SDK Money helper, deleting private unit-conversion copies.
Compat
Aligned with WB Ads Rotator with Split Test 3.1.0. Install both updates together.
v3.0.0
July 29, 2026
New 8 Improve 5 Fix 15 Security 3 Dev 4 Compat 1
New
Video ad type: advertisers can submit video creatives, served through the ad engine so impression caps and rotation apply.
Slot-first submission wizard: advertisers pick the slot before the creative, and the size a slot accepts is validated on the server rather than only hinted in the browser.
Advertisers can see which campaigns consumed their credits. The Wallet tab now shows spend per campaign with budget and remaining, so a falling balance can be reconciled without asking the site owner.
A/B testing now promotes the winner: completing a test repoints the placement to the winning creative in one click, instead of silently reverting to the original.
Create and edit campaigns directly from the admin, with a billing default the site owner chooses.
BuddyPress xProfile seller fields can be shown on classified listings (map profile fields to listings in Pro Settings).
Currency and symbol can now be set from Settings, General. The plugin formatted amounts per currency internally but had no admin field to change the US dollar default.
Price per credit for card top-ups (Stripe, PayPal) is set from Settings, Credits, instead of only through a code filter.
Improve
Redesigned admin: every dashboard, list, settings, and detail screen shares one consistent design system, inheriting the free plugin's token palette.
Advertiser list and Transactions screens show live wallet balance and total spent; the two Analytics menu items are disambiguated.
Share of Voice gained an off switch, an option to exclude house ads, and a clear label for where its numbers come from; its copy is now plain English.
Advertisers land on their portal dashboard instead of bare wp-admin.
Ads Per Placement explains what each value does and shows how many ads are actually assigned; slots closed at site level no longer appear there.
Fix
Unlimited-budget campaigns were delivering for free. A campaign with no budget was skipped at activation, correctly, because there is nothing to reserve, but hourly billing then skipped it too on the assumption it had already been charged. Impressions and clicks accrued and no credits were ever taken. Those campaigns are now charged per tick, and pause instead of running on when an advertiser's credits run out.
Credit amounts keep their cents. Charges were rounded down to whole credits before being written to the ledger, so a 147.35 charge was recorded as 147 and the difference was lost on every transaction. Balances, charges, refunds and top-ups are now exact to the cent, and existing balances are converted automatically on update.
Credit purchases now grant the full amount. A product mapped to 100 credits credited only 1, because the payment adapters and gateways wrote whole credits into a ledger stored in minor units; every purchase path (WooCommerce, PMPro, MemberPress, WC Subscriptions, WC Memberships, Stripe, PayPal) now credits the exact amount.
Currency is handled consistently everywhere. Prices, wallet balances, transaction amounts and the ad wizard all use one currency setting for both the symbol and the number of decimals, so currencies without decimals (Japanese yen, Korean won) are no longer padded with ".00" and currencies with three (Kuwaiti and Bahraini dinar) no longer lose their third decimal.
Campaign budgets now actually bill, refuse to overdraw an advertiser's credits, and show advertisers real figures; the combined pricing model is charged instead of running free.
Video ads no longer lose their video URL when an advertiser submits or updates one from the portal.
Stripe checkout no longer fatals when opening a credit purchase.
The advertiser placement picker no longer re-adds slots the site owner closed.
Transactions no longer show top-ups as negative amounts.
An A/B variant swap no longer blanks the ad's other placements on the page.
Fixed the advertiser payment screen (price, terms link, dead top-up buttons), stopped pointing site owners at pages their Site Mode does not have, and fixed a fatal in campaign lifecycle emails.
Bump-to-top now charges the price you configured instead of a fixed default; advertiser records are cleaned up when their user is deleted; classified location styling follows dark mode.
Campaign "started" and "completed" alerts send by email and in-site, only when the campaign has a linked ad; editing a campaign no longer lists the same connected ad twice.
The credits system now degrades to a clear admin notice instead of a white screen when the bundled credits library is incomplete, which can happen after a partial or corrupted plugin update.
Accessibility: the ad submission wizard shows a visible focus outline. Advertisers using a keyboard had no indication of which ad type, package or slot they were on, through the whole flow where they commit to spending.
Security
Fixed a stored XSS in front-end code-ad submissions: raw code is sanitised unless the submitter can post unfiltered HTML, and code or HTML ads are always held for review instead of auto-publishing under an auto-approve package.
Rate-limited the public classified inquiry and report endpoints, and stopped exposing a Google Maps API key in page source.
The handler that writes Pro settings onto an ad now checks permission for that specific ad rather than trusting the request.
Dev
Removed dead code and duplicate surface: two unused admin classes, a method querying a decommissioned table, an orphaned AJAX handler, 12 unused REST routes that duplicated the working AJAX, and a batch of unread localized strings.
The toast/confirm toolkit and the wp-pointer emitter now come from the free plugin instead of being duplicated here, and admin list tables use its shared class list.
Added a video-ad slot-filling API and a per-break impression-claim endpoint (wbam_claim_video_impression) so an in-stream video player sources creatives from WB Ad Manager with rotation and total-impression caps enforced server-side.
Bundled Wbcom Credits SDK updated to 1.5.1 and migrated to money mode.
Compat
Requires WB Ad Manager (free) 3.0.0. Both plugins now share one version number and are released together.
v1.7.1
June 25, 2026
Improve 1 Fix 1 Security 1
Improve
Analytics charts now load from a copy bundled with the plugin instead of an external CDN, so the dashboards work on locked-down or offline sites and make no third-party request.
Fix
Dark mode now shows the About-the-Seller box and the location on a classified listing, plus the inquiries tabs and the link-partnership form in the advertiser portal, with the correct dark background and readable text on BuddyX, BuddyX Pro, and Reign.
Security
Hardened output escaping and input sanitization across the admin and frontend screens.
v1.7.0
June 1, 2026
Fix 3
Fix
Connected ads now appear in the campaign edit form in the advertiser portal.
Dark mode now renders correctly across the advertiser portal, classifieds, and share-of-voice views on BuddyX, BuddyX Pro, and Reign.
Imported demo data now uses targeting condition values that match the available field options.
v1.6.0
New 4 Improve 4 Fix 11 Security 2 Note 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. Advertisers who opt in receive a weekly email summarising impressions, clicks, CTR, and top-performing placements for their own ads. Useful for monitoring trends without opening the portal 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.
Hot in-memory data (keyword caches, ad-targeting lookups) moved from transients to the object cache, so sites running Redis / Memcached avoid the per-request database round-trip.
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.
Note
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
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.
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
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.
WBComDesigns is amazing!
WBComDesigns is amazing. The WP plugins and themes are of top notch quality with lots of features and updated very frequently. Supports are very responsive and helpful. I use Reign with TutorLMS, and the experience is surprisingly smooth.…
Hoang Phan·VN·
The job well done!
The job well done, well in time - Thanks so much Anmbiya and team!
Happy Client·ZA·
WBCOM Designs is Amazing!
WBCOM Designs has constantly updated and supported their plugins and themes. Recently the new BuddyNext project is Amazing! - and the new line of addons like Mediaverse, Jetonomy, Mediashield, and Listora.. are likewise Amazing! - and very…
Edward S.·US·
High quality WordPress plugins and themes
We’ve hosted a number of Wbcom Designs clients on Levamo, and our experience with their products has been very positive. Their plugins and themes are well built, their support has been reliable, and they seem to be very innovative and…
Michael Eisenwasser·US·
I have worked with Wbcom Designs on…
I have worked with Wbcom Designs on several custom development requests for my WordPress platform, and my experience has been excellent.
christian nicolas·BJ·
Love this company
Love this company. Loved the REIGN product. They were there the entire time helping me set things up; and when things went wrong? They were quick to take action and help find a solution.
Fable Fortitude·CA·
Seriously, one of the best "software tech experiences" I've ever had!
After 16 years of buying WordPress themes and plugins, I know exactly what bad support looks like and Wbcom Designs is the polar opposite. My setup was a nightmare: multiple tools, deep integrations, custom configurations that required…
Duston McGroarty·US·
I was using an excellent plugin created…
I was using an excellent plugin created by Wbcom Designs and had both an error and discovered a slight bug in one aspect of the plugin. After creating a support ticket - I got a super-quick response and discovered the error was on my part…
Edward Bonthrone·US·
Excellent Theme, Powerful Plugins and Outstanding Support
I am using the REIGN theme and several plugins from Wbcom Designs on my website. The theme is beautifully designed, and the plugins are user-friendly. Everything works smoothly, and the features are perfect for building professional…