ERPNext and Zenoti integration for salons and spas

Connect Zenoti to ERPNext with the Zenoti connector in Ecommerce Integrations to bring purchase orders and sales invoices into accounting and stock. This page covers setup, mapping, security and failure points.

On this page

How the ERPNext Zenoti integration brings salon purchasing and sales into accounting and stock

A salon or spa group that runs Zenoti for bookings and point of sale, while keeping accounting and stock in ERPNext, needs the two systems to agree on what was bought and sold. The Zenoti connector pulls purchase orders and sales invoices from Zenoti and creates matching Purchase Orders and Sales Invoices in ERPNext. Introduced in version 13 of ERPNext, it is installed from Ecommerce Integrations, so the setup sits alongside other marketplace connectors rather than as custom code. Before go-live, confirm with your Zenoti account contact which documents and fields the connector reads in your tenant, since that determines what appears in ERPNext without manual entry.

When a Zenoti record refers to a customer, supplier or item that does not yet exist in ERPNext, the connector can create it from the Zenoti data. This saves time at first sync, but it also means your master data is shaped by whatever Zenoti sends. Decide in advance which Customer Group, Supplier Group, Item Group and default accounts new records should receive, and review the first batch of auto-created records for duplicates, such as the same retail product entered under two names. Choose the item naming and unit of measure rules before the first pull, because changing them later affects stock history and open documents.

Plan for what the connector does not cover unless you confirm it. Ask in writing whether it handles returns, gift card or membership payments, service-only charges, tax splits, multi-location stock transfers and cancelled documents, and how each maps to ERPNext accounts. Also confirm how often the pull runs, how failed records are reported, and who in your team reviews them. Test with a copy of recent Zenoti data in a non-production ERPNext site, reconcile the resulting ledgers and stock balances against Zenoti reports, and only then enable the scheduled sync on live books.

What you need in place before installing the Zenoti connector

The Zenoti connector writes into accounting and stock, so most installation problems trace back to decisions made before the app is touched. Confirm the platform version, hosting model, Zenoti access, and the ERPNext master data that incoming documents will map onto.

ERPNext version and support status

Confirm the ERPNext and Frappe version you run is on Frappe's supported versions list before you install anything. Frappe's warranty coverage depends on a listed version and a matching Frappe Cloud support plan. Check that the Zenoti connector is confirmed against your exact version, since the integration was introduced in version 13 and your minor release may differ from the one documented.

Hosting model decision

Choose between Frappe Cloud and a self-hosted bench or Docker deployment before configuring the connector. Frappe Cloud manages the server and backups, while self-hosting places patching, scheduler health and outbound network rules on your team. Shared Frappe Cloud benches do not allow Server Scripts, so confirm that any custom mapping you need is supported on your plan.

Ecommerce Integrations app

The connector ships through the Ecommerce Integrations app, so confirm it is installed on the site and that its version matches your ERPNext release. On Frappe Cloud it is available from the Marketplace. On a self-hosted bench, install it from the app source your team has approved and test it on a staging site first.

Zenoti API access

Ask the Zenoti account owner to provide API access and the credentials the connector needs, and confirm in writing which data the account can read for purchase orders and sales invoices. Store those credentials in ERPNext's own configuration, not in shared spreadsheets or chat. Agree who holds the credentials and who rotates them when staff change.

Company, chart of accounts and warehouses

Create the ERPNext company, chart of accounts, default income and expense accounts, and the warehouses that stock from Zenoti will land in before the first sync. Missing accounts or warehouses cause incoming invoices and receipts to fail or post to the wrong place. Decide whether each salon or spa location needs its own warehouse and cost center.

Tax templates and network reachability

Set up sales and purchase tax templates that match how Zenoti reports tax for your locations, and confirm the tax treatment with your accountant. Also confirm that the ERPNext server can reach Zenoti's API endpoints over outbound HTTPS, through any proxy or firewall your network enforces. A failed connection test at this stage is cheaper to fix than a half-finished sync.

