eveXso Integration Guide
Follow this step-by-step guide to build your eveXso integration. Complete the steps in order for best results.
Getting Connected
Obtain your API credentials and test your first connection to eveXso.
What You Need
- API Key: Contact eveXso support or your account manager
- Site ID: Your warehouse site identifier
- User ID: Integration user ID
- Environment: Beta (testing) or Production
Choose Your Testing Environment
API Playground
Test APIs in your browser with live responses and ERP-specific code generation
Open PlaygroundPostman Collection
Import pre-built requests into Postman with environment variables configured
View in PostmanTest Your Connection
Call the warehouse/list endpoint to verify your credentials work:
POST https://api.evexso.com/wms_beta
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"entity": "warehouse",
"action": "list",
"site_id": "YOUR_SITE_ID",
"user_id": "YOUR_USER_ID",
"platform": "integration",
"session_id": "",
"activity_id": "",
"data": {}
}Setup Warehouses & Locations
Define your warehouse structure including storage groups, zones, and pick faces.
Location Hierarchy
eveXso supports a flexible 4-level location hierarchy. You can use all levels or just what you need:
Area
Top level (e.g., "WAREHOUSE", "YARD")
Zone
Zones within area (e.g., "A", "B", "COOL-ROOM")
Location
Specific locations (e.g., "A01", "B12")
Slot (Optional)
Pallet positions within a location
Define Warehouse
Create your warehouse record with address details.
POST /warehouse/checkDefine Location Types
Set up your location hierarchy levels (required for locations).
POST /warehouse_location_type/checkCreate Locations
Create your actual storage locations, pick faces, and packing areas.
POST /warehouse_location/checkImport Inventory
Import your product catalog with all tracking, packaging, and warehouse information.
Important: Complete Inventory Setup
Each inventory item requires multiple API calls to be fully configured. Follow the order below:
- inventory - Core product information
- inventory_stocking_factor - At least ONE with pack_size = 1 (required)
- inventory_warehouse_information - Warehouse-specific settings
- inventory_dangerous_goods_information - DG/Hazmat data (if applicable)
- inventory_lookup - Barcodes and alternate codes
Core Inventory Record
Create the main product record with description, category, and inventory type.
POST /inventory/checkView Example
{
"inventory_code": "WIDGET-001",
"display_code": "WIDGET-001",
"description": "Premium Widget",
"inventory_type": "STOCK",
"unit_of_measure": "EA",
"inventory_category": "WIDGETS"
}Stocking Factors (Packaging)
⚠️ CRITICAL: You MUST create at least ONE stocking factor with pack_size = 1. This is the base unit.
Define how products are packaged (EA, BOX, PALLET, etc.). Create multiple stocking factors for different packaging levels.
POST /inventory_stocking_factor/checkView Example
{
"items": [
{
"inventory_code": "WIDGET-001",
"unit_of_measure": "EA",
"pack_size": 1,
"length": 10,
"width": 10,
"height": 5,
"weight": 0.5,
"is_default": true
},
{
"inventory_code": "WIDGET-001",
"unit_of_measure": "BOX",
"pack_size": 12,
"length": 50,
"width": 40,
"height": 30,
"weight": 6.5,
"is_default": false
}
]
}Warehouse Information
Set warehouse-specific settings like pick face location and average cost.
POST /inventory_warehouse_information/checkDangerous Goods (Optional)
If your product is hazardous, include DG information for compliance.
POST /inventory_dangerous_goods_information/checkBarcodes & Lookups
Add GS1 barcodes (AI 01 for GTIN), part numbers (AI 240/241), and alternate lookup codes.
POST /inventory_lookup/checkView Example
{
"items": [
{
"inventory_code": "WIDGET-001",
"lookup_code": "9312345678901",
"gs1_ai": "01",
"description": "EAN Barcode"
},
{
"inventory_code": "WIDGET-001",
"lookup_code": "SUPP-WIDGET-01",
"gs1_ai": "240",
"description": "Supplier Part Number"
}
]
}Import Customers
Create customer records with delivery locations (supply locations).
Two API Calls Required
Customers require both a customer record (basic info) and one or more supply_location records (delivery addresses).
Create Customer Record
Create the main customer record with name and basic information.
POST /customer/checkCreate Supply Locations (Delivery Addresses)
Add one or more delivery locations for each customer. Each branch/site gets its own supply location.
POST /supply_location/checkView Example
{
"entity": "customer",
"entity_key": "ACME",
"supply_location_code": "ACME-SYDNEY",
"supply_location_name": "Acme Corp - Sydney Branch",
"address_1": "123 Business St",
"address_2": "",
"suburb": "Sydney",
"state": "NSW",
"postcode": "2000",
"country": "AU",
"contact_name": "John Smith",
"contact_phone": "+61 2 9876 5432",
"contact_email": "john@acme.com",
"courier_id": "",
"courier_service": "STARTRACK",
"registration": ""
}Import Suppliers
Create supplier records with their locations (for receiving goods).
Same Pattern as Customers
Suppliers work exactly like customers - you need both a supplier record and supply_location records.
Create Supplier Record
Create the main supplier record.
POST /supplier/checkCreate Supply Locations
Add supplier locations where goods will be received from. Set entity = "supplier" and entity_key to the supplier_code.
POST /supply_location/checkSetup Courier Services
Configure courier services in the eveXso UI for dispatch and label printing.
Setup in eveXso UI
Courier and courier service configuration is done in the eveXso admin interface, not via API. Contact eveXso support or your account manager to configure:
- Courier accounts (e.g., StarTrack, AusPost, FedEx)
- Service levels (e.g., Express, Standard)
- Consignment note printing templates
- Automatic freight calculation rules
Why This Matters
Once couriers are configured, sales orders can automatically:
- Calculate freight based on weight, dimensions, and destination
- Print consignment notes during packing
- Generate tracking numbers
- Sync shipment status back to your ERP
Import Orders
Start importing sales orders and purchase orders for fulfillment and receiving.
Sales Orders
Import customer orders for picking, packing, and dispatch.
POST /sales_order/importTip: Use /import action to create complete orders with all lines in a single call.
Purchase Orders
Import supplier orders for receiving goods into the warehouse.
POST /purchase_order/importTip: Purchase orders enable receiving against expected quantities and supplier details.
Order Processing Flow
Import
Send order via API
Pick
Warehouse picks items
Pack
Pack and print labels
Dispatch
Ship to customer
Poll for Updates
Retrieve shipment, receipt, and adjustment updates to sync back to your ERP.
How Polling Works
eveXso queues updates for your ERP system. Poll the API regularly (e.g., every 60 seconds) to retrieve new updates, then mark them as complete.
Real-Time Alternative: Webhooks can be configured to trigger your integration in real-time when updates are available, eliminating the need for regular polling.
1. Poll
Call the update endpoint
2. Process
Update your ERP system
3. Mark Complete
Confirm processing or error
Three Types of Updates
📦 Outgoing Consignments
Sales order fulfillment (line level)
📥 Incoming Consignments
Purchase order receipts (line level)
🔄 Move Attempts
Inventory adjustments & transfers (line level)
Poll for Outgoing Shipments (Sales Orders)
Retrieve completed shipments with tracking numbers, packed items, and delivery details.
POST /erp_update/outgoing_consignmentView Example Request
{
"entity": "erp_update",
"action": "outgoing_consignment",
"site_id": "YOUR_SITE_ID",
"user_id": "YOUR_USER_ID",
"platform": "integration",
"session_id": "",
"activity_id": "",
"data": {}
}Poll for Incoming Receipts (Purchase Orders)
Retrieve completed receipts with received quantities, batch/serial numbers, and supplier details.
POST /erp_update/incoming_consignmentView Example Request
{
"entity": "erp_update",
"action": "incoming_consignment",
"site_id": "YOUR_SITE_ID",
"user_id": "YOUR_USER_ID",
"platform": "integration",
"session_id": "",
"activity_id": "",
"data": {}
}Poll for Inventory Adjustments & Transfers
Retrieve inventory movements including write-offs, write-ons, and location transfers.
POST /erp_update/move_attemptView Example Request
{
"entity": "erp_update",
"action": "move_attempt",
"site_id": "YOUR_SITE_ID",
"user_id": "YOUR_USER_ID",
"platform": "integration",
"session_id": "",
"activity_id": "",
"data": {}
}Mark Updates as Complete
After successfully processing updates in your ERP, mark them as complete so they're not returned again.
POST /erp_update/set_completeView Example Request
{
"entity": "erp_update",
"action": "set_complete",
"site_id": "YOUR_SITE_ID",
"user_id": "YOUR_USER_ID",
"platform": "integration",
"session_id": "",
"activity_id": "",
"data": {
"items": [
{
"integration_update_id": 12345
},
{
"integration_update_id": 12346
}
]
}
}Mark Updates as Error (Optional)
If processing fails in your ERP, mark the update as error with an error message. This prevents the update from being returned in normal polls after 5 failed attempts.
POST /erp_update/set_errorView Example Request
{
"entity": "erp_update",
"action": "set_error",
"site_id": "YOUR_SITE_ID",
"user_id": "YOUR_USER_ID",
"platform": "integration",
"session_id": "",
"activity_id": "",
"data": {
"items": [
{
"integration_update_id": 12345,
"error_message": "Customer not found in ERP"
},
{
"integration_update_id": 12346,
"error_message": "Inventory code missing from ERP"
}
]
}
}Best Practices for Polling
- Poll every 60 seconds - Balance between real-time updates and API load
- Always mark as complete - Prevents duplicate processing
- Handle errors gracefully - If ERP update fails, don't mark as complete so you can retry
- Log all transactions - Keep audit trail of all synced updates
You're Ready to Integrate!
You now have a complete overview of the integration process. Use the API Playground or Postman to start building.
Need help getting started?