{"id":50,"date":"2026-04-29T22:15:55","date_gmt":"2026-04-29T22:15:55","guid":{"rendered":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/2026\/04\/29\/paid-packages-payments\/"},"modified":"2026-04-29T22:15:55","modified_gmt":"2026-04-29T22:15:55","slug":"paid-packages-payments","status":"publish","type":"post","link":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/2026\/04\/29\/paid-packages-payments\/","title":{"rendered":"Paid Packages &#038; Payments"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Paid Packages &#038; Payments <em>[Pro]<\/em><\/h1>\n\n\n<p>If you charge for listings \u2014 featured slots, bumped-to-top, premium categories, or just any-listing-costs-money \u2014 this is where you set it up.<\/p>\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>All Pro features.<\/strong> The free theme has no payment integration; everything here requires Best Classifieds Pro active and licensed.<\/p><\/blockquote>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Concepts<\/h2>\n\n\n<p>A <strong>package<\/strong> defines what a user gets when they pay (or post for free). A package has:<\/p>\n\n\n<ul class=\"wp-block-list\">\n<li>A name and price<\/li>\n<li>A duration (the listing stays live for N days)<\/li>\n<li>Featured \/ not featured (gets the gold &#8220;Featured&#8221; badge and pinned-to-top placement)<\/li>\n<li>A maximum image count<\/li>\n<li>Allowed categories (some packages might only apply to Vehicles, for example)<\/li>\n<\/ul>\n\n\n<p>Packages are configured at <strong>Classifieds Pro \u2192 Packages<\/strong>.<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">A typical package setup<\/h2>\n\n\n<figure class=\"wp-block-table\"><table>\n<thead><tr>\n<th>Package<\/th>\n<th>Price<\/th>\n<th>Duration<\/th>\n<th>Featured<\/th>\n<th>Max images<\/th>\n<th>Use case<\/th>\n<\/tr><\/thead><tbody>\n<tr>\n<td><strong>Free Standard<\/strong><\/td>\n<td>$0<\/td>\n<td>30 days<\/td>\n<td>No<\/td>\n<td>3<\/td>\n<td>Most listings \u2014 free for individuals<\/td>\n<\/tr>\n<tr>\n<td><strong>Boosted<\/strong><\/td>\n<td>$9<\/td>\n<td>30 days<\/td>\n<td>Yes<\/td>\n<td>6<\/td>\n<td>Featured badge + top-of-category placement<\/td>\n<\/tr>\n<tr>\n<td><strong>Premium 60-Day<\/strong><\/td>\n<td>$19<\/td>\n<td>60 days<\/td>\n<td>Yes<\/td>\n<td>8<\/td>\n<td>Long-running listings<\/td>\n<\/tr>\n<tr>\n<td><strong>Business Vehicle<\/strong><\/td>\n<td>$39<\/td>\n<td>90 days<\/td>\n<td>Yes<\/td>\n<td>12<\/td>\n<td>Auto dealers&#8217; inventory<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n<p>Most marketplaces start with two packages: Free Standard + one paid Boosted option. Add more once you understand what your sellers want.<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Payment gateways<\/h2>\n\n\n<svg viewBox=\"0 0 720 240\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"max-width:100%;height:auto;display:block;margin:1rem auto;font-family:system-ui,sans-serif;\">\n  <rect x=\"20\" y=\"20\" width=\"200\" height=\"80\" rx=\"6\" fill=\"#FAFAF7\" stroke=\"#635BFF\" stroke-width=\"1.5\"\/>\n  <text x=\"120\" y=\"48\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"600\" fill=\"#1a1a1a\">Stripe<\/text>\n  <text x=\"120\" y=\"68\" text-anchor=\"middle\" font-size=\"11\" fill=\"#5a6f84\">Global \u00b7 135+ currencies<\/text>\n  <text x=\"120\" y=\"86\" text-anchor=\"middle\" font-size=\"10\" fill=\"#5a6f84\">cards, Apple Pay, Google Pay<\/text>\n\n  <rect x=\"260\" y=\"20\" width=\"200\" height=\"80\" rx=\"6\" fill=\"#FAFAF7\" stroke=\"#3395FF\" stroke-width=\"1.5\"\/>\n  <text x=\"360\" y=\"48\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"600\" fill=\"#1a1a1a\">Razorpay<\/text>\n  <text x=\"360\" y=\"68\" text-anchor=\"middle\" font-size=\"11\" fill=\"#5a6f84\">India \u00b7 INR + GST<\/text>\n  <text x=\"360\" y=\"86\" text-anchor=\"middle\" font-size=\"10\" fill=\"#5a6f84\">UPI, cards, netbanking, wallets<\/text>\n\n  <rect x=\"500\" y=\"20\" width=\"200\" height=\"80\" rx=\"6\" fill=\"#fff\" stroke=\"#94a3b8\" stroke-dasharray=\"4,3\"\/>\n  <text x=\"600\" y=\"48\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"600\" fill=\"#5a6f84\">Other (custom)<\/text>\n  <text x=\"600\" y=\"68\" text-anchor=\"middle\" font-size=\"11\" fill=\"#5a6f84\">PayPal, Square, etc.<\/text>\n  <text x=\"600\" y=\"86\" text-anchor=\"middle\" font-size=\"10\" fill=\"#5a6f84\">extension via filter<\/text>\n\n  <rect x=\"20\" y=\"140\" width=\"680\" height=\"80\" rx=\"6\" fill=\"#FAFAF7\" stroke=\"#cbd5e1\"\/>\n  <text x=\"40\" y=\"166\" font-size=\"13\" font-weight=\"600\" fill=\"#1a1a1a\">Gateway selection logic<\/text>\n  <text x=\"40\" y=\"186\" font-size=\"11\" fill=\"#5a6f84\">\u00b7 Both enabled \u2192 user picks at checkout<\/text>\n  <text x=\"40\" y=\"204\" font-size=\"11\" fill=\"#5a6f84\">\u00b7 Geo-detect to suggest (IN visitors \u2192 Razorpay first; everyone else \u2192 Stripe first)<\/text>\n<\/svg>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Stripe setup<\/h2>\n\n\n<h3 class=\"wp-block-heading\">Get your keys<\/h3>\n\n\n<ol class=\"wp-block-list\">\n<li>Sign up at <a href=\"https:\/\/stripe.com\">stripe.com<\/a>.<\/li>\n<li>Activate your account (business name, bank details, identity verification).<\/li>\n<li>Dashboard \u2192 <strong>Developers \u2192 API keys<\/strong>:<\/li>\n<\/ol>\n\n\n<p>   &#8211; <strong>Publishable key<\/strong> starts with <code>pk_live_...<\/code> (or <code>pk_test_...<\/code> in test mode) &#8211; <strong>Secret key<\/strong> starts with <code>sk_live_...<\/code> (<code>sk_test_...<\/code> for test)<\/p>\n\n\n<h3 class=\"wp-block-heading\">Configure in WordPress<\/h3>\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Classifieds Pro \u2192 Settings \u2192 Payments \u2192 Stripe<\/strong>.<\/li>\n<li>Toggle <strong>Enable Stripe<\/strong>.<\/li>\n<li>Paste publishable + secret keys.<\/li>\n<li>Set the <strong>Mode<\/strong> (Test or Live).<\/li>\n<li><strong>Save<\/strong>.<\/li>\n<\/ol>\n\n\n<h3 class=\"wp-block-heading\">Test it<\/h3>\n\n\n<p>In test mode, use Stripe&#8217;s test cards:<\/p>\n\n\n<figure class=\"wp-block-table\"><table>\n<thead><tr>\n<th>Card<\/th>\n<th>Number<\/th>\n<th>Expected outcome<\/th>\n<\/tr><\/thead><tbody>\n<tr>\n<td>Visa success<\/td>\n<td><code>4242 4242 4242 4242<\/code><\/td>\n<td>Payment approved<\/td>\n<\/tr>\n<tr>\n<td>Card declined<\/td>\n<td><code>4000 0000 0000 0002<\/code><\/td>\n<td>Generic decline<\/td>\n<\/tr>\n<tr>\n<td>3D Secure required<\/td>\n<td><code>4000 0027 6000 3184<\/code><\/td>\n<td>Auth challenge appears<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n<p>Any future expiry, any 3-digit CVC, any postal code work.<\/p>\n\n\n<h3 class=\"wp-block-heading\">Webhooks (optional but recommended)<\/h3>\n\n\n<p>Stripe webhooks confirm payments after the user closes the browser. Without them, only synchronous confirmations work.<\/p>\n\n\n<ol class=\"wp-block-list\">\n<li>Stripe Dashboard \u2192 <strong>Developers \u2192 Webhooks \u2192 Add endpoint<\/strong>.<\/li>\n<li>URL: <code>https:\/\/yoursite.com\/?wpdigipro-action=stripe-webhook<\/code> <em>(actually, for BC Pro it&#8217;s <code>?bcpro-action=stripe-webhook<\/code>)<\/em><\/li>\n<li>Events to send: <code>payment_intent.succeeded<\/code>, <code>payment_intent.payment_failed<\/code>, <code>charge.refunded<\/code>.<\/li>\n<li>Copy the <strong>Signing secret<\/strong> (<code>whsec_...<\/code>) and paste into BC Pro Stripe settings.<\/li>\n<\/ol>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Razorpay setup<\/h2>\n\n\n<h3 class=\"wp-block-heading\">Get your keys<\/h3>\n\n\n<ol class=\"wp-block-list\">\n<li>Sign up at <a href=\"https:\/\/razorpay.com\">razorpay.com<\/a>.<\/li>\n<li>Complete KYC (PAN, GST, bank account).<\/li>\n<li>Dashboard \u2192 <strong>Settings \u2192 API Keys \u2192 Generate Key<\/strong>:<\/li>\n<\/ol>\n\n\n<p>   &#8211; <strong>Key ID<\/strong> starts with <code>rzp_live_...<\/code> (<code>rzp_test_...<\/code> in test) &#8211; <strong>Key Secret<\/strong> is shown ONCE \u2014 save it immediately<\/p>\n\n\n<h3 class=\"wp-block-heading\">Configure in WordPress<\/h3>\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Classifieds Pro \u2192 Settings \u2192 Payments \u2192 Razorpay<\/strong>.<\/li>\n<li>Toggle <strong>Enable Razorpay<\/strong>.<\/li>\n<li>Paste Key ID + Key Secret.<\/li>\n<li>Set <strong>Mode<\/strong> (Test or Live).<\/li>\n<li><em>(Indian sellers)<\/em> Toggle <strong>Enable GST<\/strong> if you collect 18% GST on listings.<\/li>\n<li><strong>Save<\/strong>.<\/li>\n<\/ol>\n\n\n<h3 class=\"wp-block-heading\">Test it<\/h3>\n\n\n<p>Test mode uses dummy cards. Use card <code>4111 1111 1111 1111<\/code> with any expiry, any CVC. UPI test ID: <code>success@razorpay<\/code> (succeeds) or <code>failure@razorpay<\/code> (fails).<\/p>\n\n\n<h3 class=\"wp-block-heading\">Webhooks<\/h3>\n\n\n<p>Same as Stripe but at <code>?bcpro-action=razorpay-webhook<\/code>. Add via Razorpay Dashboard \u2192 <strong>Settings \u2192 Webhooks<\/strong>. Listen for <code>payment.captured<\/code> and <code>payment.failed<\/code>.<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">How the checkout flow works<\/h2>\n\n\n<ol class=\"wp-block-list\">\n<li>User submits a listing via <code>[bc_submit_listing]<\/code>.<\/li>\n<li>They reach the package step. If they pick a paid package, the form submission triggers payment.<\/li>\n<li>The selected gateway&#8217;s modal opens (Stripe Checkout or Razorpay popup).<\/li>\n<li>User pays with card \/ UPI \/ wallet.<\/li>\n<li>On success, the listing is published (or pending if approval is required).<\/li>\n<li>The user lands on the new listing&#8217;s permalink with a &#8220;Listing live!&#8221; success banner.<\/li>\n<li>The seller dashboard shows the listing under &#8220;Active&#8221; with the package badge.<\/li>\n<\/ol>\n\n\n<p>If the payment fails or the user closes the popup, the listing stays in <code>pending_payment<\/code> status. The seller can retry from their dashboard.<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Refunds<\/h2>\n\n\n<p>Refund a listing that&#8217;s already published:<\/p>\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Classifieds Pro \u2192 Orders<\/strong> \u2192 find the order.<\/li>\n<li>Click <strong>Refund<\/strong> \u2192 enter amount (full or partial).<\/li>\n<li>The refund goes through the original gateway. The listing goes to <code>refunded<\/code> status (not visible to public).<\/li>\n<\/ol>\n\n\n<p>Sellers can refund through their gateway dashboard too \u2014 Stripe\/Razorpay will fire a webhook that updates the order status in WP automatically (if webhooks are configured).<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Currency<\/h2>\n\n\n<p>Set the default currency at <strong>Classifieds Pro \u2192 Settings \u2192 General \u2192 Currency<\/strong>. Affects:<\/p>\n\n\n<ul class=\"wp-block-list\">\n<li>Price display (&#8220;$&#8221; prefix vs &#8220;\u20b9&#8221; vs &#8220;\u20ac&#8221;)<\/li>\n<li>Stripe\/Razorpay checkout currency<\/li>\n<li>Reporting in <strong>Classifieds Pro \u2192 Reports<\/strong><\/li>\n<\/ul>\n\n\n<p>Pre-formatted price strings (e.g. <code>$14,800<\/code>) ignore this setting \u2014 they render verbatim. Only pure-numeric prices are formatted.<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Tax handling<\/h2>\n\n\n<p>For most marketplaces, you don&#8217;t charge tax \u2014 sellers are responsible for their own. But if you do:<\/p>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Razorpay<\/strong> \u2014 toggle &#8220;Enable GST&#8221; (India only) \u2192 18% added at checkout, listed separately on the invoice.<\/li>\n<li><strong>Stripe<\/strong> \u2014 use Stripe Tax. Enable in your Stripe dashboard, set product categories, BC Pro forwards the cart to Stripe Tax for calculation.<\/li>\n<li><strong>Custom<\/strong> \u2014 filter <code>best_classifieds_payment_amount<\/code>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\"><code>add_filter( &#039;best_classifieds_payment_amount&#039;, function( $amount, $package, $user_id ) {\n    $tax_rate = 0.10; \/\/ 10% sales tax\n    return $amount * ( 1 + $tax_rate );\n}, 10, 3 );<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Reporting<\/h2>\n\n\n<p><strong>Classifieds Pro \u2192 Reports<\/strong> shows:<\/p>\n\n\n<ul class=\"wp-block-list\">\n<li>Revenue by month (line chart)<\/li>\n<li>Top packages by sales<\/li>\n<li>Top categories by listing volume<\/li>\n<li>Active vs expired listings<\/li>\n<li>Refund rate<\/li>\n<\/ul>\n\n\n<p>Export to CSV with the <strong>Export<\/strong> button (top-right of each chart).<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h2 class=\"wp-block-heading\">Adding a custom payment gateway<\/h2>\n\n\n<p>To plug in PayPal, Square, or any other gateway, register a payment method via:<\/p>\n\n\n<pre class=\"wp-block-code\"><code>add_filter( &#039;best_classifieds_payment_gateways&#039;, function( $gateways ) {\n    $gateways[&#039;paypal&#039;] = array(\n        &#039;label&#039;    =&gt; &#039;PayPal&#039;,\n        &#039;callback&#039; =&gt; &#039;my_paypal_handler&#039;,\n        &#039;fields&#039;   =&gt; array(\n            &#039;client_id&#039;     =&gt; &#039;PayPal Client ID&#039;,\n            &#039;client_secret&#039; =&gt; &#039;PayPal Client Secret&#039;,\n        ),\n    );\n    return $gateways;\n} );\n\nfunction my_paypal_handler( $order_id, $amount, $currency ) {\n    \/\/ Initiate the PayPal order, return the approval URL.\n    return array(\n        &#039;success&#039;  =&gt; true,\n        &#039;redirect&#039; =&gt; &#039;https:\/\/paypal.com\/...&#039;,\n    );\n}<\/code><\/pre>\n\n\n<p>The settings page automatically adds a tab for your gateway. The submission flow includes it as a checkout option.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you charge for listings \u2014 featured slots, bumped-to-top, premium categories, or just any-listing-costs-money \u2014 this is where you set it up.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-pro-features"],"_links":{"self":[{"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":0,"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"wp:attachment":[{"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.fasterthemes.com\/best-classifieds-wordpress-theme\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}