---
title: Troubleshooting
description: Fix common Easy Invoice issues — permalinks, missing PDFs, gateway misconfiguration, blank reports, recurring cron, email delivery, license activation.
---
# Troubleshooting
A symptom-based guide. Find the closest match, follow the steps, and you'll have it sorted in minutes.
## Activation & license
### Pro deactivates immediately on activation
**Symptom**: clicking _Activate_ on Easy Invoice Pro shows _Plugin auto-deactivated because Easy Invoice is required_.
**Cause**: the **free** Easy Invoice plugin is not active.
**Fix**:
1. Open Plugins → Installed Plugins.
2. Activate **Easy Invoice** first.
3. Then activate **Easy Invoice Pro**.
### License activation fails
**Symptom**: the License page shows _Could not connect to license server_ or _Invalid response_.
**Causes & fixes**:
| Cause | Fix |
| --- | --- |
| Outbound HTTPS firewall on your host | Whitelist `store.mantrabrain.com` in your host's outbound rules. |
| `wp_remote_post` blocked by a security plugin | Temporarily disable Wordfence / iThemes Security and retry. |
| Site URL changed since purchase | Manually deactivate the old URL in your MatrixAddons account, then activate fresh. |
| License expired | Renew at [matrixaddons.com/account](https://matrixaddons.com/account/). |
## Permalinks & 404s
### Public invoice URL shows a 404
**Cause**: pretty permalinks aren't set, or rewrite rules are stale.
**Fix**:
1. Open Settings → Permalinks.
2. Pick anything except _Plain_ (recommend _Post name_).
3. Click **Save Changes** — this flushes rewrite rules.
4. Reload the invoice URL.
If still 404, run the maintenance flush:
```
yoursite.com/wp-admin/admin-post.php?action=flush_easy_invoice_rewrite_rules
```
(Logged-in admin only; redirects back to dashboard.)
### Quote URL still shows old slug after rename
**Fix**: visit:
```
yoursite.com/wp-admin/admin-post.php?action=fix_easy_invoice_quote_slugs
```
This re-syncs the quote slugs after a CPT rename.
## PDF problems
### PDF download is blank or shows only the first page
**Cause**: jsPDF + html2canvas's canvas-capture struggles with very tall content.
**Fixes**:
- Reduce line items if the invoice has 50+.
- Switch the browser to **Chrome** or **Edge** (the canvas implementation is more forgiving than older Safari).
- Use **Print → Save as PDF** (Cmd-P / Ctrl-P) as a fallback — produces a faithful copy.
### PDF font looks weird / boxed
**Cause**: Custom theme font is not embedded.
**Fix**: use a Google Font that's already loaded on the site, or set a system font (`Arial`, `Helvetica`, `Georgia`) under Settings → PDF Options (Pro).
## Email not arriving
**Cause**: WordPress's `wp_mail` falls back to PHP's `mail()` function, which most hosts throttle or block.
**Fix**:
1. Install **WP Mail SMTP** (or any SMTP plugin).
2. Configure it with **SendGrid**, **Postmark**, **Mailgun**, **Amazon SES**, or **Gmail SMTP**.
3. Add **SPF**, **DKIM**, **DMARC** records to your domain.
4. Test deliverability at [mail-tester.com](https://www.mail-tester.com/).
If emails still don't fire:
- Check Settings → Email → General — make sure each template is **enabled**.
- Watch the WP debug log for `easy_invoice_email_failed` actions.
- Verify the recipient email isn't on a corporate filter list.
## Reports / charts blank
**Symptom**: Easy Invoice → Reports shows headings but no charts.
**Causes**:
- Browser blocked Chart.js (uBlock Origin sometimes does).
- Mixed-content warning (your site is HTTP but a chart asset is HTTPS, or vice versa).
**Fix**: open browser dev tools → **Console** tab. Look for blocked scripts. Whitelist `cdn.jsdelivr.net` if needed, or move the site to HTTPS.
## WP-Cron isn't running
**Symptom**: recurring invoices aren't generated, payment reminders never fire.
**Cause**: WP-Cron only fires on page visits. Low-traffic sites barely run cron.
**Fix**: switch to a real cron job:
1. Add to `wp-config.php`:
```php
define( 'DISABLE_WP_CRON', true );
```
2. Add a system cron entry (cPanel → Cron Jobs):
```
*/5 * * * * curl -s https://yoursite.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
```
This pings WP-Cron every 5 minutes, regardless of visitors.
## Gateway issues
### Gateway not showing on the public invoice
| Cause | Fix |
| --- | --- |
| Gateway not enabled in Settings → Payment. | Toggle on. |
| Missing API key / credential. | Fill in the credentials and save. |
| Currency mismatch. | Switch invoice currency to one the gateway supports. |
| Pro license expired. | Renew. |
| Multiple gateways enabled, only one shows | Per-client default gateway is set. Check the client's user profile. |
### Stripe webhook not received
1. In Stripe dashboard → **Developers → Webhooks**, click your endpoint → **Send test webhook**.
2. Watch your server's access log for the request.
3. If the request arrives but Easy Invoice doesn't react, check the **Signing secret** matches.
4. If the request never arrives, your firewall blocks Stripe's IPs — whitelist the [Stripe webhook IPs](https://stripe.com/docs/ips).
### Moneris not showing
The Moneris gateway files exist in the Pro plugin but may not load if the require list is gapped. Workaround: contact support; they'll provide a small mu-plugin that explicitly requires the Moneris gateway file.
### PayPal IPN sometimes missed
PayPal Standard's IPN can drop notifications. Mitigations:
- Enable **IPN history** retry in your PayPal account.
- Fall back to manual reconciliation: PayPal → Activity → match against unpaid invoices.
## Builder & data
### Invoice doesn't save
**Symptom**: clicking _Save_ shows _Saving…_ forever, or returns an error.
**Causes**:
- Browser console shows a 403 or 401 → **nonce expired** (refresh the page).
- Console shows a 500 → check `wp-content/debug.log`. Typical causes: a malformed line item field, a custom hook throwing.
- Browser shows nothing → check Network tab for the AJAX request to `admin-ajax.php`.
### Items lost after save
**Cause**: a third-party plugin altered `_easy_invoice_items` meta in a `save_post` hook.
**Fix**: temporarily deactivate other plugins one by one to find the offender.
### Client search returns nothing
**Cause**: the user role excludes them from the autocomplete query.
**Fix**: ensure the client has either:
- An invoice already attached to them, or
- The `easy_invoice_client` role.
If you're using a custom role, hook `easy_invoice_client_repository_args` and add it to the role include list.
## Listing & filters
### All Invoices is empty after filtering
**Cause**: filter combo with no matches (e.g. _Status: Paid + Date: today_ when nothing was paid today).
**Fix**: clear filters with the **Reset** button.
## Updates & versions
### Pro update notification doesn't appear
**Cause**: License is inactive or expired.
**Fix**: Easy Invoice → License → re-activate. Updates will appear within 12 hours.
### Free vs Pro version mismatch
The Free plugin sometimes ships at a different version number than Pro (e.g. Free **2.1.20**, Pro **2.1.6**). This is intentional — Pro releases follow their own cadence. Compatibility is tested across the supported pair on each release.
## Multisite
### Each site needs its own license?
Yes — license seats are tracked per site. A **Personal** license = 1 site, **Professional** = 5, **Agency** = 25. Subsite activations count individually.
## Where to go next
- ❓ [FAQs](/faqs) — quick answers to common questions.
- 💬 [Get support](/support) — when you need a human.
- 🪝 [Hooks & filters](/hooks-filters) — extend behaviour to fix edge cases.