---
title: Addons
description: Easy Invoice Pro is addon-driven. The Personal tier is free with the Pro plugin (no license required); Professional and Agency tiers unlock additional addons with a license key.
---
# Addons
Pro
Personal-tier addons unlock automatically when you install Easy Invoice Pro — no license key required. A license unlocks the Professional and Agency tiers. Get Easy Invoice Pro →
Easy Invoice Pro ships an **addon system**: every Pro feature is an independently-toggleable addon you turn on from **Easy Invoice → Addons**. Disabled addons contribute **zero PHP**, **zero database queries**, **zero hooks** — so a clean install is just as fast as the free plugin.
> **Still on the free plugin?** You're missing 19 addons across recurring billing, deposits, client portal, custom templates, reports, and more — twelve of them are included free with the Pro plugin, no license key required. [Get Easy Invoice Pro →](https://matrixaddons.com/plugins/easy-invoice/#pricing)
## How the tiers work
| Tier | What unlocks it | What you get |
|---|---|---|
| **Free** | Easy Invoice plugin only | The free core: unlimited invoices, quotes, clients, PDF generation, PayPal & Manual gateways, email notifications. |
| **Personal** | Install Easy Invoice Pro — **no license required** | All 9 Pro payment gateways + 12 Personal-tier addons (Recurring, Client Portal, PDF Toolkit, Item Library, Templates, Bulk Operations, Secure Links, Reports, and more). |
| **Professional** | Activate a Professional license | Personal **+** Time Tracking, Smart Reminders & Late Fees, Priority Support. |
| **Agency** | Activate an Agency license | Professional **+** White-Label, Team Roles & Audit Log, Webhooks & Zapier. |
Each plan **includes everything in lower plans**. Buy once, install once — the Pro plugin gives you Personal automatically. Add a license to unlock Professional or Agency.
[**Get Easy Invoice Pro →**](https://matrixaddons.com/plugins/easy-invoice/#pricing)
## The full catalog
### Personal tier (free with Pro — no license)
| Addon | What it does |
|---|---|
| [**Recurring Invoices & Subscriptions**](../recurring-invoices) | Auto-bill on autopilot — weekly, monthly, or any custom schedule. |
| [**Partial Payments & Deposits**](./partial-payments) | Get paid sooner with deposits and flexible installment plans. |
| [**Client Portal**](./client-portal) | Branded self-service area where clients view invoices, quotes, and receipts. |
| [**PDF Toolkit**](./pdf-toolkit) | Custom headers, footers, watermarks (PAID / DRAFT / OVERDUE), and styling. |
| [**Bulk Email & Export**](./bulk-operations) | Send and export hundreds of invoices in a single click. |
| [**Item Library**](./item-library) | Reusable catalog of services and products with one-click insert into invoices. |
| [**Custom Invoice & Quote Templates**](./custom-templates) | Drag-and-drop builder for pixel-perfect layouts. |
| [**Additional Tax Lines**](./additional-tax) | Multiple named tax lines per invoice — VAT + duty, GST + PST, federal + state. |
| [**Email Enhancements**](./email-enhancements) | Branded HTML emails with PDF attached, CC / BCC, and Reply-To. |
| [**Secure Links for Invoices & Quotes**](./secure-links) | Replace predictable invoice/quote URLs with signed, unguessable links that can expire automatically. |
| [**Privacy & GDPR Tools**](./privacy-tools) | Comply with GDPR, CCPA, and other data-protection laws in one click. |
| [**Reports & Analytics**](./reports) | Visual dashboard for revenue, outstanding balances, and per-client performance. |
### Professional tier (license required)
| Addon | What it does |
|---|---|
| [**Time Tracking & Project Billing**](./time-tracking) | Log billable hours and convert them to invoice lines in one click. |
| [**Expense Tracking & Reimbursable Items**](./expense-tracking) | Log billable expenses with receipts, apply markup, and roll selected expenses into a draft invoice. |
| [**Smart Reminders & Late Fees**](./smart-reminders) | Multi-step automated payment chase with auto-applied late fees. |
[**Upgrade to Professional →**](https://matrixaddons.com/plugins/easy-invoice/#pricing)
### Agency tier (license required)
| Addon | What it does |
|---|---|
| [**White-Label & Brand Override**](./white-label) | Rebrand Easy Invoice as your own product — every label, footer, and PDF. |
| [**Team Members & Audit Log**](./team-roles) | Scoped staff roles + searchable audit log of every action. |
| [**Webhooks & Zapier Bridge**](./webhooks) | Stream invoice events to any URL — Zapier, Make, n8n, your CRM. |
| [**Accounting Sync (QuickBooks / Xero / FreshBooks)**](./accounting-sync) | Two-way sync between Easy Invoice and your accounting platform. |
[**Upgrade to Agency →**](https://matrixaddons.com/plugins/easy-invoice/#pricing)
## How the gate works
When you click **Activate** on a card, three things are checked **before** the addon's code is loaded:
1. **Pro plugin present** — Easy Invoice Pro must be installed and active.
2. **License plan** — your plan must satisfy the addon's required tier. Personal tier is granted automatically when Pro is installed (no license needed). Professional/Agency addons require a valid license.
3. **Code presence** — the addon's bootstrap file must exist in the Pro plugin.
If all three pass, the addon's `addon.php` is `require_once`'d on every subsequent request (via the Pro plugin's `init` hook at priority 25). If any check fails, the file is never loaded — the addon contributes nothing to your site.
Toggling **off** disables an addon instantly. Some addons (Time Tracking, Team Roles, Webhooks) create database tables on first activation; those tables are **kept on deactivation** so you don't lose data if you re-enable later. To remove everything, uninstall Easy Invoice Pro (a clean-up routine runs on uninstall, not on deactivate).
## Activation flow
```text
You click "Activate" ──▶ AJAX easy_invoice_toggle_addon
│
├─ AddonManager::userCanAccess()
│ • Plan tier ≥ addon.plan?
│ (Personal = Pro plugin installed)
│
├─ YES ─▶ update_option(easy_invoice_addon_{id}_enabled, 1)
│ Page reloads. Addon loads on next request.
│
└─ NO ─▶ Returns { code: 'upgrade_required', upgrade_url, required_plan }
UI opens the upgrade dialog with the right tier pre-selected.
```
Defense in depth: even if you set the option directly via SQL on a Free site, the loader's plan check still refuses to require the file. You cannot bypass plan tier by editing the database.
## Existing Pro users — auto-migration
If you were running Easy Invoice Pro before the addon system existed, a one-time migration runs on the next admin page load. It auto-enables every Personal-tier addon for your install so nothing breaks — the features you were already using stay on. The migration is stamped with a version (`'2'`) so it runs **once** and then never again.
You can fully customize what's enabled afterwards from **Easy Invoice → Addons**.
## What does NOT happen automatically
- **Migrations** — an addon's database schema is created (via `dbDelta`) on **first activation**. If a future Pro release ships schema changes, the addon's version constant bumps so the migration re-runs.
- **Cron schedules** — addons that need cron (Recurring, Smart Reminders, Webhooks) self-schedule on bootstrap. There's no global "Run cron now" button.
- **Hooks into other code** — addons hook into Easy Invoice events at runtime, so events that already happened are not retroactively logged or fired. (Newly-enabled Audit Log only records actions from the moment you enabled it.)
## Filter categories
The Addons page has filter chips along the top — each addon belongs to one category so you can narrow the catalog by job-to-be-done:
- **billing** — recurring, partial payments, additional tax, dunning
- **branding** — white-label, PDF toolkit, custom templates
- **productivity** — item library, bulk operations, email enhancements, time tracking
- **clients** — client portal
- **team** — team roles & audit log
- **integrations** — webhooks
- **compliance** — privacy / GDPR
- **analytics** — reports
## Building your own addon
The addon system is intentionally **registry-driven** so third-party Easy Invoice extensions can ship their own addons. Hook into the registry filter:
```php
add_filter('easy_invoice_addons_registry', function (array $addons) {
$addons[] = [
'id' => 'acme_widgets',
'name' => 'Acme Widgets',
'tagline' => 'Adds a Widgets section to the invoice editor.',
'description' => 'Description shown on the addon card.',
'plan' => 'professional', // 'personal' | 'professional' | 'agency'
'icon' => 'dashicons-screenoptions',
'category' => 'productivity',
'badge' => null,
'docs_url' => 'https://example.com/docs/acme',
'settings_url' => admin_url('admin.php?page=easy-invoice-addon-acme-widgets'),
'pro_file' => 'addons/acme-widgets/addon.php',
];
return $addons;
});
```
The bootstrap file at `pro_file` is loaded by `AddonManager::loadEnabledAddons()` only when the addon passes the same three checks listed above.
## Common cron schedules per addon
| Addon | Hook | Cadence |
|---|---|---|
| Recurring Invoices | `easy_invoice_recurring_cron` | Configurable (every N minutes / hours / daily) |
| Smart Reminders | `easy_invoice_dunning_daily_tick` | Daily |
| Webhooks (retry) | `easy_invoice_webhooks_retry_tick` | Hourly |
| Webhooks (one-shot dispatch) | `easy_invoice_webhook_send_one` | Single event per delivery |
If a cron tick seems stuck, see [Troubleshooting → WP-Cron](../troubleshooting#wp-cron).
## Troubleshooting
### "I just bought Agency but only Professional addons show as unlockable"
The plan resolver caches the EDD license response. Either:
1. Re-activate the license (License page → Deactivate → Activate)
2. Or set a manual override: `update_option('easy_invoice_pro_plan_tier_override', 'agency')` — useful while debugging.
The resolver tries (in order) the override → EDD `price_id` → the item-name string. If none match, it falls back to `professional` for any valid license.
### "I enabled an addon but its menu / settings page is missing"
Personal-tier addons (Item Library, Templates, Reports, etc.) are reached through the Easy Invoice **in-app sidebar** — not the WordPress admin submenu. The WP admin entries are intentionally hidden to avoid duplicating the in-app sidebar navigation.
If the in-app sidebar doesn't include your addon's link:
1. Confirm the addon is **Active** on the Addons page (not just unlocked).
2. Hard-refresh the admin (sidebar cache).
3. Check `define('WP_DEBUG', true)` for PHP errors from the addon's `addon.php`.
### Hooks for developers integrating with addons
| Hook | When |
|---|---|
| `easy_invoice_addon_enabled` `(addon_id, addon)` | Site admin just enabled an addon |
| `easy_invoice_addon_disabled` `(addon_id, addon)` | Site admin just disabled an addon |
| `easy_invoice_addon_loaded` `(addon_id, addon)` | Addon's `addon.php` was just required |
| `easy_invoice_addons_registry` | Filter to add your own addon to the catalog |
| `easy_invoice_pro_addon_migration_completed` `(enabled_ids)` | Migration finished auto-enabling existing-install addons |
For per-addon hooks, see each addon's docs page.
## See also
- [Hooks & filters reference](../hooks-filters)
- [AJAX & webhooks reference](../api-reference)
- [All Pro features](../features)
Pro
Ready to unlock the full addon catalog? Install Easy Invoice Pro for 12 Personal-tier addons free — no license required. Add a Professional or Agency license to unlock the rest.
Get Easy Invoice Pro →