ml-connector
Sage 300TaxJar

Sage 300 and TaxJar integration

Sage 300 tracks orders and receivables across multiple companies and customer groups. TaxJar calculates sales tax rates in real time and automates transaction reporting to state tax authorities. When you connect the two, your Order Entry records flow into TaxJar for tax calculation and nexus tracking, and your refunds are reported to keep your filing history clean. ml-connector bridges the different authentication models and handles the polling rhythm required by both systems.

How Sage 300 works

Sage 300 is a Windows-based on-premise ERP exposing Accounts Receivable, Order Entry, invoices, and GL accounts through REST and OData endpoints. Every request carries HTTP Basic Auth with an uppercase username and password, sent with each call. There is no OAuth2 or webhook support. Sage 300 exposes master data endpoints (ARCustomers, OEOrders, GLAccounts) for full read and write, and transaction batch endpoints like ARInvoiceBatches and ARReceiptAndAdjustmentBatches for posting. OData filtering on DocumentDate and pagination via $top and $skip are the primary query mechanisms. Large API call volumes can trigger IIS AppPool timeouts, so polling is throttled to avoid overwhelming the application pool.

How TaxJar works

TaxJar is a cloud-based tax compliance platform acquired by Stripe in 2021, running at api.taxjar.com and api.sandbox.taxjar.com. Authentication is token-based, using a single API key generated in the TaxJar app and passed via Authorization header. TaxJar accepts API requests in two header formats: Token token=<API_TOKEN> or Bearer <API_TOKEN>. The API is versioned through the x-api-version request header using a date string format such as 2022-01-24. TaxJar does not support webhooks or push notifications; all data movement is merchant-initiated or poll-based. Key entities include transaction orders and refunds for reporting, customers for exemption management, and nexus regions for jurisdiction tracking. The sandbox environment is stateless and validates request format only without persisting data.

What moves between them

Order Entry and invoice data from Sage 300 flow into TaxJar for tax compliance reporting and nexus tracking. When an order is completed in Sage 300, ml-connector posts it to TaxJar's transaction reporting endpoint. Refunds and credit memos are similarly reported to TaxJar's refund endpoint. Customer exemption types and nexus regions are read from TaxJar to validate order exemptions in Sage 300. The data movement is unidirectional from Sage 300 into TaxJar; TaxJar calculation results and tax rates are read back into Sage 300 for posting to GL accounts or reference only, depending on your workflow.

How ml-connector handles it

ml-connector stores Sage 300 credentials encrypted and encodes them in base64 for HTTP Basic Auth on every request, ensuring the username and password are uppercase as Sage 300 requires. The TaxJar API key is stored encrypted separately. ml-connector polls Sage 300's OEOrders and ARInvoiceBatches endpoints on a schedule, filtering by DocumentDate to find new orders and refunds since the last sync. When an order is ready for tax reporting, ml-connector posts it to TaxJar's /transactions/orders endpoint. Refunds are posted to /transactions/refunds. If a transaction already exists in TaxJar (returns HTTP 422), ml-connector falls back to a PUT request to update it. Nexus regions are polled from TaxJar and cached to validate customer jurisdiction exemptions. Every record carries a timestamp and can be replayed if a call to TaxJar fails, and all credentials are encrypted at rest and never logged in plain text.

A real-world example

A mid-sized reseller distributes software licenses across three states, processing orders in Sage 300 and needing to file sales tax returns with state authorities. Before the integration, the finance team manually exported orders from Sage 300 weekly, matched them to states, calculated tax using TaxJar's rate lookup, and uploaded a summary to the state portals. With Sage 300 and TaxJar connected, each order posts to TaxJar immediately after fulfillment, tax is calculated in real time, and the state filings are pre-populated with complete transaction history, eliminating manual mapping and reducing compliance risk.

What you can do

  • Post completed orders from Sage 300 to TaxJar's transaction endpoint for automated tax compliance reporting.
  • Report refunds and credit memos from Sage 300 to TaxJar to maintain accurate filing history.
  • Map Sage 300 customer records to TaxJar exemption types so exempt customers are marked correctly in tax calculations.
  • Encrypt and securely store Sage 300 Basic Auth credentials and TaxJar API tokens, and refresh them if they expire.
  • Poll Sage 300 on a throttled schedule to respect IIS AppPool limits while tracking nexus regions from TaxJar.

Questions

How does ml-connector handle the different authentication models between Sage 300 and TaxJar?
Sage 300 requires HTTP Basic Auth with an uppercase username and password sent on every request. ml-connector stores both credentials encrypted, encodes them in base64, and includes them in the Authorization header. TaxJar uses a single token-based API key. ml-connector stores that key encrypted separately and passes it in the Authorization header using the Bearer format. Both credential sets are managed securely and never logged in plain text.
What records move from Sage 300 to TaxJar and how often?
Order Entry orders (OEOrders) and invoice batches (ARInvoiceBatches) flow from Sage 300 into TaxJar for tax reporting. Credit memos and refunds are also reported. ml-connector polls Sage 300 on a configurable schedule, typically daily or after each order batch, and posts new or updated orders to TaxJar. Polling is throttled to avoid overwhelming the Sage 300 IIS AppPool, which can timeout under heavy call volume.
Can orders be reported to TaxJar if a customer has a tax exemption in Sage 300?
Yes. ml-connector maps Sage 300 customer records to TaxJar exemption types. Before posting an order, it checks if the customer has an exemption in Sage 300 and applies the matching exemption type in TaxJar so tax is calculated correctly. Exemption status is maintained in both systems throughout the integration lifecycle.

Related integrations

Connect Sage 300 and TaxJar

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

Get started