The ShipStation extension helps you get your orders from WooCommerce with ShipStation and expedite the shipping process as part of your order fulfillment steps.
ShipStation is a web-based shipping service that streamlines the order fulfillment process for online retailers, handling everything from order import and batch label creation to customer communication. ShipStation is a great fit for businesses with any number of users or locations.
Installation
↑ Back to topTo start using a product from WooCommerce.com, you can use the โAdd to storeโ functionality on the order confirmation page or the My subscriptions section in your account.
- Navigate to My subscriptions.
- Find the Add to store button next to the product youโre planning to install.
- Follow the instructions on the screen, and the product will be automatically added to your store.
Alternative options and more information at:
Managing WooCommerce.com subscriptions.
Requirements
↑ Back to topTo use this integration, you must have:
- A ShipStation monthly plan. More info at ShipStation.com.
- A REST API key with Read/Write permissions, created on the WooCommerce > Settings > Advanced > REST API page of your site.
Setup and Configuration
↑ Back to topAfter installing and activating the ShipStation extension, you can view your Authentication Key and configure the settings on the WooCommerce > Settings > Integration > ShipStation page.

Authentication Key
↑ Back to topThe Authentication Key is the first thing you’ll see on the ShipStation extension’s settings page, which is automatically generated for you and unique to your store. This is one of the required keys that you’ll need when connecting your store in your ShipStation.com account dashboard.
Export Order Statuses
↑ Back to topSelect the WooCommerce order statuses that you want sent to ShipStation. We recommend sending only orders that have been paid for; those would be the following statuses: Processing, Completed, and possibly On-Hold/Cancelled.
Shipped Order Status
↑ Back to topNext, set the order status an order should be changed to once marked shipped in ShipStation. We recommend Completed, as that usually means the order requires no further action.
Gift
↑ Back to topOur integration can sync gift information from WooCommerce directly to ShipStation’s native gift features, eliminating the need for manual workarounds and allowing for streamlined gift order fulfillment.
Enable Gift Order Functionality
To activate this feature, navigate to WooCommerce > Settings > Integration > ShipStation and check the box for Enable gift order option at checkout.
When this setting is enabled, new options will appear on your store’s checkout page. If disabled, the checkout process remains unchanged.
Once an order is placed, the gift status and message will be displayed in the shipping details section of the WooCommerce order details page. This provides visibility for you and your staff.
This message can’t be edited after the order is placed. To ensure data consistency between WooCommerce and ShipStation, the gift status and message are not editable in WooCommerce after the order is submitted. If a change is required, it must be made directly within the order in your ShipStation account.
The Customer Experience

Once enabled, customers will see a new checkbox on the checkout page titled โMark order as a gift.โ
If a customer selects this checkbox, a text field will appear, allowing them to enter a gift message. By default, this message is limited to 255 characters. This limit can be customized via a filter below.
Customizing the Gift Message Character Limit
By default, the gift message field at checkout is limited to 255 characters. While ShipStation’s API supports up to 1,000 characters, you can adjust this limit using the woocommerce_shipstation_gift_message_max_length filter.
The following snippet demonstrates how to increase the character limit to 500.
<?php
// Add this code to your theme's functions.php file or a custom plugin.
add_filter( 'woocommerce_shipstation_gift_message_max_length', 'wc_shipstation_custom_gift_message_limit' );
/**
* Set custom character limit for ShipStation gift messages.
*
* @param int $limit The current character limit.
* @return int The new character limit.
*/
function wc_shipstation_custom_gift_message_limit( $limit ) {
// New character limit. Can be any value between 0 and 1000.
return 500;
}
How Gift Data Syncs to ShipStation
When a customer places an order marked as a gift, the plugin saves the gift status and message to the WooCommerce order. During the sync, this data is sent directly to ShipStation’s dedicated <Gift> and <GiftMessage> fields.
In ShipStation, these orders will be clearly identified with a gift icon in the Orders grid and in the Order Details screen. The message will populate the โGift Messageโ field.
This allows you to use ShipStation’s powerful features, such as Automation Rules, to create custom packing slips that hide prices, apply specific gift-wrapping instructions, or easily filter for all gift orders. For more ideas on handling gift orders, see ShipStation’s Help Center article.
Logging
↑ Back to topIf you’ve run into any issues, enable logging here. This can be helpful for troubleshooting things. You can view the logs at WooCommerce > System Status > Logs. Then in the logs dropdown, find the appropriate ShipStation log files.
Finally, select Save changes.
REST API Keys
↑ Back to topIn the past, the ShipStation connection only required the Authentication Key and the store URL. ShipStation now connects via the REST API, so you will also need a Consumer Key and Consumer Secret when connecting your site in your ShipStation.com account dashboard.
Generating the Consumer Key and Consumer Secret
↑ Back to topTo generate the Consumer Key and Consumer Secret, you will need to create an API key on the WooCommerce > Settings > Advanced > REST API page in your site admin.
If you haven’t created any REST API keys yet, you can select the โCreate an API keyโ button in the middle of the screen. If you have created REST API keys already, those keys will be shown on this page. To create a new REST API key, select the โAdd keyโ button in the top-left:

