Skip to content

Invoices

The invoice is the core unit of Easy Invoice. Every list, report, payment, and email is anchored to an invoice. This page walks the entire builder, all the meta you can set, the status flow, and how PDFs work.

What an invoice is, technically

  • Custom post type: easy_invoice (registered in includes/EasyInvoice.php:281–311).
  • Public: yes (visitors can open the public invoice URL).
  • Admin UI: hidden — Easy Invoice ships its own admin pages instead of standard WP edit screens.
  • Slug: invoice/<post-slug>.
  • Capabilities: manage_options to edit (admins), separate role for portal viewing.

Status flow

WordPress core post status + Easy Invoice payment status (meta key _payment_status):

StagePost statusPayment status (meta)Triggered by
DraftdraftunpaidSave without sending
SentpublishunpaidSend to Client button
Pending bankpending-bankpending-bankBank Transfer gateway (Pro)
Pending chequepending-chequepending-chequeCheque gateway (Pro)
Paidpublishcompleted (or paid)Manual mark or successful gateway return
RefundedpublishrefundedMark refunded on the related Payment
Overduepublishunpaid + due date pastDerived in UI / reports
CancelledprivatecancelledManual via builder

"Overdue" isn't a CPT status — it's computed each render from the due date. This means overdue badges update without a cron run.

The invoice builder

Open Easy Invoice → Add New.

  • Invoice number — auto-incremented from Settings → Invoice → Next invoice number. Override per invoice if you need to.
  • Client — start typing to search WP users; click + Add new to create one.
  • Invoice date — defaults to today.
  • Due date — defaults to today + N days from settings.
  • Status badge — inline, shows current state.

Line items

Each line has:

  • Item — title (autocomplete from Pro Item Library when active).
  • Description — multi-line, printed on the invoice.
  • Quantity — decimals supported.
  • Unit price — currency-formatted.
  • Tax (per line, when "Item" tax method is selected).
  • Discount (per line, when enabled).
  • Total — auto-computed, read-only.

Reorder lines by drag handle. Delete with the trash icon.

Totals

FieldWhat it is
SubtotalSum of (qty × price) for every line, before discount/tax.
DiscountEither a flat amount or a percentage; before- or after-tax depending on settings.
TaxPer-line or single bottom rate, depending on Tax entry method.
TotalFinal amount the client owes.
Amount paidAggregated from related Payment posts.
Balance dueTotal − amount paid.

The easy_invoice_invoice_total filter (includes/Models/Invoice.php:914) lets you re-derive totals — useful for B2B with negotiated lines.

Currency

Per-invoice currency override field (defaults to Settings → Currency). Useful for multi-currency operators who bill some clients in EUR and others in USD.

Notes

  • Customer notes — printed at the bottom of the invoice (visible to the client).
  • Private notes — admin-only, useful for internal context.
  • Save draft
  • Send to Client — fires the email template.
  • Print
  • Download PDF — opens the client-side renderer (jsPDF + canvas capture).
  • Public link — copy/paste; opens the public invoice page.
  • Duplicate PRO — clone every line, status reset to draft.

Sending the invoice

Click Send to Client from the builder. Easy Invoice:

  1. Reads Settings → Email → Invoice Available (subject, heading, body).
  2. Substitutes merge tags (see Email & notifications).
  3. Posts via wp_mail (use SMTP for deliverability — see Troubleshooting).
  4. Logs the result via the easy_invoice_email_sent / easy_invoice_email_failed actions.

Re-sending triggers another email; status doesn't change (still Sent).

PDF export (client-side)

Easy Invoice generates the PDF in the browser using jsPDF + html2canvas (see includes/Helpers/PdfHelper.php:78–86).

  • Pro: No server-side library required (no Dompdf / mPDF dependency).
  • Con: Long invoices need browser canvas resources — very-long invoices (50+ line items) may be slow on weak machines.
  • Print-to-PDF is always a fallback (Cmd-P / Ctrl-P).

Pro The PDF Enhancements module adds a watermark, alignment options, and per-template PDF customisation. See Pro features overview.

Numbering format

Set in Settings → Invoice:

FieldExampleNote
PrefixINV-Anything text.
Next number1Increments on every save.
Auto-incrementOn / OffOff = manual numbering.
Padding4INV-0001, INV-0002… (set in advanced if exposed).

Year-restart numbering (e.g. INV-2026-0001): set the next number manually each January and bake the year into the prefix. The free plugin doesn't auto-restart per year.

Bulk actions

The invoice list (Easy Invoice → All Invoices) supports:

  • Filter by status, client, date range.
  • Bulk delete (trashed first, can be restored).
  • Bulk export to CSV Pro

Discounts

Free supports both before-tax and after-tax discount methods (set in Settings → Tax). Discounts can be:

  • A flat amount in your currency.
  • A percentage of the subtotal.

Pro The Pro plugin doesn't add a coupon system — discounts are per-invoice manual fields. For coupon codes use a marketing plugin alongside Easy Invoice.

Tax

Per-line or one bottom rate (set in Settings → Tax):

  • Item — tax field on each line, taxable flag per line.
  • Subtotal — single rate at the bottom.

Pro Additional Tax adds support for more than one rate stack — useful for "GST + State Tax" or "VAT + service charge".

Refunds

Refunds aren't an invoice action — they're a status change on the Payment record:

  1. Issue the refund in the gateway dashboard (Stripe, PayPal, etc.).
  2. Open Easy Invoice → Payments → click the payment.
  3. Set status to Refunded.
  4. The invoice's payment status flips back to unpaid (or partially paid, depending on amount).

See Payments → Refunds for the full flow.

Where the data lives

DataStorage
Invoice header (number, dates, client, currency)post meta
Line itemsmeta _easy_invoice_items
Payment statusmeta _payment_status
Payment recordsseparate easy_invoice_payment posts
Recurring schedule (Pro)meta on easy_invoice_recurring posts

Easy Invoice does not create custom DB tables — everything is in wp_posts + wp_postmeta. This means standard WP backups capture invoice data automatically.

Where to go next