Wbcom Designs WB Ad Manager Docs
Back to product Buy Now

Getting Started

Install WB Ad Manager, run the setup wizard, and get your first ad or cloaked link live.

Installation Guide

WP Ad Manager active on the Plugins list

What You'll Learn

  • How to install WB Ad Manager (free plugin)
  • Initial configuration steps
  • How to verify installation

Prerequisites

Before installing, make sure you have:

  • WordPress 5.8 or higher
  • PHP 7.4 or higher

Installation Methods

Method A: Install from WordPress.org (Recommended)

Plugin install search - 'wb ad manager' keyword result

  1. Log in to your WordPress dashboard
  2. Go to Plugins → Add New
  3. Search for "WB Ad Manager"
  4. Click Install Now
  5. Click Activate

Method B: Upload ZIP File

  1. Download the plugin ZIP from WordPress.org
  2. Go to Plugins → Add New → Upload Plugin
  3. Choose the ZIP file
  4. Click Install Now
  5. Click Activate

After Installation

Once activated, you'll see a WB Ad Manager menu in your WordPress admin sidebar with:

  1. Ads - Create and manage your advertisements
  2. Links - Manage tracked affiliate links
  3. Settings - Configure plugin options

Quick Configuration

Step 1: Configure Basic Settings

  1. Go to WB Ad Manager → Settings
  2. Review the General tab:
    • Optionally hide ads from logged-in users or admins
    • Set minimum content length for paragraph placements
    • Configure maximum ads per page
  3. Click Save Settings

Step 2: Create Your First Ad

  1. Go to WB Ad Manager → Ads
  2. Click Add New
  3. Enter the ad title (internal reference)
  4. Choose an ad type (Image, Rich Content, Code/HTML/JS, AdSense, or Email Capture)
  5. Fill in the ad content
  6. In the Placements metabox, check where the ad should appear (header, footer, content, etc.)
  7. Click Publish

How rotation works: Multiple ads assigned to the same placement rotate automatically based on priority. Higher priority ads display more often.


Verify Installation

To confirm everything is working:

  1. Add this shortcode to any page or post, replacing 123 with a real ad ID:
    [wbam_ad id="123"]
    
  2. View the page on the frontend
  3. Your ad should display
  4. Click the ad and check analytics

What's Included (Free Version)

Feature Description
Ad Management Create and manage unlimited ads
5 Ad Types Image, Rich Content, Code/HTML/JS, AdSense, Email Capture
14+ Placements Header, footer, content, sidebar, and more
Priority-Based Rotation Higher priority ads show more often
Click Tracking Track clicks and impressions
Link Management Create and track affiliate links
Partnership Forms Accept link partnership requests
Shortcodes Display specific ads anywhere

Upgrade to Pro

Want more features? WB Ad Manager Pro adds:

  • Advertiser Portal (let others buy ads)
  • Classifieds Marketplace
  • Wallet & Payments
  • Advanced Analytics
  • Email Notifications
  • And much more!

Learn about WB Ad Manager Pro for advanced features like campaigns, wallet, classifieds, and analytics.


Next Steps


Troubleshooting

Plugin won't activate

  • Check PHP version (requires 7.4+)
  • Check WordPress version (requires 5.8+)
  • Deactivate other plugins to check for conflicts

Menu not appearing

  • Clear your browser cache
  • Try logging out and back in
  • Check user role has admin capabilities

Need help? Visit the support forum

Quick Setup Guide

What You'll Learn

  • How to create ads with placement checkboxes
  • How to display ads on your site
  • How to track performance

Overview

Setting up WB Ad Manager involves two simple steps:

  1. Create Ads - Add your ad content and choose where it appears
  2. Display Ads - Use shortcodes for manual placement anywhere

Ads assigned to the same placement rotate automatically based on priority. No zones to create.


Step 1: Create Your First Ad (5 minutes)

Ads admin list showing 23 ads with status, type, placements, impressions and clicks The ads list showing all your ads with status, placements, and performance metrics

For Image Ads

  1. Go to WB Ad Manager → Ads
  2. Click Add New
  3. Enter:
    • Title: "Summer Sale Banner" (internal only)
    • Ad Type: Image
  4. Upload your banner image
  5. Enter Destination URL: https://example.com/sale
  6. In the Placements metabox, check where this ad should appear (e.g., "After Content", "Sidebar")
  7. Set Priority (1-10) - higher priority shows the ad more often when multiple ads share a placement
  8. Click Publish

For HTML/Code Ads

  1. Go to WB Ad Manager → Ads → Add New
  2. Select Ad Type: Code/HTML/JS
  3. Paste your HTML or JavaScript code
  4. Check your desired placements and Publish

For Google AdSense

  1. Go to WB Ad Manager → Ads → Add New
  2. Select Ad Type: AdSense
  3. Enter your Ad Unit ID
  4. Check your desired placements and Publish

Tip: Add multiple ads and assign them to the same placement. They will rotate automatically, with higher priority ads appearing more often.


Step 2: Display Ads on Your Site (2 minutes)

Using Shortcodes (Manual Placement)

Use shortcodes to display a specific ad by ID anywhere - pages, posts, widgets, or theme templates:

[wbam_ad id="123"]

Display multiple specific ads at once:

[wbam_ads ids="1,2,3"]

Where to add shortcodes:

Location How to Add
Pages/Posts Add directly in content editor
Widgets Use Text/HTML widget in sidebar
Theme Use do_shortcode() in PHP

Using Automatic Placements

Automatic placements insert ads without shortcodes. Check the placements you want directly on each ad:

  • Before Content / After Content
  • Header / Footer
  • Sidebar
  • After Paragraph X (and optionally repeat)
  • And more

Step 3: Verify It's Working (1 minute)

  1. Visit a page where you added the shortcode or have an automatic placement active
  2. Your ad should display
  3. Click the ad to test tracking
  4. Go to WB Ad Manager → Ads
  5. Check the Impressions and Clicks columns

Step 4: Configure Tracking (2 minutes)

Enable Analytics

  1. Go to WB Ad Manager → Settings
  2. Verify tracking is enabled (it is by default)
  3. Optionally enable Exclude Admins to keep your own visits out of stats

View Reports

Stats appear directly in the Ads list: impressions and clicks per ad.


Quick Reference

Shortcodes Available

Shortcode Purpose
[wbam_ad id="123"] Display a single ad by ID
[wbam_ads ids="1,2,3"] Display multiple specific ads
[wbam_link id="123"] Display a managed tracked link
[wbam_links] Display a link list
[wbam_link_url id="123"] Output a raw tracked URL
[wbam_partnership_inquiry] Link request form

Ad Statuses

Status Meaning
Published Active and showing
Draft Saved but not live
Scheduled Will go live on start date
Disabled Manually turned off in Ad Status metabox

Tips for Success

  1. Set priority - Give important ads a higher priority (1-10) so they show more often
  2. Monitor performance - Check impressions and clicks weekly
  3. Rotate creatives - Add multiple ads to the same placement
  4. A/B test - Create variations and compare performance using the built-in comparison metabox
  5. Use scheduling - Set start and end dates for time-limited campaigns

Common Questions

How many ads can I create?

Unlimited. Create as many ads as you need.

Can I schedule ads?

Yes. Set start and end dates when creating an ad.

Does it slow down my site?

No. Lazy loading and query caching are enabled by default.

Can I use Google AdSense?

Yes. Use the dedicated AdSense ad type, or paste AdSense code into a Code/HTML/JS ad.


Next Steps


Upgrade to Pro

Ready for more? WB Ad Manager Pro includes:

  • Advertiser Portal - Let others submit and pay for ads
  • Classifieds - Run a marketplace
  • Wallet System - Accept payments
  • Advanced Analytics - Detailed reports

WB Ad Manager Pro adds campaigns, wallet payments, classifieds marketplace, and advanced analytics.


Questions? Check our Troubleshooting Guide

WB Ad Manager Pro - Installation & Requirements

Setup wizard step 1 - pick how you'll use WB Ad Manager

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

WB Ad Manager Pro adds a monetization layer on top of the free plugin. You get an advertiser portal, a classifieds marketplace, a credit wallet, and the campaign / analytics / A/B testing / link-tracking modules that let you run a real ad platform on your site. Everything in the free plugin keeps working; Pro is strictly additive.

Install it on top of the free plugin once you're ready to let other people (advertisers, classified sellers, community members) pay you to appear in your ad slots or listings.


Requirements

Required

Requirement Minimum Version
WB Ad Manager (free) 2.7.0 or higher
WordPress 5.8 or higher
PHP 7.4 or higher
Valid license key -

WB Ad Manager (free) must be installed and activated before activating the Pro addon. The Pro plugin declares Requires Plugins: wb-ads-rotator-with-split-test and will not activate without it.

Optional

Dependency Adds
BuddyPress or BuddyBoss Advertiser tabs in member profiles, xProfile seller field mapping
WooCommerce WooCommerce checkout as a wallet top-up payment method

Installation

Step 1: Install WB Ad Manager (Free)

If you have not already installed the free plugin:

  1. Go to Plugins → Add New
  2. Search for WB Ad Manager
  3. Click Install Now, then Activate

Step 2: Install the Pro Addon

  1. Download the Pro ZIP from your Wbcom Designs account
  2. Go to Plugins → Add New → Upload Plugin
  3. Select the ZIP file and click Install Now
  4. Click Activate Plugin

Step 3: Enter Your License Key

  1. Go to WB Ad Manager Pro → Settings → License
  2. Paste your license key
  3. Click Activate License

Your license is validated against the Wbcom Designs store. An active license is required to receive automatic plugin updates.


Initial Setup

1. Create Required Pages

Create a WordPress page for the advertiser dashboard and add this shortcode to its content:

[wbam_advertiser_dashboard]

This page becomes the self-service portal where advertisers manage ads, campaigns, wallet, classifieds, and analytics.

If you plan to use classifieds, also create pages for:

[wbam_submit_classified]
[wbam_browse_classifieds]
[wbam_my_classifieds]

2. Configure at least one credit top-up adapter

Pro uses the Wbcom Credits SDK rather than shipping its own Stripe, PayPal, or Razorpay integration. Credits reach an advertiser's wallet through an adapter that connects the SDK to a plugin you already use for payments. Open WB Ads → Pro Settings → Credits and enable whichever adapter matches the plugin(s) active on your site.

Adapter Requires Accepts payment via
WooCommerce Products WooCommerce Any WC-supported gateway - Stripe, PayPal, Razorpay, Square, bank transfer, etc.
WooCommerce Subscriptions WooCommerce Subscriptions Any WC-supported gateway, billed on each renewal
WooCommerce Memberships WooCommerce Memberships Any WC-supported gateway, credit bundled into the membership
Paid Memberships Pro PMPro Gateways supported by PMPro (Stripe, PayPal, Braintree, etc.)
MemberPress MemberPress Gateways supported by MemberPress
Manual / Bank Transfer - Offline payment approved manually from the admin Transactions page

Advertisers can also request manual/bank-transfer top-ups directly from their Wallet tab; you approve them from WB Ads → Transactions → Pending Approval once funds have cleared.

See Wallet and Payments for the full setup walkthroughs for each adapter path.

3. Enable Modules

All Pro features are organized into modules. Each module can be toggled independently at WB Ad Manager Pro → Settings → Modules.

Module What It Provides
Wallet Prepaid credit system, transaction history, payment processing
Advertisers Advertiser accounts, approval workflow, frontend portal
Campaigns Budget-based ad campaigns with CPM/CPC/flat pricing
Packages Pricing tiers for ad submissions
Ad Submissions Advertiser-submitted ad creatives
Classifieds Peer-to-peer classified listings marketplace
Analytics Impression and click tracking with charts
A/B Testing Split-test multiple ad variants
Rotation Fair impression rotation engine
Links Advanced link tracking and keyword linking
BuddyPress BuddyPress/BuddyBoss member integration
Notifications Email notification system

Disabling a module hides its admin menus, deregisters its REST API routes, and removes its shortcodes. Data is preserved in the database.

4. Create Ad Packages

Go to WB Ad Manager Pro → Packages → Add New to create your first pricing package.

Each package defines:

  • Package name and description
  • Pricing model: flat rate, CPM (cost per 1,000 impressions), or CPC (cost per click)
  • Price per unit or flat price
  • Which ad placements the package applies to
  • Duration and impression limits
  • Optional setup fee

Advertisers select a package when submitting an ad through the portal.


Budget Reservation System

For campaigns using CPM or CPC pricing with a set budget, WB Ad Manager Pro pre-reserves the full budget amount from the advertiser's wallet when the campaign is activated. This prevents campaigns from overspending beyond the available balance.

  • On activation: Budget amount is reserved (locked, not spent)
  • As ads serve: Reserved funds are moved to spent incrementally
  • On completion or cancellation: Unspent reserved funds are refunded to the wallet

Flat-rate campaigns do not use budget reservation - the package price is debited at submission.


What's Included

Feature Description
Advertiser Portal 12-tab self-service frontend dashboard
Classifieds System Full listings marketplace with categories, locations, upgrades, inquiries, reports, favorites, and seller following
Wallet System Prepaid credit wallet with full transaction history
Credit Top-up Adapters WooCommerce Products, WooCommerce Subscriptions, WooCommerce Memberships, Paid Memberships Pro, MemberPress, plus manual / bank transfer
Campaign Management Draft, active, paused, completed statuses; CPM/CPC/flat pricing; budget reservation
Analytics Dashboard Impressions, clicks, CTR with date-range charts
A/B Testing Split-test ad variants to find top performers
Ad Rotation Weighted and fair impression rotation engine with share-of-voice reporting
Package System Multiple pricing tiers with placement restrictions
Link Tracking Affiliate link management, keyword auto-linking, link health checks
BuddyPress Integration Advertiser tabs in member profiles, xProfile seller field mapping
REST API Programmatic access to classifieds, campaigns, wallet, and analytics
Audit Log Admin log of all significant account and billing events

Database

On activation, the installer creates all required tables and stores the current schema version in the wbam_pro_db_version option (currently 3.8.0). The installer runs automatic upgrade routines on plugin updates - no manual database work is needed.

Key tables created:

Table Purpose
wbam_advertisers Advertiser accounts
wbam_campaigns Ad campaigns
wbam_classifieds Classified listings
wbam_classified_meta Custom fields for classifieds (added DB 2.8.0)
wbam_classified_inquiries Buyer-to-seller messages
wbam_classified_reports Inappropriate content reports
wbam_transactions Wallet transaction ledger
wbam_packages Ad pricing packages

Next Steps

Flows

End-to-end walkthroughs for the common monetization patterns.

Publish Your First Ad

Home page rendering a header banner ad after first publish

This flow takes a freshly-installed free plugin to a live ad rendered on the frontend with its first impression counted. Budget about 10 minutes. Work top to bottom; each step tells you what you should see before you move on.

Before you start

  • The free plugin WB Ad Manager is installed and activated.
  • You have WordPress admin access on the site you want to serve the ad on.
  • You have one image (JPG / PNG / GIF / WebP) ready to use as the creative, and a destination URL.

Step 1 - Confirm the admin area loaded

  1. Go to WB Ad Manager → Ads in the admin sidebar.
  2. You should see an empty list with an Add New button at the top.

If the menu is missing, the plugin is not active. Fix that before continuing - see Installation.

Step 2 - Create the ad post

  1. Click Add New.
  2. Enter a title. This is internal-only; advertisers never see it.
  3. In the Ad Type control, pick Image.
  4. Upload the creative and enter the Destination URL.
  5. Fill in Alt text for accessibility.

Do not publish yet. The next step decides where the ad appears.

Step 3 - Pick a placement

  1. Scroll to the Placements metabox.
  2. Check After Content. This is the simplest placement to verify because it appears on every single post.
  3. In the Ad Status metabox, leave Priority at the default and leave Session Limit empty.

Step 4 - Publish

  1. Click Publish.
  2. The post moves to Published status and the Ads list now shows one row.

For the full field reference, see Managing Ads.

Step 5 - Render the ad on the frontend

You have two equally valid ways to display it. Pick one.

Option A - automatic placement (zero code)

Because you checked After Content in Step 3, the ad renders automatically at the bottom of every single-post page.

  1. Open any published post on the frontend in an incognito window (so admin-exclude filters do not hide it).
  2. Scroll to the end of the post content.
  3. Confirm your image appears above the comments area.

Option B - shortcode placement (one specific page)

