Troubleshooting
You switched a module on and nothing changed on the storefront. Or a renewal didn’t charge, an email never arrived or a webhook seems to go nowhere. Most Stackless problems come down to a short list of causes: another EDD add-on doing the same job, a module that needs one you haven’t switched on, a site Stackless treats as a staging copy or an error that’s already in the log.
This page walks through each of them in the order I’d check them, and ends with how to open a ticket.
Check the Requirements
Stackless for EDD needs Easy Digital Downloads 3.5 or newer, PHP 8.0 or newer and WordPress 6.7 or newer. When EDD is missing or too old, no module loads and admins see one of these notices:
- “Stackless for EDD needs Easy Digital Downloads installed and active.”
- “Stackless for EDD needs Easy Digital Downloads 3.5 or newer. You have (your version).”
Update or activate EDD and the modules start on the next page load.
If a module’s database setup fails after an install or update, you’ll see “Stackless could not finish setting up these modules:” with each module and its error. Setup retries on every page load, and the details go to the debug log.
Check the Module Card
Open Stackless → Dashboard and find the module. If it’s switched on but not running, the card says why:
- “Paused because (plugin name) is active and does the same job.”
- “Needs the (module name) module enabled.”
- “Failed to start. See Downloads → Tools → Debug Log (stackless-edd-*).”
The reason is worked out when the page loads, so reload the dashboard after you change a plugin or another module.
Which EDD Add-ons Pause Which Modules
Stackless never runs a module side by side with an add-on that does the same job. When one of these is active, the matching module pauses. On multisite, network-activated plugins count too.
| Module | Pauses while this is active |
|---|---|
| Subscriptions | EDD Recurring Payments |
| Software Licensing | EDD Software Licensing |
| Multi-Currency Checkout | EDD Multi Currency |
| Page Access | EDD Content Restriction |
| Custom Invoices | EDD Invoices |
| Wishlist | EDD Wish Lists |
| Pay What You Like | EDD Custom Prices |
Stripe has no conflict list. It can run next to EDD’s own Stripe gateway because it uses a different gateway ID, its own customers, saved cards and webhooks.
Dependent modules pause one step later. Currency-Aware Payment Gateways and Storefront Currency Selector need Multi-Currency Checkout. Request a Quote needs Custom Invoices. Modal Checkout needs On-page Checkout.
While EDD Recurring Payments is active, the Subscriptions module stays paused, so the two never process the same renewals. Everything else in Stackless keeps working. Plan a move off EDD Recurring as a fresh start for new subscribers rather than a switch you flip on live subscriptions.
Live Store or Staging Copy
A copy of your production database keeps every saved payment method, renewal schedule and customer address. Without a guard, a staging site could charge real customers or email them. So Stackless remembers which site is the live store, and treats any other copy as a copy until someone confirms it.
The live store is identified by its home URL together with the WordPress environment type. It’s recorded when you activate the plugin on a site with nothing recorded yet, on the first load of an existing install whose environment type is production or when an admin confirms it.
What a Copy Does Differently
- Saved payment methods aren’t charged, failed payments aren’t retried and dunning doesn’t run.
- Charges and cancellations at the payment provider are refused.
- Customer emails aren’t sent. With EDD’s debug mode on, each skipped email is logged.
- Outgoing webhooks are skipped and logged on the Webhooks screen.
- Orders, tokens and payment modes stay exactly as copied. Nothing is deleted.
Held renewals and reminders are parked in the Action Scheduler group stackless-edd-held. Once the site is confirmed as live, they’re queued to run, and each one re-checks its subscription or order first.
The Notice and How to Clear It
On a copy, admins see “Stackless paused automatic billing on this site.” with the reason, such as a different address, a different environment type or no live store recorded yet. It has two buttons:
- This is the live store: use it after moving the store to a new domain or host. It asks you to confirm, because customers with saved payment methods will be charged from this site.
- Keep paused and hide this notice: use it on staging. The notice still shows on Stackless screens.
Hosts can decide instead with a constant in wp-config.php. True makes the site the live store and false keeps it a copy. While the constant is set, the confirm button is refused:
define('STACKLESS_EDD_LIVE_STORE', false);
Code can use the stackless_edd_live_store filter (bool $live, string $state), which applies only when the constant isn’t defined.
Read the Debug Log
Stackless writes to EDD’s own debug log at Downloads → Tools → Debug Log. Each line starts with [stackless-edd- and the module ID, then the level and the message:
[stackless-edd-subscriptions] ERROR Subscription #42 status hook failed: ...
- Errors and warnings are always written, including a module that fails to start and every failed webhook delivery.
- Info and debug lines are written only while EDD’s debug mode is on. Turn it on with “Record important information to the debug log while troubleshooting.” on the same Debug Log screen.
- Each Stackless gateway (Stripe, PayPal, Polar, Paddle and Dodo Payments) has a Debug log setting that adds routine API activity.
- Live store events use the
corechannel, and email failures useemails.
Keys, secrets and card data are never written to the log.
Payment Webhooks Not Arriving
Payment providers report back through these REST routes on your site:
/wp-json/stackless-edd/v1/stripe/webhook/wp-json/stackless-edd/v1/paypal/webhook/wp-json/stackless-edd/v1/polar/webhook/wp-json/stackless-edd/v1/paddle/webhook/wp-json/stackless-edd/v1/dodo/webhook
A gateway copy adds its own suffix, such as /polar/webhook/copy2. Every webhook’s signature is checked, and one that fails is rejected and logged as a warning even with Debug log off. If payments complete at the provider but orders don’t update, check that the signing secret you saved belongs to that exact endpoint, in the right mode (test or live).
Outgoing Webhooks Not Arriving
For webhooks Stackless sends to Zapier, Make, n8n or your own code, open Stackless → Webhooks and click Deliveries on the webhook. Each attempt shows its response code and message.
- “Skipped: this site is not the live store.” means the site is a copy (see above).
- A Paused or Disabled status means nothing is queued. A webhook disables itself after five events in a row fail for good. Fix the endpoint, then save it as Active.
- A 301 or 302 counts as a failure, because redirects aren’t followed. Use the final URL.
- Local and private network addresses are refused. Use a public URL.
- Deliveries run on Action Scheduler in the group
stackless-edd-developer_api. If scheduled actions don’t run on your site, deliveries wait.
Webhooks and REST API covers signatures, retries and payloads.
Emails Not Sending
- Open Stackless → Emails and check the email is On. Each one has an Enable setting.
- For admin emails, check Recipients. Empty uses the admin notification emails from Downloads → Settings → Emails.
- Check the live store notice. A copy doesn’t send customer emails. With EDD’s debug mode on, the debug log says
Customer email "..." was not sent: this site is not the live store. - Search the debug log for
[stackless-edd-emails]. A failed send is logged as a warning with the email and address.
Stackless emails go through EDD’s own email template and sending, so if EDD’s purchase receipts don’t arrive either, the problem is your site’s mail setup. An SMTP plugin usually fixes that.
Emails lists every email and its placeholders.
Page Caching and Account Pages
Pages that change per visitor shouldn’t come from a shared page cache. Exclude these from your caching plugin or host cache:
- EDD’s checkout page.
- The account page with
[stackless_edd_account]. Stackless creates it on activation as “Account”, and the Pages list marks it “Stackless Account Page”. - With Multi-Currency Checkout on, pages that change with the visitor’s currency, unless your cache varies on the
stackless_edd_currencycookie.
The wishlist page and the On-page Checkout frame already tell caching plugins not to cache them, using the standard DONOTCACHEPAGE flag.
Account tabs use a query argument, ?account-tab=, so they don’t need a permalink refresh. Signed-out visitors see EDD’s login form on the account page. See Customer Account for the tabs.
Check Scheduled Actions
Renewals, retries, reminders, rate refreshes, webhook deliveries and CRM syncs run on the Action Scheduler that ships with EDD. Stackless uses one group per module, named stackless-edd- plus the module ID, for example:
stackless-edd-subscriptionsstackless-edd-developer_apistackless-edd-fluentcrmstackless-edd-heldfor actions held on a staging copy
EDD’s own Scheduled Actions tab under Downloads → Tools lists only EDD’s group, so it won’t show these. A failed Stackless action usually has a matching line in the debug log.
Known Limits
- EDD gateways other than the Stackless ones renew subscriptions manually, with a pending renewal order and a payment link.
- Deleting the plugin keeps all Stackless data unless
STACKLESS_EDD_REMOVE_ALL_DATAis set to true inwp-config.phpfirst. EDD orders, renewal orders included, are never deleted.
define('STACKLESS_EDD_REMOVE_ALL_DATA', true);
Where to Get Help
Open a ticket at gauravtiwari.org/support/tickets. Include:
- the module name and what you expected to happen
- the message on the module card or the admin notice, if there is one
- the matching
[stackless-edd-lines from Downloads → Tools → Debug Log, with anything personal removed - your EDD, WordPress and PHP versions, and whether the site is live or a staging copy