{"id":358814,"date":"2026-08-28T20:49:47","date_gmt":"2026-08-28T20:49:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/chala-subscriptions-for-woocommerce\/"},"modified":"2026-08-28T20:49:18","modified_gmt":"2026-08-28T20:49:18","slug":"chala-subscriptions","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/chala-subscriptions\/","author":23536006,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Chala Subscriptions for WooCommerce","header_author":"Bytloop","header_description":"Gateway-agnostic subscriptions for WooCommerce. Stripe, PayPal, and manual renewal free. Razorpay, Mollie, Paystack, Square in Pro. Half the price of the official plugin.","assets_banners_color":"183070","last_updated":"2026-08-28 20:49:18","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/bytloop.com\/","header_plugin_uri":"https:\/\/chala.bytloop.com\/","header_author_uri":"https:\/\/bytloop.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"bytloop","date":"2026-08-28 20:49:18","revision":3670918}},"upgrade_notice":{"1.0.0":"<p>Initial release of Chala Subscriptions for WooCommerce.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3670917,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3670917,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3670917,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3670917,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3670917,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3670917,"resolution":"1","location":"assets","locale":"","width":1280,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3670917,"resolution":"2","location":"assets","locale":"","width":1280,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3670917,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3670917,"resolution":"4","location":"assets","locale":"","width":1440,"height":1000}},"screenshots":{"1":"Customer subscription list in My Account.","2":"Subscription detail with cancel, pause, and update payment method options.","3":"Admin subscription list with filters.","4":"Settings, including which gateways have been verified against the provider."}},"plugin_section":[262246],"plugin_tags":[334,32529,5349,4079,286],"plugin_category":[41,45],"plugin_contributors":[274389],"plugin_business_model":[],"class_list":["post-358814","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-paypal","plugin_tags-recurring-payments","plugin_tags-stripe","plugin_tags-subscriptions","plugin_tags-woocommerce","plugin_category-communication","plugin_category-ecommerce","plugin_contributors-bytloop","plugin_committers-bytloop"],"banners":{"banner":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/banner-772x250.png?rev=3670917","banner_2x":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/banner-1544x500.png?rev=3670917","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/icon.svg?rev=3670917","icon":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/icon.svg?rev=3670917","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/screenshot-1.png?rev=3670917","caption":"Customer subscription list in My Account."},{"src":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/screenshot-2.png?rev=3670917","caption":"Subscription detail with cancel, pause, and update payment method options."},{"src":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/screenshot-3.png?rev=3670917","caption":"Admin subscription list with filters."},{"src":"https:\/\/ps.w.org\/chala-subscriptions\/assets\/screenshot-4.png?rev=3670917","caption":"Settings, including which gateways have been verified against the provider."}],"raw_content":"<!--section=description-->\n<p><strong>Chala<\/strong> (pronounced CHOH-la, Bengali for \"to keep going\") turns any WooCommerce product into one that bills on a schedule, using the payment gateway you already have configured.<\/p>\n\n<p>Sell a product that bills weekly, monthly or yearly, and let Chala handle the rest: taking the renewal payment on time, retrying it when the card declines, emailing the customer, and giving them a place to pause or cancel without opening a support ticket.<\/p>\n\n<p>Every amount is stored as an integer in the currency's smallest unit, so JPY (no decimals) and KWD (three) are as correct as USD. Every webhook is de-duplicated before it is acted on, because payment providers deliver the same event more than once. Every subscription order is a real WooCommerce order under High-Performance Order Storage.<\/p>\n\n<p>Built by the team behind <a href=\"https:\/\/wordpress.org\/plugins\/nishchoy-reviews\/\">Nishchoy Reviews<\/a> and <a href=\"https:\/\/wordpress.org\/plugins\/uttor-aeo\/\">Uttor AEO<\/a>.<\/p>\n\n<h4>Features (free)<\/h4>\n\n<ul>\n<li><strong>Subscription products<\/strong> \u2014 recurring daily \/ weekly \/ monthly \/ yearly, billed every period or every Nth period<\/li>\n<li><strong>Free trials<\/strong> \u2014 delay the first payment by any number of days<\/li>\n<li><strong>Sign-up fees<\/strong> \u2014 a one-time charge taken with the first payment<\/li>\n<li><strong>Fixed-length subscriptions<\/strong> \u2014 stop automatically after a set number of payments<\/li>\n<li><strong>Stripe integration<\/strong> \u2014 full support for saved cards, SCA\/3DS, and automatic renewals<\/li>\n<li><strong>PayPal integration<\/strong> \u2014 Reference Transactions for renewals<\/li>\n<li><strong>Manual renewal<\/strong> \u2014 for merchants who invoice offline<\/li>\n<li><strong>Customer portal<\/strong> \u2014 subscribers manage their own subscriptions in My Account (pause, resume, cancel, update payment method, update address)<\/li>\n<li><strong>Merchant admin<\/strong> \u2014 full subscription list with filters, individual editor, manual creation, bulk actions<\/li>\n<li><strong>Automatic renewals<\/strong> \u2014 powered by Action Scheduler, idempotent by design<\/li>\n<li><strong>Failed payment retries<\/strong> \u2014 retry on a fixed schedule, with a cap you set<\/li>\n<li><strong>MRR dashboard<\/strong> \u2014 see active count and monthly recurring revenue at a glance<\/li>\n<li><strong>Email notifications<\/strong> \u2014 subscription started, renewal successful, renewal failed, cancelled, and more<\/li>\n<li><strong>Full audit log<\/strong> \u2014 every subscription state change recorded with who\/what\/when<\/li>\n<li><strong>Migration from official WooCommerce Subscriptions<\/strong> \u2014 one-click, dry-run first<\/li>\n<li><strong>HPOS-native<\/strong> \u2014 first-class WooCommerce High-Performance Order Storage support<\/li>\n<li><strong>REST API<\/strong> \u2014 headless-friendly, works with block-based checkout<\/li>\n<li><strong>WP-CLI commands<\/strong> \u2014 <code>wp chala list<\/code>, <code>wp chala renew<\/code>, <code>wp chala export<\/code><\/li>\n<li><strong>Gateway self-test<\/strong> \u2014 <code>wp chala gateway-selftest &lt;gateway&gt;<\/code> charges your\nsandbox, replays the charge to prove a retried renewal will not bill twice,\nand refunds it. It refuses to run against live credentials.<\/li>\n<li><strong>Data ownership<\/strong> \u2014 everything in your WordPress database, no third-party servers<\/li>\n<\/ul>\n\n<h4>Pro version<\/h4>\n\n<p><a href=\"https:\/\/chala.bytloop.com\/\">Chala Pro<\/a> is a separate plugin that adds five more gateways (Authorize.Net, plus Razorpay, Mollie, Paystack and Square as experimental \u2014 see the FAQ), multiple plans per product, prorated upgrades and downgrades, configurable dunning retry ladders, subscriber-only coupons, cohort retention analytics, cancellation save flows, and priority support. Everything described above is in this plugin and stays that way.<\/p>\n\n<h4>Works with Nishchoy Reviews and Uttor AEO<\/h4>\n\n<p>Chala integrates with our other plugins when they are installed. Nishchoy Reviews can request a review from long-term subscribers. Uttor AEO adds recurring price information to your subscription products' schema markup. Neither is required.<\/p>\n\n<h4>Migration from WooCommerce Subscriptions<\/h4>\n\n<p>If you're on the official plugin, migrate in three steps:<\/p>\n\n<ol>\n<li>Install Chala alongside the official plugin.<\/li>\n<li>Run <code>wp chala migrate --dry-run<\/code> to preview.<\/li>\n<li>Run <code>wp chala migrate --commit<\/code> to import.<\/li>\n<\/ol>\n\n<p>Full guide at <a href=\"https:\/\/chala.bytloop.com\/migration\">chala.bytloop.com\/migration<\/a>.<\/p>\n\n<h4>Security<\/h4>\n\n<p>Chala takes money-handling seriously. Payment method tokens are encrypted at rest. Webhook receivers verify cryptographic signatures. Every renewal is idempotent \u2014 replayed webhooks never cause double-charges. Every state change is audit-logged for reconstruction. Full details at <a href=\"https:\/\/chala.bytloop.com\/security\">chala.bytloop.com\/security<\/a>.<\/p>\n\n<p>Chala never touches raw card data. Card entry happens in the payment gateway's own iframes or redirects, keeping your PCI compliance scope at SAQ A.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Chala talks to a payment provider only when you have configured that provider and only to move money you asked it to move. It has no analytics, no telemetry, and no phone-home of any kind. Nothing is sent anywhere if you use manual renewal.<\/p>\n\n<h4>Stripe<\/h4>\n\n<p>Used when you enable the Stripe gateway, to charge subscription renewals and to store a reusable payment method.<\/p>\n\n<p>Chala sends to <code>api.stripe.com<\/code>: the renewal amount and currency, the Stripe customer and payment method identifiers created for that customer at checkout, an idempotency key generated by Chala, and your site's Stripe secret key for authentication. It reads back the charge result. Renewal charges are sent when a subscription is due; payment method lookups happen when a customer opens or updates a subscription. Chala never sends or receives raw card numbers \u2014 card entry happens in Stripe's own fields.<\/p>\n\n<p>Stripe also sends webhooks back to your site to report payment outcomes.<\/p>\n\n<p>This service is provided by Stripe: <a href=\"https:\/\/stripe.com\/legal\/ssa\">terms of service<\/a>, <a href=\"https:\/\/stripe.com\/privacy\">privacy policy<\/a>.<\/p>\n\n<h4>PayPal<\/h4>\n\n<p>Used when you enable the PayPal gateway, to charge subscription renewals against a billing agreement the customer approved at checkout.<\/p>\n\n<p>Chala sends to <code>api-m.paypal.com<\/code> (or <code>api-m.sandbox.paypal.com<\/code> in sandbox mode): the renewal amount and currency, the billing agreement or vault identifier for that customer, a request identifier generated by Chala, and your site's PayPal client credentials for authentication. It reads back the payment result. Requests are made when a subscription renewal is due and when a customer updates their payment method.<\/p>\n\n<p>PayPal also sends webhooks back to your site to report payment outcomes.<\/p>\n\n<p>This service is provided by PayPal: <a href=\"https:\/\/www.paypal.com\/legalhub\/useragreement-full\">terms of service<\/a>, <a href=\"https:\/\/www.paypal.com\/legalhub\/privacy-full\">privacy policy<\/a>.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>Chala ships no minified, obfuscated or compiled code that is not accompanied by its source.<\/p>\n\n<p>The admin and front-end scripts under <code>assets\/<\/code> are the original, unminified source and are what runs in the browser.<\/p>\n\n<p>The one bundled script is <code>build\/blocks-totals.js<\/code>, used by the block-based cart and checkout. Its source is <code>assets-src\/blocks\/blocks-totals.js<\/code>, and the <code>webpack.config.js<\/code>, <code>package.json<\/code> and <code>package-lock.json<\/code> that build it are all included in this plugin. From the plugin directory:<\/p>\n\n<pre><code>npm install\nnpm run build\n<\/code><\/pre>\n\n<p>That rebuilds <code>build\/blocks-totals.js<\/code> from that source, using <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">@wordpress\/scripts<\/a>. No repository access or additional tooling is required.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Go to Plugins \u2192 Add New in your WordPress admin.<\/li>\n<li>Search for \"Chala Subscriptions\".<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Follow the setup wizard: connect at least one payment gateway.<\/li>\n<li>Create a subscription product from Products \u2192 Add New \u2192 Product data \u2192 \"Simple subscription\".<\/li>\n<\/ol>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.3 or newer<\/li>\n<li>WooCommerce 8.0 or newer<\/li>\n<li>PHP 7.4 or newer (8.1+ recommended)<\/li>\n<li>At least one supported payment gateway configured<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20really%20free%3F\"><h3>Is this really free?<\/h3><\/dt>\n<dd><p>Yes. Unlimited subscriptions, unlimited products, trials, sign-up fees, custom billing intervals, the full customer portal, the admin tools and the MRR dashboard. Nothing here is time-limited or disabled until you pay. Pro is a separate plugin that adds more on top.<\/p><\/dd>\n<dt id=\"will%20my%20existing%20woocommerce%20subscriptions%20data%20migrate%3F\"><h3>Will my existing WooCommerce Subscriptions data migrate?<\/h3><\/dt>\n<dd><p>Yes. Chala includes a one-click importer with dry-run mode. Test on staging first. Full migration guide at <a href=\"https:\/\/chala.bytloop.com\/migration\">chala.bytloop.com\/migration<\/a>.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20renewal%20payment%20fails%3F\"><h3>What happens if a renewal payment fails?<\/h3><\/dt>\n<dd><p>Chala retries on a fixed schedule up to a limit you set, emails the customer each time, and puts the subscription on hold when the retries run out. Pro adds configurable retry ladders and recovery analytics.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20variable%20products%3F\"><h3>Does it work with variable products?<\/h3><\/dt>\n<dd><p>Chala adds a simple subscription product type. Variable and grouped subscription products are in Pro.<\/p><\/dd>\n<dt id=\"does%20it%20handle%20sca%20%2F%203d%20secure%3F\"><h3>Does it handle SCA \/ 3D Secure?<\/h3><\/dt>\n<dd><p>Yes, via Stripe's Payment Intents API. Cards requiring authentication trigger the appropriate flow.<\/p><\/dd>\n<dt id=\"is%20it%20hpos-compatible%3F\"><h3>Is it HPOS-compatible?<\/h3><\/dt>\n<dd><p>Yes. Chala is built HPOS-native. Subscription orders and renewal orders are first-class WooCommerce orders under HPOS. We never touch <code>wp_posts<\/code> for order data.<\/p><\/dd>\n<dt id=\"does%20it%20handle%20refunds%3F\"><h3>Does it handle refunds?<\/h3><\/dt>\n<dd><p>Yes. Full and partial refunds are supported through the WooCommerce order admin. Chargebacks are handled via gateway webhooks and update subscription status appropriately.<\/p><\/dd>\n<dt id=\"which%20gateways%20have%20been%20tested%20against%20the%20real%20provider%3F\"><h3>Which gateways have been tested against the real provider?<\/h3><\/dt>\n<dd><p>Stripe and Authorize.Net have. Both have been charged repeatedly against the providers' own sandboxes \u2014 real cards, real declines, real webhook signatures, real duplicate detection.<\/p>\n\n<p>PayPal (free) and Razorpay, Mollie, Paystack and Square (Pro) have not. Each is written against its provider's published API and covered by tests that assert exactly what Chala sends \u2014 endpoint, authentication, idempotency mechanism, amount format, and how each decline is read \u2014 but nobody has charged them for real.<\/p>\n\n<p>The reason is eligibility, not effort. PayPal does not operate in the country this plugin is built in, and the other four require a business registered in India, the EEA, Africa, or one of Square's eight supported countries. Those are walls, not queues.<\/p>\n\n<p>We are telling you because charging a real provider is what finds the bugs mocks cannot. Doing it to Authorize.Net found four, including one that made the integration completely non-functional \u2014 while every one of its contract tests passed.<\/p>\n\n<p><strong>If you run one of these, you can settle it in five minutes.<\/strong> With the gateway in sandbox mode and one test subscription bought:<\/p>\n\n<pre><code>wp chala gateway-selftest paypal\n<\/code><\/pre>\n\n<p>It charges a stored payment method, replays the charge to prove a retried renewal cannot bill twice, refunds it, and prints a report. It refuses to run against live credentials \u2014 the gateway has to declare sandbox mode, and anything that does not say so is treated as production. Send us the output and that gateway comes off this list.<\/p><\/dd>\n<dt id=\"can%20i%20run%20multiple%20gateways%20for%20the%20same%20store%3F\"><h3>Can I run multiple gateways for the same store?<\/h3><\/dt>\n<dd><p>Yes. Customers pick which gateway they want at checkout. Each subscription is tied to a single gateway for its lifetime.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20support%3F\"><h3>Where can I get support?<\/h3><\/dt>\n<dd><p>Free support is available in the plugin's <a href=\"https:\/\/wordpress.org\/support\/plugin\/chala-subscriptions\/\">support forum<\/a> on wordpress.org. Pro customers get email support with a 24-hour response SLA.<\/p><\/dd>\n<dt id=\"i%27m%20a%20developer%20%E2%80%94%20where%20are%20the%20hooks%3F\"><h3>I'm a developer \u2014 where are the hooks?<\/h3><\/dt>\n<dd><p>The hooks reference lives at <a href=\"https:\/\/chala.bytloop.com\/docs\/hooks\">chala.bytloop.com\/docs\/hooks<\/a> and in <code>\/docs\/hooks.md<\/code> in the plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Recurring payments for WooCommerce. Stripe, PayPal and manual renewal, with trials, sign-up fees, a customer portal and HPOS support.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358814","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=358814"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bytloop"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358814"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358814"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358814"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358814"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358814"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}