Create invoices in WordPress, email them as PDFs and let customers pay by Stripe or PayPal from a private link. Online payments are off until you set them up, and tax is a percentage you type per item.
Contents10 sections
To create PDF invoices in WordPress, email them and get paid, install Advance Invoices for WordPress & WooCommerce, add your company details under Invoices → Settings, then build an invoice under Invoices → Add New and click Send Invoice. The customer gets the PDF by email and a private link to view the invoice and, once you set up Stripe or PayPal, pay it. Two limits first: online payments stay off until you switch them on, and the plugin does not look up tax rates, because you type a tax percentage per item.
What the plugin does, and what it leaves to you
Invoices and estimates are separate, each with its own numbering and statuses, and both produce A4 PDFs. WooCommerce is optional; it adds customer and product search, order import and invoice PDFs on order emails.
- Tax is a percentage you enter per item and for shipping. There are no tax tables or tax-inclusive prices.
- A currency only changes the symbol and number format. Nothing is converted.
- Stripe and PayPal are the built-in online gateways. Bank transfers and cash are recorded by hand.
- There are no recurring invoices, late fees or credit notes.
- PDFs are not stored; each is generated when previewed, downloaded or emailed.
It is a paid plugin, but no licence is checked in the invoicing code: it works once activated, and the key (Plugins → WpExperts Hub Licences → Activate licence) only unlocks updates. Only the licence screen and update checks contact wpexpertshub.com.
What you need
- WordPress 6.4 or later and PHP 7.4 or later.
- The PHP extensions
domandmbstringfor PDF generation. The PDF engine row in Invoices → Settings → General names a missing one.gdis recommended for logos but not checked. - WooCommerce is optional. The plugin header lists 9.0 or later (tested up to 11.1), though the code only checks that WooCommerce is loaded.
- For online payments: a Stripe secret key and/or a PayPal REST app (client ID and secret), and a site address that Stripe and PayPal can reach for webhooks.
- Working WordPress mail, because documents are sent with
wp_mail(), and WP-Cron for the daily job that marks invoices Overdue and sends reminders.
Step-by-step setup
- Download the plugin zip from your account on wpexpertshub.com. In WordPress, open Plugins → Add Plugin → Upload Plugin, choose the zip, click Install Now, then Activate.
- Open Invoices → Settings → Company. Fill in Company name (required), the address, Email and Tax / VAT number. Use Additional information for bank details and Choose logo for a PNG, JPG or GIF. Click Save Changes; each settings tab saves on its own, so save before you open another.
- On the Currency tab, tick the currencies you use and choose one default. On the Invoice tab, check Number prefix (INV- by default), Starting number, Due in (days) (30) and Default payment terms.
- On the General tab, pick the Default invoice design (Classic, Modern, Compact, Minimal or Business). Preview under a design opens a sample PDF and creates nothing.
- Open Invoices → Add New. Choose Manual customer, enter a Full name or Company and the customer’s Email, add items with Description, Qty, Unit price, Discount and Tax %, then click Save Draft. Click Preview to check the PDF.
- Click Send Invoice. In the “Send Invoice by email” dialog check To, Subject and Message, then click Send email. The draft becomes Sent.
- Test it: send the first invoice to your own address and open the link in the email. It uses a real invoice number, and deleting the invoice does not free it.
What the customer receives
The email carries the PDF and, while Client pages is on, a button to the invoice’s private client page (a plain link in the Plain text look). The button says “Pay invoice online” when the customer can pay and “View invoice” otherwise. Customers never log in: the long random token in the link grants access. The page offers Download PDF and Print; a draft stays hidden until sent.
Anyone who holds the link can see that invoice, so send it only to your customer. If it goes astray, click Regenerate link in the editor’s Client page card and the old link stops working at once.
Invoices → Settings → Email design sets the look of the emails: WooCommerce style (needs WooCommerce), Design my own or Plain text look, with a Send me a test button. Your company email (else the site admin email) also gets a confirmation with the same PDF whenever a document goes to a customer; Confirmation to me on the Email tab switches it off.
Take Stripe and PayPal payments
Customers pay on Stripe’s or PayPal’s own page, so card details never reach your site. Start with test keys.
- Open Invoices → Settings → Payments. Keep Client pages on and tick Online payments (“Show a Pay button on invoice client pages”).
- For Stripe, tick Enable Stripe and paste the Secret key, which starts with
sk_test_orsk_live_. A TEST or LIVE badge appears when the key looks valid; the plugin checks its format, not Stripe. - In Stripe, open Developers → Webhooks and add the Stripe webhook URL shown on this tab. Select
checkout.session.completed,checkout.session.async_payment_succeededandcharge.refunded, then paste the signing secret (whsec_) into Webhook signing secret. - For PayPal, tick Enable PayPal. Sandbox mode is on by default, so enter sandbox credentials in Client ID and Client secret first. In PayPal, create a webhook that uses the PayPal webhook URL shown, subscribe it to
PAYMENT.CAPTURE.COMPLETEDandPAYMENT.CAPTURE.REFUNDED, and enter its Webhook ID. - Click Save Changes. Saved keys are never shown again; leave a field empty to keep it.
- Test it: send yourself an invoice and pay it with Stripe test keys or the PayPal sandbox. To go live, replace the keys, Stripe signing secret and PayPal Webhook ID with live ones (test and live webhooks differ) and untick Sandbox mode.
Without a PayPal Webhook ID every PayPal notification is rejected: payments are recorded only when the customer comes back to your site, and refunds made in PayPal never reach the invoice.
What the customer sees when paying
A “Pay online” card appears when the invoice is not Draft, Paid, Cancelled or Refunded, a balance remains, Online payments is on and a gateway is set up. The buttons read “Pay with Card (Stripe)” and “Pay with PayPal”. With Partial payments on, the default, the customer can pay the full balance or “Pay a different amount”. A partial amount cannot be below Smallest partial payment (1 by default), though the last payment may be smaller.
When the customer returns, the plugin confirms the payment with Stripe or PayPal itself. Stripe’s webhook also records customers who close the tab first; PayPal payments are captured on that return, so its webhook only backs up a capture that was not recorded. A payment reported twice is counted once.
Partial payments, the ledger and receipts
The Payments card in the invoice editor shows Paid and Balance due, with one line per payment. The status follows it: Partially Paid when some money has arrived, Paid when the total is covered, and back to Sent if the net amount returns to zero.
- Bank transfer or cash: open Record a payment, enter Amount, Method (Bank transfer, Cash, Cheque, Card (offline) or Other), Date and an optional Note, then click Record payment.
- Refunds: the plugin never issues one; refunds made in Stripe or PayPal arrive through the webhook. The bin icon only removes a ledger line, so use it to correct a wrong manual entry.
- Receipts: every payment gets a numbered PDF receipt (RCT-000001 by default), emailed while Email receipts is on (the default). Download it from the ledger or the client page.
Overdue invoices and reminders
A daily job marks Sent, Pending Payment and Partially Paid invoices as Overdue once the due date has passed, while Automatic status updates on the General tab is on.
Payment reminders are off by default. Tick Payment reminders under Invoices → Settings → Email and the plugin sends the first one 5 days after you emailed the invoice, then every 5 days (both are settings) until it is Paid, Cancelled or Refunded. Invoices you never emailed from the plugin are not chased. Send reminder in the editor or the invoices list nudges one customer now.
Estimates and WooCommerce
Estimates are off by default. Tick Enable estimates (quotes) under Invoices → Settings → General to add an Estimates menu. Customers can accept or decline a Sent estimate on its client page, and Convert to Invoice creates a new Draft invoice from it and sets the estimate to Converted. Estimates take no payments.
With WooCommerce active, an Invoices → Settings → WooCommerce tab appears. Orders and products are only read (apart from optional private order notes), and an invoice keeps its own copy of the data.
- Import an order: in the editor, search under Create from a WooCommerce order. Nothing is saved until you save.
- Invoice on order emails: tick Auto attach and choose Order on-hold, Processing order, Completed order or Customer invoice / order details (Processing and Completed are ticked by default). Admin emails never get the PDF. The invoice is created the first time an email needs it, even with Auto record orders off.
- Automatic invoices: tick Auto record orders and the statuses at which an invoice is created (Processing and Completed by default). A cancelled order then cancels its invoice, and a refund adds a negative “Refund #…” line.
- Customer download: off by default. When on, customers get an Invoice button in My Account → Orders for orders that have an invoice, and Client pages must be on.
If you also run the free PDF Invoice for WooCommerce, which attaches its own PDF to order emails, tick each email in only one plugin: this one adds its PDF without removing anyone else’s, so customers would get two.
Good to know and troubleshooting
- “PDF generation is unavailable”: PHP lacks
domormbstring, or the bundledvendorfolder was removed. Ask your host to enable the extensions or reinstall the plugin. - “This page is not available”: Client pages is off, the invoice is still a Draft, or the link was regenerated or copied incompletely.
- The customer paid but the invoice did not change: check the webhook URL, its events and the saved signing secret or Webhook ID. Stripe’s webhook log shows “Invalid signature” when the secret belongs to another endpoint, is empty or the server clock is more than 5 minutes off.
- “The payment could not be started”: open the invoice History and read the “checkout could not be started” line, which holds the gateway’s message. “PayPal rejected the API credentials” usually means the credentials do not match the Sandbox mode setting.
- Wrong amounts online: amounts go to Stripe and PayPal in the smallest unit, using the Decimals value in the Currency tab, so keep the standard decimals for currencies you take online.
- The invoice stays Sent after a bank transfer: the plugin cannot see bank transfers, so use Record a payment. Choosing Paid in the Status box sets the status only and records no payment or receipt.
The full documentation covers every setting, hook, privacy detail and the changelog.
Links
Plugin page: Advance Invoices for WordPress & WooCommerce. Settings reference: Advance Invoices documentation. More tools: Browse all plugins.