On the โKey detailsโ page, enter a Description (ex: โShipStation REST API Keyโ), choose the user account that will have ownership of this key, and select โRead/Writeโ in the Permissions dropdown. Then click the โGenerate API keyโ button.
After clicking the โGenerate API keyโ button, you will be provided with the automatically generated Consumer Key and Consumer Secret. Make sure to copy and save these keys in a secure location, as you will need this information when connecting the store on ShipStation.com, and the secret key will be hidden once you leave this page.

Connect to ShipStation
↑ Back to topAfter setting up the ShipStation extension and generating the REST API Consumer Key and Consumer Secret on your site, the next step is to connect your WooCommerce store to your ShipStation.com account. If you don’t have a ShipStation account yet, you can sign up by clicking the โConnect to ShipStation.comโ button below.
After signing up, you’ll be prompted to pick a Selling Channel to connect to your WooCommerce store. If youโre an existing ShipStation user, you can find this page by logging into your account on ShipStation.com and going to My Profile > Selling Channels and clicking Connect a Store. Select the WooCommerce store connection option to continue.

After selecting the WooCommerce store connection, you will be prompted to enter the following info:
- Authentication Key: This is the unique key shown on the WooCommerce > Settings > Integration > ShipStation page of your site admin.
- Consumer Key: This is part of the REST API key that was created on the WooCommerce > Settings > Advanced > REST API page of your site admin. This key begins with
ck_. - Consumer Secret: This is part of the REST API key that was created on the WooCommerce > Settings > Advanced > REST API page of your site admin. This key begins with
cs_. - URL to Custom XML Page: This is the URL for your site (ex:
https://www.yoursite.com).
Once you have entered all of that info, click the โTest Connectionโ link in the bottom left to test the connection. Then click the โConnectโ button to finalize the connection.

Shipped Orders
↑ Back to top
When marking an order shipped via ShipStation there is an important checkbox to select. Be sure to select/enable the โNotify Marketplace?โ checkbox. This is required so ShipStation notifies your store, which then does the following in WooCommerce:
- Changes the order status to your Shipped Order Status, which was set under the setting covered above
- Adds a customer note with carrier and tracking information.

If you are using our WooCommerce Shipment Tracking extension, then the tracking information is added using the extension instead.
Export Custom Field Data to ShipStation
↑ Back to topScope of support:
We are unable to provide support for customizations under ourย Support Policy. If you need to customize a snippet or extend its functionality, we recommend working with a Woo Agency Partner or a WooCommerce developer on Codeable.
ShipStation supports up to three custom fields that may contain extra data you want sent to the ShipStation orders section.
Custom Field 1 contains coupon codes used in an order. Enabled by default.
Custom Fields 2 and 3 can be customized with a snippet in which you define the name of the metadata you want to export. Example:
<?php
// Add this code to your theme's functions.php file or a custom plugin.
/**
* Set custom field 2 for ShipStation export.
*
* @return string The meta key for custom field 2.
*/
add_filter( 'woocommerce_shipstation_export_custom_field_2', 'shipstation_custom_field_2' );
function shipstation_custom_field_2() {
return '_meta_key'; // Replace this with the key of your custom field.
}
/**
* Set custom field 3 for ShipStation export.
*
* @return string The meta key for custom field 3.
*/
add_filter( 'woocommerce_shipstation_export_custom_field_3', 'shipstation_custom_field_3' );
function shipstation_custom_field_3() {
return '_meta_key_2'; // Replace this with the key of your custom field.
}
We are unable to provide support for customizations under our Support Policy. If you are unfamiliar with code and resolving potential conflicts, select a WooExpert or developer for assistance.
Usage
↑ Back to topHow ShipStation works with your ShipStation account:
- Customer places an order on your WooCommerce shop that requires shipping.
- ShipStation.com makes an API call to the merchantโs store to the extension’s endpoint.
- The extension looks at the setup and generates an XML output response to the ShipStation API. This XML includes order details, items, customer information, and, if enabled, the order’s gift status and gift message. ShipStation imports those orders into their system.
- Merchantโs shipping person/people go into ShipStation.com, sees orders that need shipment, and generates shipping labels (aka: “ships them”).
- Once a label is generated, ShipStation.com sends a notification to the merchantโs store via the extensionโs endpoint.
- The extension updates the order to Shipped Order status (typically โCompletedโ) and stores the shipping info within the order.
Troubleshooting
↑ Back to topOrders are not imported into ShipStation
↑ Back to topCaching plugins providing file minification can generate this kind of issue. Make sure that you disable file minification and try to import orders again.
Orders are not importing into ShipStation because requests are being blocked
↑ Back to topIf orders are not importing into ShipStation and your logs show an HTML response, CAPTCHA page, or redirect instead of the expected API response, your host or a security layer may be blocking ShipStationโs requests.
This can happen when a firewall, security plugin, CDN protection, or host-level bot protection treats requests to the WooCommerce REST API as suspicious traffic. For example, this has been seen on some sites hosted with SiteGround, where anti-bot protection may intercept requests to /wp-json/wc-shipstation/ endpoints and return a CAPTCHA challenge instead of the expected API response.
Resolution:
- Check whether your site is using a security plugin, firewall, CDN security feature, or host-level bot protection.
- Review your server or security logs for blocked requests to
/wp-json/wc-shipstation/. - If you use SiteGround, check whether its security or anti-bot protection is challenging requests to these endpoints.
- Ask your host or security provider to exclude the ShipStation REST API endpoints from bot protection or CAPTCHA checks.
- Coordinate with your host to whitelist relevant IPs (e.g., 35.173.55.253) at the server level.
- Test the connection again in ShipStation after making these changes.
If the issue continues, contact your hosting provider and ShipStation support so they can help confirm which requests are being blocked.
Orders are not exporting to ShipStation
↑ Back to topIf orders are in an Export Status but are not being exported to ShipStation (i.e., no โOrder has been exported to ShipStationโ note is added to the order and the ShipStation logs show โExported 0 ordersโ), check the connection in your ShipStation.com dashboard.
To achieve this, log in to ShipStation.com and go to My Profile > Selling Channels. Click the ... icon in the โActionsโ column and choose โEdit Connectionโ (as seen in the screenshot below). Make sure all the connection fields are filled out and select โTest Connection.โ If the Consumer Key and Consumer Secret fields are empty, follow the instructions to generate those REST API keys and add them to those respective fields.

Testing the XML Export
↑ Back to topThe XML feed for ShipStation can be tested at a specific URL. It’s formatted as per this example below that looks at orders from 1 Feb 2022 until 30 April 2022. https://example.com/?wc-api=wc_shipstation&auth_key=YOUR_AUTH_KEY&action=export&start_date=02/01/2022%2000:05&end_date=04/30/2022%2021:00
Be sure to replace example.com with your site’s URL and YOUR_AUTH_KEY with your authentication key. The link should then load an XML view of orders from your store, which is what ShipStation reads.
Cloudflare or firewall blocking ShipStation requests (500 Internal Server Error)
↑ Back to topIf ShipStation returns an Internal Server Error (HTTP 500) when importing orders or posting shipment updates, your store’s firewall โ most commonly Cloudflare โ may be blocking ShipStation’s requests before they reach WooCommerce.
This can affect:
- Order importsย โ ShipStation cannot pull new orders from your store.
- Shipment notificationsย โ ShipStation cannot post tracking numbers back to WooCommerce, so orders stay in a “Processing” status instead of updating to “Completed.”
How ShipStation communicates with your store
ShipStation uses two types of requests to sync with WooCommerce:
GET requests are used to import orders from your store. These are sent to /wp-json/wc-shipstation/v1/orders. In your Cloudflare Security Analytics, GET traffic from ShipStation looks like this:

POST requests are used to send shipment tracking data back to WooCommerce (also known as ShipNotify). These are sent to /wp-json/wc-shipstation/v1/orders/shipments. In Cloudflare, POST traffic from ShipStation looks like this:

Both request types share these identifiers, which you can use to locate ShipStation traffic in any firewall log:
| Field | Value |
|---|---|
| User-Agent | shipstation-order-source/1.0 |
| ASN | 14618 (Amazon AWS) |
| Country | United States |
Confirming Cloudflare is blocking ShipStation
If your store uses Cloudflare, follow these steps to check whether it is intercepting ShipStation’s requests:
- Log in to yourย Cloudflare dashboard.
- Select your store’s domain.
- Go toย Security โ Analyticsย and click theย Trafficย tab.
- Use the filter bar at the top of the traffic table to narrow results by path. Filter for requests matching any of these:
/wp-json/wc-shipstation/v1/orders/wp-json/wc-shipstation/v1/orders/shipments/?wc-api=wc_shipstation

- Click on any matching request to expand its details. The key field to check is Mitigation:
- “Not mitigated”ย means Cloudflare is passing the request through normally. The issue is elsewhere.
- Block, Challenge, JS Challenge, or Managed Challengeย means Cloudflare is intercepting the request โ this is your problem.
200. If it shows403,429, or500while the origin would normally return200, the edge layer is blocking the request.

Fixing the issue in Cloudflare
Option A: Create a WAF custom rule (recommended)
This is the most precise fix. It tells Cloudflare to skip security checks only for ShipStation’s known request pattern, without affecting the rest of your site’s protection.
- Go toย Security โ Security rules.
- Clickย Create ruleย and chooseย Custom rules.

- Give the rule a name, for example:ย
Allow ShipStation. - Clickย Edit expressionย and enter the following:
(http.user_agent contains "shipstation-order-source") or (ip.geoip.asnum eq 14618 and http.request.uri.path contains "wc-shipstation")
- Set theย Actionย toย Skip โ All remaining custom rules.
- Clickย Save and deploy.
When configured correctly, the completed rule should look like this:

Note: The ASN condition (
14618) alone is broad โ it covers all of Amazon AWS. Combining it with the path condition keeps the rule tight so it only affects ShipStation endpoints on your store.
Option B: Disable Bot Fight Mode for the API path
If you have Bot Fight Mode or Super Bot Fight Mode enabled, it may be challenging ShipStation’s automated requests.
- Go toย Security โ Bots.
- Check whetherย Bot Fight Modeย is enabled.
- Bot Fight Mode cannot be disabled per-path from the Cloudflare UI. The cleanest approach is to use a WAF Skip rule (Option A above) to exempt the ShipStation paths. Alternatively, you can disable Bot Fight Mode entirely, though this affects all traffic to your site.
Option C: IP allowlist
ShipStation runs on Amazon AWS infrastructure. Because AWS IPs can change over time, this approach is less reliable than the User-Agent + path method above. If you still prefer to allowlist by IP:
- Go toย Security โ WAF โ Custom rules.
- Create a rule matching the specific ShipStation IPs visible in your Security Analytics logs.
- Set the action toย Skip.
Fixing the issue in other WAFs
The same principle applies to any WAF or security plugin (for example, Sucuri, Wordfence, NinjaFirewall, or server-level ModSecurity):
- Allowlist by User-Agent:ย
shipstation-order-source/1.0 - Allowlist by path:ย
/wp-json/wc-shipstation/v1/ย andย/?wc-api=wc_shipstation - Allowlist by ASN:ย
AS14618ย (Amazon AWS)
Consult your WAF or security plugin’s documentation for the exact steps to create an allowlist or exception rule.
Verifying the fix
After applying the rule:
- In ShipStation, trigger a manual sync or re-import.
- Go back toย Cloudflare โ Security โ Analytics โ Trafficย and confirm that ShipStation requests now showย “Not mitigated”ย and anย Edge status code of 200.
- In WooCommerce, check that new orders appear in ShipStation and that shipped orders update to “Completed” in your store.
If requests are still being blocked after adding the rule, check whether Cloudflare’s DDoS protection rules are also active โ these are separate from WAF custom rules and may need their own override.
Frequently Asked Questions
↑ Back to topDoes ShipStation provide real-time shipping quotes that can be used at checkout?
No. Store owners need a real-time shipping quote extension such as USPS, FedEx, UPS, etc., or have an alternate way to show shipping quotes (e.g., the built-in Flat rate method).
Does ShipStation send data when not being used (e.g., Free Shipping)?
↑ Back to topYes, there isnโt conditional exporting. If the data is there, we export it!
Why am I getting an โUnable to connect to the remote serverโ error?
↑ Back to topCheck if you have security plugins activeโsecurity plugins usually restrict the accessibility of endpoints/URLs on a WP online store. The security plugin may not be allowing ShipStation to connect to the server. If it is, disable the security plugin and test again.
If the error is still not resolved, then please check with your host if they have a firewall enabled. If they do, please ask them to disable that and check again. Moreover, make sure to whitelist ShipStation IPs.
Why do multiple line items in an order on the WooCommerce side get combined when they reach ShipStation?
↑ Back to topThis is most likely because unique Product SKUs have not been configured for each product and variation in the store. To ensure that order line items show up correctly in ShipStation, we recommend assigning a unique SKU to each product as well as each variation within a product.
Why donโt orders show as Completed in WooCommerce after being Shipped in ShipStation?
↑ Back to topMost likely causes are:
- A misconfigurationโCheck WooCommerce > Integrations > ShipStation to ensure that โShipped Order Statusโ is set to Completed.
- A conflict with security plugins usually restricts the accessibility of endpoints/URLs on your store. Although orders may be exporting fine, the security plugin you use may not be allowing ShipStation to POST shipping information to the server. If you have โShippedโ an Order in ShipStation (created a label or used โMark as shippedโ), but the order is not being updated to Completed, check to see if your site is using a security plugin. If it is, disable the security plugin and test again. If disabling the plugin resolves the issue, see if it can whitelist your endpoints.
If the above two items do not resolve the issue, first contact ShipStation.com support to request further information on the error their system is seeing when communicating with your site.
Once ShipStation has responded with the technical information, share the information with WooCommerce Support for further investigation.
Using a custom order status with ShipStation
↑ Back to topShipStation supports custom order statuses, but these must be set in your ShipStation account. You can find this in your Account > Store Setup > Your Order Statuses. If you add a custom order status, then you will need to use the slug (case insensitive) to match it to a ShipStation order status. You can use the WooCommerce Order Status Manager for creating a custom order status in WooCommerce.

How to change the Authentication Key
↑ Back to topTo change the Authentication Key, please go to your WordPress options page here: https://yoursitename.com/wp-admin/options.php and look for a field that’s called woocommerce_shipstation_auth_key.

Delete the value of the field and click save. This allows a new Authentication Key to be generated, which you can find here: WooCommerce > Settings > Integration > ShipStation
On multisite installations, the woocommerce_shipstation_auth_key data can be deleted in the store settings for each site. Doing this can help resolve issues related to non-unique key generation problems.
SSL/TLS Certificates
↑ Back to topShipStation only works with SSL certificates up to TLS v1.2. TLS v1.3 cannot be used at this time, but this could change in the future.
Are Product Dimensions included in the order import to ShipStation?
↑ Back to topThe XML data used for the order imports includes product weights but not dimensions. If you would like to have product dimensions included as well, please do add your vote to the Feature Request here.
Is ShipStation compatible with Sequential Order Numbers plugins?
↑ Back to topCurrently, the Sequential Order Numbers plugins from SkyVerge and WebToffee are supported, but some other plugins may work as well. However, if you’re using a different Sequential Order Numbers plugin that isn’t compatible, you might encounter issues with order statuses not updating due to missing XML data in the ShipNotify request. If the custom order number is being used instead of the actual order ID. When this occurs, the logs will show the Missing ShipNotify XML input error message.
For developers working on compatibility: When the ShipNotify request is received, the โrealโ order number is needed to be able to update the correct order. The plugin uses the function get_order_id and the order number can be adjusted by using a filter, like the example pictured below:
<?php
// Force Shipstation to use Order ID - https://wordpress.org/support/topic/get-the-original-post-id/
add_filter( 'woocommerce_shipstation_get_order_id', function( $order_id ) {
global $wpdb;
/**
* Fetch the real WooCommerce order ID from custom order number.
* Handles sequential order number plugins that store custom numbers in postmeta.
*/
$real_order_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %s",
'_alg_wc_full_custom_order_number',
$order_id
)
);
// Use found order ID, otherwise fallback to the original.
return ! empty( $real_order_id ) ? absint( $real_order_id ) : absint( $order_id );
} );
Questions and support
↑ Back to topDo you still have questions and need assistance?
- Get in touch with a Happiness Engineer via our Help Desk. We provide support for extensions developed by and/or sold on WooCommerce.com, and Jetpack/WordPress.com customers.
- If you are not a customer, we recommend finding help in theย WooCommerce support forumย or hiring a Woo Agency Partner. These are trusted agencies with a proven track record of building highly customized, scalable online stores.ย Learn more about Woo Agency Partners.
