ml-connector
Zoho BooksShipStation

Zoho Books and ShipStation integration

Zoho Books tracks invoices and expenses. ShipStation tracks orders and shipments. Connecting them ensures that orders in ShipStation become invoices in Zoho Books, and shipment costs and tracking information flow back into your accounting records. With Zoho Books and ShipStation integrated, your sales revenue and fulfillment costs are recorded in one place, and month-end reconciliation between sales and shipping expenses requires no re-keying.

How Zoho Books works

Zoho Books exposes invoices, bills, purchase orders, customer payments, vendor payments, items, and chart of accounts through a REST API with OAuth2 Authorization Code flow. The platform is region-specific, with distinct base URLs for the US, EU, India, Australia, Japan, Canada, China, and Saudi Arabia. Each customer organization ID is required as a query parameter on every API call. Access tokens expire after 1 hour and refresh tokens are user-delegated with no server-side expiry. Zoho Books supports outgoing webhooks for invoices, bills, purchase orders, and customer/vendor payments, each with HMAC signature verification, plus offset-based polling for all list endpoints.

How ShipStation works

ShipStation exposes orders, customers, products, shipments, and warehouses through REST APIs available in both V1 (legacy, with order CRUD and customer/product management) and V2 (current, with label creation and inventory management). ShipStation uses API Key authentication via header (V2) or HTTP Basic Auth with base64-encoded key and secret (V1). All V1 datetime fields are in PST/PDT timezone, not UTC. The platform supports outgoing webhooks for order and shipment notifications, but webhook payloads contain only resource pointers, so actual data requires authenticated follow-up GET requests. ORDER_NOTIFY fires only on new orders; detecting order edits requires polling the modifyDate filter endpoint.

What moves between them

Orders flow from ShipStation to Zoho Books. ml-connector polls ShipStation's orders endpoint (filtering by modifyDate to catch both new orders and edits) and creates or updates corresponding invoices in Zoho Books, mapping the ShipStation order total to an invoice amount and the customer email to a Zoho Books contact. Shipment data flows from ShipStation back into Zoho Books as journal entries or line-item notes recording shipping costs and carrier tracking numbers. Customer data is synchronized in both directions so a new customer in Zoho Books is available in ShipStation, and customers created implicitly in ShipStation (via orderUsername) are reflected back in Zoho Books.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Zoho Books side it accepts the region parameter from the OAuth2 token response (returned as api_domain) and routes all subsequent calls to the correct regional base URL (US, EU, India, Australia, Japan, Canada, China, or Saudi Arabia). It proactively refreshes access tokens at 55 minutes to avoid the 1-hour expiry window. On the ShipStation side it polls the V1 orders endpoint with the modifyDate filter to detect changes not caught by ORDER_NOTIFY webhooks (which fire only on new orders), and it converts all V1 timestamps from PST/PDT to UTC on ingest. Because ShipStation webhook payloads are pointers only (containing resource_url and resource_type), ml-connector immediately follows up with an authenticated GET to fetch the full order or shipment data within the tight time window. The integration applies Zoho Books' 100 requests/minute rate limit via exponential backoff and retry, and tracks the authorization code expiry (2 minutes, single-use) to avoid wasted token requests. Every order and shipment record carries a full audit trail and can be replayed if a downstream invoice create fails.

A real-world example

A mid-sized e-commerce retailer selling through multiple channels (Shopify, Amazon, eBay) uses ShipStation to consolidate orders, print labels, and manage carrier contracts. They also use Zoho Books for accounting, invoicing, and expense tracking. Before the integration, the operations team exported weekly order totals from ShipStation and manually entered them into Zoho Books as batch invoices, often missing shipping cost details and reconciling customer names across systems. With Zoho Books and ShipStation connected, each order syncs automatically as an invoice, customer data is kept in sync, and shipping costs are captured as line-item notes or separate journal entries. The accounting team now has complete visibility into revenue and fulfillment costs from a single system, and month-end close no longer requires manual order reconciliation.

What you can do

  • Sync ShipStation orders to Zoho Books as invoices, automatically creating or updating customer contacts.
  • Capture shipping costs and carrier tracking numbers from ShipStation shipments as journal entries or invoice notes in Zoho Books.
  • Route all Zoho Books API calls to the correct regional base URL (US, EU, India, Australia, Japan, Canada, China, or Saudi Arabia) based on the customer organization.
  • Poll ShipStation orders by modifyDate to detect both new orders and edits, and follow up on webhook pointers to fetch full order and shipment data.
  • Proactively refresh Zoho Books access tokens before expiry and handle rate limits with exponential backoff and a complete audit trail on every record.

Questions

Which direction does data move between Zoho Books and ShipStation?
Orders and shipments flow from ShipStation into Zoho Books as invoices and cost records. Customer data is synchronized in both directions so contacts stay aligned. Zoho Books invoices and purchase orders are read-only on the ShipStation side, so the integration does not write financial transactions back into the shipping system.
How does the integration handle ShipStation's webhook payloads being data pointers, not full records?
ShipStation webhook payloads contain only a resource_url and resource_type, not the full order or shipment details. ml-connector immediately follows up with an authenticated GET request to the resource_url to fetch the complete order or shipment data within the tight time window before the data changes again. This is why polling with the modifyDate filter is also required to catch order edits, which do not trigger webhooks.
How does Zoho Books' multi-region setup affect the integration?
Zoho Books returns the customer's region (api_domain) in the OAuth2 token response. ml-connector stores this value and routes all subsequent API calls to the correct regional base URL (US, EU, India, Australia, Japan, Canada, China, or Saudi Arabia) so that credentials and data remain in the correct jurisdiction. This ensures compliance and prevents regional API routing errors.

Related integrations

Connect Zoho Books and ShipStation

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started