Skip to content
ProRecurring invoices and subscription billing are Easy Invoice Pro features. The free plugin only does one-shot invoices.View pricing & buy →

Recurring & subscriptions

Pro adds two related but distinct features:

  • Recurring invoices — generate the next invoice on a schedule. The client pays each one (or has card-on-file via Stripe).
  • Subscription invoices — like recurring, but the gateway charges automatically (no manual client action).

What recurring invoices are

  • Custom post type: easy_invoice_recurring (registered in includes/Controllers/RecurringInvoiceController.php:61–99).
  • Public: no.
  • create_posts capability: do_not_allow — recurring records are created from the invoice builder, not directly.

A recurring record is a template for future invoices. Each generation creates a fresh easy_invoice post linked back to the template.

Setting up a recurring invoice

  1. Build a normal invoice as you would (line items, currency, client).
  2. In the right sidebar, toggle Make recurring.
  3. Pick the Frequency: daily / weekly / fortnightly / monthly / quarterly / yearly.
  4. Pick the Start date (defaults to today).
  5. Pick a Stop condition: never / after N invoices / on a specific date.
  6. Save. The first invoice is generated immediately or on the start date.

How generation actually runs

Pro defines two cron mechanisms (so you have a fallback if one is delayed):

HookFrequencyWhat it does
easy_invoice_recurring_cronevery 2 minutes (custom schedule)Primary — picks up due-now templates and generates.
easy_invoice_pro_generate_recurringdailyBackup pass — catches anything the 2-min job missed.
easy_invoice_pro_process_subscriptionsdailySubscription billing (auto-charge on file).

If the 2-min job runs more often than you want, switch your hosting cron to fire every 15 min — schedule still respects the per-invoice "next run" date.

When a recurring invoice generates:

  1. A new easy_invoice post is created with the same line items.
  2. The new invoice's invoice date = today; due date = today + (default due days).
  3. The recurring template's "next run" advances by one frequency.
  4. The configured email template is sent (use Invoice Available by default).
  5. Action easy_invoice_pro_recurring_generated fires (if you want to extend).

Stopping a recurring invoice

Two ways:

  • Open the recurring template → toggle Active off.
  • Or set a stop condition (after N or by date) when first creating.

Pausing doesn't delete past invoices. They stay in the All Invoices list with their original dates.

Subscription invoices (Pro module)

Subscription invoices are recurring with auto-charge. The client enters card / mandate once; Pro charges them automatically each cycle.

SettingWhat it is
GatewayMust be a subscription-capable gateway (Stripe, Mollie).
FrequencySame options as recurring.
Trial periodOptional N free days before first charge.
Setup feeOne-off charge added to the first invoice.
CyclesHow many charges total (or unlimited).
Send invoice emailEven when auto-charged, you can still email a copy.

Configure under Settings → Subscription Invoices.

Combining with deposits & partials

Pro lets you stack:

  • Deposit + recurring — a one-off deposit invoice on signup, then recurring monthly maintenance.
  • Recurring + partial payments — let clients pay each recurring invoice in chunks.
  • Subscription + setup fee — Stripe charges the setup once + monthly subscription.

See:

Reporting

Recurring invoices appear in the All Invoices list with a recurring icon. Filter by Source: Recurring to see only those. Reports treat each generated invoice as a normal one (revenue counts each cycle).

Common pitfalls

SymptomCauseFix
New invoice not generated on scheduleWP-Cron not running.Troubleshooting → WP-Cron.
Two invoices generated on the same dayHooked to easy_invoice_recurring_cron and easy_invoice_pro_generate_recurring.Disable one of the two via custom code if you only want one.
Subscription auto-charge failsCard on file declined.Stripe → Subscriptions; either retry or the client updates their card.
Recurring stops after pauseToggle Active is off.Re-enable in the template.

Architecture note

The Pro plugin contains two recurring subsystems (RecurringInvoices.php extension and RecurringInvoiceController controller). Both are wired in production builds; the controller is the newer admin UI, the extension is the cron-glue. If you build a custom recurring extension, hook against the controller's actions (easy_invoice_pro_recurring_generated) — those are stable.

Where to go next