ml-connector
Wave AccountingFedEx

Wave Accounting and FedEx integration

Wave Accounting tracks small business sales and expenses. FedEx moves and tracks packages. Connecting the two lets you pull customer and invoice data from Wave, create shipments in FedEx directly from those invoices, and flow tracking events back into Wave as transactions. New customers added to Wave can be validated against FedEx address rules, and shipment tracking updates appear in your Wave transaction log without re-keying.

How Wave Accounting works

Wave Accounting exposes customers, invoices, products, chart of accounts, and transactions through a GraphQL API at https://gql.waveapps.com/graphql/public. Requests require OAuth 2.0 bearer tokens with a 2 hour expiry and refresh tokens for longer sessions. Wave publishes webhooks for invoice.created, invoice.updated, invoice.paid, payment.created, customer.created, customer.updated, transaction.created, and product.created/updated events. Webhook signatures must be verified with HMAC-SHA256 using the x-wave-signature header. Wave Pro subscription is required for API access. Invoices support create, approve, send, and delete operations but not patching existing fields. Bills and purchase orders are not available through the GraphQL API.

How FedEx works

FedEx exposes shipment creation, tracking, rate quotes, freight management, and pickup scheduling through REST APIs at https://apis.fedex.com. Authentication uses OAuth 2.0 Client Credentials with an API Key and Secret from the FedEx Developer Portal. FedEx rate limits at 1,400 transactions per 10 seconds per project and enforces IP-level token limits: 3 tokens per second, with 403 returned for 10 minutes if exceeded. Track API accepts up to 30 tracking numbers per request and returns historical and in-transit events. FedEx also offers paid webhooks for tracking push events, but tracking can be polled for free. Freight invoicing is read-only and available only through a web portal. An FedEx account number is required for account-rated shipment creation.

What moves between them

The main flow is from Wave into FedEx and back. When a new invoice is created in Wave, ml-connector reads the customer and line items, creates a shipment in FedEx, and stores the tracking number as a Wave transaction. Tracking events from FedEx are polled or received via webhook and written back to Wave as transaction notes. Customer records created or updated in Wave are validated against FedEx address rules before being used in shipment creation. Shipments flow one direction from Wave to FedEx, while tracking updates flow back to Wave.

How ml-connector handles it

ml-connector stores Wave OAuth credentials and refreshes the bearer token every 2 hours or when Wave returns a 401. On every webhook from Wave, signature verification via HMAC-SHA256 prevents spoofed events. FedEx Client Credentials tokens are cached with a 1-hour TTL and refreshed on 401 or when approaching expiry. To avoid FedEx's IP-level rate limit (3 tokens per second for 5 seconds triggers a 10-minute block), ml-connector spaces token requests and reuses cached tokens across requests. When creating a shipment, ml-connector maps Wave customer data to FedEx Address entities, using the Wave customer name and email as shipper or recipient details. FedEx requires an account number for account-rated calls, so per-customer FedEx account numbers are stored and validated on setup. Tracking numbers returned from FedEx Ship API are stored in Wave as transactions with a unique transactionId from FedEx for client-side deduplication. Tracking events are polled from FedEx Track API (free) with a default cadence of every 4 hours and can optionally use FedEx paid webhooks if the customer subscribes. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A small business selling specialty items ships 50-200 orders per month via FedEx. Before the integration, the fulfillment team created invoices in Wave, then manually created FedEx labels by copying customer addresses between systems and looking up account numbers. Customers had to ask for tracking numbers by email. With Wave and FedEx connected, a new invoice in Wave automatically creates a FedEx shipment using the customer address already in Wave, stores the tracking number as a transaction in Wave, and updates the transaction with tracking milestones as the package moves. The fulfillment team prints labels directly from Wave, and customers can request tracking numbers that are already in the system.

What you can do

  • Create FedEx shipments automatically when invoices are created in Wave, pulling customer and address data from Wave customers.
  • Retrieve FedEx tracking numbers and store them as Wave transactions, linked to the original invoice.
  • Poll FedEx Track API for package tracking events and write them back to Wave as transaction notes.
  • Validate Wave customer addresses against FedEx address rules before shipment creation, and cache FedEx OAuth tokens to avoid rate-limit blocks.
  • Verify Wave webhook signatures with HMAC-SHA256 and refresh Wave OAuth tokens automatically when they expire.

Questions

How does ml-connector create shipments in FedEx when Wave has no shipping data?
ml-connector uses the customer address from the Wave customer record to create a FedEx shipment. The shipper address is static per customer (configured during setup), and the recipient address comes from the Wave customer associated with the invoice. Line item weights and dimensions can be read from Wave products if available, or set to defaults.
Can Wave and FedEx track shipments together?
Yes. ml-connector polls FedEx Track API for tracking events every 4 hours (or receives them via FedEx webhooks if enabled) and writes tracking milestones back to Wave as transaction notes. Customers can see the current tracking status in Wave without leaving the platform.
What happens if ml-connector hits FedEx's IP-level token rate limit?
FedEx blocks new token requests for 10 minutes if more than 3 tokens are issued per second for 5 seconds. ml-connector caches tokens with a 1-hour TTL and spaces token requests to stay under the limit, falling back to cached tokens for shipment lookups and tracking queries.

Related integrations

Connect Wave Accounting and FedEx

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

Get started