Installing and configuring the connector in sequence

This sequence takes the Zenoti connector from a bare ERPNext site to a scheduled sync that creates Purchase Orders and Sales Invoices, with a check at each step so that accounting and stock settings are confirmed before live data moves. Each step names what is produced and how the team knows it is finished.

  1. Confirm the site version and staging copy

    Before installing anything, confirm that the ERPNext site runs a version that supports the Zenoti integration, which was introduced in version 13, and that the Frappe Framework version is on the supported list. Clone the production site to a staging site with its accounting and stock data, so that test pulls never touch live ledgers. Done means the staging site loads, the version is recorded in the change ticket, and the Zenoti account owner has confirmed which Zenoti locations and API access the test will use.

  2. Install the Ecommerce Integrations app

    On the staging site, install the Ecommerce Integrations app, which hosts the Zenoti connector alongside other marketplace connectors. On Frappe Cloud, it is available from the Frappe Cloud Marketplace. On a self-managed bench, the app is installed from its repository and then added to the site. Done means the app appears under the installed apps list and the Ecommerce Integrations workspace opens without errors in the error log.

  3. Enable and configure the Zenoti settings

    Open the Zenoti settings document in the Ecommerce Integrations workspace and enable the connector for the staging site only. Leave the scheduled sync off at this stage. Record the Zenoti environment and any location or company identifiers the connector asks for. Done means the settings document saves without validation errors, and the team has written down which Zenoti account and location each setting refers to.

  4. Enter Zenoti credentials and company

    Enter the API credentials supplied by the Zenoti account administrator into the settings, and select the ERPNext Company that will own the documents. Store the credentials in the password fields the app provides, not in custom scripts or shared notes. Ask the Zenoti administrator to confirm that the API user has read access to purchase orders and sales invoices only. Done means the test connection returns a success message on the staging site, and the company shown matches the entity whose books will receive the data.

  5. Map default accounts, warehouse, price list and item group

    Set the default accounts for income, expense, receivable and payable, along with the default warehouse, price list and item group that new items will receive. Coordinate with the finance lead on the chart of accounts, and with the stock lead on which warehouse holds salon retail and treatment consumables. Any missing mapping causes documents to fail or land in the wrong ledger, so review each field against the chart of accounts. Done means each mapped account exists, is a non-group account on the chosen company, and the finance lead has signed off on the list.

  6. Run a test pull on staging

    Run a manual sync on the staging site for a short, known date range that contains a small number of Zenoti purchase orders and sales invoices. Watch the sync log and the Error Log for failed records, duplicate customers or items, and tax or currency mismatches. Do not widen the date range until the first run is clean. Done means the sync log shows the expected count of processed records, and every failed record has a recorded reason and a fix or an accepted exception.

  7. Review created documents before go-live

    Open the Purchase Orders and Sales Invoices created by the test pull and compare them against the source records in Zenoti. Check quantities, unit prices, taxes, discounts, customer and supplier names, and the items auto-created from Zenoti data. Confirm that auto-created customers, suppliers and items have the correct groups and accounts, and that the Sales Invoices post to the expected ledgers. Done means the finance lead has reviewed a sample of documents, the differences are logged, and the mapping changes are saved and retested.

  8. Enable the scheduled sync

    Once the staging review passes, repeat the configuration on the production site with the same settings, and enable the scheduled sync so the connector pulls new Zenoti records on its own. Watch the first scheduled runs and the sync log for the first few cycles, and keep a named owner for failed records. Done means the scheduled runs complete without errors, the production ledgers show the expected documents, and the owner has confirmed the escalation path for failures.

Installing on Frappe Cloud or a self-hosted bench

