WooCommerce was overkill for MSP billing. We needed invoices, card payments, and a customer portal, not a shop with a cart and shipping zones. I built a standalone Stripe billing platform with invoicing, autopay, subscriptions, accounting sync, magic-link auth, and branded PDF invoices. It also works alongside WooCommerce if you need it, but that's optional, not required.
Passwordless login via encrypted email tokens. Single-use, time-limited, cryptographically signed. Perfect for invoice payment links where you don't want to force a customer to remember a password. The magic link authenticates, sets a session, and redirects to the invoice or portal page. Application forms use the same mechanism for new customer onboarding.
Branded HTML rendered to PDF via WeasyPrint. Dual-render architecture: beautiful in the browser, pixel-perfect as a downloadable PDF. Custom logo, company details, colour scheme, bank details for manual payments, and line-item tables with tax breakdowns. PDFs can be emailed as attachments or downloaded from the portal and admin. The printable invoice page serves both the browser view and the PDF generation source.
All personally identifiable information is encrypted at rest using AES-256-CBC. Customer names, email addresses, phone numbers, addresses, payment method identifiers, cancellation reasons, and notes are all encrypted in the database. Searchable fields use SHA-256 blind indexes via ajt_stripe_email_hash() so you can look up customers by email without decrypting every row. The client and licence master use separate encryption key chains.
A bento-grid dashboard with revenue charts, invoice feeds, payment feeds, attention alerts (failed charges, overdue invoices), circle indicators for key metrics, and MSP Hub integration strips when active. Customer intelligence scoring (A/B/C/D grades) based on payment behaviour helps identify reliable customers and flag problematic ones. Revenue breakdown with drilldown modals for detailed analysis.
A dedicated customers tab with search, filtering, and a detail view showing the complete financial relationship: all invoices, all orders, all subscriptions, all contracts, saved payment methods, and MSP Hub links (tickets, services, contracts) when active. Bulk actions, customer deletion with data cleanup, and NET-14 per-customer payment terms configuration.
A quote builder that creates professional quotes with line items, then converts accepted quotes into invoices with one click. Quotes are stored as a custom post type with their own lifecycle: draft, sent, accepted, declined, expired, converted. Quote-to-invoice conversion preserves all line items, customer details, and terms. The invoicing tab shows quotes and invoices side by side with filtering and search.
Optional WooCommerce integration adds a NET-14 pay-later gateway (buy now, invoice later with configurable payment terms) and a card gateway with full SCA/3D Secure support. Checkout Blocks compatible. For sites that need both a WooCommerce shop and standalone invoicing, both coexist cleanly. Order meta boxes show Stripe payment details, invoice links, and sync status.
Branded transactional emails for every lifecycle event: invoice created, payment received, payment failed, overdue reminders, autopay success/failure, subscription created/cancelled, quote sent, application received. Email templates use merge tags ({customer_name}, {invoice_number}, {amount_due}, {payment_link}) and respect Robot workflow overrides when GLASS is active.
A 14-file portable licensing system that can be dropped into any AJT plugin without modification. RSA JWT token verification (RS256, not shared-secret HMAC), Sentinel MU-plugin for boot-time integrity checks, heartbeat cron for periodic licence validation, colocation proof for same-server deployments, and obfuscated protocol to prevent reverse engineering. The licence module on ajt.support communicates with Stripe Pro via local WordPress hooks, not HTTP.
Never trust client-submitted amounts. Every PaymentIntent is created server-side by looking up prices from the product catalogue. The frontend submits a product ID, not a price. This prevents price manipulation attacks entirely.
Stripe webhooks are verified using the webhook signing secret before processing. Events are idempotent: processing the same event twice has no side effects. Belt-and-braces reliability for payment confirmation.
Failed Stripe API calls trigger automatic retry with exponential backoff. Failed invoice creation queues for manual retry. Admin notifications on persistent failures. A dedicated dashboard widget shows failed and pending invoices that need attention.
5 API controllers (customers, finance, payments, subscriptions, misc) with JWT authentication, rate limiting, input validation, and audit logging. The API powers the GLASS portal sections and any external integrations.
A comprehensive diagnostics panel showing Stripe connection status (test and live modes), webhook configuration, API version, accounting sync health, database table status, and cron job schedules. One-click connection test for both Stripe and accounting platforms.
Delete the plugin and it removes everything: all options, all database tables, all user meta, all transients, all cron hooks, all custom post types. Zero residue. Encrypted data is destroyed with the encryption keys.