This guide covers implementation, configuration, daily use and troubleshooting for Nomad Small Business Accounting Free.
Downloadable PDF guide
This online article contains the comprehensive Free version implementation guide. You can also download the PDF version for offline use or customer distribution.
Nomad Small Business Accounting - Free Version Implementation Guide
Based on uploaded plugin: nomad-small-business-accounting-v1.0.6.zip Scope: Free version only - no Pro, PayFast automation, AI generation, connector/API workflows or recurring billing automation.
1. Purpose and Scope
This implementation guide explains how to install, configure, test, support and publish the Free version of Nomad Small Business Accounting for WordPress. It is based on the actual v1.0.6 plugin package and intentionally excludes Pro-only functionality.
The Free version is designed to be useful on its own. It gives a small business a self-hosted accounting foundation inside WordPress: customers, products/services, quotes, invoices, manual payment recording, expenses, manual customer statements, VAT Lite summaries, basic reports and CSV exports.
1.1 Free Version Positioning
- Self-hosted WordPress accounting foundation for small businesses.
- No time limit and no license key requirement.
- No external AI service required.
- No online payment gateway requirement.
- Manual-first workflows: create, email, print/save as PDF, record payment, export data.
- Useful enough for a first business workflow without forcing an upgrade.
1.2 Explicit Free/Pro Boundary
The Free version must remain clear and trustworthy. It may show upgrade prompts for advanced features, but core accounting workflows must not depend on Pro.
- Included: setup wizard, company settings, invoice settings, invoice branding, email settings, customers, product categories, products/services, quotes, invoices, manual payments, expenses, VAT Lite, reports, manual statements, manual follow-up helpers, exports and logs.
- Reserved for Pro/add-ons: PayFast and other payment gateway automation, recurring subscription billing, automated payment reminders, automated customer statement runs, AI proposal generation, AI product image generation, external connector/API workflows, automatic exchange-rate updates, bank feeds, receipt capture, advanced categorisation, progress invoicing and compliance-grade VAT automation.
2. Plugin Identity and Technical Baseline
| Item | Value |
|---|---|
| Plugin name | Nomad Small Business Accounting |
| Version inspected | 1.0.6 |
| Main file | nomad-small-business-accounting.php |
| Text domain | nomad-small-business-accounting |
| Edition constants | AN_FREE_EDITION = true; ANA_PRO_FEATURES_ENABLED = false |
| Shared core | includes/core/nomad-core.php, bundled as a shared identity layer. |
| Primary admin menu | Accounting |
| Primary capability | ana_manage_accounting |
| Public shortcode present | [african_nomad_payment_result] - mainly relevant to PayFast result pages, not needed for Free-only operations. |
2.1 Requirements
| Requirement | Implementation note |
|---|---|
| WordPress | Requires at least WordPress 6.0; readme marks tested up to 6.9. |
| PHP | Requires PHP 7.4 or later. PHP 8.x should be tested before publishing. |
| Database | Uses custom WordPress database tables created through dbDelta on activation. |
| User capability | Administrators get ana_manage_accounting. A dedicated Accounting Admin role is also created. |
| Uses WordPress wp_mail. Configure SMTP/domain authentication on the site for reliable delivery. | |
| Uploads | Expense document uploads use WordPress upload handling and media/file permissions. |
| External services | Free workflows do not require OpenAI, PayFast, connectors or paid external services. |
2.2 Activation Behaviour
- Creates the Accounting custom database tables.
- Runs migrations for customer names, party identity, quote subscription compatibility fields, recurring expense fields, expense VAT fields and product long description fields.
- Creates the Accounting Admin role and grants administrators the ana_manage_accounting capability.
- Seeds standard income accounts, expense accounts, currencies and payment methods.
- Does not seed product categories in v1.0.6; categories intentionally start empty.
- Migrates customers to shared Nomad Core Party records where applicable.
- Does not delete data on deactivation.
- Does not schedule Pro automation events while AN_FREE_EDITION is true and ANA_PRO_FEATURES_ENABLED is false.
3. Installation and First Setup
Use this section as the practical implementation path for a new website running the Free plugin.
3.1 Installation Steps
- Back up the WordPress site and database before installing any accounting plugin.
- Go to WordPress Admin > Plugins > Add New > Upload Plugin.
- Upload nomad-small-business-accounting-v1.0.6.zip.
- Activate Nomad Small Business Accounting.
- Confirm that the Accounting menu appears in the WordPress admin sidebar.
- Visit Accounting > Setup Wizard and complete the first setup.
- Configure Company Settings, Invoice Settings, Invoice Branding and Email Settings before sending any customer-facing document.
- Add at least one Income Account if needed, then add product categories and products/services.
- Add the first customer.
- Create a test quote, convert it to an invoice, email it to an internal test address and record a manual payment.
3.2 Recommended Setup Order
- Setup Wizard: minimum business profile, VAT flag, currency and document numbering.
- Company Settings: legal/contact details, banking details, payment terms and invoice logo.
- Invoice Settings: invoice format, next number, quote format and quote validity.
- Invoice Branding: customer-facing colours, terms, footer and payment instructions.
- Email Settings: trusted sender identity, reply-to address and templates.
- Product Categories: create only the categories the business actually uses.
- Income Accounts and Expense Accounts: review seeded categories and adjust if necessary.
- Products & Services: create sellable catalogue items.
- Customers: create customer records with all billing email addresses.
- Operational workflow: quote, invoice, payment, expense, statement and export.
4. Admin Menu Implementation Map
The following table maps each Free admin screen to its implementation purpose and when to use it.
| Admin page | Purpose | When to use |
|---|---|---|
| Dashboard | Operational overview and quick actions. | Use after setup to monitor totals, outstanding invoices, recent invoices and export reminder. |
| Setup Wizard | First-run business setup. | Capture minimum business, VAT, currency and numbering defaults. |
| Customers | Customer master records. | Create customer records, multiple email addresses, transaction history and balances. |
| Products & Services | Sellable catalogue. | Create products/services, short and long descriptions, category, image URL, price, cost, currency, billing metadata and income account. |
| Quotes | Quote/proposal workflow. | Create once-off quotes, email, view public quote, capture accept/reject, version changes and convert to invoice. |
| Invoices | Invoice creation and list management. | Create manual invoices, apply discounts, email invoices and view public PDF-style invoice. |
| Payments | Manual payment recording. | Record EFT, cash, manual card or other payments against unpaid or partial invoices. |
| Expenses | Supplier cost capture. | Capture supplier expenses, upload documents, mark input VAT and optionally generate due recurring expense entries manually. |
| Customer Statements | Manual customer statements. | View, print/save as PDF, copy or email customer statements for a selected period. |
| Payment Follow-up | Manual debtor follow-up. | View unpaid/overdue invoices and copy/open follow-up email wording. |
| VAT Lite | Basic VAT summary. | Review output VAT, input VAT and net VAT for a selected period; export CSV. |
| Reports | Basic business reports. | Sales, expenses, estimated profit, debtor totals, sales by product and debtor ageing-style list. |
| Data & Export | CSV export centre. | Export customers, products, quotes, invoices, payments and expenses. |
| Company Settings | Legal, contact and banking details. | Configure company details, VAT registration, payment terms, banking and invoice logo. |
| Invoice Settings | Document numbering and defaults. | Set invoice/quote formats, next numbers, padding, currency, quote validity and yearly reset. |
| Invoice Branding | Customer-facing document look. | Set logo, colours, footer, payment instructions and default terms. |
| Email Settings | Central email sender and templates. | Set From/Reply-To details, copy settings and email templates for invoices, quotes, statements and reminders. |
| Product Categories | Catalogue categories. | Create, edit and delete categories. Fresh installs start empty. |
| Income Accounts | Sales account lookup. | Maintain standard income account categories used by products/services. |
| Expense Accounts | Expense account lookup. | Maintain standard expense account categories used by expenses. |
| Pro Roadmap | Upgrade boundary explanation. | Explains features reserved for Pro/add-ons. |
| Logs | Internal event log. | Review system, sync, payment and automation log entries created by the plugin. |
5. Core Configuration Pages
5.1 Setup Wizard
- Captures trading name, registered company name, email, phone, address, VAT registered flag and VAT number.
- Captures default currency, payment terms, invoice format, next invoice number, quote prefix and quote valid days.
- Does not create first product or first customer records in v1.0.6. It shows Add First Product and Add First Customer buttons instead.
- Sets ana_setup_complete to 1 after saving.
5.2 Company Settings
- Use for legal identity, trading identity, VAT registration status, VAT number, business address, email, phone, website, bank details and payment terms.
- Payment terms are deliberately controlled in Free: Due on Receipt or 30 Days.
- The invoice logo URL can be selected from the WordPress media library and is saved into branding settings.
- Bank details should be checked before sending any invoice because the Free version is manual-payment first.
5.3 Invoice Settings
- Sets invoice format, next invoice number, number padding and optional yearly reset.
- Sets quote format, next quote number, quote number padding, quote valid days and credit note prefix.
- Default invoice number example from the plugin guidance: AN-INV-2026-000191.
- Invoice due dates are controlled from Company Settings payment terms, not from a free-text due-days field.
5.4 Invoice Branding
- Controls logo URL, primary colour, secondary colour, footer text, payment instructions and terms text.
- Payment instructions should explain EFT/manual payment steps clearly because Free does not process online payment automation.
- Invoice and quote email template fields remain compatible, but the main email template control is now Email Settings.
5.5 Email Settings
- Sets From name, From email, Reply-to name and Reply-to email.
- Sets internal notification email for quote/proposal acceptance or rejection notifications.
- Allows sending a company copy for invoice, quote, statement and payment reminder emails.
- Templates are provided for Invoice Email, Quote/Proposal Email, Customer Statement Email and Payment Reminder Email.
- Payment reminder templates exist for consistency, but automated reminder sending remains Pro. Free provides manual follow-up helper wording.
| Template | Available placeholders |
|---|---|
| Invoice Email | {INVOICE_NUMBER}, {CUSTOMER_NAME}, {INVOICE_URL}, {TOTAL}, {COMPANY_NAME} |
| Quote / Proposal Email | {QUOTE_NUMBER}, {CUSTOMER_NAME}, {QUOTE_URL}, {TOTAL}, {COMPANY_NAME} |
| Customer Statement Email | {CUSTOMER_NAME}, {STATEMENT_DATE}, {PERIOD_START}, {PERIOD_END}, {TOTAL_DUE}, {STATEMENT_HTML}, {COMPANY_NAME} |
| Payment Reminder Email | {REMINDER_NUMBER}, {INVOICE_NUMBER}, {CUSTOMER_NAME}, {INVOICE_URL}, {TOTAL}, {BALANCE}, {DUE_DATE}, {COMPANY_NAME} |
6. Operational Workflows
6.1 Customer Workflow
- Go to Accounting > Customers.
- Enter company name when invoicing an organisation. Enter first and last name for the contact person.
- Add one or more email addresses. The plugin accepts one email per line or comma-separated addresses and uses all valid addresses when sending invoices.
- Capture phone, billing address, VAT number and status.
- Save the customer.
- Use the Transactions action to review invoices, quotes, payments and running balance for that customer.
Implementation note: customers are also linked to shared Nomad Core Party records. If Nomad CRM is installed and exposes nomad_sync_customer_to_contact(), customer saves can sync identity into CRM/contact structures without making Accounting dependent on CRM.
6.2 Product and Service Workflow
- Go to Accounting > Product Categories and create relevant categories, or use the + button next to the category field on the Products & Services form.
- Go to Accounting > Products & Services.
- Enter product/service name and product code/SKU. The code is sanitised as a slug-like identifier.
- Choose a category, or leave as Uncategorised/Other.
- Enter a short description for cards/grids and a long description for detail pages.
- Enter selling price, cost, currency, billing cycle and income account.
- Billing cycle is limited to Once Off and Monthly in Free. Monthly is metadata only; automated recurring billing is Pro.
- Optionally choose a product image URL from the media library.
- Save the product/service.
Implementation note: if the African Nomad Portal product table exists, product saves attempt a non-fatal sync to the Portal add-on product table. If sync fails, the product save still succeeds and an error is logged.
6.3 Quote Workflow
- Go to Accounting > Quotes.
- Select a customer and currency.
- Choose quote status: Draft, Sent, Accepted, Rejected or Converted.
- Set issue date and valid-until date. Default validity comes from Invoice Settings.
- Enter manual exchange rate when billing in a non-base currency.
- Add line items from existing products or use manual items.
- Add notes. Deposit/staged payment schedules are not part of Free.
- Optionally email the quote to the customer on creation.
- Use View Quote to open the public quote URL.
- Use Version History to review snapshots after editing an existing quote.
- Convert an accepted quote to an invoice from the quote actions.
Free quotes are once-off documents. Subscription quotes, proposal AI generation and recurring billing conversion are Pro scope.
6.4 Invoice Workflow
- Go to Accounting > Invoices.
- Select a customer, currency and status.
- Set issue date and exchange rate if billing in a non-base currency.
- Add line items from the product catalogue or manual items.
- Use line discounts if required.
- Use invoice-wide discount for an overall discount across all line items.
- Add notes.
- Optionally email the invoice to the customer after creation.
- Use the invoice list to View, Email or Delete invoices.
- Use invoice filters to search by customer, status, source, date range, due date range and outstanding-only.
Customer-facing invoices are rendered through a public tokenised admin-post URL and include a Print / Save as PDF button. In Free, payment instructions should guide EFT or other manual payment methods.
6.5 Manual Payment Workflow
- Go to Accounting > Payments.
- Select an unpaid, partial or overdue invoice.
- Enter payment amount, paid date, payment method, reference and notes.
- Save the payment.
- The plugin records the payment and recalculates invoice balance and status.
- Review the payment in the Payment List and on the customer transaction history screen.
Important v1.0.6 implementation check: the payment form needs the admin_post_ana_record_payment action hook registered before release. See Section 13 for the exact release-blocker note.
6.6 Expense Workflow
- Go to Accounting > Expenses.
- Enter supplier and choose an expense account.
- Enter description, amount, currency and expense date.
- Tick VAT claimable only when you have a valid supplier VAT invoice.
- Enter VAT rate and whether the amount includes VAT.
- Choose payment method.
- Upload supplier invoice/documentation files or enter a document URL.
- Optionally mark as recurring. In the Free build, treat this as a manual recurring-expense helper unless scheduling is explicitly enabled.
- Save the expense.
- Use Run Recurring Expenses Now to generate due recurring expense entries manually.
6.7 Customer Statement Workflow
- Go to Accounting > Customer Statements.
- Select a customer and statement period.
- Click View Statement.
- Open the PDF-style statement in a new tab.
- Print or save as PDF from the browser.
- Email the statement manually to the customer if required.
- Copy the plain statement text if you need to paste it into another message.
Manual statements are included in Free. Automated scheduled statement runs are Pro.
6.8 Payment Follow-up Workflow
- Go to Accounting > Payment Follow-up.
- Review unpaid, partial and overdue invoices sorted by due date.
- Copy the suggested follow-up wording or open a mailto email when a customer email exists.
- Use View Invoice to include the invoice link in the customer follow-up.
6.9 VAT Lite Workflow
- Confirm VAT registration status in Company Settings.
- Create invoices with VAT-aware line totals where applicable.
- Capture supplier expenses with VAT claimable enabled only for valid supplier VAT invoices.
- Go to Accounting > VAT Lite.
- Select date from and date to.
- Run the VAT Lite Summary.
- Review output VAT, input VAT and net VAT potentially payable/refundable.
- Export CSV or print/save as PDF for accountant review.
VAT Lite is a working summary, not an official tax filing system. The guide should advise users to verify VAT registration, periods and valid VAT documentation with their accountant.
6.10 Reports and Export Workflow
- Use Reports for quick business overview: total sales, total expenses, estimated profit and outstanding debtors in base currency.
- Use sales by product to identify the top revenue lines.
- Use outstanding debtors to decide who needs follow-up.
- Use Data & Export to download CSV files for customers, products, quotes, invoices, payments and expenses.
- Export regularly as part of the Free version data ownership promise.
7. Data Architecture
Nomad Small Business Accounting uses custom tables prefixed with the WordPress database prefix and ana_. It also bundles Nomad Core tables prefixed nomad_ for shared identity records.
7.1 Free Operational Tables
| Table | Purpose | Key data |
|---|---|---|
| ana_customers | Customer master data. | Company/person names, multiple emails, phone, VAT number, billing address, source and shared Nomad party link. |
| ana_product_categories | Product/service categories. | User-defined categories. v1.0.6 starts empty and removes old bundled defaults. |
| ana_income_accounts | Income account lookup. | Seeded standard income accounts for product/service income classification. |
| ana_products | Products and services. | SKU/code, name, short/long description, category, image URL, price, cost, currency, billing cycle metadata and income account. |
| ana_quotes | Quote header records. | Quote number, customer, status, dates, currency, totals, token, notes, terms, proposal compatibility fields and invoice link after conversion. |
| ana_quote_items | Quote line items. | Product code, description, quantity, price, discount-compatible columns, tax and totals. |
| ana_quote_versions | Quote version history. | Snapshot of quote state each time an edited quote is saved. |
| ana_quote_decisions | Customer quote decisions. | Accepted/rejected decision, customer name/email, comment, IP, user agent and timestamp. |
| ana_invoices | Invoice header records. | Invoice number, customer, status, dates, currency, exchange rate, totals, balance, token, notes and metadata. |
| ana_invoice_items | Invoice line items. | Product code, description, quantity, unit price, line discount, invoice discount allocation, tax and totals. |
| ana_payments | Payment records. | Invoice/customer, amount, currency, method, reference, paid date, source, external ID and notes. |
| ana_expense_accounts | Expense account lookup. | Seeded standard expense categories. |
| ana_expenses | Supplier expenses. | Supplier, description, expense account, amount, currency, exchange rate, VAT fields, payment method, document links and recurring expense metadata. |
| ana_payment_methods | Payment method lookup. | Manual payment methods such as EFT, Cash, Manual card payment and Other. Automated gateways are Pro. |
| ana_statement_logs | Statement email audit. | Manual statement email sends, recipients, subject/body, totals and success/failure state. |
| ana_logs | Plugin event log. | Source, event, object reference, status, message and payloads. |
| ana_currencies / ana_exchange_rates | Currency support tables. | Enabled currencies and manual exchange rates. Automatic updates are gated for Pro. |
7.2 Pro-Reserved / Compatibility Tables Present in the Schema
Some tables exist in the v1.0.6 schema even though the matching workflows are not part of the Free version. This helps future upgrades and compatibility, but these tables should not be promoted as Free features.
| Table | Reserved purpose | Free implementation note |
|---|---|---|
| ana_checkout_orders | PayFast/cart checkout staging. | Created for future/pro PayFast checkout flows. Not part of Free workflow. |
| ana_payfast_requests | PayFast ITN/payment request tracking. | Reserved for PayFast payments. Free build blocks PayFast settings and checkout handlers. |
| ana_api_keys | External API authentication. | Reserved for connector/API workflows. REST routes return early in Free. |
| ana_subscriptions | Subscription billing records. | Reserved for automated recurring billing. Product monthly billing is metadata only in Free. |
| ana_billing_logs | Recurring billing audit. | Reserved for Pro subscription billing runs. |
| ana_payment_schedules | Deposits/staged payments. | Reserved for Pro staged/progress payment flows. |
7.3 Shared Nomad Core Tables
| Core table | Purpose |
|---|---|
| nomad_parties | Neutral shared identity records for customers/contacts. |
| nomad_party_emails | Multiple email addresses attached to a shared party. |
| nomad_party_addresses | Address records attached to a party. |
| nomad_links | Links Accounting records, CRM records and Party records. |
| nomad_events | Module-neutral event log for cross-plugin workflows. |
7.4 WordPress Options
| Option | Used by | Purpose |
|---|---|---|
| ana_company_settings | Company Settings and Setup Wizard. | Company name, trading name, VAT flag, VAT number, address, email, phone, website, bank details and payment terms. |
| ana_invoice_settings | Invoice Settings and Setup Wizard. | Invoice/quote number formats, next numbers, padding, default currency, labels and quote validity. |
| ana_branding_settings | Invoice Branding and Company Settings logo field. | Logo URL, colours, footer, payment instructions, terms and legacy email template values. |
| ana_email_settings | Email Settings. | From/Reply-To identity, internal notification email, copy settings and invoice/quote/statement/reminder templates. |
| ana_currency_settings | Currency helpers. | Base currency, default invoice currency, enabled currencies and provider metadata. Automatic updates are not active in Free. |
| ana_payment_reminder_settings | Template support. | Template data used for manual/future reminder consistency; scheduled reminders are Pro. |
| ana_statement_settings | Statement template support. | Template data and statement run metadata; manual statements are Free, automated scheduled runs are Pro. |
| ana_setup_complete | Setup Wizard. | Marks first setup as complete. |
| ana_db_version | Activation and upgrade. | Stores installed accounting schema/plugin version. |
8. Roles, Capabilities and Security
- The plugin creates the ana_manage_accounting capability.
- Administrators receive the capability automatically.
- The Accounting Admin role is created with read and ana_manage_accounting capabilities.
- Admin actions use WordPress nonces for save/delete/export operations.
- Input is generally sanitised using WordPress sanitisation functions such as sanitize_text_field, sanitize_email, sanitize_textarea_field, esc_url_raw and wp_kses_post where relevant.
- Customer-facing quote and invoice views use tokenised links rather than requiring a customer login.
- Do not share tokenised quote/invoice links publicly unless intended; anyone with the link may be able to view the document.
- Expense document uploads rely on WordPress upload permissions and allowed file type handling.
9. Integration Points
9.1 CRM and Nomad Core Identity
- Accounting works alone and must not require CRM.
- CRM works alone and must not require Accounting.
- When both exist, Nomad Core provides neutral Party records as shared identity.
- Customer saves call sync_customer_identity() and can call nomad_sync_customer_to_contact() if that function is available.
- The plugin emits a customer_saved event through Nomad Core when available.
9.2 Portal Product Sync
- Product saves call safe_sync_accounting_product_to_portal().
- The sync only proceeds when the Portal add-on product table exists.
- The sync maps product name, slug/code, price, billing cycle, image URL, short description, long description and accounting metadata where matching Portal columns exist.
- Sync failures are non-fatal and are logged; they do not prevent product saving.
- For WordPress.org Free distribution, this must remain optional and should not be described as a required dependency.
9.3 Email
- All customer-facing email delivery depends on wp_mail.
- For production, configure SMTP or transactional email at the WordPress/site level.
- Use a domain-based From address and correct SPF/DKIM/DMARC to avoid invoices landing in spam.
- Templates are centralised in Accounting > Email Settings.
9.4 REST/API and Payment Gateway Boundary
- REST routes are registered only when is_pro_enabled() returns true.
- Because AN_FREE_EDITION is true and ANA_PRO_FEATURES_ENABLED is false, Free does not expose connector REST endpoints.
- PayFast settings and PayFast checkout handlers are blocked as Pro features.
- The Free version should be positioned around manual EFT/cash/card recording, not online payment processing.
10. Public-Facing Documents and Shortcodes
- Public quote view: generated through admin-post handler using the quote token.
- Public invoice view: generated through admin-post handler using the invoice token.
- Both document types include browser-based Print / Save as PDF behaviour.
- Customer statements can be opened in a PDF-style statement view from the admin statement screen.
- The shortcode [african_nomad_payment_result] exists but is primarily for PayFast success/cancel/unsuccessful pages. It is not required for Free-only accounting implementation.
11. Testing and Acceptance Checklist
11.1 Fresh Install Tests
- Activate the plugin on a clean WordPress install.
- Confirm Accounting menu appears for administrator.
- Confirm Accounting Admin role exists.
- Confirm custom ana_ tables were created.
- Confirm nomad_ core tables were created.
- Confirm product categories are empty on fresh install.
- Confirm seeded income accounts, expense accounts and manual payment methods exist.
11.2 Configuration Tests
- Complete Setup Wizard and verify ana_setup_complete is saved.
- Save Company Settings with VAT disabled, then enabled, and verify VAT Lite warning behaviour.
- Save invoice numbering and confirm the next invoice uses the expected number format.
- Save branding logo/colour/payment instructions and inspect public invoice output.
- Save Email Settings and send a test invoice/quote to an internal test mailbox.
11.3 Workflow Tests
- Create a product category from the Product Categories screen.
- Create a product category from the inline + modal in Products & Services and verify it is selected automatically.
- Create a product/service with short and long descriptions.
- Create a customer with multiple email addresses.
- Create a quote using the product/service and email it.
- Open the public quote view and test accept/reject decision flow.
- Edit the quote and verify a version history entry is created.
- Convert the quote to an invoice.
- Create a manual invoice with line-level and invoice-wide discount.
- Open public invoice and print/save as PDF.
- Record a manual payment after applying the payment hook fix.
- Verify invoice balance and status update after payment.
- Capture an expense with uploaded documentation.
- Capture a VAT claimable expense and verify VAT Lite input VAT.
- Run VAT Lite, export CSV and print/save as PDF.
- Generate and email a manual customer statement.
- Run Data & Export for each core dataset.
11.4 Negative Tests
- Try saving a product without an income account and confirm the plugin blocks it.
- Try creating an invoice without a customer and confirm the plugin blocks it.
- Try creating an invoice without line items and confirm the plugin blocks it.
- Try deleting a product category used by products and confirm products become uncategorised rather than deleted.
- Try accessing admin screens as a user without ana_manage_accounting and confirm access is denied.
- Confirm PayFast settings and API/connector routes are unavailable in Free.
12. Go-Live Checklist
- Backup the WordPress database and files.
- Confirm the Free build is the intended package and not Pro.
- Apply or verify the release-blocker fixes in Section 13.
- Confirm WordPress and PHP versions meet requirements.
- Confirm wp_mail delivery using SMTP or hosting email.
- Complete Setup Wizard.
- Set invoice and quote numbering before creating real customer documents.
- Configure Company Settings, banking details and payment terms.
- Configure Invoice Branding and inspect a test invoice.
- Configure Email Settings and send test emails.
- Review Income Accounts and Expense Accounts.
- Create product categories, products/services and customers.
- Create one full test quote-to-invoice-to-payment workflow.
- Capture one test expense and run VAT Lite.
- Export CSV backup after initial setup.
- Remove test customer/quote/invoice/payment records before live use if necessary.
13. Release-Blocker and Quality Notes for v1.0.6
The following items were detected while inspecting the uploaded v1.0.6 Free plugin. They should be corrected or consciously documented before public release.
| Item | Implementation note |
|---|---|
| Payment form action hook | The Payments form posts action=ana_record_payment, and handle_record_payment() exists, but the constructor does not register admin_post_ana_record_payment. Add the hook before release or the Record Payment form will not process. |
| Public invoice Pay Now button | The public invoice view can display Pay Now for eligible ZAR internal/quote invoices, but PayFast checkout is Pro-gated. In Free, invoice_is_manual_payfast_eligible() should return false when is_pro_enabled() is false, or the Pay Now button should be hidden. |
| Recurring expense wording | The Expenses screen says WordPress cron will automatically create recurring expenses, but Free activation does not schedule ana_daily_recurring_expense_run. Treat Free recurring expenses as manual Run Recurring Expenses Now unless you explicitly enable a free scheduled event. |
| Data export duplicate array key | The Data & Export page defines expenses twice in the exports array. PHP keeps one entry, so it is low risk, but it should be cleaned up. |
13.1 Payment Form Hook Fix
Add this action registration in the constructor near the other admin_post registrations:
add_action('admin_post_ana_record_payment', array($this, 'handle_record_payment'));13.2 Hide Pay Now in Free
To prevent a Free user from seeing a Pay Now button that leads to a Pro-gated PayFast handler, add a Pro check to invoice_is_manual_payfast_eligible():
if (!$this->is_pro_enabled()) { return false; }13.3 Recurring Expense Scope Decision
The Expenses UI includes recurring expense fields and a manual Run Recurring Expenses Now button. Free activation does not schedule the recurring expense cron event. Choose one of these implementation decisions before release:
- Manual-only Free approach: keep Run Recurring Expenses Now and change help text so users do not expect automatic cron generation.
- Scheduled Free approach: schedule only ana_daily_recurring_expense_run in Free while keeping subscription billing, payment reminders and statement automation gated for Pro.
- Pro-only recurring expenses approach: remove or gate recurring expense fields from the Free Expenses screen.
14. Troubleshooting
| Problem | Resolution |
|---|---|
| Accounting menu missing | Confirm the plugin is active and the user has administrator or ana_manage_accounting capability. |
| Setup saved but invoices look incomplete | Complete Company Settings, Invoice Branding and Email Settings. Check logo URL, bank details, payment instructions and terms. |
| Invoice or quote emails not arriving | Configure SMTP/transactional email. Check From email, SPF/DKIM/DMARC, spam folder and wp_mail logs. |
| Product categories are empty | This is intentional in v1.0.6. Create only the categories the business actually needs. |
| Cannot add a product | Ensure at least one active Income Account exists and is selected. |
| Payment recording does not work | Apply the admin_post_ana_record_payment hook fix from Section 13.1. |
| Pay Now appears but Free blocks payment | Apply the is_pro_enabled() check from Section 13.2 or hide PayFast payment buttons in Free. |
| VAT Lite shows zero input VAT | Expenses must be marked VAT claimable and have VAT rate/amount data. |
| VAT Lite warning appears | Company Settings has VAT registered set to No. This is correct unless the business is VAT registered. |
| Expense upload fails | Check WordPress upload permissions, file size limits and allowed file types. |
| Currency totals look wrong | Free uses manual exchange-rate input for non-base currency documents. Verify the rate entered at invoice/expense creation. |
| Exports missing expected data | Confirm the relevant records exist and are saved in the core ana_ tables. Data & Export exports full table rows. |
15. Maintenance and Backup
- Use Data & Export regularly to export customers, products, quotes, invoices, payments and expenses.
- Keep regular full database backups because accounting records are stored in custom database tables.
- Before plugin updates, backup the database and plugin folder.
- After each update, test setup screens, quote creation, invoice creation, email sending, payment recording, expense capture, VAT Lite and export.
- Do not delete custom tables on deactivation. Deactivation should be reversible.
- For live accounting records, avoid direct database edits except for controlled migrations and support fixes.
16. WordPress.org Free Plugin Considerations
- The Free version must remain useful without requiring a paid upgrade.
- Do not require PayFast, OpenAI, CRM, Portal or any external service for the core workflow.
- Any upgrade prompts should be clear and non-blocking.
- Avoid advertising Pro-only features as Free features.
- Keep data export and manual workflows prominent as part of the self-hosted value promise.
- Ensure all user-facing text is accurate: manual statements are Free; scheduled statements are Pro; manual follow-up is Free; automated reminders are Pro; product Monthly billing is metadata only; automated recurring billing is Pro.
17. Recommended Implementation Milestones
| Milestone | Theme | Definition of done |
|---|---|---|
| Milestone 1 | Technical readiness | Apply v1.0.6 release-blocker fixes, run PHP syntax checks and activate on staging. |
| Milestone 2 | Configuration readiness | Complete setup wizard, company settings, invoice settings, branding and email templates. |
| Milestone 3 | Master data readiness | Create accounts, categories, products/services and customers. |
| Milestone 4 | Workflow readiness | Test quote, invoice, payment, expense, statement, VAT and export workflows. |
| Milestone 5 | Publishing readiness | Confirm Free/Pro boundary text, readme, screenshots, support notes and backup/export guidance. |
18. Quick User-Facing Setup Checklist
19. Final Free Version Definition
A successful Free implementation is one where a small business can complete the full manual accounting loop without a paid add-on: configure the business, add products/services and customers, send a quote, convert it to an invoice, record manual payment, capture expenses, review VAT Lite and reports, send a statement and export the data.
The Free product should be positioned as a real accounting foundation, while Pro is positioned as growth automation: payments, recurring billing, scheduled reminders, scheduled statements, connectors, AI generation, bank feeds and advanced accounting automation.