Installing from the Frappe Cloud Marketplace means the Zenoti connector is delivered as part of the Ecommerce Integrations app on a site that Frappe Cloud hosts. The marketplace flow handles the app install on your site, and Frappe Cloud manages the underlying servers, database, backups and platform updates. You still decide when to move the site to a new ERPNext version and when to accept app updates, so the marketplace model shifts infrastructure work to the host while keeping configuration decisions with you.

  • Updates: Frappe Cloud applies platform updates on its schedule, while you control app version changes on your site.
  • Version pinning: the app must match the ERPNext version on the site, so confirm compatibility before any major upgrade.
  • Staging: create a separate staging site on Frappe Cloud and install the same app version there before production.
  • Hosting cost: Frappe Cloud shared site hosting starts at 5 US dollars per month according to the ERPNext pricing page, and dedicated servers start at 125 US dollars per month, so plan size drives the recurring cost.
  • Custom logic: Server Scripts are not available on public shared benches, so custom posting rules need a different route.

Before you choose this path, confirm the current plan that includes your staging and production sites and whether your Zenoti data volumes fit it.

How Zenoti records map to ERPNext documents and master data

This table compares each Zenoti record the connector reads with the ERPNext document or master record it creates, the key used to match existing data, and who should confirm the behavior. Use it as a checklist before a pilot: anything marked for verification depends on the connector documentation and your own Zenoti configuration, not on assumptions about how salon and spa data is usually structured.

Zenoti sourceERPNext targetMatch key and creation ruleOwner to confirm
Purchase ordersPurchase OrderConfirm which Zenoti identifier is stored on the ERPNext document to prevent duplicates on re-syncFinance lead and connector documentation
Sales invoicesSales InvoiceConfirm whether invoices post to stock, income and receivable accounts as expected for your chart of accountsAccountant and ERPNext implementer
Customers in ZenotiCustomerCreated when no match exists; confirm which field (phone, email or Zenoti ID) is used to find an existing customerFront-desk operations and data owner
Suppliers in ZenotiSupplierCreated when missing from purchase order data; confirm the matching field and whether duplicates are mergedProcurement lead
Products sold or purchasedItem (stock item)Created when missing; confirm item code rules, units of measure and default warehouse assignmentInventory owner and ERPNext implementer
Services performedItem (service item)Confirm whether services are created as non-stock items and which income account they post toFinance lead and operations manager
Taxes, discounts and gift cardsTax templates, pricing and payment linesFlag for verification: confirm how each tax rate, discount type and gift card redemption is represented in the synced invoiceAccountant and tax advisor
Multi-location stockWarehouses per locationFlag for verification: confirm whether stock is tracked per Zenoti location and how it maps to ERPNext warehousesInventory owner and operations manager

Deciding which items, customers and suppliers should be created automatically

Decide before the first pull whether the Zenoti connector should create missing customers, suppliers and items on its own, or whether you clean and approve those masters first. Automatic creation keeps Purchase Orders and Sales Invoices flowing without manual intervention, but every missing record it creates becomes a permanent ERPNext master that accounting and stock reports rely on. Cleaning first costs review time up front, yet it prevents the duplicates and misnamed suppliers that are slow to untangle once posted documents reference them. Confirm with your Zenoti administrator which fields the sales and purchase data actually carries for each record type, because the connector can only create masters from what the data provides.

Customers are the most common source of duplicates. A client who books a treatment under one name and buys retail products under a slightly different spelling, or with a different phone number, can appear as two customers in ERPNext, which splits receivables and loyalty history. Settle how names are normalized, which identifier (email, phone or a Zenoti client reference) is treated as the match key, and who merges records when the match fails. Separate service items from stock items as well. Treatments and memberships are usually non-stock items that post to income accounts, while retail products such as shampoo or skincare lines need stock tracking, valuation and a warehouse. Mapping a retail product as a service item, or the reverse, changes how stock and cost of goods reports behave, so review item types against your product list before the first sync.

