{"product_id":"shipstation-connector-pro","title":"ShipStation Connector Pro","description":"\u003cdiv class=\"hero\"\u003e\n\u003ch1\u003eShipStation Connector Pro\u003c\/h1\u003e\n\u003cp\u003eDolibarr and ShipStation, within the 40 requests a minute the API allows\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ch2\u003eFeatures\u003c\/h2\u003e\n\u003cdiv class=\"grid\"\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eSeveral accounts, both API versions\u003c\/b\u003e\u003cbr\u003eV1 (\u003ccode\u003essapi.shipstation.com\u003c\/code\u003e, HTTP Basic) and V2 (\u003ccode\u003eapi.shipstation.com\/v2\u003c\/code\u003e, API-Key header) side by side, each with its own environment, limit and sandbox flag. A key is never shown in full.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eA connection test that really connects\u003c\/b\u003e\u003cbr\u003eThe module calls the carrier list, not a ping. An account whose key is valid but whose plan does not expose the API would pass a ping and fail on every useful call. The verdict is written on the account.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eMarketplaces, stores, warehouses, carriers\u003c\/b\u003e\u003cbr\u003eImported with their services and package types, and mapped onto\u003cspan\u003e \u003c\/span\u003e\u003cb\u003eyour\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003eDolibarr warehouses. Shipping methods are built in bulk from carrier + service + package.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eProduct matching that proposes, never decides\u003c\/b\u003e\u003cbr\u003eMatching on the reference, by hand, by file or by barcode. An automatic match stays\u003cspan\u003e \u003c\/span\u003e\u003cb\u003eunverified\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003euntil someone confirms it, because a wrong reference ships the wrong parcel. The screen counts the orders each unmatched article is blocking.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eOrders exported, and the blocked ones explained\u003c\/b\u003e\u003cbr\u003eOne by one or in bulk. For every order that\u003cspan\u003e \u003c\/span\u003e\u003cb\u003ecannot\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003ego, the screen says why: incomplete address, missing country, no item, unmatched article, already exported, cancelled. Before a bulk export it announces the remaining quota and the number of waves needed.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eRates compared, and the rule's verdict shown\u003c\/b\u003e\u003cbr\u003eCheapest, fastest and the spread between offers. Rules: fixed service, cheapest, fastest, best compromise, with a price cap, a transit cap and excluded carriers. The comparator shows the offers the rule\u003cspan\u003e \u003c\/span\u003e\u003cb\u003eset aside, and on what grounds\u003c\/b\u003e.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eLabels, return labels, and an honest void button\u003c\/b\u003e\u003cbr\u003ePDF, PNG and ZPL, in 4×6, A4 and US letter. A purchased label is\u003cspan\u003e \u003c\/span\u003e\u003cb\u003eimmutable\u003c\/b\u003e: voiding is all that is left, and only for a configurable number of days. The screen says, label by label, whether it is still voidable, instead of offering a button the carrier will refuse.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eTest labels kept out of the spend\u003c\/b\u003e\u003cbr\u003eA test label costs nothing and cannot be used. It is counted apart and\u003cspan\u003e \u003c\/span\u003e\u003cb\u003eexcluded from the spend\u003c\/b\u003e, which would otherwise be overstated every month.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eQueues, and a governor that spends the quota\u003c\/b\u003e\u003cbr\u003eNothing is ever fired in a burst. Seven kinds of queue, a governor that reads\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eX-Rate-Limit-Remaining\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eand\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eX-Rate-Limit-Reset\u003c\/code\u003e,\u003cspan\u003e \u003c\/span\u003e\u003cb\u003edefers\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003ewhat does not fit in the minute and resumes at the next window. Every call is journalled with its HTTP code, its duration and the quota left.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eDeferred is not failed\u003c\/b\u003e\u003cbr\u003eThe two counters are separate on the screens, in the reports and in the API. An operator who confuses them replays work that was never going to fail, and spends quota for nothing.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eAn error catalogue, so one code gets one answer\u003c\/b\u003e\u003cbr\u003eEvery HTTP code with its cause and its remedy. The queue monitor reads the remedy from here, so the same code always receives the same advice.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eDashboard, 54 reports, exports and a REST API\u003c\/b\u003e\u003cbr\u003eA shipping control tower, 54 reports in 10 families, exports to CSV, Excel, Word, PDF and JSON, and a\u003cspan\u003e \u003c\/span\u003e\u003cb\u003e42-route REST API\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003ethat answers with the same verdicts as the screens.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eA simulation mode that says so\u003c\/b\u003e\u003cbr\u003eThe module starts answering from its own tables, so it can be installed, explored and demonstrated\u003cspan\u003e \u003c\/span\u003e\u003cb\u003ewithout a ShipStation account\u003c\/b\u003e. A banner says so on every screen and every simulated call is journalled as such: nothing is ever presented as coming from ShipStation.\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\u003cb\u003e\u003c\/b\u003e\u003c\/div\u003e\n\u003cdiv class=\"card\"\u003e\n\u003cb\u003eDemo data in, demo data out, one click each\u003c\/b\u003e\u003cbr\u003eActivation installs a complete, coherent configuration drawn from\u003cspan\u003e \u003c\/span\u003e\u003cb\u003eyour own\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003eproducts, customer orders and warehouses. Removing it is cascaded and\u003cspan\u003e \u003c\/span\u003e\u003cb\u003etouches no row your users created\u003c\/b\u003e.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ch2\u003e\u003c\/h2\u003e\n\u003ch2\u003eWhat the module does not do\u003c\/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cb\u003eThe module does not export products to ShipStation.\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003eThe API does not allow it: the direction is ShipStation → Dolibarr.\u003c\/li\u003e\n\u003cli\u003e\n\u003cb\u003eIt never calls ShipStation while a page is being rendered\u003c\/b\u003e, nor inside a trigger. An ERP page that waits on a remote API is a page that times out the day the API is slow — and at 40 requests a minute, it will be.\u003c\/li\u003e\n\u003cli\u003e\n\u003cb\u003eIt modifies no native Dolibarr table.\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003eIt creates its own\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003ellx_shipstationconnector_*\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003etables and plugs in through hooks and triggers.\u003c\/li\u003e\n\u003cli\u003eA delivery address\u003cspan\u003e \u003c\/span\u003e\u003cb\u003ecan no longer be changed\u003c\/b\u003e\u003cspan\u003e \u003c\/span\u003eonce the label is generated: the label must be voided and another bought.\u003c\/li\u003e\n\u003cli\u003eV1 only knows stores, marketplaces and warehouses; manifests and batches are V2. A V2 key on a V1 configuration answers\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003e401\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eto every call, and does not say why — so the connection screen states the rule instead of burying it in a manual.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch2\u003ePutting it to work\u003c\/h2\u003e\n\u003col\u003e\n\u003cli\u003eActivate the module. It starts in\u003cspan\u003e \u003c\/span\u003e\u003cb\u003esimulation mode\u003c\/b\u003e, with a complete demo set already in place: nothing reaches ShipStation yet.\u003c\/li\u003e\n\u003cli\u003eGrant the permissions to your user groups. Without a permission row, the left-menu entries stay greyed.\u003c\/li\u003e\n\u003cli\u003eEnter your key and secret on an account, pick the API version, and\u003cspan\u003e \u003c\/span\u003e\u003cb\u003etest the connection\u003c\/b\u003e.\u003c\/li\u003e\n\u003cli\u003eRefresh the metadata: marketplaces, stores, warehouses, carriers, then services and packages. The screen says how many calls each refresh costs.\u003c\/li\u003e\n\u003cli\u003eMap your warehouses and your products. Confirm the automatic proposals.\u003c\/li\u003e\n\u003cli\u003eUncheck simulation mode. From then on, the queues really talk to ShipStation, within the quota.\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003ch2\u003eTechnical summary\u003c\/h2\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eModule number\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e1572000\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eDolibarr\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e16 to 23\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003ePHP\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e7.1 to 8.4\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eTables\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e34, prefix\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003ellx_shipstationconnector_\u003c\/code\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003ePermissions\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e36 in 14 groups\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eMenu\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e1 top entry, 11 left groups, 44 entries\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eConstants\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e31\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eScheduled jobs\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e4\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eReports\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e54 in 10 families\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eREST API\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e42 routes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eLanguages\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003eEnglish, French, German, Italian, Spanish\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eShipStation V1\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e\n\u003ccode\u003essapi.shipstation.com\u003c\/code\u003e, HTTP Basic,\u003cspan\u003e \u003c\/span\u003e\u003cb\u003e40 req\/min\u003c\/b\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eShipStation V2\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e\n\u003ccode\u003eapi.shipstation.com\/v2\u003c\/code\u003e, API-Key header, 200 req\/min\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eTests\u003c\/b\u003e\u003c\/td\u003e\n\u003ctd\u003e1 214 assertions, no failure\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cdiv class=\"sig\"\u003eDeveloped by DoliResource\u003cbr\u003eCopyright © DoliResource\u003cbr\u003eWebsite :\u003cspan\u003e \u003c\/span\u003e\u003ca href=\"https:\/\/www.doliresource.com\"\u003ewww.doliresource.com\u003c\/a\u003e\n\u003c\/div\u003e","brand":"Dolibarr Resources","offers":[{"title":"Default Title","offer_id":54737841881406,"sku":null,"price":199.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0986\/4174\/0094\/files\/Image_IA_Canva_24_oct._2026_13_41_57.png?v=1792845763","url":"https:\/\/doliresource.com\/products\/shipstation-connector-pro","provider":"DoliResource","version":"1.0","type":"link"}