Use this when you want the ad on one page, or inside a theme template.

  1. Edit the page where you want the ad.

  2. Insert this shortcode where the ad should appear:

    [wbam_ad id="123"]
    

    Replace 123 with the ad post ID (visible in the row's URL in WB Ad Manager → Ads).

  3. Update the page. Open it in an incognito window and confirm the ad renders.

The full shortcode reference is in Ad Shortcodes.

Step 6 - Confirm tracking fires

  1. In the incognito window, click the ad image once. The destination URL opens.
  2. Go back to WB Ad Manager → Ads.
  3. In the row for this ad, the Impressions column should show at least 1 and Clicks should show at least 1.

If both columns are still zero after 30 seconds, check Common Issues - the top two causes are caching plugins and the Exclude Admins setting counting your admin session out.

Verification - how to confirm the full flow worked

All four must be true:

  • The ad row in WB Ad Manager → Ads shows status Published.
  • The ad renders on the frontend in the placement you chose (After Content or shortcode target).
  • Clicking the ad opens the destination URL in the target you set.
  • The Impressions and Clicks columns both increment within a minute of your test click.

What to do next

  • Add a second ad with the same placement. They rotate automatically based on priority. See Managing Ads.
  • Run an A/B test by creating two variants sharing a placement and using the comparison metabox.
  • Schedule the ad to stop on a specific date - see Targeting & Scheduling.
  • Ready to sell ad space? Move on to Accept Paid Ads.

Accept Paid Ads

Advertiser portal Campaigns tab with 3 running campaigns

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

This flow takes you from a freshly-activated Pro plugin to the first advertiser who paid for an ad that is now live on your site, with the payment recorded in the wallet ledger. Budget about 45 minutes of active work, plus whatever time your test advertiser takes to complete their first purchase.

Before you start

  • The free plugin is installed and you have published at least one ad yourself - complete Publish Your First Ad if you have not.
  • You have a valid Pro license key.
  • You have one of these payment stacks already running on the site: WooCommerce (with at least one working gateway), WooCommerce Subscriptions, WooCommerce Memberships, Paid Memberships Pro, or MemberPress. Pro does not ship direct Stripe / PayPal / Razorpay integration; credit top-ups are collected by the source plugin of whichever adapter you enable.
  • You have a second WordPress user you can log in as to play the advertiser role (or you can create one mid-flow).

Step 1 - Activate Pro and accept the license

  1. Upload and activate WB Ad Manager Pro from Plugins → Add New → Upload Plugin.
  2. Go to WB Ad Manager Pro → Settings → License, paste your license key, click Activate License.
  3. Confirm the license status shows as active. If it does not, automatic updates are off until you resolve it.

Full prerequisite detail lives in Pro Installation & Requirements.

Step 2 - Enable the modules you need

  1. Go to Pro Settings → Modules (path: WB Ad Manager → Pro Settings → Modules).
  2. Confirm these are on: Wallet & Billing, Campaigns, Ad Packages, Ad Submissions, Email Notifications.
  3. Save.

Ad Submissions depends on Wallet + Campaigns + Packages; the UI enforces the dependency automatically. The Advertisers module is core and is always on.

The full module table is in Pro Settings Configuration → Tab 2 Modules.

Step 3 - Configure the credit top-up adapter

This is the step most installs get wrong. Pro does not collect money itself - it consumes credits granted by an adapter that plugs into a payment system you already run.

  1. Open Pro Settings → Credits.
  2. Enable the adapter whose source plugin is active on your site. For the most common case, that is WooCommerce Products.
  3. For WooCommerce Products: in WooCommerce, create Simple Products such as 100 Credits - $10 and 500 Credits - $45. Then back in Pro Settings → Credits, click Add Mapping, pick the product, and enter the credit amount each purchase should grant.
  4. Set the currency and currency symbol to match what your payment source uses.
  5. Set Minimum Deposit (default $5.00) and Low Balance Threshold (default $10.00).

For the full adapter walkthrough covering subscriptions, memberships, PMPro, and MemberPress, see Wallet and Payments and Pro Settings Configuration → Tab 3 Credits.

Step 4 - Create at least one ad package

Packages are what advertisers actually purchase. Without at least one active package, the submission wizard has nothing to offer.

  1. Go to WB Ads → Packages → Add New.
  2. Name the package, pick a pricing model (flat, cpm, cpc, or cpm_cpc), set the price, duration, and any impression or click limit.
  3. Under Placements, leave empty to allow all or pick specific placements the package covers.
  4. Leave Requires Approval on for your first package so you can review submissions manually until you trust the flow.
  5. Click Save Package. Confirm the package shows Active in the list.

Field reference: Creating Ad Packages. A fresh install seeds four example packages you can also edit instead of creating from scratch.

Step 5 - Publish the advertiser dashboard page

  1. Go to Pages → Add New.

  2. Title it Advertiser Dashboard.

  3. Paste in the shortcode:

    [wbam_advertiser_dashboard]
    
  4. Publish.

  5. Go to Pro Settings → Pages and confirm the Advertiser Dashboard page is mapped to the page you just created. If not, assign it and save.

The dashboard is the single frontend entry point - advertisers manage ads, classifieds, wallet, and analytics from here. See Advertiser Portal Overview.

Step 6 - Register (or approve) the test advertiser

In an incognito window, log in as your test user and visit the Advertiser Dashboard page.

  • If you enabled Auto-approve advertisers in Pro Settings → General, the account is ready immediately.
  • If not, the user sees a pending notice. Go back to your admin session, open WB Ads → Advertisers, click the user, and change their status to Active.

Status meanings are in Advertiser Portal Overview → Account Statuses.

Step 7 - Top up the advertiser's wallet

  1. Still logged in as the test advertiser, open the Wallet tab on the dashboard.
  2. Click Buy Credits. The button routes to the purchase URL you set in Step 3 (for the WooCommerce path, that is the shop page or a credit-packs category).
  3. Complete the purchase through your existing gateway. This is a real purchase from the source plugin's point of view; use a test payment method if you have one (Stripe test mode, WooCommerce "Check payments" gateway, etc.).
  4. Once the source order reaches completed or processing, the adapter grants credits immediately.
  5. Confirm the Wallet tab now shows the new balance. A ledger entry of type topup is recorded.

The full adapter flow, all nine transaction types, and the offline / bank-transfer variant are documented in Wallet and Payments.

Step 8 - Submit the first paid ad

Still as the test advertiser:

  1. On the dashboard, open the Ads tab and click Create New Ad.
  2. Walk the four-step wizard: Ad Type → Content → Package → Placements.
  3. Pick the package you created in Step 4.
  4. Submit.

What happens under the covers:

  • The ad post is created as a draft.
  • A campaign is created from the package via Campaign_Manager::create_from_package().
  • For a flat-rate package the price is debited from the wallet at this point.
  • For a CPM or CPC package with a budget, the full budget is pre-charged as a campaign_reserve ledger entry.
  • Because the package requires approval, the submission enters pending status and you get an email.

Full submission logic: Ad Submissions and Approval Workflow.

Step 9 - Approve the submission

  1. In your admin session, go to WB Ads → Submissions. The submission shows with a pending badge.
  2. Open it, review the creative and placements, and click Approve.
  3. The campaign activates. For CPM / CPC campaigns the approval can still fail at this moment if the wallet can no longer cover the reservation (e.g., the advertiser spent elsewhere in between) - if so, top up and retry.

Step 10 - Confirm the ad serves on the frontend

  1. In an incognito window, visit a page that matches the package's allowed placements.
  2. Confirm the advertiser's creative renders.
  3. Refresh a few times and confirm impression counts increment in WB Ads → Campaigns.

Impression and click counting uses row-level locking and per-day cookies - see Campaign Management → Tracking Accuracy.

Verification - how to confirm the full flow worked

All six must be true:

  • The advertiser account shows status Active in WB Ads → Advertisers.
  • The wallet balance on the Advertiser Dashboard matches what the advertiser paid minus the package cost (or, for CPM / CPC, minus the reserved budget).
  • WB Ads → Transactions shows at least one topup ledger entry (from the adapter) and one package or campaign_reserve debit (from the submission).
  • The submission shows Approved in WB Ads → Submissions.
  • The campaign shows Active in WB Ads → Campaigns.
  • The advertiser's creative renders on the frontend in a matching placement and impressions increment.

What to do next

  • Add a second package at a different price point so advertisers have a choice. Guidance in Creating Ad Packages → Best Practices.
  • Turn on the Trust System in Pro Settings → General to auto-approve paid submissions from advertisers with a clean history. Code/HTML ads still require manual review.
  • Move on to the classifieds marketplace in Launch a Classifieds Marketplace.
  • Work through Pro Troubleshooting if approvals, reservations, or top-ups behave unexpectedly.

Launch a Classifieds Marketplace

Frontend classifieds marketplace with 10 listings across categories

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

This flow sets up a working classifieds marketplace: sellers submit listings, buyers browse and inquire, and you review and moderate from the admin. Budget about 30 minutes plus the time to seed categories and locations relevant to your audience. Run Accept Paid Ads first if you want paid upgrades (Featured, Highlighted, Urgent, Bump, Top) - those deduct from the advertiser wallet.

Before you start

  • Pro is activated and licensed. See Pro Installation & Requirements.
  • The Wallet module is enabled in Pro Settings → Modules (Classifieds depends on Wallet).
  • You know which taxonomies matter for your audience - categories (e.g., Cars, Jobs, Real Estate) and locations (cities or regions). Seed these up front so submissions have somewhere to live.

Step 1 - Enable the Classifieds module

  1. Go to WB Ad Manager → Pro Settings → Modules.
  2. Toggle Classifieds Marketplace on.
  3. Save.

The module registers the wbam-classified custom post type and two taxonomies: wbam-classified-cat (Categories) and wbam-classified-loc (Locations). The top-level Classifieds admin menu appears immediately.

Step 2 - Configure marketplace rules

  1. Go to Pro Settings → Classifieds.
  2. Set:
    • Listing Duration - how many days a listing stays live before expiring. Default 30.
    • Require Approval - on for moderated marketplaces, off for instant-publish.
    • Max Images per listing (default 10, limit 50).
    • Max Classifieds Per Advertiser - cap concurrent active listings per user. 0 = unlimited.
    • Minimum Balance to Post - require a wallet balance above zero before a user can submit. Set to 0 to let anyone with an active advertiser account post for free.
  3. Under Upgrade Options, decide which paid upgrades to offer: Featured, Highlighted, Urgent, Bump, Top. Setting any price to 0 disables that upgrade. Defaults and durations live in Pro Settings Configuration → Tab 6 Classifieds.
  4. Under Inquiries, enable the inquiry system and the Email Notifications option so sellers get alerted.
  5. Save.

Step 3 - Seed categories and locations

Sellers cannot submit if there are no categories to file a listing under.

  1. Go to WB Ads → Classifieds → Categories (WordPress taxonomy screen).
  2. Add the top-level categories your marketplace needs. Use nested categories sparingly - the sidebar filter flattens them.
  3. Go to WB Ads → Classifieds → Locations and add your regions.

Confirm at least three categories and three locations exist before you move on.

Step 4 - Publish the marketplace pages

Create one WordPress page per shortcode. All five are reachable from a single navigation menu item once they exist.

Page Shortcode Why you need it
Browse Classifieds [wbam_browse_classifieds] Public grid with filters, the marketplace "homepage"
Submit a Listing [wbam_submit_classified] Multi-step seller form
My Listings [wbam_my_classifieds] Seller dashboard for their own active listings
My Favorites [wbam_my_favorites] Saved listings for logged-in visitors
Sellers I Follow [wbam_my_following] Feed from followed sellers

Shortcode options are in Pro Shortcodes Reference → Classifieds Shortcodes.

After publishing the pages, go to Pro Settings → Pages and confirm the Classifieds, My Classifieds, My Favorites, and Following pages are mapped to the pages you just created.

Step 5 - Add the pages to the site menu

  1. Go to Appearance → Menus.
  2. Add links for Browse Classifieds, Submit a Listing, and My Listings to your primary nav.
  3. Save.

This is the gateway - without it sellers cannot find the submit form and buyers cannot find the browse grid.

Step 6 - Do a submission dry run

Using a second browser or incognito window, log in as a test user (who has an advertiser account from Step 6 of Accept Paid Ads) and:

  1. Visit the Submit a Listing page.
  2. Walk through the multi-step form: Title → Description → Category + Location → Price → Images → Review.
  3. Submit.

If Require Approval is on, the listing enters pending. If off, it publishes immediately.

Confirm in your admin session that the listing now exists under Classifieds → All Listings (or whatever plural label you configured under Pro Settings → Classifieds).

Step 7 - Moderate the listing

This is the moderation workflow you will use day to day.

  1. Go to Classifieds → All Listings and filter by status pending.
  2. Click the listing to open it.
  3. Review the title, description, images, category, and price.
  4. From the admin bar:
    • Click Approve to publish the listing - the status moves to active and the seller gets an email.
    • Click Reject to decline - you can attach a moderation note visible to the seller.

The complete status set is pending, active, sold, expired, rejected, draft. Details in Setting Up Classifieds → Admin Management.

Reports and takedowns

Any visitor can report a listing as inappropriate from the single listing page. Handle reports at WB Ads → Classifieds → Reports:

  1. Filter by status pending.
  2. Review the reason and the reporter's note.
  3. Mark as reviewed, resolved, or dismissed.
  4. If the listing needs to come down, open it from the report row and move its status to rejected.

Step 8 - Confirm the buyer side works

In a fresh incognito window (do not log in):

  1. Visit the Browse Classifieds page. The approved listing should render in the grid.
  2. Apply one of the sidebar filters (category or location). The grid should update via AJAX without a page reload.
  3. Open the listing and use the inquiry form at the bottom to send a message.
  4. Switch to the seller's email inbox and confirm the inquiry notification arrived.
  5. Log back in as the seller, open the Inquiries tab on the Advertiser Dashboard, and confirm the inquiry shows with status unread.

Inquiry storage lives in wbam_classified_inquiries; statuses cycle through unreadreadrepliedarchived.

Step 9 - Test a paid upgrade (optional but recommended)

If you enabled upgrade pricing in Step 2, run the paid path at least once so you know the wallet wiring works.

  1. As the seller, open My Listings and click Promote on the listing.
  2. Pick Featured (or any enabled upgrade).
  3. Confirm. The upgrade cost debits the wallet as a classified ledger entry.
  4. Reload the Browse page in incognito. The listing now shows a Featured badge and pins to the top of its category.
  5. Confirm a ledger entry exists under WB Ads → Transactions with type classified.

For Featured with Recurring Monthly billing, the wbam_process_classified_billing hourly cron charges the wallet each cycle. If the wallet cannot cover a renewal, the listing is downgraded to standard automatically.

Verification - how to confirm the full flow worked

All seven must be true:

  • Pro Settings → Modules shows Classifieds Marketplace enabled.
  • At least three categories and three locations exist in Classifieds → Categories and Classifieds → Locations.
  • Browse Classifieds, Submit a Listing, My Listings, My Favorites, and Sellers I Follow are each published and mapped in Pro Settings → Pages.
  • A test submission was moved from pending to active in Classifieds → All Listings.
  • The approved listing renders on the Browse page and the category / location sidebar filters update it.
  • An inquiry sent from the single-listing page lands in the seller's Inquiries tab and triggers the notification email.
  • If paid upgrades are enabled: at least one upgrade purchase shows a classified debit in WB Ads → Transactions.

What to do next

  • Map BuddyPress xProfile fields to seller profiles - in Pro Settings → BuddyPress → xProfile Field Mapping. Details in Setting Up Classifieds → BuddyPress xProfile Seller Fields.
  • Override template files (submit-form.php, archive.php, single.php) by copying them from wp-content/plugins/wb-ad-manager-pro/templates/classifieds/ to wp-content/themes/your-theme/wbam/classifieds/.
  • Build a classifieds homepage hero by combining [wbam_classified_search] with a curated [wbam_browse_classifieds category="5" limit="6"].
  • If renewal emails fail or listings do not expire on schedule, work through Pro Troubleshooting.

Extend via Hooks

This flow walks a developer through three non-trivial extensions using real Pro hooks. Each example is a self-contained drop-in for a site-specific plugin or an mu-plugins/ file. Budget about 45 minutes to work through all three.

Before you start

  • Pro is activated and at minimum the Ad Submissions, Classifieds, and Advertisers modules are on - see Pro Installation & Requirements.
  • You have access to either a custom plugin directory or wp-content/mu-plugins/ where you can drop a PHP file.
  • You have a way to read the PHP error log (either wp-content/debug.log or your hosting panel).

Full hook list: docs/pro-developer/HOOKS.md in the plugin. Every filter returns WP_Error to abort; every _after_ action runs post-commit.

Example 1 - Add a Promo Code field to the ad submission wizard

Scope: inject a custom field into Step 2 (Content) of the frontend ad submission wizard, persist it on submit, and read it back on the approved ad. Uses two hooks that work as a pair.

Hooks used

Hook Type What it does
wbam_pro_ad_form_step_2_after_fields action Render slot inside the Content step template
wbam_pro_before_submit_ad filter Runs before the submission record is saved; mutate $ad_data to persist extra fields

Code

<?php
// wp-content/mu-plugins/site-ads-extend.php

/**
 * Render a Promo Code input inside Step 2 of the ad submission wizard.
 *
 * @param array $ad_data Current wizard state (pre-populated on edit).
 * @param bool  $is_edit Whether the user is editing an existing submission.
 */
add_action( 'wbam_pro_ad_form_step_2_after_fields', function ( $ad_data, $is_edit ) {
    $value = isset( $ad_data['promo_code'] ) ? $ad_data['promo_code'] : '';
    ?>
    <div class="wbam-form-row">
        <label for="promo_code"><?php esc_html_e( 'Promo Code (optional)', 'site-ads' ); ?></label>
        <input type="text" id="promo_code" name="promo_code"
               value="<?php echo esc_attr( $value ); ?>"
               maxlength="40"
               pattern="[A-Z0-9_-]+">
        <p class="description">
            <?php esc_html_e( 'Uppercase letters, digits, dashes, and underscores only.', 'site-ads' ); ?>
        </p>
    </div>
    <?php
}, 10, 2 );

/**
 * Persist the promo code when the submission is saved.
 *
 * Return a WP_Error to abort the submission and show the message to the advertiser.
 */
add_filter( 'wbam_pro_before_submit_ad', function ( $ad_data, $advertiser_id, $package_id ) {
    if ( empty( $_POST['promo_code'] ) ) {
        return $ad_data;
    }

    $code = sanitize_text_field( wp_unslash( $_POST['promo_code'] ) );
    $code = strtoupper( $code );

    if ( ! preg_match( '/^[A-Z0-9_-]{1,40}$/', $code ) ) {
        return new WP_Error(
            'invalid_promo_code',
            __( 'Promo code must be uppercase letters, digits, dashes, or underscores only.', 'site-ads' )
        );
    }

    $ad_data['promo_code'] = $code;
    return $ad_data;
}, 10, 3 );

Verification

  1. Log in as an advertiser and open the ad submission wizard from the Advertiser Dashboard.
  2. Step to the Content tab. Confirm the Promo Code field renders under the existing fields.
  3. Enter a lowercase value and submit. The submission aborts with the custom error message.
  4. Enter a valid value and submit. The submission saves; look up the submission row in wbam_ad_submissions and confirm the promo_code column (or the serialized extra_fields blob, depending on your DB schema) contains the uppercased value.

Example 2 - Expose a "sold" badge on the public classified REST response

Scope: add a boolean is_sold flag to the public REST payload that the classified single-page JS renders. Useful when you run a custom "Sold" post-meta flag and want the frontend to show a badge without a second AJAX call.

Hook used

Hook Type What it does
wbam_pro_rest_prepare_classified_public filter Fires on Classified_API::prepare_public_response(); shape the JSON sent to unauthenticated / non-owner viewers

wbam_pro_rest_prepare_classified_* fires in public → user → admin order; hook the narrowest layer you need.

Code

<?php
// wp-content/mu-plugins/site-classifieds-rest.php

/**
 * Add an is_sold flag to the public REST shape of a classified.
 *
 * Scope: everyone who hits /wp-json/wbam-pro/v1/classifieds/{id} (public reads).
 *
 * @param array      $data       Prepared payload.
 * @param Classified $classified Source model.
 * @param bool       $full       Whether the "full" response variant was requested.
 */
add_filter( 'wbam_pro_rest_prepare_classified_public', function ( $data, $classified, $full ) {
    $post_id = (int) $classified->post_id;

    // _site_sold is a post-meta flag set by the seller via a custom "Mark as Sold"
    // button in the My Listings screen. Cast aggressively so the JSON is stable.
    $data['is_sold']   = (bool) get_post_meta( $post_id, '_site_sold', true );
    $data['sold_date'] = get_post_meta( $post_id, '_site_sold_date', true ) ?: null;

    return $data;
}, 10, 3 );

Verification

  1. Set _site_sold = 1 and _site_sold_date = 2026-01-15 on one classified post via update_post_meta() in WP-CLI.
  2. In an incognito window, hit /wp-json/wbam-pro/v1/classifieds/<post_id>.
  3. Confirm the JSON response contains "is_sold": true and "sold_date": "2026-01-15".
  4. Hit the same endpoint for a classified where the flag is unset. Confirm is_sold is false and sold_date is null.

Example 3 - Grant onboarding credits when a new advertiser is created

Scope: every time a new advertiser account is created (self-registration or admin-created), grant a $5 welcome credit with an idempotency key so accidental re-runs never double-credit. This is a post-commit action with a wallet side effect - demonstrates integrating with the Wallet_Manager from outside Pro.

Hook used

Hook Type What it does
wbam_pro_after_create_advertiser action Fires post-commit after a new Advertiser row exists; safe for side effects

Code

<?php
// wp-content/mu-plugins/site-advertiser-welcome.php

use WBAM_Pro\Modules\Wallet\Wallet_Manager;

/**
 * Grant $5.00 of welcome credit on advertiser creation.
 *
 * Uses an idempotency key derived from the advertiser ID so this action is
 * safe under retries; Wallet_Manager::credit() will reject a second grant with
 * the same key thanks to the UNIQUE constraint on the ledger.
 */
add_action( 'wbam_pro_after_create_advertiser', function ( $advertiser ) {
    // Defensive: Wallet_Manager only loads when the Wallet module is on.
    if ( ! class_exists( '\\WBAM_Pro\\Modules\\Wallet\\Wallet_Manager' ) ) {
        return;
    }

    $advertiser_id = (int) $advertiser->id;
    if ( $advertiser_id <= 0 ) {
        return;
    }

    Wallet_Manager::get_instance()->credit( array(
        'advertiser_id'   => $advertiser_id,
        'amount'          => 5.00,
        'type'            => 'credit',
        'reason'          => __( 'Welcome credit', 'site-ads' ),
        'idempotency_key' => 'site_welcome_' . $advertiser_id,
    ) );
}, 10, 1 );

Verification

  1. Register a new advertiser via the Advertiser Dashboard in an incognito window.
  2. In the admin, open WB Ads → Advertisers, find the new account, and confirm the balance reads $5.00.
  3. Open WB Ads → Transactions and confirm a ledger row with type credit, amount $5.00, reason "Welcome credit", and idempotency key site_welcome_<id>.
  4. Call the same wbam_pro_after_create_advertiser action manually with the same advertiser (for example via WP-CLI eval). Confirm no second credit is recorded - the idempotency key blocks the double-credit.

Verification - how to confirm the full flow worked

All three extensions must pass their own verification block above:

  • Example 1: the Promo Code field renders, validates, and persists.
  • Example 2: the is_sold flag appears in the public REST payload and reflects post-meta accurately.
  • Example 3: new advertisers get exactly one $5 welcome credit, and the idempotency key prevents duplicates.

No PHP fatals in wp-content/debug.log after exercising all three flows.

What to do next

  • Browse the full hook surface in docs/pro-developer/HOOKS.md - write-path filters, REST shape filters, four wizard slot actions, and the wbam_pro_free_setting_{key} cross-plugin bridge.
  • For campaign side effects (e.g., post to Slack when a campaign goes live), hook wbam_pro_after_update_campaign and inspect the $old_data status delta.
  • For short-circuit patterns (e.g., archive instead of delete), filter wbam_pro_before_delete_advertiser and return non-null to skip the default delete.
  • If you need a new hook that does not exist, open a PR against Pro - every filter / action follows the wbam_pro_{verb}_{action}_{entity} convention.

Feature Matrix

Side-by-side Free vs Pro capability table.

Feature Matrix - Free vs. Pro

Use this page to decide whether you need the Pro add-on or whether the free plugin covers your use case. Each row names a capability, marks whether it ships in Free and Pro, and describes what the capability actually does. Pro always sits on top of Free - nothing in Free is removed when Pro activates.

Free is the ad-rotation and tracked-link engine: self-serve admin places ads, admin counts impressions and clicks. Pro adds the advertiser-facing portal, the credit wallet and Credits-SDK adapters, the classifieds marketplace, campaign budgeting, deeper analytics, A/B testing, and the developer hook surface.

Matrix

Capability Free Pro Description
Ad post type + admin list wbam-ad custom post type managed from WB Ad Manager → Ads
Image ad type Upload JPG / PNG / GIF / WebP with destination URL and alt text
Rich-content ad type HTML body sanitized via wp_kses_post
Code / HTML / JS ad type Third-party ad network snippets, AdSense code, custom JS
Google AdSense ad type Dedicated AdSense field with auto / horizontal / vertical / rectangle formats
Email Capture ad type Newsletter-style lead-capture ad
Placement metabox (per-ad) Ad picks its own placements via checkboxes; no separate zone admin
Automatic placements (header, footer, before/after content, sidebar, after paragraph N) Ads render without shortcodes where the checkbox is on
Shortcode placement - [wbam_ad id] Drop a single ad by ID into any post, page, widget, or theme template
Shortcode placement - [wbam_ads ids] Drop a pinned set of ads by comma-separated ID list
Priority-weighted rotation Priority 1-10 per ad; higher shows more often when multiple ads share a placement
Session impression limit Cap per-visitor exposure per session
Schedule start / end dates Publish ahead of time; expire automatically
Built-in A/B comparison metabox Side-by-side CTR bar chart when multiple ads share a placement; Winner badge at 100+ impressions
Dedicated A/B Testing module - Variant management, weighted splits, programmatic enroll / disqualify
Weighted fair-rotation engine - Rotation module replaces default priority sort; share-of-voice reporting
Impressions + clicks counts in Ads list Columns on the Ads admin list
Analytics dashboard with charts - Date-range impression / click / CTR charts, per-ad / per-placement / per-date breakdowns
Bot filtering (40-pattern UA list) - Rejects Googlebot, Bingbot, Ahrefsbot, SEMrushbot, headless-browser signatures, etc.
IP-hash anonymization with daily-rotating salt - GDPR-friendly anonymization; salt rotates at UTC midnight
Cookie-consent integration (CookieYes, Complianz, Moove GDPR, Cookie Notice) - Only records tracking events after consent
Managed link CPT + categories /go/<slug> redirect URLs behind every tracked link
Click-tracking on managed links Total clicks, unique clicks, referrers, click dates
[wbam_link], [wbam_links], [wbam_link_url] shortcodes Inline anchor, list / grid / inline layout, raw URL for custom HTML
Link nofollow / sponsored / UGC flags Per-link and per-shortcode SEO attributes
Partnership inquiry form [wbam_partnership_inquiry] captures visitor requests; approval creates the link automatically
Keyword auto-linking - Links Pro module rewrites keywords in post content to tracked links
Broken-link health checks - Scheduled scan flags dead destinations in the links admin
Advertiser accounts - wbam_advertisers table, approval workflow, suspended / banned states
Advertiser Dashboard ([wbam_advertiser_dashboard]) - 12-tab frontend portal: Overview, Ads, Campaigns, Classifieds, Inquiries, Favorites, Following, Links, Wallet, Analytics, Share of Voice, Profile
Self-service ad submission wizard - Four-step wizard (Ad Type → Content → Package → Placements) inside the dashboard
Admin submission review queue - WB Ads → Submissions with approve / reject / request changes, plus bulk actions
Trust-based auto-approval - Paid submissions from advertisers with N approved ads auto-approve; code/HTML always held for review
Ad packages (pricing tiers) - Flat / CPM / CPC / CPM+CPC packages with duration, impression / click limits, placement restrictions
Campaign lifecycle - Draft → Pending → Active → Paused → Completed / Expired / Cancelled state machine
Pre-funded budget reservation - CPM / CPC campaigns pre-charge full budget; unused portion refunded on completion
Unlimited-budget hourly billing - wbam_calculate_hourly_billing cron charges for prior hour's impressions / clicks
Auto-pause on budget or limit exhaustion - wbam_do_check_campaign_budgets cron moves campaigns to Completed every 15 min
Credit wallet with ledger - Per-advertiser balance, nine transaction types, atomic row-locked credit / debit
Wbcom Credits SDK adapter - WooCommerce Products - Sell credit-pack products via any WC-supported gateway
Wbcom Credits SDK adapter - WooCommerce Subscriptions - Recurring credit top-ups on subscription renewal
Wbcom Credits SDK adapter - WooCommerce Memberships - Credits bundled into membership activation and renewal
Wbcom Credits SDK adapter - Paid Memberships Pro - Map PMPro levels to credit grants
Wbcom Credits SDK adapter - MemberPress - Map MemberPress products to credit grants
Manual / bank-transfer top-ups - Advertiser submits reference note; admin approves from WB Ads → Transactions → Pending Approval
Admin wallet adjustments - Credit or debit any advertiser with a reason; lands in ledger as adjustment
Classifieds marketplace - wbam-classified CPT with categories, locations, AJAX filters, favorites, follow-seller
Paid classified upgrades (Featured, Highlighted, Urgent, Bump, Top) - Wallet-debited promotions with configurable prices and durations
Classified inquiry system - Buyer-to-seller messages stored in wbam_classified_inquiries; seller gets email
Classified moderation + reports - Admin review queue plus visitor-submitted inappropriate-content reports
BuddyPress / BuddyBoss integration - Advertiser tabs on member profiles; xProfile field mapping onto seller pages
Seller profile pages (/seller/{slug}/) - Public page per advertiser showing their listings and follow button
Email notifications module - Registration, ad approved / rejected, campaign status, low balance, classified events, inquiries, payments
Site Mode presets - Five operator modes (Publisher, Sponsored, Classifieds-only, Full marketplace, Custom) with billing-UI gates
Free-plugin public hooks wbam_register_ad_types, wbam_register_placements, wbam_ad_rendered, etc.
Pro write-path hooks (wbam_pro_before_/after_*) - ~20 create / update / delete hooks across advertisers, campaigns, classifieds, packages, submissions
Pro REST response-shape filters (wbam_pro_rest_prepare_*) - Four filters on Packages + Classifieds (public / user / admin scope)
Ad submission wizard render slots - Four action slots, one per wizard step, for injecting custom fields
Cross-plugin bridge filter (wbam_pro_free_setting_{key}) - Override any Free-plugin setting read made by Pro
REST API namespace - wbam-pro/v1 endpoints for classifieds, campaigns, advertisers, wallet, packages, analytics
Audit log - Admin log of account, billing, and moderation events
Delete-all-data uninstall toggle - Optional clean wipe on plugin uninstall

Minimums and identifiers

  • Free plugin slug: wb-ads-rotator-with-split-test. Required WordPress 5.8+, PHP 7.4+.
  • Pro plugin slug: wb-ad-manager-pro. Declares Requires Plugins: wb-ads-rotator-with-split-test.
  • Pro DB version: 3.8.0, stored in option wbam_pro_db_version.
  • Optional integrations on top of Pro: BuddyPress / BuddyBoss, WooCommerce, WooCommerce Subscriptions, WooCommerce Memberships, Paid Memberships Pro, MemberPress.

What to read next

Ad Management

Create ads, pick placements, target audiences, and tune rotation.

Managing Ads - Site Owner Guide

What You'll Learn

  • How to create different ad types
  • How to assign placements directly on each ad
  • How to set priority and session limits
  • Best practices for ad management

How Ad Placement Works

Ads do not use zones. Instead, each ad has its own Placements metabox where you check which locations it should appear in (header, footer, after content, sidebar, etc.).

When multiple ads share the same placement, they rotate automatically. Priority controls how often each ad is shown - higher priority ads appear more often.


Creating Ads

Step-by-Step

  1. Go to WB Ad Manager → Ads
  2. Click Add New
  3. Enter the ad title (internal reference only)
  4. Choose an ad type and fill in the content
  5. In the Placements metabox, check all locations where the ad should appear
  6. In the Ad Status metabox, set priority and optional session limit
  7. Click Publish

Ad Types

Image Ads

Best for: Banners, promotional graphics, affiliate images

Required fields:

  • Image upload (JPG, PNG, GIF, WebP)
  • Destination URL
  • Alt text (for accessibility)

Tips:

  • Optimize images before upload to keep page load fast
  • Animated GIFs are supported
  • Use standard IAB sizes: 300x250, 728x90, 160x600

Rich Content Ads

Best for: Native advertising, styled announcements, promotional content

Fields:

  • HTML content area (supports basic HTML tags via wp_kses_post)

Tips:

  • Match your site's design for a native feel
  • Keep content concise - it's an ad, not an article

Code/HTML/JS Ads

Best for: Third-party ad networks, custom scripts, embedded content

Fields:

  • HTML/JavaScript code input

Tips:

  • Test code before saving
  • Use for affiliate network banners, custom tracking pixels
  • Check mobile compatibility

Google AdSense

Best for: Google AdSense integration with responsive sizing

Fields:

  • Ad Unit ID (from your AdSense account)
  • Format (Auto, Horizontal, Vertical, Rectangle)
  • Responsive sizing toggle

Requirements:

  • Active Google AdSense account approved for your site
  • Publisher ID configured in WB Ad Manager → Settings → Google AdSense

Email Capture

Best for: Newsletter signups, lead generation

See Ad Types for full Email Capture documentation.


Ad Scheduling

Setting Date Ranges

When creating or editing an ad:

  1. Find the Schedule section
  2. Set Start Date - when the ad becomes active
  3. Set End Date - when the ad expires (optional)
  4. Save changes

Schedule Examples

Scenario Start Date End Date
Always active Leave empty Leave empty
Future launch Dec 25, 2024 Leave empty
Limited time Dec 1, 2024 Dec 31, 2024
One day Dec 25, 2024 Dec 25, 2024

Ad Priority

Control how often an ad appears relative to others sharing the same placement.

Setting Priority

  1. Edit the ad
  2. Find the Ad Status metabox (right sidebar)
  3. Drag the Priority slider - range is 1 to 10
  4. Save

Higher priority = shown more often when multiple ads share a placement.

Priority Examples

Ad Priority Effect
Featured sponsor 10 Shown most often
Regular sponsor 5 Shown at medium frequency
House ad 1 Shown least often

Session Impression Limit

Limit how many times a single visitor sees an ad per session.

Setting the Limit

  1. Edit the ad
  2. Find the Ad Status metabox
  3. Enter a number in Session Limit
  4. Leave empty for unlimited
Value Behavior
Empty Unlimited - no cap
1 Show once per visitor session
3 Show up to 3 times per session

Managing Placements

Each ad shows a Placements metabox listing all available locations grouped by type. Check the boxes for where this ad should appear.

Automatic Placements

When you check an automatic placement (header, footer, after content, etc.), the ad appears there without any shortcode.

Shortcode Placement

To display a specific ad manually using a shortcode:

[wbam_ad id="123"]

See Shortcode Reference for all shortcode options.

Via PHP (Theme)

<?php echo do_shortcode( '[wbam_ad id="123"]' ); ?>

Tracking Performance

Viewing Stats

Analytics dashboard with impressions, clicks, CTR and top-performing ads The ads list showing impressions, clicks, and status columns per ad

The Ads list shows impressions and clicks directly in the table columns. For per-ad details:

  1. Edit any ad
  2. If other active ads share the same placement, a Ad Performance Comparison metabox appears
  3. View side-by-side CTR comparison with a visual bar chart
  4. A "Winner" badge marks the ad with the highest CTR (requires 100+ impressions)

Key Metrics

Metric What It Means Good Target
Impressions Times ad was shown Varies
Clicks Times ad was clicked More is better
CTR Clicks ÷ Impressions 0.5%+

Organizing Ads

Using Categories

Create categories to organize ads:

  1. Go to WB Ad Manager → Ads → Categories
  2. Add categories (e.g., "Sponsors", "House Ads")
  3. Assign ads to categories when editing

Best Practices

  • Use consistent naming conventions
  • Create categories by advertiser or campaign
  • Archive old ads instead of deleting
  • Use tags for additional organization

Bulk Operations

Bulk Edit Ads

  1. Go to WB Ad Manager → Ads
  2. Check multiple ads
  3. Select a bulk action (Move to Trash, Edit)
  4. Click Apply

Export/Import

  • Export: Use WordPress export (Tools → Export)
  • Import: Use WordPress import (Tools → Import)

Best Practices

Ad Placement Effectiveness

Location Effectiveness Notes
Above fold High Seen immediately
In-content High Read alongside content
Sidebar Medium Always visible
Footer Low Often missed

Performance Tips

  1. A/B test - Create variations and use the comparison metabox
  2. Rotate regularly - Add multiple ads per placement to prevent ad blindness
  3. Match context - Relevant ads perform better
  4. Optimize images - Compress before uploading for faster load times
  5. Monitor CTR - Disable underperformers directly from the comparison table

Common Mistakes

  • Too many ads per page (3-5 is ideal)
  • Ads that don't match the surrounding content
  • Slow-loading ad images
  • Ignoring mobile users
  • Not tracking performance

Next Steps


Upgrade to WB Ad Manager Pro for campaigns, wallet payments, classifieds, and analytics.

Ad Types

WB Ad Manager supports five ad types. Choose based on what you're displaying.


Available Ad Types

Type Best For Tracks Clicks
Image Banners, affiliate graphics Yes
Rich Content Native ads, styled promotions Yes
Code/HTML/JS AdSense, third-party networks, custom scripts Depends on code
Google AdSense Google AdSense specifically Via AdSense
Email Capture Newsletter signups, lead generation N/A

Image Ad

Display banner images with click tracking.

Image ad editor with preview + placements The Image Ad editor showing image upload, destination URL, and alt text fields

Settings

Field Description
Image Upload or select from media library
Destination URL Where clicks go
Alt Text Image alt attribute (accessibility)
Open in New Tab Yes/No

Best Practices

  • Use standard IAB sizes: 300x250, 728x90, 160x600
  • Optimize images for web (compress, proper format)
  • Always set alt text for accessibility
  • Animated GIFs are supported

Rich Content Ad

Create ads using the WordPress block editor.

Rich Content ad editor with HTML input

Settings

Field Description
Content HTML content area (basic HTML tags supported via wp_kses_post)

Best For

  • Native advertising that matches your site's design
  • Promotional announcements
  • Styled call-to-action boxes
  • Content that needs formatting (headings, buttons, lists)

Tips

  • Match your site's design for a native feel
  • Keep it concise - it's an ad, not an article
  • Use Heading blocks sparingly

Code/HTML/JS Ad

Insert HTML, JavaScript, or third-party ad network code.

Code/HTML ad editor with sandbox toggle The Code Ad editor showing the syntax-highlighted code input area

Settings

Field Description
Code Your HTML/JavaScript code

Common Uses

  • Google AdSense manual ad units
  • Third-party ad networks (Media.net, etc.)
  • Custom tracking pixels
  • Affiliate network banner code
  • Embedded content

Security Note

Only use code from trusted sources. Malicious scripts can compromise your site and your visitors.


Google AdSense Ad

Dedicated Google AdSense integration with responsive sizing.

AdSense ad editor - Ad Slot ID, Publisher ID, Ad Format

Settings

Field Description
Ad Unit ID From your AdSense account
Format Auto, Horizontal, Vertical, Rectangle
Responsive Enable responsive sizing

Setup Steps

  1. Log into your Google AdSense account
  2. Create an ad unit and copy its Ad Unit ID
  3. Go to WB Ad Manager → Settings → Google AdSense and enter your Publisher ID
  4. Create a new ad in WB Ad Manager, select "AdSense" type
  5. Enter your Ad Unit ID, choose format, and save

Requirements

  • Active Google AdSense account
  • Site approved by AdSense
  • Publisher ID configured in WB Ad Manager → Settings

Email Capture Ad

Collect email addresses with a subscription form displayed inline anywhere on your site.

Email Capture ad editor - headline, description, button text, success message

Settings

Field Description
Headline Form headline text
Description Optional supporting text below the headline
Button Text Submit button label (default: "Subscribe")
Show Name Field Add an optional name input above the email field
Success Message Message shown after successful submission
Redirect URL Optional URL to redirect after submission (leave empty to show success message)
Dismiss Duration (Days) Days to hide the form after a user closes it. Set 0 to always show.
Privacy Text Small privacy notice shown below the form
Background Color Form background color picker
Text Color Form text color picker
Button Color Submit button color picker

How It Works

  1. A visitor sees the form and submits their email address
  2. The plugin stores the submission and fires the wbam_email_captured action
  3. A success message (or redirect) is shown
  4. A cookie is set so the form hides for the configured number of days

Integrating with Your Email Service

Use the wbam_email_captured action hook to pass captured emails to Mailchimp, ConvertKit, or any other service:

add_action( 'wbam_email_captured', function( $email, $name, $ad_id ) {
    // Send to your email service provider.
    // $email  - subscriber email address
    // $name   - subscriber name (empty string if name field is hidden)
    // $ad_id  - WP post ID of the Email Capture ad
}, 10, 3 );

Developer Hooks

Hook Type Description
wbam_email_form_before Action Fires before the form renders
wbam_email_form_after Action Fires after the form renders
wbam_email_form_before_fields Action Fires before the form fields
wbam_email_form_after_fields Action Fires after fields, before submit (use to add custom fields)
wbam_email_form_after_name Action Fires after name field (if shown)
wbam_email_form_after_email Action Fires after email field
wbam_email_form_data Filter Modify form configuration before render
wbam_email_form_classes Filter Modify wrapper CSS classes
wbam_email_form_button_text Filter Modify button text
wbam_email_form_success_message Filter Modify success message
wbam_email_form_privacy_text Filter Modify privacy text
wbam_email_form_placeholders Filter Modify field placeholder text
wbam_email_form_show_cookie_check Filter Return false to always show form, ignoring dismiss cookie

Best Practices

  • Offer clear value (newsletter, discount, free resource)
  • Keep form fields minimal - email alone converts best
  • Test the form after setup
  • Comply with GDPR/privacy laws - use the Privacy Text field for your notice

Choosing the Right Type

Scenario Recommended Type
Affiliate banner graphic Image
Google AdSense AdSense
Third-party ad network Code/HTML/JS
Custom HTML banner Code/HTML/JS
Promotional announcement Rich Content
Newsletter signup Email Capture
Custom tracking pixel Code/HTML/JS
Native-style promotion Rich Content

Related Guides

Placements

Placements control where ads appear on your site. Assign multiple placements per ad.


Available Placements

Page Positions

Placement Location
Header Top of every page, before content
Footer Bottom of every page, after content
Before Content Before post/page content starts
After Content After post/page content ends

In-Content

Placement Location
After Paragraph X After a specific paragraph (e.g., after paragraph 3)

Archive / Loop

Placement Location
Before Archive Just before the first post on archive/blog pages (fires on loop_start)
After Archive Just after the last post on archive/blog pages (fires on loop_end)

Widgets & Manual

Placement Location
Sidebar Via widget in sidebar areas
Shortcode Manual placement with [wbam_ad]

Overlays

Placement Location
Popup Modal overlay (with trigger conditions)
Sticky Fixed position bar (top or bottom)

Comments

Placement Location
Before Comments Above comment section
After Comments Below comment section

Community - BuddyPress

Registered automatically when BuddyPress is active.

Placement Location
BuddyPress Activity Injected into the activity stream between posts
Directory - Before Members Top of the members directory
Directory - Between Members Between member cards in the members directory
Directory - After Members Bottom of the members directory
Directory - Before Groups Top of the groups directory
Directory - Between Groups Between group cards in the groups directory
Directory - After Groups Bottom of the groups directory

Community - bbPress

Registered automatically when bbPress is active. All positions belong to the single bbpress placement - pick positions per ad.

Position Location
Before Forums Top of the forums list
After Forums Bottom of the forums list
Before Topics Top of the topics list in a forum
After Topics Bottom of the topics list in a forum
Before Single Topic Just above the topic title on a topic page
After Single Topic Just below the opening post, before replies
Between Replies Every N replies inside a topic (configurable per ad - default 5)

Community - Jetonomy

Registered automatically when the Jetonomy community plugin is active (detected via class_exists('\\Jetonomy\\Jetonomy')). All seven placements are free-plugin features.

Placement Location
Sidebar Top Top of the Jetonomy sidebar, above everything
Sidebar After About Between the About card and the next widget (space pages only)
Sidebar Bottom Bottom of the Jetonomy sidebar
After Topic Body Directly under the topic body, before replies
Before Replies Above the first reply
Between Replies Every N replies (configurable per ad - default 5)
After Replies Below the last reply

Between-reply frequency (bbPress and Jetonomy): each ad assigned to a "between replies" position has two extra options:

  • Show after - reply number to anchor on (default: 5)
  • Repeat every - if checked, the ad repeats every N replies instead of showing once at the anchor position

bbPress Widgets

Two dedicated widgets for bbPress sidebar ads:

Widget Description
WBAM: bbPress Forum Ad Display ads on bbPress forum pages
WBAM: bbPress Topic Sidebar Ad Display ads on single topic pages only

bbPress Forum Ad Widget

Settings:

  • Title - Optional widget title
  • Select Ad - Choose which ad to display
  • Show On - All bbPress pages, Forum pages only, or Topic pages only

bbPress Topic Sidebar Ad Widget

Settings:

  • Title - Optional widget title
  • Select Ad - Choose which ad to display

This widget only displays on single topic pages, making it ideal for topic-specific advertising.


Setting Up Placements

Method 1: In Ad Editor

  1. Edit your ad
  2. Find Placements metabox
  3. Check desired placements
  4. Save

Method 2: Widget

  1. Go to Appearance > Widgets
  2. Add WBAM Ad Widget to sidebar
  3. Select specific ad or "Random from placement"
  4. Save

Method 3: Shortcode

[wbam_ad id="123"]

Place in any post, page, or widget area.


Placement Settings

After Paragraph X

Configure which paragraph:

  1. Edit ad
  2. In Placements, check "After Paragraph"
  3. Set paragraph number (e.g., 3)
  4. Save

Ad appears after the 3rd paragraph in post content.

Popup Settings

The popup/modal placement renders inside wp_footer and is shown by JavaScript based on the trigger you choose.

Setting Values Default Description
Trigger delay, scroll, exit delay What causes the popup to appear
Delay (seconds) Integer ≥ 0 5 Only used when trigger is delay - wait this long after page load
Scroll % 0 - 100 50 Only used when trigger is scroll - fire after the user scrolls this much of the page

Exit intent shows the popup when the visitor's mouse moves toward the browser-tab area - a classic "about to leave" signal. Not available on touch devices (no mouse to track), so popup falls back to delay behavior on mobile.

Close behavior: a close button (.wbam-popup-close) dismisses the popup for the current page view. Reloading the page shows the popup again unless you're also using a per-ad session limit (see Targeting → Frequency Capping).

Sticky Bar Settings

The sticky/floating placement also renders inside wp_footer and stays pinned to the viewport.

Setting Values Default Description
Position bottom-right, bottom-left, bottom-bar, top-bar bottom-right Where the element is pinned
  • bottom-right / bottom-left - floating card anchored to the corner
  • bottom-bar / top-bar - full-width bar spanning the viewport

Close behavior: a close button (.wbam-sticky-close) hides the bar for the current page view. Combine with a session limit to persist the dismissal across pages.


Multiple Ads Per Placement

When multiple ads share a placement, they rotate automatically. The ad shown is selected based on Priority, set per ad using a slider from 1 to 10 in the Ad Status metabox.

Higher priority ads are shown more often. No zone configuration is needed - simply assign multiple ads to the same placement.


Best Practices

High-Performing Placements

Placement Typical CTR Notes
After paragraph 1-3 High Users engaged with content
Before content Medium Visible but before engagement
Sidebar Low-Medium Depends on sidebar visibility
Popup High Interruptive but effective
Footer Low Most users don't scroll down

Recommendations

  • Don't overload - Too many ads hurts user experience
  • Test placements - Use A/B testing to find winners
  • Consider mobile - Some placements work better on desktop
  • Match ad size to placement - 300x250 for sidebar, 728x90 for header

Shortcode Parameters

[wbam_ad id="123"]                    # Display a specific ad
[wbam_ad id="123" class="featured"]   # With custom CSS class
[wbam_ads ids="1,2,3"]                # Display multiple specific ads
Parameter Description Default
id Specific ad ID (required) -
ids Comma-separated ad IDs -
class Custom CSS class -

Related Guides

Targeting & Display Rules

Control when, where, and to whom your ads appear.


Display Rules

Show on All Pages (with exclusions)

Default behavior. Ad shows everywhere except excluded items.

Exclusion options:

  • Specific posts/pages
  • Categories
  • Tags
  • Page types (front page, blog, archives, 404)

Show on Specific Pages Only

Ad only shows on selected items.

Inclusion options:

  • Post types (posts, pages, custom)
  • Specific posts/pages
  • Categories
  • Tags
  • Page types

Visitor Targeting

Device Targeting

Device Description
Desktop Computers, laptops
Tablet iPad, Android tablets
Mobile Smartphones

Select one or more. Ad only shows on selected devices.

Use case: Show mobile-optimized ads only on phones.

User Status

Option Shows To
All Users Everyone
Logged In Only Registered users
Logged Out Only Visitors not logged in

Use case: Show signup prompts only to logged-out visitors.

User Roles

When targeting logged-in users, specify roles:

  • Administrator
  • Editor
  • Author
  • Contributor
  • Subscriber
  • Custom roles

Use case: Show upgrade offers only to free members.


Scheduling

Date Range

Field Description
Start Date When ad begins showing
End Date When ad stops showing

Leave empty for no restriction.

Day of Week

Select specific days:

  • Monday through Sunday
  • Or all days (default)

Use case: Weekend sale ads only on Sat/Sun.

Time of Day

Field Description
Start Time Hour ad begins (e.g., 9:00 AM)
End Time Hour ad stops (e.g., 5:00 PM)

Based on your WordPress timezone setting.

Use case: Happy hour promotions 4-7 PM only.


Geo Targeting

Target by geographic location using IP detection at the country level.

Setup

  1. Edit ad
  2. Find Geo Targeting section
  3. Choose mode: Include (show only in selected countries) or Exclude (hide in selected countries)
  4. Select countries from the dropdown
  5. Save

Supported Providers

Provider Free Tier Notes
ip-api.com 45 req/min Default, no key needed
ipinfo.io 50K/month API key required
ipapi.co 1K/day API key required

Notes

  • Country-level targeting only (95-99% accurate)
  • VPN users may see wrong location
  • Configure provider in Settings > Geo Targeting

Frequency Capping

Limit how often users see an ad within a single session.

Setting Description
Session Impression Limit Maximum times the ad is shown per browser session. Leave empty or set to 0 for unlimited.

Uses cookies to track impressions within the current session. Resets when the user closes the browser or clears cookies.


Example Configurations

Scenario: Holiday Sale

Scheduling:
- Start: Dec 20
- End: Dec 26

Display Rules:
- All pages except checkout

Targeting:
- All devices
- All users

Scenario: Mobile App Promo

Device Targeting:
- Mobile only

User Status:
- Logged in only

Display Rules:
- Show on dashboard page only

Scenario: Local Business Ad

Geo Targeting:
- United States > California > Los Angeles

Scheduling:
- Mon-Fri
- 9 AM - 6 PM

Placements:
- Sidebar
- After paragraph 3

Troubleshooting

Ad not showing

  1. Check if enabled (toggle is ON)
  2. Check schedule (not expired, correct time)
  3. Check display rules (not excluded from current page)
  4. Check device (viewing on targeted device?)
  5. Check user status (logged in/out as expected?)
  6. Check frequency cap (not exceeded?)

Ad showing when it shouldn't

  1. Review display rules - might be set to "All"
  2. Check exclusions are saved properly
  3. Clear caching plugins
  4. Check targeting conditions

Related Guides

Settings

Configure WB Ad Manager at WB Ad Manager → Settings.

General settings page with display, performance, geo, AdSense and privacy sections The settings page with General, Display, Performance, Geo Targeting, AdSense, Privacy, and Advanced sections


General Settings

Setting Description Default
Disable for Logged-in Users Hide all ads from logged-in users Off
Disable for Admins Hide all ads from administrators Off
Minimum Content Length Minimum characters required to show paragraph ads. Set 0 to disable this check. 300
Disable on Post Types Post types where automatic placements won't show None
Maximum Ads Per Page Limit how many ads display per page. Set 0 for unlimited. 10

When to Use

  • Disable for Admins: See your site without ads while testing
  • Disable for Logged-in: Offer an ad-free experience to members
  • Minimum Content Length: Prevents paragraph ads from appearing on very short posts
  • Disable on Post Types: Exclude certain post types from automatic placements entirely
  • Maximum Ads Per Page: Prevents ad overload on content-heavy pages

Display Settings

Setting Description Default
Ad Label Text Optional label shown with ads (e.g., "Advertisement") Advertisement
Label Position Show label above or below the ad Above
Custom Container Class Additional CSS class for ad containers Empty

Ad Label

Adding a label helps with:

  • FTC/advertising disclosure compliance
  • User transparency
  • Ad identification

Leave the label text empty to disable the label entirely.

Custom Container Class

Add your own CSS class to style ads consistently across your site:

.my-custom-ad-class {
    border: 1px solid #eee;
    padding: 10px;
    margin: 20px 0;
}

Performance Settings

Setting Description Default
Lazy Load Ads Load ads only when scrolled into view On
Cache Ad Queries Cache database queries using WordPress transients On

Lazy Loading

When enabled, ads below the fold won't load until the user scrolls to them. This improves:

  • Initial page load time
  • Core Web Vitals scores
  • User experience on slow connections

Cache Ad Queries

Caches ad selection queries to reduce database load. Uses WordPress transients with automatic invalidation when ads change. Recommended for sites with many ads.


Geo Targeting Settings

Setting Description Default
Primary Provider Service for IP geolocation ip-api
ipinfo.io API Key API key for ipinfo.io (optional) Empty

Available Providers

Provider Requests API Key Required
ip-api.com 45/minute No
ipinfo.io 50K/month Optional (free tier available)
ipapi.co 1K/day No

If the primary provider fails, the system automatically tries the next provider.

Getting an ipinfo.io API Key

  1. Go to ipinfo.io
  2. Sign up for a free account
  3. Copy your API key from the dashboard
  4. Paste it into this setting

Google AdSense Settings

Setting Description Default
Publisher ID Your AdSense publisher ID (ca-pub-xxx) Empty
Auto Ads Enable AdSense Auto Ads site-wide Off

Getting Your Publisher ID

  1. Log into Google AdSense
  2. Click your account icon
  3. Find "Publisher ID" (starts with ca-pub-)
  4. Paste it here - this is the default used for all AdSense ads

Auto Ads

When enabled, Google automatically places ads throughout your site. This works alongside any manually placed ads.

Note: Auto Ads may place ads in locations you don't control. Test thoroughly before enabling on production.


Privacy & GDPR Settings

Setting Description Default
Require Consent for AdSense Only load AdSense after user consent Off
Anonymize IP Addresses Store hashed IPs instead of raw addresses On

Consent for AdSense

When enabled, AdSense scripts won't load until the user gives consent. Works with popular consent plugins:

  • Cookie Notice
  • CookieYes
  • Complianz
  • GDPR Cookie Consent
  • Other plugins that implement standard WordPress consent APIs

IP Anonymization

When enabled, IP addresses are hashed before storage, making them non-identifiable. This helps with:

  • GDPR compliance
  • Privacy protection
  • Reduced data liability

Recommended to keep this On for sites with EU visitors.


Advanced Settings

Setting Description Default
Delete Data on Uninstall Remove all plugin data when uninstalling Off

Delete Data on Uninstall

When enabled, uninstalling the plugin will permanently delete:

  • All ads and ad data
  • All tracked links
  • All statistics and analytics
  • All plugin settings

Warning: This cannot be undone. Only enable if you are certain you want complete removal.


Performance Tips

For Speed

  • Enable lazy loading for ads below the fold
  • Enable ad query caching
  • Limit the maximum ads per page in General Settings
  • Optimize images before uploading to media library

For Accuracy

  • Exclude bots from tracking (handled automatically)
  • Enable "Disable for Admins" to keep your own views out of stats

For Privacy

  • Enable IP anonymization
  • Require consent for AdSense if targeting EU visitors
  • Review the Delete Data on Uninstall option before removing the plugin

Related Guides

Link Management

Cloak affiliate URLs, track clicks, detect broken links, accept partnership inquiries.

Link Partnerships

Accept inbound partnership inquiries from advertisers, bloggers, and affiliate partners - without email ping-pong. Visitors submit a structured form on your site; you review, accept, or reject each inquiry from the WordPress admin.

Find it under WB Ad Manager → Link Partnerships.


When to Use This

The Link Partnerships module is useful if people ask you about:

  • Paid link placements - pay once to publish a link in an existing post
  • Link exchanges - swap links between your site and theirs
  • Sponsored posts - paid content on your blog

Instead of fielding every request by email, point interested people at an inquiry form on your site. Everyone gets the same questions. You get a structured record per request.


Step 1 - Add the Inquiry Form

Drop this shortcode onto any page (a "Work with us", "Partnerships", or "Advertise" page works well):

[wbam_partnership_inquiry]

The form renders these fields out of the box:

Field Required Purpose
Name Yes Contact name
Email Yes Reply-to for acceptance / rejection
Website URL Yes The partner's site
Partnership type Yes Paid Link, Link Exchange, or Sponsored Post
Target page on your site Optional The post/page they want the link in
Anchor text Optional The exact text they want linked
Budget (min / max) Optional For paid placements
Message Optional Free-form pitch

Shortcode attributes

All attributes below are optional - the defaults match the table above.

[wbam_partnership_inquiry
    title="Partner with Us"
    description="Tell us about your partnership idea."
    show_budget="yes"
    show_target_page="yes"
    show_anchor="yes"
    show_message="yes"
    button_text="Send Inquiry"
    class="my-custom-form"
]
Attribute Values Default Effect
title Any text Partner with Us Heading above the form
description Any text Short intro paragraph Sub-heading
show_budget yes / no yes Toggles the budget min/max fields
show_target_page yes / no yes Toggles the "target page" dropdown
show_anchor yes / no yes Toggles the anchor-text input
show_message yes / no yes Toggles the message textarea
button_text Any text Send Inquiry Submit button label
class CSS class name Empty Extra class on the form wrapper

Anti-abuse

  • Submissions are nonce-protected and sanitized server-side.
  • The same email can only submit once per 24 hours against the same target page - repeat submissions inside that window are silently ignored. This prevents bots from hammering your inbox.

Step 2 - Review Incoming Inquiries

Every submission creates a row in WB Ad Manager → Link Partnerships.

The list table shows:

Column What it is
Contact Name + email (click to view full detail)
Website The partner's site, linked
Type Paid Link, Exchange, or Sponsored
Budget Budget range if provided
Status Pending / Accepted / Rejected / Spam
Date When the inquiry arrived
Actions View, Accept, Reject, Mark as Spam, Delete

Use the status tabs at the top (All / Pending / Accepted / Rejected / Spam) to filter. New inquiries land in Pending.

Inquiry detail view

Clicking an inquiry shows:

  • Everything the partner submitted
  • The IP address the submission came from
  • Admin-only notes (internal - never emailed)
  • Buttons to Accept, Reject, or Mark as Spam

When you accept or reject, an email is sent to the partner automatically (see "Email Notifications" below).


Step 3 - Act on Accepted Inquiries

Accepting an inquiry does not automatically create the link on your site - it only tells the partner you're interested and moves the record to the Accepted tab. You still decide the terms and publish the link yourself.

A typical flow:

  1. Partner submits inquiry → lands in Pending
  2. You review, mark Accepted → automatic acceptance email sent
  3. You reply to their email to negotiate price / date / final anchor text
  4. Once settled, create the managed link at WB Ad Manager → Links (#link-management-wam-doc)) or edit the target post and paste the anchor manually
  5. Record the agreed terms in the admin notes field for your own reference

Rejected and spam inquiries stay on file so you have a record - you don't have to delete them.


Email Notifications

Three notification emails are built in:

Event Sent to Trigger
New inquiry Site admin email Every new submission
Accepted The partner When you click Accept
Rejected The partner When you click Reject

Marking an inquiry as Spam does not email the partner.

All three notification sends are filterable - see the Developer Guide → Link Partnerships hooks if you want to disable any of them, change headers, or modify the body.


Styling the Form

The form inherits your theme's form styles. If you need to override, wrap it in a custom class:

[wbam_partnership_inquiry class="my-partnership-form"]

And style it:

.my-partnership-form {
    max-width: 640px;
    margin: 0 auto;
}
.my-partnership-form label {
    font-weight: 600;
}

FAQ

Does this integrate with a CRM? No - all inquiries stay in your WordPress database. Use the wbam_partnership_created action (see the developer guide) to forward submissions to HubSpot, Pipedrive, or any webhook.

Can I change the partnership types? The three types (paid_link, exchange, sponsored_post) are hard-coded in the free plugin. Developers can remove or rename options with form-output filters - see the developer guide.

Are submissions deleted on uninstall? Only if Settings → Advanced → Delete Data on Uninstall is enabled. By default, uninstalling preserves the table so re-installing restores your history.

How do I know if the form is working? Submit a test inquiry yourself. It should appear under Pending and you should receive the admin notification email at the site admin address.


Related Guides

  • Link Management - manage the links you publish
  • Settings - global plugin settings including data retention
  • Developer Guide → Link Partnerships - hooks, database schema, REST endpoint

Advertiser Portal

Pro module — the self-serve portal advertisers use to sign up, top up credits, and manage their own campaigns.

Advertiser Portal Overview

Advertiser portal overview - stats, quick actions, active campaigns, recent activity

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

The Advertiser Portal is a frontend page where each advertiser manages their own ads, classifieds, wallet, campaigns, analytics, and profile. Advertisers never need WordPress admin access.

The portal is embedded on any page using a single shortcode:

[wbam_advertiser_dashboard]

How the Portal Works

Advertiser portal Ads tab with creative cards and action buttons

When a logged-in user visits the dashboard page, the plugin checks whether they have an advertiser account. If auto-registration is enabled in settings, an account is created automatically. Otherwise, users register via the dashboard page and wait for admin approval.

The dashboard header displays the advertiser's current wallet balance and an Add Funds button that links to the Wallet tab. A tab bar along the top lets advertisers switch between sections.


Advertiser Registration and Approval Workflow

Registration

Advertisers can register in two ways:

  1. Self-registration - User logs in and visits the dashboard page. If Auto-approve advertisers is enabled, their account is activated immediately. If not, it enters pending status.
  2. Admin-created - An admin goes to WB Ad Manager Pro → Advertisers → Add New, links the account to an existing WordPress user, and sets the initial status manually.

Account Statuses

Status What It Means
pending Account awaiting approval. The advertiser can log in and view the portal but sees a notice that approval is pending. They can still create ads.
active Full access to all portal features and ad serving.
suspended Account frozen. Advertiser cannot access the portal. All their ads are paused. Wallet balance is preserved.
banned Permanently blocked. Similar to suspended but indicates a policy violation.

Approval Flow

  1. New advertiser registers - status set to pending
  2. Admin sees the account in WB Ad Manager Pro → Advertisers
  3. Admin clicks the advertiser name and changes status to Active
  4. Advertiser receives an approval email (if email notifications are enabled)

To enable auto-approval (skip manual review): go to WB Ad Manager Pro → Settings → General and enable Auto-approve advertisers.


Portal Tabs

The dashboard has 12 tabs. Tabs are only visible when their corresponding module is enabled.

Overview

Shows a summary of the advertiser's performance: total impressions, clicks, active campaign count, total wallet spend, and a recent activity feed. Stats pull from the Analytics and Campaigns modules when those modules are enabled.

Ads

Lists all ad submissions created by the advertiser. Each row shows the ad title, status, associated campaign, and impression/click counts. The Create New Ad button opens the ad submission form. Ads can be edited or deleted from this tab.

Campaigns

Lists all campaigns with status, budget, spend, and date range. The Create Campaign button opens the campaign builder. From here advertisers can pause, resume, or cancel active campaigns. Requires the Campaigns module.

Classifieds

Lists all classified listings submitted by the advertiser. Each row shows the listing title, status, listing type (standard/featured/premium), view count, and inquiry count. The Submit Listing button links to the submit form page. From here advertisers can renew, edit, or delete their listings. Requires the Classifieds module.

Inquiries

Shows all buyer inquiries received across the advertiser's classified listings. Each inquiry shows the sender name, email, the listing it relates to, the message, and the current status (unread, read, replied, archived). Advertisers can update the status of each inquiry. Requires the Classifieds module.

Favorites

Displays all classified listings the advertiser has saved as favorites. Listings can be removed from favorites here. Requires the Classifieds module.

Following

Shows all sellers the advertiser is following, with their most recent listings. Advertisers can unfollow sellers from this tab. Requires the Classifieds module.

Links

Displays link partnership requests submitted by site visitors through the [wbam_partnership_inquiry] form. Requires the Links module.

Wallet

Shows the current balance, full transaction history, and a form to add funds. Payment methods available depend on which gateways are configured in settings (Stripe, PayPal, Razorpay, WooCommerce, or Manual/Bank Transfer). Requires the Wallet module.

Analytics

Shows impression and click charts for the advertiser's ads over a selected date range. Data is broken down by ad, placement, and date. Requires the Analytics module.

Profile

Allows the advertiser to update their company name, contact name, phone, website, address, and email notification preferences. Changes save immediately and are reflected in seller profile pages.

Share of Voice

Shows what percentage of total ad impressions the advertiser's ads received versus other advertisers in the same placements. Useful for understanding competitive position in the ad rotation. Requires the Rotation module.


Seller Profile Pages

Each active advertiser gets a public seller profile page at:

/seller/{slug}/

The slug is derived from the company name. If no company name is set, the WordPress display name is used.

The seller profile page shows:

  • Advertiser's company name and contact info
  • BuddyPress xProfile fields (if the BuddyPress module is enabled and field mapping is configured)
  • All active classified listings from that seller
  • A "Follow" button for logged-in visitors

WP Admin User Profile Integration

When viewing or editing a WordPress user in Users → All Users → Edit User, admins see an Advertiser Account section added to the bottom of the profile page. This section shows:

  • Advertiser status (active/pending/suspended)
  • Current wallet balance
  • Company name, phone, website, address
  • A direct link to the advertiser's portal record

Admins can update these fields directly from the WordPress user profile screen. Changes are saved to the wbam_advertisers table. This is useful for quick edits without navigating to the separate Advertisers admin screen.


Admin Management

Navigate to WB Ad Manager Pro → Advertisers to manage all advertiser accounts.

From the list table you can:

  • Filter by status (active, pending, suspended)
  • See wallet balance, ad count, and registration date at a glance
  • Click an advertiser name to open their edit screen

From the advertiser edit screen you can:

  • Change account status
  • Add or deduct wallet credits manually
  • Add a note to manual transactions
  • View the advertiser's ads, campaigns, and classifieds
  • Review recent account activity

Adding Manual Wallet Credits

  1. Go to WB Ad Manager Pro → Advertisers
  2. Click the advertiser name
  3. Go to the Wallet tab
  4. Click Add Credit
  5. Enter the amount and an internal note
  6. Click Add

The credit appears in the wallet immediately and is logged in the transaction history.


Shortcodes Reference

Shortcode Description
[wbam_advertiser_dashboard] Full tabbed advertiser portal
[wbam_my_ads] Standalone ad list widget
[wbam_advertiser_stats] Stats summary widget
[wbam_advertiser_wallet] Standalone wallet widget
[wbam_seller_profile] Seller profile display for current user

Ad Submissions and Approval Workflow

Ads tab showing submitted ads with status badges

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

When an advertiser submits an ad, the plugin creates the ad, links it to a campaign, handles wallet charges, and routes it through your approval workflow. This guide explains each step for both admins and advertisers.

How Submission Works

Advertisers submit ads from the Advertiser Dashboard (the [wbam_submit_ad] shortcode redirects there automatically). The submission process runs in this order:

  1. The advertiser's account is validated and the selected package is checked
  2. The wallet balance is checked against the required amount for the package
  3. The ad post is created in draft status
  4. A campaign is created via Campaign_Manager::create_from_package() using the package's pricing model, budget, and duration
  5. The submission record is saved linking the ad, campaign, and package
  6. For flat-rate packages, the package price is debited from the wallet immediately
  7. For packages that do not require approval, the campaign activates at once - this triggers budget reservation for CPM/CPC packages
  8. For packages that require approval, the submission enters pending status and you receive a notification

If any step fails (balance check, campaign creation, wallet charge), the entire submission is rolled back: the ad post and campaign are deleted and the advertiser sees an error message.

Submission Statuses

Status Meaning
Pending Submitted and waiting for your review
Approved Ad is live and campaign is active
Rejected Ad was declined. For flat-rate packages, the package price is automatically refunded to the advertiser's wallet.
Changes Requested Returned to the advertiser for edits. Advertiser can update and resubmit.
Cancelled Submission was withdrawn

Reviewing Submissions

Go to WB Ads > Submissions to see all submissions.

Each submission shows:

  • Ad preview (image, code, or rich content)
  • Advertiser name and email
  • Package selected
  • Requested placements
  • Submission date

Available actions:

Action What Happens
Approve Campaign activates (triggers budget reservation for CPM/CPC). Ad is published. Advertiser is notified.
Reject Submission is declined. Flat-rate package fees are automatically refunded. Advertiser is notified with your reason.
Request Changes Submission is returned to the advertiser. They can edit and resubmit.

Bulk actions: Select multiple submissions to approve or reject them all at once.

Approval on Activation

When you approve a submission, the plugin first activates the campaign. If campaign activation fails - for example because a CPM/CPC campaign cannot reserve its budget due to insufficient wallet balance - the approval is rolled back, the submission stays in its previous status, and you see an error. The advertiser needs to top up their wallet before you can successfully approve.

Auto-Approval

Submissions can be approved automatically without manual review in two cases:

  1. Package setting - The package has "Requires Approval" turned off. The ad goes live immediately on submission.
  2. Trust system - If you have enabled the trust system in settings, trusted advertisers with paid submissions can be auto-approved. Code and HTML ad types always require manual review regardless of trust level (for security).

Configure auto-approval settings at WB Ad Manager Pro > Settings > General (Trust System section).

The Shortcode

[wbam_submit_ad]

Place this shortcode on any page. It redirects visitors to the Advertiser Dashboard ad submission form. The standalone wizard is no longer used - all submission happens inside the dashboard.

Action Hooks for Developers

The submission system fires action hooks at each key moment so you can add custom behavior.

Hook When It Fires Parameters
wbam_ad_submitted After a submission is created $submission object
wbam_ad_submission_approved After an admin approves a submission $submission object
wbam_ad_submission_rejected After an admin rejects a submission $submission object, $reason string
wbam_ad_submission_changes_requested After changes are requested $submission object, $notes string
wbam_ad_submission_resubmitted After an advertiser resubmits after changes $submission object
wbam_fund_request_submitted When a manual payment fund request is submitted $transaction_id, $advertiser, $amount

Ad Types Supported

Advertisers can submit three types of ads:

Ad Type Required Fields
Image Image upload or URL, alt text, destination URL
Code HTML or JavaScript ad code
Rich Rich text content (filtered with wp_kses_post)

Code and HTML ads always enter pending review regardless of auto-approval rules.

Campaign Management

Campaigns tab with active campaigns, budget progress bars, and per-campaign actions

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

Campaigns control how ads run - their budget, pricing model, duration, and delivery limits. This guide explains every campaign status, how budget reservation works, and how campaigns move through their lifecycle.

What Is a Campaign?

A campaign links an ad to its delivery rules. Each campaign tracks:

  • Budget - Total spend limit (0 = unlimited)
  • Pricing model - How charges are calculated
  • Impressions and clicks - Running totals with optional caps
  • Date range - Start and end dates for delivery
  • Status - Current state in the campaign lifecycle

A campaign is created automatically when an advertiser submits an ad through a package. You can also create and manage campaigns manually from WB Ads > Campaigns.

Campaign Statuses

Status Meaning
Draft Created but not yet submitted for review
Pending Awaiting admin approval (set when package requires approval)
Active Running and delivering ads
Paused Temporarily stopped by the advertiser or system
Completed Budget exhausted or all limits reached
Expired End date passed while campaign was active
Cancelled Stopped by admin or advertiser before completion

Status Transition Rules

Campaigns follow a strict state machine. Not every status change is permitted.

From Can move to
Draft Pending, Active, Cancelled
Pending Active, Cancelled
Active Paused, Completed, Expired, Cancelled
Paused Active, Completed, Cancelled
Completed (none - final state)
Expired (none - final state)
Cancelled (none - final state)

Attempts to make an invalid transition return an error and the campaign status is not changed.

Pricing Models

Flat Rate

A single fixed charge for the campaign duration. The package price is debited from the wallet at submission time. No per-impression or per-click billing applies.

Best for: Sponsored placements, newsletter ads, homepage takeovers.

CPM (Cost Per Mille)

The advertiser is charged per 1,000 ad impressions. Set a rate (e.g., $2.50 per 1,000 views) and optionally an impressions limit.

Budget calculation: rate × (impressions_limit ÷ 1000)

Best for: Brand awareness campaigns.

CPC (Cost Per Click)

The advertiser is charged per click on their ad. Set a rate (e.g., $0.50 per click) and optionally a clicks limit.

Budget calculation: rate × clicks_limit

Best for: Lead generation, direct response campaigns.

CPM + CPC Combined (cpm_cpc)

The advertiser is charged for both impressions and clicks simultaneously. A CPM rate applies to every 1,000 impressions served, and a separate CPC rate applies to every click. Both charges draw from the same campaign budget.

Best for: Campaigns where both reach and engagement matter.

Budget Reservation (CPM and CPC Campaigns)

CPM and CPC campaigns with a budget greater than zero use a pre-funded reservation system.

Reservation lifecycle:

  1. Activate - The full budget is deducted from the wallet as a campaign_reserve transaction. If the wallet balance is insufficient, activation is blocked.
  2. Pause - The reservation is held. No funds are released when pausing.
  3. Resume - The campaign resumes without a new reservation charge. Funds were already held.
  4. Complete, expire, or cancel - The unspent portion (budget minus actual spend) is returned to the wallet as a campaign_refund transaction.

This ensures advertisers always have enough funds before their ads go live, and they only pay for what is actually spent.

Campaigns Created from Packages

When an advertiser submits an ad using a package, a campaign is created automatically via Campaign_Manager::create_from_package().

Flow:

  1. Submission is validated and the ad post is created in draft status
  2. The campaign is created with budget and pricing model derived from the package
  3. If the package does not require approval, the campaign activates immediately. For CPM/CPC packages, budget reservation happens at this step.
  4. If the package requires approval, the campaign enters pending status. Budget reservation happens when you approve it.
  5. If activation fails (e.g., insufficient balance), the ad and campaign are cleaned up and the advertiser sees an error.

Auto-Pause and Auto-Completion

A cron job runs every 15 minutes (wbam_do_check_campaign_budgets) and checks all active campaigns. If a campaign has exhausted its budget or reached its impressions or clicks limit, it is automatically moved to Completed and the associated ad is unpublished.

A daily cron job (wbam_daily_aggregation) checks for campaigns whose end date has passed and moves them to Expired.

For unlimited-budget CPM/CPC campaigns, an hourly billing job (wbam_calculate_hourly_billing) charges the advertiser's wallet for accrued spend. If the wallet balance is insufficient at billing time, the campaign is paused automatically.

Managing Campaigns as an Admin

Navigate to WB Ads > Campaigns to see all campaigns.

Available columns: Campaign name, advertiser, pricing model, budget (spent / total), impressions, clicks, status, date range.

Actions per campaign:

  • Approve - Move a pending campaign to active (triggers budget reservation for CPM/CPC)
  • Reject - Cancel a pending campaign
  • Pause / Resume - Toggle active campaigns
  • View Stats - See impressions, clicks, CTR, and daily spend chart

Tracking Accuracy

Impression and click recording uses database-level row locking (START TRANSACTION + SELECT ... FOR UPDATE) to prevent duplicate counts under concurrent traffic. Per-day tracking cookies (wbam_camp_imp, wbam_camp_clk) prevent the same visitor from being counted more than once per calendar day per campaign. These are not session cookies - they persist until midnight of the current day. Bot traffic is filtered based on user-agent patterns before any count is recorded.

Analytics

Pro analytics dashboard — revenue by advertiser, impressions and clicks over time, device and geo breakdowns.

Analytics Dashboard

Revenue dashboard - earnings by day, top earning ads, and revenue by placement

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

WB Ad Manager Pro includes two analytics dashboards: the Ad Analytics dashboard for impression and click tracking, and the Revenue Dashboard for earnings reporting. Both are accessible from the WB Ads admin menu.


Enabling Analytics

Analytics tracking is off by default. Enable it at Pro Settings → General → Analytics → Enable analytics tracking.

Once enabled, configure tracking behaviour at Pro Settings → Analytics & Privacy.


Ad Analytics Dashboard

Location: WB Ads → Analytics

Overview Metrics

The top row shows four summary cards for the selected date range:

Metric Description
Total Impressions How many times ads were displayed. Includes a percentage change vs. the previous equivalent period
Total Clicks Total ad clicks. Includes percentage change vs. the previous period
Click-Through Rate (CTR) (clicks / impressions) × 100
Unique Visitors Distinct visitors (based on anonymised IP hash) who saw at least one ad

Date Range Filter

Filter all metrics and charts by selecting a start date, end date, and optionally a specific ad. Click Filter to apply, or Reset to return to the default range.

Charts

Chart Description
Impressions & Clicks Over Time Line chart showing daily impressions and clicks across the selected period
By Device Pie/doughnut chart of traffic split by device type (desktop, mobile, tablet)
Top Countries Bar chart of top countries by impression volume

Geographic and device data is only collected when Anonymize IP Addresses is disabled in Privacy settings.

Ad Performance Table

Lists all ads with their impression, click, CTR, and placement data for the selected period. Click any ad name to open its edit screen.

Exporting Analytics Data

Click Export to download analytics data as a CSV file for the selected date range and ad filter.

The AJAX action wbam_export_analytics handles the export. Exports are restricted to users with manage_options capability.


Data Retention and Aggregation

Configured at Pro Settings → Analytics & Privacy.

Setting Default Description
Data Retention 365 days Raw event records older than this are deleted by a scheduled cleanup. Valid range: 30-3,650 days
Aggregate After 7 days After this many days, raw events are summarised into daily stats and the raw rows are removed. Aggregated stats are kept permanently

Effect: Recent data (within the aggregation window) provides full event-level detail. Older data is available as daily totals. This approach keeps the database lean on high-traffic sites while preserving long-term trend reporting.


Bot Filtering

When Bot Filtering is enabled in Analytics settings, the tracker inspects the User-Agent header and rejects the request before recording any event if it matches a known crawler. Empty or missing User-Agent is also rejected.

The filter checks the lowercased user-agent string for these 40 substrings:

Group Patterns
Search engines googlebot, bingbot, slurp (Yahoo), duckduckbot, baiduspider, yandexbot, sogou, exabot, applebot
Social facebot, facebookexternalhit, twitterbot, linkedinbot, pinterest
SEO / monitoring semrushbot, ahrefsbot, mj12bot, dotbot, petalbot, bytespider, ia_archiver (Alexa), mediapartners, lighthouse
Generic crawler, spider, bot/, bot;
Headless / automation headless, phantomjs, selenium, puppeteer, scraper
HTTP libraries wget, curl/, python-requests, python-urllib, java/, httpclient, go-http-client, apache-httpclient, libwww-perl

Matching is case-insensitive and uses substring match, so variant user-agent strings containing any of the above are filtered. The list lives in includes/Modules/Analytics/class-analytics-tracker.php.


GDPR / Privacy Controls

Setting Effect
Require Cookie Consent Events are only recorded after the visitor consents via a supported cookie consent plugin (CookieYes, Complianz, Moove GDPR, Cookie Notice)
Anonymize IP Addresses IP addresses are hashed with a salt that rotates at UTC midnight (a new salt per UTC calendar day). User IDs and country data are not stored. Device type (non-PII) is still recorded

Revenue Dashboard

Location: WB Ads → Revenue

The Revenue Dashboard tracks earnings from both ad campaigns and classified listings. All revenue figures are estimates based on configurable CPM/CPC rates unless the wallet system provides actual transaction amounts.

Overview Cards

Card Description
Total Revenue Combined ad revenue + classified revenue for the selected period
Classified Revenue Revenue from classified listing transactions, with period-over-period percentage change
CPM Revenue Revenue attributed to CPM (impression-based) campaigns
CPC Revenue Revenue attributed to CPC (click-based) campaigns
Page RPM Revenue per 1,000 page views

Total Revenue shows the breakdown: "Ads: $X | Classifieds: $Y".

Date Range Filter

Quick-range buttons: 7 Days, 30 Days, 90 Days, This Month, Year to Date. A custom date picker is also available.

Revenue Chart

Line chart showing CPM revenue and CPC revenue over time for the selected period.

Top Earning Ads Table

Lists the top 10 ads by revenue for the selected period, with columns: Ad name, Revenue, Impressions, Clicks.

Revenue by Placement Table

Revenue attributed to each placement, with percentage of total revenue.

Classified Revenue Breakdown

Appears only when classified revenue exists. Shows revenue split by type:

Revenue Type Description
Featured Listings Income from advertisers purchasing featured status
Premium Listings Income from premium-tier listing fees
New Listings Income from paid listing submissions
Renewals Income from listing renewal fees
Upgrades (Bump, Highlight) Income from bump, highlight, urgent, and top-of-category upgrades

Revenue Calculation Settings

Located at the bottom of the Revenue Dashboard page:

Setting Default Description
Default CPM Rate $2.50 Revenue per 1,000 impressions used for estimation
Default CPC Rate $0.10 Revenue per click used for estimation

These rates are used when actual wallet transaction data is not available (e.g., flat-rate packages where the revenue calculation is estimated).

Exporting Revenue Data

Click Export CSV to download revenue data for the selected date range. The export covers the same breakdown shown on screen: by ad, by placement, and classified revenue breakdown.

The AJAX action wbam_export_revenue handles the export and requires manage_options capability.

Classifieds

Pro classifieds marketplace — frontend submission, paid upgrades, inquiries, membership plans.

Setting Up Classifieds

Classifieds frontend browse page with search, category, location, and price filters

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

The Classifieds module adds a full peer-to-peer marketplace to your WordPress site. Sellers submit listings, buyers browse and send inquiries, and you manage everything from the WordPress admin.

Requires: Classifieds module enabled in WB Ad Manager Pro → Settings → Modules


Enabling the Module

  1. Go to WB Ad Manager Pro → Settings → Modules
  2. Toggle Classifieds to enabled
  3. Save settings

Once enabled, the plugin registers the wbam-classified custom post type with two taxonomies: Categories (wbam-classified-cat) and Locations (wbam-classified-loc).


Creating Required Pages

Create pages for each shortcode you want to use and publish them. At minimum you need a browse page and a submission page.

Page Shortcode
Browse Classifieds [wbam_browse_classifieds]
Submit a Listing [wbam_submit_classified]
My Listings [wbam_my_classifieds]
My Favorites [wbam_my_favorites]
Sellers I Follow [wbam_my_following]
Search [wbam_classified_search]

Shortcode Reference

[wbam_submit_classified]

Displays the multi-step classified submission form. Requires the user to be logged in and to have an approved advertiser account. The submit form template (templates/classifieds/submit-form.php) can be copied to your theme folder at your-theme/wbam/classifieds/submit-form.php for full customization without plugin updates overwriting your changes.

[wbam_my_classifieds]

Shows the logged-in advertiser's own listings with options to edit, renew, or delete each one.

[wbam_browse_classifieds]

Displays the public listing grid with sidebar category and location filters, price range filtering, and sort options (newest, price low-to-high, price high-to-low, featured first). Supports AJAX-powered filtering without page reloads.

[wbam_classified_search]

Renders a standalone search form that submits to the browse page. Use this in sidebars or headers.

[wbam_my_favorites]

Shows all listings the logged-in user has saved as favorites.

[wbam_my_following]

Shows all sellers the logged-in user is following. New listings from followed sellers appear in this feed.


Listing Types

Each classified is assigned a listing type when submitted. The type controls placement and billing behavior.

Type Description
standard Default free or paid listing
featured Pinned to top of search results with featured badge; recurring monthly billing from wallet
premium Highest-visibility tier; same billing behavior as featured

Listing type is stored in the wbam_classifieds database table and cannot be changed by the seller after submission without going through the upgrade flow.


Listing Upgrades

Sellers can upgrade a live listing from their advertiser portal. Prices are set in WB Ad Manager Pro → Settings → Classifieds (Upgrade Options section).

Upgrade Default Price Default Duration Effect
Featured $5.00 30 days Pinned to top of results
Highlighted $3.00 7 days Colored highlight border
Urgent $4.00 7 days "Urgent" badge on card
Bump $2.00 7 days Refreshes listing date to now
Top $10.00 30 days Shown in "Top Listings" section

All upgrade costs are deducted from the advertiser's wallet balance at the time of purchase. Featured and premium upgrades renew automatically each month. If the wallet balance is insufficient at renewal, the listing is downgraded to standard and the advertiser receives an email notification.


Expiration and Renewal

Standard listings expire after the duration set in Settings → Classifieds → Listing Duration (default: 30 days). Featured listings expire based on the featured billing cycle.

Automatic expiration flow:

  1. A daily cron job checks for expired listings (wbam_pro_daily_cleanup)
  2. Listings past their expires_at date are set to expired status
  3. Expiration warning emails are sent 3 days before expiry (configurable)
  4. Sellers renew from their My Classifieds dashboard tab

Featured billing flow (hourly cron):

  1. The wbam_process_classified_billing cron runs hourly
  2. Featured/premium listings with featured_next_billing <= NOW() are processed
  3. The wallet is debited for the configured monthly fee
  4. On success: featured_next_billing advances by one month, confirmation email sent
  5. On failure (insufficient funds): listing downgraded to standard, downgrade email sent

Inquiry System

Visitors can contact sellers without revealing the seller's email address. The inquiry form appears on each single classified page.

How it works:

  • Buyer submits name, email, phone (optional), and message via the contact form (templates/classifieds/contact-form.php)
  • Both logged-in and guest users can send inquiries
  • Inquiry is stored in the wbam_classified_inquiries table with status unread
  • Seller receives an email notification
  • Seller manages all inquiries from their portal Inquiries tab
  • Inquiry statuses: unread, read, replied, archived

Report System

Any visitor can report a listing as inappropriate. Reports go to the WordPress admin for review.

Report workflow:

  1. Visitor clicks "Report" on a single listing page
  2. Selects a reason and adds optional details
  3. Report is stored in wbam_classified_reports with status pending
  4. Admin reviews reports under WB Ad Manager Pro → Classifieds → Reports
  5. Admin can mark reports as reviewed, resolved, or dismissed

Favorites and Follow Seller

Logged-in users can save listings and follow sellers.

  • Favorites: Click the heart icon on any listing to save it. View saved listings via [wbam_my_favorites]
  • Follow Seller: Click "Follow" on a seller's profile page. View followed sellers and their new listings via [wbam_my_following]

Both features require the user to be logged in. Guest users see a login prompt.


BuddyPress xProfile Seller Fields

When BuddyPress is active and the BuddyPress module is enabled, you can map xProfile fields to appear on seller profile pages. This lets you surface verified member data (business name, location, rating) directly on classified listings.

To configure:

  1. Go to WB Ad Manager Pro → Settings → BuddyPress
  2. Enable xProfile Field Mapping
  3. Add field mappings: select the xProfile field ID, set a display label, and choose an icon
  4. Save settings

Mapped fields appear automatically on single classified pages and on the public seller profile page (/seller/{slug}/). Fields with empty values for a given user are hidden automatically. Multi-select xProfile fields are joined with a comma.


Custom Field Storage (wbam_classified_meta)

Since DB version 2.8.0, classified custom fields are stored in the dedicated wbam_classified_meta table instead of WordPress post meta. This provides better query performance and cleaner data separation.

Table: {prefix}wbam_classified_meta

The CRUD API mirrors WordPress core meta functions:

Method Equivalent WP Function
Classified::add_meta( $key, $value ) add_post_meta()
Classified::get_meta( $key, $single ) get_post_meta()
Classified::update_meta( $key, $value ) update_post_meta()
Classified::delete_meta( $key ) delete_post_meta()

Meta rows are automatically deleted when a classified is deleted, either through Classified::delete() or through the cascade delete triggered in the admin.


Template Files

You can override any template by copying it from wp-content/plugins/wb-ad-manager-pro/templates/classifieds/ to wp-content/themes/your-theme/wbam/classifieds/.

Template File Renders
submit-form.php Listing submission form
single.php Single listing page
content.php Listing card in grid view
content-featured.php Featured listing card
archive.php Browse listing grid
search-form.php Search form
sidebar-filters.php Category/location/price filter sidebar
contact-form.php Inquiry contact form
upgrades.php Listing upgrade options panel
taxonomy-category.php Category archive view
taxonomy-location.php Location archive view
taxonomy-wrapper.php Shared taxonomy archive wrapper

Admin Management

Navigate to WB Ad Manager Pro → Classifieds to view, approve, edit, and delete all listings. From the list table you can:

  • Filter by status (pending, active, sold, expired, rejected, draft)
  • Bulk approve or reject listings
  • Add moderation notes visible to the seller
  • View inquiry counts and view counts per listing

To add or manage categories and locations, go to WB Ad Manager Pro → Classified Categories and Classified Locations.


Settings Reference

Navigate to WB Ad Manager Pro → Settings → Classifieds for these options:

Setting Description
Listing Duration Default expiry in days (default: 30)
Require Approval Hold new listings as pending until admin approves
Allow Guests to Inquire Let non-logged-in users send inquiries
Featured Fee Monthly fee charged for featured/premium status
Featured Expiration Warning Days before expiry to send warning email (default: 3)
Admin Notification on Featured Email admin when a listing is upgraded to featured
Member Notification on Featured Email advertiser on featured upgrade/renewal
Downgrade Notification Email advertiser when featured is removed

Payments & Wallet

How the Wbcom Credits SDK wallet works, the 5 adapters (WooCommerce / Subscriptions / Memberships / PMPro / MemberPress), and top-up flows.

Wallet and Payments

Credits tab - Wbcom Credits SDK adapters and mapped products

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

Every advertiser on a Pro-enabled site has a wallet that tracks how many credits they have available to spend on ads, campaigns, classified listings, and package purchases. This guide explains how credits enter the wallet, how spending works, and how you (the site owner) configure which payment paths your advertisers can use.

How credits reach a wallet

Pro does not ship its own Stripe, PayPal, or Razorpay integration. Instead it uses the Wbcom Credits SDK, which is bundled with Pro under vendor/wbcom-credits-sdk/. The SDK exposes a plug-in adapter pattern. Pro registers itself with the SDK as a credit consumer; the SDK then accepts credit grants from any adapter that is also registered and active on the site.

Five adapters ship out of the box, and every one of them auto-appears in Settings → Credits when the adapter's source plugin is active:

Adapter Source plugin What it does
WooCommerce Products WooCommerce Sell credit-pack products. The advertiser checks out through WooCommerce; any WC-supported gateway (Stripe, PayPal, Razorpay, Square, bank transfer, …) handles the payment. When the order reaches completed or processing, the adapter grants credits.
WooCommerce Subscriptions WooCommerce Subscriptions Sell recurring credit packs. Each renewal tops up the wallet automatically.
WooCommerce Memberships WooCommerce Memberships Bundle credits into membership plans. Credits are granted on membership activation and renewal.
Paid Memberships Pro Paid Memberships Pro Map PMPro levels to credit grants. Purchasing a level credits the advertiser.
MemberPress MemberPress Map MemberPress products to credit grants.

What this means for site owners

Any payment method you could already accept through your existing WooCommerce or membership-plugin setup will work for credit top-ups. You do not configure Stripe or PayPal inside Pro - you configure them inside WooCommerce (or the membership plugin you chose), and Pro picks up the credit on order completion.

What advertisers see

Advertisers log in to the Advertiser Portal, open the Wallet tab, and click Buy Credits. The button routes to the purchase URL you configured in Settings → Credits. From that point on, the checkout experience is whatever your WooCommerce shop or membership checkout looks like. When payment succeeds, Pro grants credits immediately and the Wallet tab shows the updated balance.

Three ways to configure credit top-ups

Path A - WooCommerce credit-pack products (most common)

Use this when you want one-off credit purchases with a single price per pack.

  1. Install and activate WooCommerce. Configure at least one payment gateway you already trust (Stripe, PayPal, bank transfer - any WC plugin works).
  2. In WooCommerce, create Simple Products that represent credit packs. For example: "100 Credits - $10", "500 Credits - $45".
  3. In the Pro admin, open Settings → Credits. The WooCommerce adapter appears automatically. Enable it and map each credit-pack product to its credit amount.
  4. Set the Advertiser Portal's "Buy Credits" button to link to your WooCommerce shop (or a dedicated credit-packs category page).
  5. Test: from an advertiser account, click Buy Credits, complete checkout, and confirm the Wallet tab shows the new balance.

Path B - WooCommerce Subscriptions (recurring credits)

Use this when you want advertisers to pay monthly or yearly for a rolling credit allowance.

  1. On top of WooCommerce, install WooCommerce Subscriptions.
  2. Create Subscription Products (e.g., "50 Credits every month - $5/mo").
  3. In Settings → Credits, enable the WooCommerce Subscriptions adapter and map each subscription product to its credit allowance.
  4. Each successful renewal fires the adapter callback, which tops up the wallet.

Path C - Membership tier grants credit (best for tiered pricing)

Use this when you want an advertiser's credit allowance to be part of their membership package rather than a separate purchase.

  1. Install Paid Memberships Pro or MemberPress (not both - pick one).
  2. Create membership levels / products.
  3. In Settings → Credits, enable the matching adapter (PMPro or MemberPress). Map each level/product to its credit grant amount.
  4. When an advertiser joins the membership, the adapter grants credits immediately. Renewals grant again.

Advertisers can always add credits outside their membership using a WooCommerce credit pack in parallel.

Spending - how credits leave the wallet

Admin Transactions page with filters for Credits, Debits, Holds, Releases, and Refunds

Credits leave the wallet through four entry points. Every spend is recorded in the advertiser's ledger with a transaction type so you can see what happened and when.

Event Transaction type When it fires
Package purchase package Advertiser buys an ad package from Advertiser Portal → Packages. Full package cost is charged at purchase time.
CPM/CPC campaign activation campaign_reserve Advertiser activates a CPM or CPC campaign with a set budget. The full budget is pre-charged against the wallet.
Unlimited campaign hourly billing campaign For campaigns with no budget cap, the wbam_calculate_hourly_billing cron charges the advertiser every hour for the prior hour's impressions/clicks.
Classified listing fee or upgrade classified Advertiser submits a paid classified, or buys a Featured / Highlighted / Urgent / Bump upgrade.

Campaign budget pre-charge and refund

When an advertiser activates a CPM or CPC campaign with a budget > 0, Pro charges the full budget to the wallet as a campaign_reserve ledger entry. This is a genuine charge (not a hold) so it is atomic with the activation and cannot get lost if the site crashes mid-flow.

The Campaign_Manager then tracks how much of the budget actually gets spent on served impressions/clicks. When the campaign completes, expires, or is cancelled, any unspent portion is credited back as a campaign_refund ledger entry. Pausing a campaign does not refund - the reservation stays held so that un-pausing does not risk activation failing due to the advertiser spending the money elsewhere in the meantime.

If the advertiser's balance is too low to cover a budget at activation time, the activation fails with a clear error. They top up and try again.

All transaction types

Everything that moves a wallet balance gets one of these types. Use the WB Ads → Transactions admin page's type filter to audit any specific flow.

Type Direction Description
topup Credit Credits added by an adapter (WooCommerce order / subscription renewal / membership purchase).
credit Credit General credit added to the wallet.
adjustment Credit or Debit Manual admin adjustment with a reason.
campaign_refund Credit Unused campaign budget returned on completion or cancellation.
campaign_adjust Credit or Debit Budget change on an active campaign edit.
package Debit Flat-rate package purchase.
campaign_reserve Debit Full budget pre-charged when a CPM/CPC campaign activates.
campaign Debit Hourly spend on an unlimited-budget campaign.
classified Debit Classified listing fee or paid upgrade.

Offline payments - manual / bank transfer

When you would rather accept bank transfers, cheques, or any other out-of-band method, you can approve top-ups yourself.

What the advertiser does:

  1. Opens the Wallet tab and selects Bank Transfer (or whichever label you configured).
  2. Enters a reference note (invoice number, transaction ID, etc.).
  3. Submits. A pending ledger entry is created and you get an email.

What you do as admin:

  1. Go to WB Ads → Transactions and open the Pending Approval filter.
  2. Review the request - contact the advertiser if needed.
  3. Click Approve once the funds have cleared in your bank account, or Cancel to decline.

Approving fires the wbam_fund_request_approved action and emails the advertiser that their wallet has been topped up. Only transactions with pending status and type payment or credit can be approved from this screen.

Admin adjustments

You can credit or debit any advertiser's wallet directly.

  1. WB Ads → Advertisers → click the advertiser name.
  2. Adjust Balance.
  3. Choose Credit or Debit, enter an amount, type a reason.
  4. Save.

Every adjustment lands in the ledger as an adjustment transaction with your reason text. The minimum deposit amount enforced on advertiser-initiated top-ups is $5 by default and is filterable via wbam_pro_minimum_deposit.

What's next

Settings (Pro)

Pro-only settings tabs and ad package configuration.

Pro Settings Configuration

Pro Settings → Modules with each module toggled on or off

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

Configure WB Ad Manager Pro via WB Ads → Pro Settings (or navigate to Ads → Pro Settings in your admin menu). Settings are split across seven tabs.


Tab 1: General

Navigate to: Pro Settings → General

Pro Settings → General

Advertiser Settings

Setting Default Description
Admin as Advertiser Off Automatically create an advertiser account for admin users when they access the ad manager
Auto-Approve Advertisers Off Automatically approve new advertiser registrations without manual review

Trust System (Auto-Approval)

Automatically approve ads from advertisers who have a track record of approved submissions.

Setting Default Description
Enable Trust System Off Enables trust-based auto-approval for qualified advertisers
Approvals Required 2 How many manually approved ads an advertiser needs before becoming trusted
Auto-Approve Paid Ads On Only auto-approve ads that were paid for; free ads still require manual review
Always Review Code Ads On HTML/code ads always require manual approval regardless of trust status (recommended for security)

Data Settings

Setting Default Description
Analytics Off Enable impression and click tracking across all ads
Delete Data on Uninstall Off Permanently delete all analytics data, advertisers, campaigns, and settings when the plugin is uninstalled

Tab 2: Modules

Navigate to: Pro Settings → Modules

Enable or disable Pro feature modules. Disabling a module hides it from all admin menus and frontend shortcodes. Module dependencies are enforced automatically - if you disable a required module, dependent modules disable too.

The Advertisers module is core and always active; it does not appear in this toggle list and cannot be disabled.

Module Default Depends On Description
Classifieds Marketplace On Wallet Lets users post and browse classified ads
Ad Submissions On Wallet, Campaigns, Packages Frontend ad submission form for advertisers
Campaigns On Wallet Campaign management for grouping and scheduling ads
Wallet & Billing On - Advertiser credit wallet and pay-per-impression billing
Ad Packages On Wallet, Campaigns Purchasable ad packages with predefined limits
A/B Testing On - Compare ad variations
Ad Rotation On - Weighted ad rotation engine
Links Pro On - Enhanced link tracking, health checks, and keyword auto-linking
BuddyPress Integration On - Social features via BuddyPress (requires BuddyPress active)
Email Notifications On - Automated emails for all platform events

Dependency map:

  • Campaigns requires Wallet
  • Packages requires Wallet + Campaigns
  • Ad Submissions requires Wallet + Campaigns + Packages
  • Classifieds requires Wallet

Tab 3: Credits

Navigate to: Pro Settings → Credits

Pro Settings → Credits - adapters and mappings

Pro uses the Wbcom Credits SDK to accept credit top-ups rather than shipping its own payment-gateway integrations. Every adapter whose source plugin is active on the site auto-appears in this tab; you enable the adapters you want to use and map each one's products / levels to a credit amount.

Available adapters

Adapter Appears when this plugin is active Typical purchase UX
WooCommerce Products WooCommerce Advertiser buys a "Credit Pack" Simple Product at your WC checkout
WooCommerce Subscriptions WooCommerce Subscriptions Advertiser subscribes, renewal tops up credits automatically
WooCommerce Memberships WooCommerce Memberships Credits bundled into membership activation + renewal
Paid Memberships Pro PMPro Credits granted when the advertiser joins a PMPro level
MemberPress MemberPress Credits granted on MemberPress product purchase

Each adapter delegates payment collection to its source plugin, so you configure Stripe, PayPal, Razorpay, or any other gateway in that plugin - not in Pro.

Configuring an adapter mapping

  1. Enable the adapter checkbox next to the one you want to use.
  2. Click Add Mapping. A dropdown lists the products / levels from that plugin.
  3. Pick the product, enter the credit amount the advertiser should receive, save.
  4. Repeat for each credit pack or tier.

The active mappings table below shows every mapping you've created across adapters. You can delete or edit each row in place.

Wallet settings

Setting Default Description
Currency USD Currency code used for all wallet balances and transactions
Currency Symbol $ Symbol displayed with amounts (e.g., $, , £)
Minimum Deposit $5.00 Minimum single top-up amount (filterable via wbam_pro_minimum_deposit)
Low Balance Threshold $10.00 Send a notification when an advertiser's balance falls below this amount (0 to disable)
Billing Threshold $0.01 Minimum unbilled amount before deducting from the wallet for CPM/CPC campaigns

Offline / bank-transfer top-ups

Enable the "Manual / Bank Transfer" option to let advertisers request a top-up against an offline payment. The advertiser enters a reference note; you approve or cancel the request from WB Ads → Transactions → Pending Approval once funds clear. Approvals fire the wbam_fund_request_approved action and email the advertiser.

See Wallet and Payments for the full end-to-end walkthrough of each adapter path.


Tab 4: Pages

Navigate to: Pro Settings → Pages

Pro Settings → Pages - portal page assignments

Map WordPress pages to plugin features. The plugin creates these pages automatically on activation. You can reassign them to any published, draft, or private page.

Page Key Default Slug Default Shortcode
Advertiser Dashboard /advertiser-dashboard [wbam_advertiser_dashboard]
Classifieds /classifieds [wbam_browse_classifieds]
My Classifieds /my-classifieds [wbam_my_classifieds]
My Favorites /my-favorites [wbam_my_favorites]
Following /my-following [wbam_my_following]

Each page row shows a Visit link to preview the current page and a Create button to generate a new page with the correct shortcode automatically inserted.

Settings are saved as individual wbam_page_{key} options (e.g., wbam_page_advertiser_dashboard) for fast lookup.


Tab 5: Analytics & Privacy

Navigate to: Pro Settings → Analytics & Privacy

This tab is always visible. Analytics-specific settings only appear when analytics is enabled in the General tab.

Analytics Settings

(Visible only when analytics is enabled)

Setting Default Description
Pixel Tracking Off Use tracking pixels/beacons for more accurate viewability tracking
Track Logged-in Users Off Include logged-in users in analytics; by default only anonymous visitors are tracked
Bot Filtering Off Exclude known bots and crawlers. The tracker rejects requests whose User-Agent matches any of 40 substrings, including Googlebot, Bingbot, Yandexbot, Ahrefsbot, SEMrushbot, and headless-browser signatures (Puppeteer, Selenium, PhantomJS). See Analytics Dashboard for the full list
Data Retention 365 days Raw event data older than this is deleted. Range: 30-3,650 days. Aggregated daily stats are kept permanently
Aggregate After 7 days After this many days, raw events are rolled up into daily summary stats. Range: 1-30 days

GDPR & Privacy Settings

These settings apply regardless of whether analytics is enabled.

Setting Default Description
Require Cookie Consent Off Only track when the visitor has accepted cookies. Integrates with CookieYes, Complianz, Moove GDPR, and Cookie Notice
Anonymize IP Addresses Off Hash IP addresses with a salt that rotates at UTC midnight (new salt per UTC calendar day), strip user IDs, and remove sensitive query parameters from tracked URLs

Tab 6: Classifieds

Navigate to: Pro Settings → Classifieds

Pro Settings → Classifieds

(Only visible when the Classifieds module is enabled)

Classifieds Settings

Setting Default Description
Enable Classifieds On Master switch for the classifieds marketplace
Require Approval - New listings require admin approval before going live
Listing Duration 30 days Default expiration period for new listings
Max Images 10 Maximum images per listing (up to 50)

Advertiser Restrictions

Setting Default Description
Max Classifieds Per Advertiser 0 (unlimited) Cap how many active listings an advertiser can have at once
Minimum Balance to Post $0.00 Require a minimum wallet balance before posting is allowed (0 to disable)

Upgrade Options

Allow advertisers to pay to promote their listings.

Setting Default Description
Enable Upgrades - Allow advertisers to purchase listing upgrades
Upgrade Duration 7 days How long each upgrade remains active
Featured Price $5.00 / 30 days Price to feature a listing (highlighted with badge). Set to 0 to disable
Highlighted Price $3.00 / 7 days Price for a coloured background highlight. Set to 0 to disable
Urgent Price $4.00 / 7 days Price for an urgent badge. Set to 0 to disable
Top of Category Price $10.00 / 30 days Price to pin a listing at the top of its category. Set to 0 to disable
Bump Price $2.00 / 7 days Price to bump a listing to the top of search results. Set to 0 to disable

Inquiries

Setting Default Description
Enable Inquiries - Allow site visitors to send inquiries about listings
Email Notifications - Email the advertiser when an inquiry is received

Featured Listings Billing

Configure how the wallet is charged for featured listings.

Setting Default Description
Monthly Fee $10.00 Amount deducted per billing cycle (30 days)
Billing Model Recurring Monthly One-Time Payment - single charge for selected duration. Recurring Monthly - automatic monthly deduction
Duration Options 1, 3, 6, 12 months Which duration options advertisers can choose from

Tab 7: Emails

Navigate to: Pro Settings → Emails

Pro Settings → Emails

Configure automated email notifications. This tab is managed by the Email Notifications module. If that module is disabled, the tab is still visible but inactive.

Common email events configured here include: advertiser registration, ad approved/rejected, campaign status changes, low wallet balance alerts, classified listing approved/expired, inquiry received, and payment confirmation.


Settings Storage

Option Name Contents
wbam_pro_settings General, Trust System, Analytics enable/disable, Currency, Wallet, GDPR flags
wbam_pro_stripe_settings All Stripe keys, webhook secret, min/max amounts
wbam_pro_classifieds_settings Classifieds module settings, upgrade prices
wbam_pro_email_settings Email notification settings
wbam_pro_analytics_settings Data retention, aggregation, report range
wbam_page_{key} Individual page ID per portal page

Creating Ad Packages

Ad Packages admin list showing pricing tiers with limits and status

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

Ad packages define what advertisers purchase: pricing model, duration, impression or click limits, and which placements are included. When an advertiser submits an ad, they select a package, pay for it, and a campaign is created automatically.


How Packages Connect to Campaigns

When an advertiser purchases a package and their ad is approved, the plugin calls Campaign_Manager::create_from_package(). This creates a campaign linked to the package and the ad.

Budget reservation for CPM and CPC packages:

When the campaign status changes to active, the system pre-funds a budget reservation from the advertiser's wallet. This reservation holds the funds until the campaign completes or is cancelled, at which point unused funds are refunded automatically.

  • Flat rate packages - the package price is deducted at purchase time. No ongoing reservation.
  • CPM packages - the campaign budget is reserved at activation. The wallet is debited in real time as impressions accumulate. Unused budget is refunded when the campaign ends.
  • CPC packages - same reservation behaviour as CPM, debited per click instead of per impression.

If an advertiser's wallet balance is insufficient to cover the reservation, the campaign stays in pending status and cannot activate until funds are added.

Important: Pausing a campaign does not release the budget reservation. Funds remain held and are not re-reserved when the campaign resumes.


Pricing Models

Model Key How Cost Is Calculated
Flat Rate flat Fixed price charged at purchase
Cost Per 1,000 Impressions cpm (impressions × price_per_unit) / 1000
Cost Per Click cpc clicks × price_per_unit
CPM + CPC Combined cpm_cpc CPM cost + CPC cost summed

Package Fields

Field Type Default Description
Name string - Package display name shown to advertisers
Description text - What's included; supports basic HTML
Status select active active, inactive, or archived
Pricing Model select flat See table above
Price decimal 0.00 Used for flat pricing model
Price Per Unit decimal 0.00 Rate per 1,000 impressions (CPM) or per click (CPC)
Duration (days) integer 30 How many days the campaign runs. Set to 0 for unlimited
Impressions Limit integer null Maximum impressions before the campaign pauses. Leave blank for unlimited
Clicks Limit integer null Maximum clicks before the campaign pauses. Leave blank for unlimited
Placements multi-select (all) Which ad placements this package covers. Leave empty for all placements
Requires Approval checkbox true Whether purchased ads need admin review before going live
Max Ads Per Advertiser integer null Limit how many active campaigns an advertiser can have with this package. Leave blank for unlimited
Sort Order integer 0 Display order in package selection lists

Creating a Package

  1. Go to WB Ads → Packages → Add New.
  2. Enter a Name and Description.
  3. Choose a Pricing Model.
    • For flat: enter the Price.
    • For cpm or cpc: enter the Price Per Unit.
  4. Set Duration (days) and optional Impressions Limit or Clicks Limit.
  5. Select Placements (leave empty to allow all).
  6. Set Requires Approval and Max Ads Per Advertiser as needed.
  7. Click Save Package.

Default Packages

On a fresh installation the plugin creates four example packages if no packages exist:

Package Model Price Duration Impressions
Starter Flat $49.00 30 days 10,000
Professional Flat $149.00 30 days 50,000
Enterprise Flat $499.00 30 days Unlimited
Pay Per Click CPC $0.50/click 30 days Unlimited

Enterprise packages have requires_approval set to false by default.


Managing Packages

  • Duplicate - Creates a copy with (Copy) appended to the name and status set to inactive. Use this to create new tiers based on an existing package.
  • Reorder - Drag packages into the desired display order.
  • Archive - Hides a package from advertisers without deleting historical campaign data.

Package Statuses

Status Visible to Advertisers Description
active Yes Available for purchase
inactive No Hidden from frontend
archived No Permanently retired; keeps historical data

Best Practices

  • 3-4 tiers work best (Starter / Pro / Enterprise or similar good-better-best pricing).
  • Make the middle tier the best value to drive upgrades.
  • For CPM/CPC packages, ensure advertisers understand they need sufficient wallet balance at the time of campaign activation.
  • Set requires_approval = false only for premium tiers or trusted advertisers to reduce admin workload.
  • Use max_ads to prevent a single advertiser from monopolising inventory on popular packages.

Shortcode Reference

Every shortcode shipped by Free and Pro — with attributes, defaults, and examples.

Ad Display Shortcodes

What You'll Learn

  • How to display ads using shortcodes
  • All available parameters
  • Common use cases and examples

Available Shortcodes

Shortcode Purpose
[wbam_ad] Display a single specific ad by ID
[wbam_ads] Display multiple specific ads by their IDs

Note: Shortcodes display ads by ID. For automatic placement (header, footer, content, etc.), use the Placements checkboxes on each ad - no shortcode needed.


[wbam_ad] - Single Ad Display

Display one ad by its post ID.

Basic Usage

[wbam_ad id="123"]

All Parameters

Parameter Type Required Description
id int Yes The post ID of the ad to display
class string No Custom CSS class added to the ad wrapper

Examples

Display a specific ad:

[wbam_ad id="123"]

With a custom CSS class:

[wbam_ad id="123" class="my-custom-ad"]

[wbam_ads] - Multiple Ads Display

Display a set of specific ads by their IDs. All listed ads render in sequence inside a shared wrapper.

Basic Usage

[wbam_ads ids="1,2,3"]

All Parameters

Parameter Type Required Description
ids string Yes Comma-separated list of ad post IDs
class string No Custom CSS class added to each ad wrapper

Examples

Show three specific ads:

[wbam_ads ids="10,20,30"]

With a custom CSS class on each ad:

[wbam_ads ids="10,20,30" class="partner-logo"]

Finding Ad IDs

To find your ad's post ID:

  1. Go to WB Ad Manager → Ads
  2. Hover over an ad title - the ID appears in the URL at the bottom of your browser (e.g., post=123)
  3. Or click to edit an ad and check the URL: post.php?post=123&action=edit

Using in Different Locations

In Page/Post Content

Add the shortcode directly in the editor:

[wbam_ad id="123"]

In Widgets

  1. Add a Custom HTML or Text widget
  2. Paste the shortcode
  3. Save

In Theme Templates (PHP)

<?php echo do_shortcode( '[wbam_ad id="123"]' ); ?>

Styling Your Ads

Default CSS Classes

.wbam-ad                   /* Single ad container */
.wbam-ad-image             /* Image ad type */
.wbam-ad-rich_content      /* Rich Content ad type */
.wbam-ad-code              /* Code/HTML/JS ad type */
.wbam-ad-adsense           /* AdSense ad type */
.wbam-ad-email-capture     /* Email Capture ad type */
.wbam-placement-shortcode  /* Wrapper when using [wbam_ads] */

Custom Styling Examples

/* Add border to all ads */
.wbam-ad {
    border: 1px solid #ddd;
    padding: 10px;
}

/* Rounded image corners */
.wbam-ad img {
    border-radius: 8px;
}

/* Hover shadow effect */
.wbam-ad:hover {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

How Ad Rotation Works

Rotation is not controlled by shortcodes. It happens automatically at the placement level.

When multiple published ads are assigned to the same placement (e.g., "After Content"), the plugin selects which ad to show based on Priority (set per ad on a 1-10 slider). Higher priority ads are shown more often.

To display a specific ad regardless of rotation, use [wbam_ad id="123"] with the exact ID.


Troubleshooting

Ad not showing

  1. Verify the ad is published (not draft or disabled)
  2. Check the ad ID is correct
  3. Verify start/end dates if set
  4. Clear any caching plugins

Shortcode shows as plain text

  1. Verify the plugin is activated
  2. Check shortcode spelling - it is case-sensitive
  3. Ensure no extra spaces inside the shortcode brackets
  4. Try on a different page/post
  5. Switch to a default theme to test for conflicts

Clicks not tracking

  1. Verify tracking is enabled in settings
  2. Check destination URL starts with http:// or https://
  3. Test in an incognito window (ad blockers may interfere)

Performance Tips

  1. Optimize images - Compress ad images before uploading
  2. Limit ads per page - 3-5 ad placements is optimal
  3. Enable lazy loading - Turn on in WB Ad Manager → Settings → Performance for ads below the fold

See also: Link Shortcodes

Pro Shortcodes Reference

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

Complete reference for all 12 WB Ad Manager Pro shortcodes. Each shortcode requires the corresponding module to be enabled in Pro Settings → Modules.


Advertiser Portal Shortcodes

These shortcodes require the Advertisers module. All portal shortcodes redirect unauthenticated users to a login form.


[wbam_advertiser_dashboard]

Renders the full advertiser portal with a sidebar navigation layout. This is the primary shortcode - place it on the Advertiser Dashboard page.

Attributes:

Attribute Default Description
show_tabs overview,ads,campaigns,classifieds,inquiries,favorites,following,links,wallet,analytics,share-of-voice,profile Comma-separated list of tabs to display. Classifieds-related tabs only appear when the Classifieds module is enabled. The links tab only appears when the free Links module's Partnership_Form class is present

Available tab slugs:

Slug Label Notes
overview Overview Balance, recent activity, quick stats
ads My Ads Create, edit, view submitted ads
campaigns Campaigns Campaign management
classifieds Classifieds Manage classified listings (Classifieds module required)
inquiries Inquiries View inquiries on classifieds (Classifieds module required)
favorites Favorites Saved/favorited classifieds (Classifieds module required)
following Following Sellers the user follows
links Links Link partnership requests (free Links module required)
wallet Wallet Balance, top-up, transaction history
analytics Analytics Impression and click stats for the advertiser's own ads
share-of-voice Share of Voice Advertiser's share of total impressions
profile Profile Advertiser profile settings

Examples:

[wbam_advertiser_dashboard]
[wbam_advertiser_dashboard show_tabs="overview,ads,wallet,profile"]
[wbam_advertiser_dashboard show_tabs="overview,ads,campaigns,wallet,analytics,profile"]

[wbam_my_ads]

Displays only the advertiser's ads list. Use this when you want a standalone ads list without the full portal.

Attributes: None

Requires: User must be logged in and have an advertiser account.

[wbam_my_ads]

[wbam_advertiser_stats]

Renders a small stats widget showing the advertiser's wallet balance and count of active ads. Suitable for sidebars or widget areas.

Attributes: None

[wbam_advertiser_stats]

[wbam_advertiser_wallet]

Displays the wallet section only - balance, transaction history, and the Add Funds button. Use this when you want a standalone wallet page separate from the full dashboard.

Attributes: None

[wbam_advertiser_wallet]

[wbam_seller_profile]

Displays a public seller profile page showing the advertiser's information and their active classified listings.

Attributes:

Attribute Default Description
id 0 Advertiser ID to display. If 0, the shortcode reads the ?seller= query parameter from the URL
limit 12 Number of classified listings to display
columns 3 Grid columns for the listings grid

Examples:

[wbam_seller_profile]
[wbam_seller_profile id="42"]
[wbam_seller_profile id="42" limit="6" columns="2"]

Ad Submission Shortcodes

These shortcodes require the Ad Submissions module (which in turn requires Wallet, Campaigns, and Packages modules).


[wbam_submit_ad]

Legacy shortcode that redirects the user to the Advertiser Dashboard with the ad creation form open (?action=create-ad). The standalone ad submission wizard was replaced by the dashboard form in v1.1.0.

Attributes: None (all attributes are ignored)

Note: If no Advertiser Dashboard page is set in Pro Settings → Pages, this shortcode shows a warning message instead of redirecting.

[wbam_submit_ad]

Classifieds Shortcodes

All classifieds shortcodes require the Classifieds module to be enabled.


[wbam_submit_classified]

Displays the classified submission form. Requires the user to be logged in and have an advertiser account. Users without an advertiser account see a prompt to register first.

Attributes:

Attribute Default Description
redirect '' URL to redirect to after successful submission. Leave empty to use the default behaviour
[wbam_submit_classified]
[wbam_submit_classified redirect="https://example.com/my-classifieds"]

[wbam_my_classifieds]

Displays the logged-in advertiser's classified listings with full management options: view, edit, promote (featured, highlighted, bump, urgent, top), mark as sold, renew, and delete.

Attributes:

Attribute Default Description
limit 10 Number of listings to show per page
[wbam_my_classifieds]
[wbam_my_classifieds limit="20"]

[wbam_my_favorites]

Displays the logged-in user's saved/favorited classified listings in a grid. Requires login.

Attributes:

Attribute Default Description
limit 12 Number of favorited listings to display
columns 3 Grid column count
[wbam_my_favorites]
[wbam_my_favorites limit="24" columns="4"]

[wbam_my_following]

Displays the list of sellers that the logged-in user follows. Each seller card shows their avatar, follower count, total listing count, and up to 3 recent listings. Requires login.

Attributes:

Attribute Default Description
limit 24 Maximum number of followed sellers to display
[wbam_my_following]
[wbam_my_following limit="12"]

[wbam_browse_classifieds]

Public classifieds archive with a sidebar filter panel. Supports real-time URL-based filtering - category, location, keyword, price range, and condition filters are applied via query parameters so the filtered view is bookmarkable and shareable.

Attributes:

Attribute Default Description
limit 12 Listings per page
category '' Pre-filter by category term ID
location '' Pre-filter by location term ID
columns 3 Grid column count
sidebar left Filter sidebar position: left, right, or none

URL query parameters accepted: cpage (pagination), category, location, q (keyword search), orderby, min_price, max_price, condition[]

[wbam_browse_classifieds]
[wbam_browse_classifieds limit="24" columns="4" sidebar="left"]
[wbam_browse_classifieds category="5" sidebar="none"]

[wbam_classified_search]

Renders a search form widget with keyword input, category dropdown, and location dropdown. Submits to the configured results page or to the URL set via results_page.

Attributes:

Attribute Default Description
results_page '' URL of the page that contains [wbam_browse_classifieds]. If empty, the form action is the current page URL
[wbam_classified_search]
[wbam_classified_search results_page="https://example.com/classifieds"]

Module Requirements Summary

Shortcode Required Module
[wbam_advertiser_dashboard] Advertisers
[wbam_my_ads] Advertisers
[wbam_advertiser_stats] Advertisers
[wbam_advertiser_wallet] Advertisers
[wbam_seller_profile] Advertisers
[wbam_submit_ad] Ad Submissions
[wbam_submit_classified] Classifieds
[wbam_my_classifieds] Classifieds
[wbam_my_favorites] Classifieds
[wbam_my_following] Classifieds
[wbam_browse_classifieds] Classifieds
[wbam_classified_search] Classifieds

Troubleshooting

Fixes for common installation, placement, caching, and portal issues.

Common Issues & Solutions

What You'll Learn

  • How to fix common problems
  • Where to find error information
  • When to contact support

Quick Fixes

Before diving into specific issues, try these:

  1. Clear caches - Browser cache, WordPress cache, CDN cache
  2. Flush permalinks - Settings → Permalinks → Save Changes
  3. Check plugin conflicts - Deactivate other plugins temporarily
  4. Update WordPress - Ensure you're on the latest version

Installation Issues

Plugin won't activate

Error: "Plugin could not be activated because it triggered a fatal error"

Solutions:

  1. Check PHP version (requires 7.4+)
    • Go to Tools → Site Health → Info → Server
  2. Check WordPress version (requires 5.8+)
  3. Increase PHP memory limit to 128MB+
  4. Check error log for specific message

Menu not appearing after activation

Solutions:

  1. Clear browser cache and refresh
  2. Log out and log back in
  3. Check user role has administrator capabilities
  4. Deactivate/reactivate the plugin

Ad Display Issues

Ads not showing

Checklist:

  • Ad is published (not draft or disabled)
  • Ad has at least one placement checked, or you are using a shortcode with the correct ID
  • Start date has passed (if set)
  • End date has not passed (if set)
  • Session Impression Limit has not been reached for this visitor

Debug steps:

  1. Try the shortcode directly: [wbam_ad id="123"] (use the actual ad ID)
  2. Check ad status in WB Ad Manager → Ads
  3. View page source to check if the ad container renders
  4. Test in an incognito window to rule out session limits

Shortcode shows as plain text

Symptoms: You see [wbam_ad id="123"] instead of an ad

Solutions:

  1. Verify the plugin is activated
  2. Check shortcode spelling - wbam_ad not wbam-ad (case-sensitive)
  3. Ensure no extra spaces in shortcode
  4. Try in a different page/post
  5. Switch to a default theme temporarily

Ad not showing even though it's published

Common causes:

  • The ad is disabled - check the Ad Status metabox (Enabled/Disabled toggle)
  • No placements are checked and there is no shortcode for that ad
  • The Session Impression Limit has been reached for this visitor - test in incognito mode
  • The Disable for Admins setting is on - go to Settings and turn it off temporarily

Same ad always showing

Causes:

  • Only one ad is assigned to that placement
  • Aggressive page caching

Solutions:

  1. Add more published ads with the same placement checked
  2. Clear all caches
  3. Test in incognito/private browsing

Click Tracking Issues

Clicks not being tracked

Solutions:

  1. Go to Settings and verify tracking is enabled
  2. Check destination URL is valid (starts with http or https)
  3. Test in incognito mode - ad blockers can interfere
  4. Check for JavaScript errors in browser console
  5. Verify the link is not cached by a CDN

Analytics showing zero

Solutions:

  1. Wait a few minutes (stats may be delayed)
  2. Clear any caching
  3. Check database tables exist (deactivate and reactivate plugin if missing)
  4. Verify the tracking script is loading (view page source)

Link Management Issues

Links not displaying

Solutions:

  1. Verify link ID is correct
  2. Check the link is published
  3. Verify shortcode syntax: [wbam_link id="123"]

Partnership form not working

Symptoms: Form submits but nothing happens

Solutions:

  1. Check browser console for JavaScript errors
  2. Verify AJAX URL is accessible
  3. Check email settings in WordPress
  4. Look for form validation errors

Partnership emails not sending

Solutions:

  1. Check WordPress email works (test with other plugins)
  2. Verify email address in settings is correct
  3. Check spam/junk folder
  4. Use an SMTP plugin (WP Mail SMTP recommended)
  5. Check if your server is blocking outbound mail

Performance Issues

Pages loading slowly

Solutions:

  1. Enable lazy loading in WB Ad Manager → Settings → Performance
  2. Enable cache ad queries in the same section
  3. Reduce number of ad placements per page
  4. Optimize ad images before uploading

High server resource usage

Solutions:

  1. Enable ad query caching in Settings
  2. Reduce the number of active placements per page
  3. Optimize database tables (use a plugin like WP-Optimize)

Styling Issues

Ads breaking layout

Solutions:

  1. Add container width CSS:
.wbam-ad {
    max-width: 100%;
    overflow: hidden;
}
  1. Check for responsive issues on mobile
  2. Use browser inspector to find conflicts

Ads not responsive

Solution CSS:

.wbam-ad {
    width: 100%;
    max-width: 100%;
}

.wbam-ad img {
    max-width: 100%;
    height: auto;
}

@media (max-width: 768px) {
    .wbam-ad {
        text-align: center;
    }
}

Database Issues

"Table doesn't exist" error

Solutions:

  1. Deactivate and reactivate plugin - this re-runs the table creation
  2. Check database prefix matches wp-config.php
  3. Contact hosting for database access issues

Stats not saving

Solutions:

  1. Check database write permissions
  2. Verify tables exist (deactivate and reactivate)
  3. Check available disk space
  4. Look for database errors in the error log

Debugging

Enable WordPress Debug Mode

Add to wp-config.php:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Check logs at: /wp-content/debug.log

Check JavaScript Console

  1. Open browser Developer Tools (F12)
  2. Go to Console tab
  3. Look for red error messages
  4. Note any errors mentioning wbam

Check Network Tab

  1. Open Developer Tools → Network tab
  2. Reload the page
  3. Look for failed requests (shown in red)
  4. Check AJAX calls are returning 200 responses

Conflicts with Other Plugins

Common Conflict Sources

Plugin Type Potential Issue
Caching Stale ads, tracking issues
Security Blocked AJAX, false positives
Optimization Broken JavaScript
Page builders Shortcode rendering
Ad blockers Hidden ads, no tracking

Testing for Conflicts

  1. Activate only WB Ad Manager and a default theme
  2. Test if issue persists
  3. Reactivate plugins one by one
  4. Identify the conflicting plugin
  5. Contact support with findings

Getting Help

Before Contacting Support

Gather this information:

  • WordPress version
  • Plugin version
  • PHP version
  • Theme name
  • List of active plugins
  • Exact error message
  • Steps to reproduce

Checking Plugin Version

  1. Go to Plugins → Installed Plugins
  2. Find "WB Ad Manager"
  3. Note the version number

Support Resources

  • Documentation: Read relevant docs first
  • WordPress Forum: Community support
  • GitHub Issues: Bug reports

Upgrade to Pro

Many issues are solved in the Pro version:

  • Advanced debugging tools
  • Priority support
  • More configuration options
  • Better error handling

Learn About Pro →


Still having issues? Make sure you've tried all the quick fixes at the top of this page.

Pro Troubleshooting

PRO feature. Requires the WB Ad Manager Pro add-on on top of the free plugin.

Common issues and solutions for WB Ad Manager Pro.


Payment Issues

Stripe Payment Fails

Symptoms: Advertiser sees a payment error; wallet is not credited.

Checklist:

  1. Confirm you are using the correct key set - test keys (pk_test_, sk_test_) in test mode and live keys (pk_live_, sk_live_) in live mode.
  2. Verify SSL is active - Stripe requires HTTPS.
  3. Check the webhook is registered in the Stripe Dashboard at: https://yoursite.com/wp-json/wbam-pro/v1/stripe/webhook
  4. Confirm the webhook secret (whsec_...) in Pro Settings → Payments matches the one in Stripe Dashboard.
  5. Required webhook events: payment_intent.succeeded, checkout.session.completed, charge.refunded.
  6. Check Stripe Dashboard → Developers → Logs for failed delivery attempts.
  7. Enable WP_DEBUG_LOG and check wp-content/debug.log for PHP errors on webhook receipt.

Wallet Not Updated After Stripe Payment

The wallet is credited by the webhook, not by the redirect. If the webhook is not delivered, the wallet remains at the pre-payment balance.

  1. Confirm the webhook URL is reachable from the internet (not a localhost install).
  2. Check Stripe Dashboard for failed webhook deliveries and retry them manually.
  3. Confirm the webhook signing secret is correct - a mismatched secret causes signature validation to fail silently.

Manual/Bank Transfer Payment Stuck in Pending

How the offline payment flow works:

  1. Advertiser selects "Bank Transfer" and submits a fund request.
  2. A transaction record is created with status pending and type payment.
  3. The admin receives a notification email with the advertiser's bank reference.
  4. The admin reviews the request in WB Ads → Transactions.
  5. Admin clicks Approve (row action) - the wallet is credited and the transaction moves to completed.
  6. Admin clicks Cancel (row action) - the request is rejected and the transaction moves to cancelled.

If the payment stays in pending:

  • Confirm the admin has the manage_options capability.
  • Confirm the nonce in the Transactions admin page has not expired (reload the page if it has been open for more than 12 hours).
  • Check wp-content/debug.log for PHP errors during the approve/cancel action.
  • Verify the wbam_transactions table exists: run SHOW TABLES LIKE 'wp_wbam_transactions'; in your database tool.

Wallet Balance Mismatch

Symptoms: Advertiser reports a balance that does not match their expected amount.

Diagnostic steps:

  1. Go to WB Ads → Transactions and filter by the advertiser's ID.
  2. Check for any duplicate transactions - the wallet uses idempotency_key constraints to prevent double-credits, but this only applies to operations that set the key.
  3. Confirm that campaign_reserve transactions are not being treated as available balance. Reserved funds are shown in the advertiser's record but are not spendable.
  4. Check for campaign_refund transactions - these credit the wallet when a campaign completes or is cancelled and represent returned reserved funds.
  5. If a CPM/CPC campaign was active, check for campaign_adjust transactions - these represent the difference between the reserved amount and actual usage.

Budget Reservation Not Triggering

Symptoms: A CPM or CPC campaign activates but no campaign_reserve transaction appears in the wallet.

Cause: Reservation only fires when Campaign::update_status() transitions the campaign to active. The Campaign_Manager::create() method does not trigger a reservation.

Checklist:

  1. Confirm the campaign's pricing_model is cpm or cpc - flat-rate campaigns do not reserve funds.
  2. Confirm the campaign budget field is greater than 0.
  3. Confirm the advertiser has sufficient wallet balance. If balance is insufficient, the status transition fails silently and the campaign remains in its previous state.
  4. Check the wbam_campaigns table: the status column should read active after a successful transition.
  5. Check wp-content/debug.log for WP_Error responses from the Campaign Manager during status changes.

Campaign Status Transitions Failing

Valid status transitions are enforced by Campaign_Manager::is_valid_transition(). Invalid transitions are rejected.

Allowed transitions:

From To
draft pending, active, cancelled
pending active, cancelled
active paused, completed, expired, cancelled
paused active, completed, cancelled

Symptoms: Admin clicks "Activate" but the status does not change.

  1. Check the current campaign status in the database. If it is completed or expired, it cannot be reactivated.
  2. Confirm the advertiser wallet has enough balance to cover the budget reservation (for CPM/CPC campaigns).
  3. Check wp-content/debug.log for WP_Error objects returned by Campaign_Manager::update_status().
  4. Never check the return value with ! $result - WP_Error is truthy in PHP. Always use is_wp_error($result).

Module Dependency Errors

Symptoms: A module appears disabled even though you enabled it in Pro Settings → Modules.

Cause: Modules have dependency requirements. A module is effectively disabled if any of its dependencies are disabled.

Dependency map:

  • Campaigns requires Wallet
  • Packages requires Wallet and Campaigns
  • Ad Submissions requires Wallet, Campaigns, and Packages
  • Classifieds requires Wallet

Fix: Enable all required dependency modules first, then save. If enabling dependencies causes the expected module to still appear inactive, check for PHP errors - a fatal error during module boot can prevent registration.


Classified Meta Migration Issues

Version 1.4.0 (DB 2.8.0) introduced the wbam_classified_meta table to replace _wbam_custom_fields post meta. If you upgraded from a version before 2.8.0, custom field data may not have migrated correctly.

Symptoms: Custom fields are missing from classified listings after upgrade.

Checklist:

  1. Confirm the wbam_classified_meta table exists:
    SHOW TABLES LIKE 'wp_wbam_classified_meta';
    
  2. Check if the old post meta still exists:
    SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = '_wbam_custom_fields';
    
    If this returns rows but wbam_classified_meta is empty, the migration did not run.
  3. Trigger the migration by forcing the plugin's upgrade routine to re-run: deactivate WB Ad Manager Pro, then reactivate it. The installer runs maybe_upgrade() on activation and will create missing tables and migrate legacy meta if the stored DB version is behind the current DB_VERSION constant. If reactivation does not fix the issue, contact support with your current DB version (stored in the wbam_pro_db_version option).
  4. Confirm the classified post delete hook is working - meta rows should auto-delete when a classified is deleted (via Classified::delete() or cascade_delete_classified_data()).

Advertiser Portal Issues

Dashboard Shows Blank Page

  1. Confirm the user is logged in.
  2. Confirm the user has an advertiser account linked. Non-advertiser users see a "become advertiser" registration prompt, not a blank page.
  3. If the page appears empty after login, check for a PHP fatal error in wp-content/debug.log.
  4. Clear your caching plugin's cache - portal pages must not be cached per-user.
  5. Confirm the [wbam_advertiser_dashboard] shortcode is in the page content.

Tabs Missing from Dashboard

Some tabs are conditional:

  • Classifieds tabs (classifieds, inquiries, favorites) only appear when the Classifieds module is enabled.
  • The links tab only appears when the free WB Ad Manager plugin's Partnership_Form class is present.
  • You can restrict tabs using the show_tabs attribute: [wbam_advertiser_dashboard show_tabs="overview,ads,wallet,profile"].

Analytics Issues

No Data Showing

  1. Confirm analytics is enabled at Pro Settings → General → Enable analytics tracking.
  2. Allow up to 24 hours for data to accumulate on new installs.
  3. Check date range filters - the default range may not include today if the filter was previously set to a past date.
  4. Confirm the analytics JavaScript is loading (check browser console for errors).
  5. If tracking logged-in users: enable Track Logged-in Users in Pro Settings → Analytics & Privacy - by default, only anonymous visitors are tracked.
  6. If all traffic appears as bots, verify that Bot Filtering is not too aggressive for your test environment (curl, wget, and headless browsers are filtered).

Impressions Not Recording

  1. Confirm ads are actually being displayed (check the frontend with an ad blocker disabled).
  2. Open browser DevTools → Network and look for AJAX requests to wbam_track_event.
  3. Check for JavaScript console errors that may prevent the tracking script from firing.
  4. Confirm GDPR consent is not blocking tracking - if Require Cookie Consent is enabled, analytics only fires after the visitor accepts the cookie notice.

Common REST API Errors

Error Likely Cause Fix
rest_forbidden User lacks the required capability Confirm the request includes a valid nonce or authentication credentials
401 Unauthorized Missing or expired authentication Include X-WP-Nonce header or use Application Passwords
400 Bad Request on campaign creation Missing required fields or invalid pricing_model Check that pricing_model is one of: flat, cpm, cpc, cpm_cpc
Stripe webhook returns 400 Invalid or missing webhook secret Re-copy the whsec_... value from Stripe Dashboard to Pro Settings → Payments
Stripe webhook returns 200 but wallet not credited Idempotency key collision Check for duplicate payment_intent.succeeded events in Stripe logs; each event should have a unique ID

Debug Mode

Enable WordPress debug logging before reporting an issue:

// Add to wp-config.php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Check the log at: wp-content/debug.log


Getting Help

Pro customers receive priority support. When contacting support, include:

  • Plugin version (visible in Plugins → WB Ad Manager Pro)
  • WordPress version
  • PHP version
  • Error messages from debug.log
  • Steps to reproduce the issue
  • Your DB version (stored in the wbam_pro_db_version option; view with wp option get wbam_pro_db_version or look up the row in wp_options)

Something unclear? Open a support ticket →

Buy WB Ad Manager