Agree a naming convention for suppliers and items in writing before the first pull, and make the review step a named owner's task with a sign-off. A sensible convention for suppliers states whether the legal name, trading name or brand name is used, how punctuation and legal suffixes are handled, and who approves a new supplier. For items, decide the code format and how product variants such as sizes or shades are represented. Run the first pull against a test site or a limited date range, check the created records against the convention, correct them, and only then enable the recurring sync. This approach is a recommendation for your process, and the exact behavior of the connector on your data should be confirmed in the ERPNext Zenoti integration documentation.

Securing Zenoti credentials and ERPNext accounting data

A Zenoti connector writes purchase orders, sales invoices and master data into your books, so its credentials and its settings deserve the same care as your bank access. The cards below cover the controls to decide before go-live and the evidence you should be able to show afterward.

Least-privilege Zenoti API access

Ask Zenoti which API credentials and scopes the integration needs for purchase orders, sales invoices, customers, suppliers and items, and request only those. Do not reuse a credential that belongs to a person or to another system. Confirm with Zenoti how keys are issued, rotated and revoked, and record who at your organization can request a new key. A read-only scope for the data that flows in is a good default where the vendor supports one.

Credentials in site configuration

Store the Zenoti credentials in the ERPNext site configuration rather than in a document, a spreadsheet or a shared note. Any user who can read a Zenoti Settings-style record or an exported fixture may be able to see a secret stored there, so confirm in your build where the values live and who can read them. Keep the site configuration file out of version control, restrict file permissions on the server, and include the secret store in your backup encryption plan.

Role permissions on connector settings

Limit edits to the connector settings to a named accounting or system administrator role, and keep it separate from the roles that create sales invoices or approve purchase orders. A user who can change the account mapping, the default item group or the customer creation rule can alter where Zenoti transactions land in the ledger. Test the restriction with a non-admin user before go-live, and review the role list whenever staff change.

Audit trail on created documents

Documents created by the connector, including Purchase Orders, Sales Invoices, and auto-created customers, suppliers and items, should be traceable to the sync run that made them. Confirm which fields record the source reference and the creation user, and check what version history ERPNext keeps for each DocType. Decide how long you keep the logs and who reviews them, and export a sample of created records to show an auditor how a Zenoti transaction maps to a ledger entry.

TLS on every connection

Confirm that the connection from ERPNext to Zenoti uses HTTPS with certificate validation enabled, and that browser access to ERPNext, the reverse proxy and any database or Redis traffic between hosts is encrypted in your environment. Check that no development setting disables certificate verification and that the same rule applies to backups and offsite storage. Record the certificate owner and renewal process so the connector does not fail silently when a certificate expires.

Controls and evidence, not audit reports

DeployOpen can configure these controls, document them and collect the evidence your team or an independent auditor will ask for. DeployOpen does not issue audit reports, attestations or certifications, so the assessment itself remains with your auditor or certification body. Ask us to agree in writing which controls, test records and configuration exports are in scope before the build starts.

Common Zenoti sync failures and how to fix them

This table lists the sync failures most likely to appear when Zenoti purchase orders and sales invoices flow into ERPNext, with the probable cause, the check to run and the fix for each. Work through the rows in order when a sync stops or produces unexpected records, since credential and default-setting problems usually block everything downstream. The main takeaway is that most failures trace to configuration gaps that can be confirmed on the ERPNext side before you change the Zenoti data.

