PaidListings
Sell listing submissions, upgrades, and premium listing features with the JReviews 6 PaidListings add-on.
Overview
PaidListings lets you charge for new listings and sell upgrades such as featured status, additional custom fields, and higher media limits. A purchase belongs to one listing; the add-on does not automatically copy a plan to another article or listing.
Enable the JReviews 6 pages
Open JReviews → Early Access and enable PaidListings — Account & Plans Pages. This switches My Account, Paid Plans, orders, invoices, subscriptions, billing, and the modern notification flow to the JReviews 6 implementation. The streamlined checkout is used with the modern listing flow.
Test checkout, renewals, cancellations, expiration, and every enabled payment handler on a staging site before enabling the pages in production. Disabling the switch returns those surfaces to the legacy implementation without converting your orders or plans.
Getting started
Complete the initial JReviews setup, then:
- Create the PaidListings My Account menu item.
- Create at least one base pricing plan and assign it to the categories where it is sold.
- Configure and enable a payment handler. Offline payments are useful for the first test.
- Run a complete listing submission and payment before opening sales.
The optional Paid Categories menu displays the plans available for selected categories.
Pricing plans
Plan types
- Base plans are used for a new paid submission and can optionally be offered when a listing changes its current base tier.
- Upgrade plans add features to a listing that already has a base plan. An upgrade can be exclusive or restricted to selected base plans.
Payment types
- One time — paid once, with renewal available for plans that expire.
- Subscription — renewed by a supported payment handler on the plan schedule.
- Free or trial — activates without a charge for the configured duration.
Expiration
An expiring base plan can either switch the listing to a selected free plan or allow the listing to become unpublished. Users can renew or change plans before or after expiration. Upgrade expiration removes only the features granted by that upgrade.
Existing listings
Listings already present in a category need an order when that category becomes paid. Without one, paid field and media rules treat the listing as having no active entitlement.
- Create a free base plan for the affected category. Use Never Expires when the existing listings should remain active indefinitely.
- Use Create Orders for that plan to create orders for listings that do not have one.
- Verify several listings, including their fields, featured state, and published media.
Payment handlers
The Payment Handlers page is the source of truth for the handlers installed on your site and the payment modes each supports. Open every enabled handler and complete its required credentials, return URLs, and webhook setup.
Stripe uses the separate Stripe Payments add-on. The current PayPal and Stripe setup requirements are shown in their handler settings; use those values rather than webhook names or URLs copied from older documentation.
For an Offline order, open the order in the administrator, mark the offline payment as successful, and save it. This activates the order through the normal entitlement pipeline.
Taxes and coupons
PaidListings supports a standard tax rate or EU tax rates by customer country and type. Taxes can be included in the displayed plan price or added to it.
Coupons can be limited by date, user, plan, category, renewal status, and number of uses. A coupon for 100% can provide an administrator or selected users with a normal checkout that completes without a charge.
Orders and plan changes
Use Create Order in the administrator to assign a plan manually. Select zero price when the entitlement is being granted without collecting payment.
Orders keep a snapshot of the plan used when they were created. After changing the fields, media limits, featured state, or other entitlement settings on a plan, use Update Orders for that plan when existing orders should receive the new snapshot. Verify the affected listings after a bulk update.
Notifications and scheduled expiration
Review the PaidListings notification settings and templates before launch. The modern flow queues the configured order, payment, renewal, and expiration messages.
Expiration checks and reminders require JReviews Cron. Run cron every minute; each PaidListings task still controls its own due interval. The first reminder interval also controls when the renewal option begins appearing in My Account.
Developer integrations
JReviews 6 exposes a settled entitlement event and FWDHook action for integrations:
paidlistings:listing_entitlements_changed
The event includes the listing ID, the final active base and upgrade assignments, effective featured/field/media entitlements, a reason, and stable fingerprints. It fires only after a supported JReviews 6 entitlement transition has settled. Delivery is synchronous and best-effort; callback failures are contained so they cannot break checkout or cron.
Use the Hooks Directory for complete copyable examples, including a Joomla Language Associations example. Custom code chooses the associated target and direction; the product API itself remains CMS- and multilingual-policy neutral.
For FWDHook callbacks, use templates/jreviews_overrides/hooks.php on Joomla or
jreviews_overrides/hooks.php on WordPress. For a class-based Laravel listener, use
templates/jreviews_overrides/config/events.php on Joomla or
jreviews_overrides/config/events.php on WordPress. Both complete forms are included in
the hook examples.
To copy the active assignments from a chosen source listing to a chosen target listing:
use JReviews\Addons\PaidListings\App\Actions\SyncListingEntitlementsAction;
use JReviews\Addons\PaidListings\App\Enums\EntitlementSyncPolicy;
$result = SyncListingEntitlementsAction::run(
sourceListingId: $sourceListingId,
targetListingId: $targetListingId,
policy: EntitlementSyncPolicy::ReplaceTargetEntitlements,
);
The action does not discover associations or copy charges, invoices, transactions, subscriptions, or gateway identifiers. It creates zero-charge target assignments and can accept an explicit source-plan-to-target-plan map when translated categories use different plan IDs. Each target order receives the source order's captured entitlement settings—not whatever the live plan happens to contain later—with the mapped target identity and no financial or subscription state. If different listing-type media defaults make the source state impossible to reproduce, validation stops before writing. Do not run simultaneous synchronization calls against the same target.