FailureLikely causeCheck to runFix
Authentication errorsZenoti API credentials are expired, mistyped, or lack access to the required dataConfirm the credentials in the Zenoti Settings document and test a single pull with a recent date rangeRe-enter or regenerate credentials with Zenoti, then rerun the failed batch and confirm records appear
Duplicate customers or items from bookingsMatching uses names or codes that differ between Zenoti bookings and existing ERPNext mastersSearch Customer and Item lists for near-duplicates created on the sync date and compare their identifiersMerge duplicates in ERPNext, align the identifier used for matching, and set the auto-create options to match your master data rules
Missing default accounts or warehousesCompany defaults, income, expense or stock accounts, or the target warehouse were not set before the connector ranReview the company defaults and the warehouse field in the connector settings for blank valuesSet the default accounts and warehouse, then resync the affected documents so Purchase Orders and Sales Invoices post correctly
Tax template mismatchesZenoti tax rates or inclusive and exclusive settings do not match an ERPNext Sales Taxes and Charges templateCompare a sample invoice's tax lines in Zenoti with the tax amounts recalculated in ERPNextCreate or correct the matching tax template, confirm whether prices include tax, and reprocess invoices that were booked with the wrong template
Unsynced returns and refundsRefunds or voided sales processed in Zenoti after the original invoice was pulled, with no matching return document in ERPNextList Zenoti refunds for the period and check for corresponding return Sales Invoices in ERPNextCreate the return documents manually or through a controlled correction process, and confirm stock and receivable balances afterwards
Sync timing gapsBookings, invoices or stock changes made after the last run, or runs that overlap a day-end closeCompare the last successful sync timestamp with the Zenoti transaction dates for the same periodAgree a fixed run schedule with the front desk and finance close, and rerun a date range that covers any gap

Questions buyers ask before engaging help with the Zenoti connector

What drives the implementation effort and cost of the Zenoti connector?

The main drivers are how many Zenoti locations feed one ERPNext company, how clean the item, customer and supplier data is in Zenoti, and how much of your accounting setup (chart of accounts, tax templates, warehouses, cost centers) is ready before the connector runs. Costs have three parts: the connector installation and configuration, the master data cleanup and mapping work, and testing against real purchase orders and sales invoices. Each of these is priced from a written scope, and DeployOpen does not publish a price list. Ask any partner to itemize these three parts in a quote so you can see which ones your own staff could take on.

How long does Zenoti setup take with messy master data across several locations?

The duration depends mainly on master data quality and on the number of locations, because each location adds its own mapping decisions and test runs. The connector can auto-create missing customers, suppliers and items from Zenoti data, but duplicates, inconsistent product names and unclear supplier records are easier to fix before the first sync than after thousands of invoices have been created. No fixed timeline is supplied for this connector, so ask for a duration in the written scope and confirm the Zenoti data export details with your Zenoti account contact and the ERPNext Zenoti integration documentation.

What does the work need from our finance and operations staff?

Finance staff need to confirm how each Zenoti sales invoice should post to income, tax, payment and receivable accounts, and how purchase orders should map to supplier and stock accounts. Operations staff need to confirm item groups, units of measure, warehouses and which products are retail stock versus service consumables. Expect them to review a sample of synced documents in a test environment and sign off on the mapping before go-live. Without this input, the connector will create documents, but they may land in the wrong accounts or stock locations.

Can our internal IT team install the Zenoti connector without a partner?

Yes, a capable internal team can install the connector, because it is available through Ecommerce Integrations on the Frappe Cloud Marketplace and ERPNext documents the setup. The harder part is the mapping and validation work, which needs accounting knowledge of your salon or spa group, and the ongoing operation of the sync. Decide early which of these your team owns, and whether you want a partner for configuration, testing and documentation. Confirm the installation path that matches your hosting, since ERPNext can run on Frappe Cloud, with Docker Compose, or manually with bench.

What recurs after go-live, such as upgrades and monitoring?

After go-live, recurring work includes applying ERPNext and Frappe minor releases, testing the connector after major upgrades, monitoring sync jobs and failed records, and keeping Zenoti credentials and item mappings current as your menu and suppliers change. Frappe's supported versions page lists end-of-life dates, so plan major version moves before a line reaches end of life. Frappe support coverage requires a listed version and a matching Frappe Cloud support plan, so confirm your support route with Frappe and budget for recurring operations as a separate line from the one-time build.

What should we ask for in a fixed-scope quote?

Ask for a written scope that lists the locations in scope, the ERPNext version and hosting model, the Zenoti data fields and document types that sync, and the rules for creating customers, suppliers and items. Request the testing plan, the acceptance criteria, the handover documentation and any training for finance and operations staff. Also ask what is excluded, such as historical backfill, custom reports or other integrations, and how changes after sign-off are priced. A fixed-scope quote should let you compare options against your own team's estimate line by line.

Does the connector cover every Zenoti feature a salon or spa group uses?

The documented connector pulls purchase orders and sales invoices from Zenoti and creates Purchase Orders and Sales Invoices in ERPNext, creating missing customers, suppliers or items from Zenoti data. It should not be assumed to cover appointments, memberships, payroll or other Zenoti modules unless the documentation confirms it. Confirm the exact document types and fields with the ERPNext Zenoti integration documentation and with your Zenoti account contact before you define the scope.

Testing and cutover before the first live Zenoti pull

Before the first live pull, run the Zenoti connector against a staging site and reconcile what it creates with what Zenoti holds. Pick a sample of purchase orders and sales invoices that cover your common cases: a retail product sale, a service sale with a discount, a sale with tax at each rate you charge, a refund, and a purchase with a supplier that already exists. For each one, compare the Purchase Order or Sales Invoice in ERPNext with the source document line by line, including quantities, unit prices, discounts, tax rows, totals and the warehouse the stock moved from. Then check the totals at the level your accountant reads: sales tax collected by rate, revenue by income account, and stock value movement against the stock ledger. Confirm the exact Zenoti fields and tax behavior with your Zenoti administrator and the connector documentation before you sign off, since the mapping decides which tax accounts receive the amounts.

Next, test the master data, because the connector creates missing customers, suppliers and items on the fly. Run a pull twice over the same period and confirm that no second customer, supplier or item appears for the same person or product. Search for near-duplicates by name, phone and email, and for items that Zenoti names differently from your existing catalogue. Clean the existing masters first, using the Data Import tool with its downloadable templates, and keep each batch to a few thousand records at most, as the documentation advises. Record the decision for each duplicate: merge, keep separate, or rename at source. The rollback plan should be written before go-live. Define who can disable the scheduled pull, how to cancel or delete the documents a bad run created while they are still unsubmitted, how submitted invoices are reversed with credit notes, and what the accountant signs off before the stock and tax periods close. Agree these steps in writing with your finance lead and your Zenoti contact.

How DeployOpen scopes and supports the ERPNext Zenoti integration

DeployOpen is a Chainscore Labs company that plans, implements, customizes, integrates, documents and supports self-hosted open-source platforms inside your own infrastructure. For the ERPNext and Zenoti integration for salons and spas, we start from the written scope, configure the connector against your accounting and stock setup, and hand over a documented, supported system that your team can operate.

How we scope

  • Confirm which Zenoti purchase orders and sales invoices should flow into ERPNext, and which branches or locations are in scope.
  • Map Zenoti suppliers, customers and items to existing ERPNext records, and agree rules for auto-creating missing ones.
  • Agree the written scope, deliverables and timeline before work starts, since most engagements are fixed-scope.

How we build

  • Install the Zenoti connector from Ecommerce Integrations on your ERPNext site and confirm the version matches your deployment.
  • Configure accounts, warehouses, tax templates and item defaults so pulled documents post correctly to accounting and stock.
  • Test with a sample of Zenoti records in a staging site, checking invoices, stock movements and auto-created master data.

How we hand over

  • Document the configuration, field mappings, sync schedule and every rule applied to auto-created customers, suppliers and items.
  • Walk your finance and operations staff through reconciling pulled invoices and purchase orders against Zenoti reports.
  • Provide a runbook covering failed syncs, duplicate master data checks and what to escalate to your own team.

How we support

  • Ongoing support, upgrades and testing are available as a retainer, covering ERPNext releases and connector changes.
  • Confirm with us how Zenoti API or connector changes will be reviewed and tested before they reach production.
  • Ask for a written quote based on the agreed scope, since DeployOpen does not publish a price list.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.