# Get the authenticated user. Source: https://docs.smartsend.io/api-reference/account/get-the-authenticated-user /openapi-v1.json get /v1/me Returns the currently authenticated user along with the websites (teams) the user belongs to. # Get website info. Source: https://docs.smartsend.io/api-reference/account/get-website-info /openapi-v1.json get /v1/website/{team}/info This endpoint is used to get details about a given website. # Get specific carrier agent in country. Source: https://docs.smartsend.io/api-reference/agents/get-specific-carrier-agent-in-country /openapi-v1.json get /v1/website/{team}/agents/carrier/{carrier}/country/{country}/agentno/{agentNo} This endpoint is used to get a single agent for a given carrier in a given country by the carriers own agent number. # List agents within a geospatial area. Source: https://docs.smartsend.io/api-reference/agents/list-agents-within-a-geospatial-area /openapi-v1.json get /v1/website/{team}/agents/carrier/{carrier}/country/{country}/area/latitude/min/{minLatitude}/max/{maxLatitude}/longitude/min/{minLongitude}/max/{maxLongitude} List carrier agents in country limited by a geospatial area. # List carrier agents in country. Source: https://docs.smartsend.io/api-reference/agents/list-carrier-agents-in-country /openapi-v1.json get /v1/website/{team}/agents/carrier/{carrier}/country/{country} This endpoint is used to index all agents for a given carrier in a given country. # List carrier agents in postal code. Source: https://docs.smartsend.io/api-reference/agents/list-carrier-agents-in-postal-code /openapi-v1.json get /v1/website/{team}/agents/carrier/{carrier}/country/{country}/postalcode/{postalCode} This endpoint is used to index all agents for a given carrier in a given postal code. # List carrier agents on given street. Source: https://docs.smartsend.io/api-reference/agents/list-carrier-agents-on-given-street /openapi-v1.json get /v1/website/{team}/agents/carrier/{carrier}/country/{country}/postalcode/{postalCode}/street/{street} This endpoint is used to index all agents for a given carrier on a specific street. # Authentication Source: https://docs.smartsend.io/api-reference/authentication Authenticate with the Smart Send REST API using bearer tokens. The Smart Send API uses bearer tokens for authentication. Every request must include a valid API token in the `Authorization` header. ## Creating an API token To create an API token, start by logging into the Smart Send platform . Go to **API Tokens**. In the **Create API Token** section, fill in a name. The name is only used for your internal classification and is not visible outside your team. Create API Token form with token name field Click the **Create** button. A modal opens displaying the newly generated API token. Modal displaying the newly generated API token The API token is only shown once. Copy it and store it somewhere safe immediately. If you lose it, you will need to delete it and create a new one. ## Using your API token Include your API token in the `Authorization` header of every request, prefixed with `Bearer`: ```bash theme={null} curl https://app.smartsend.io/api/v2/agents/dk \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Accept: application/json" ``` Treat API tokens like passwords. Never commit them to version control, embed them in client-side code, or share them in support tickets. Use environment variables or a secrets manager to keep them safe. ## Revoking an API token If a token is no longer needed or may have been exposed, revoke it immediately. Go to **API Tokens**. In the **Manage API Tokens** section, find the token you want to delete. List of API tokens with delete option Click the **Delete** button next to the token and confirm the action. Confirmation dialog for deleting an API token Deleting an API token is irreversible and immediately breaks any integration that is still using it. # Add shipments to batch Source: https://docs.smartsend.io/api-reference/booking-batches/add-shipments-to-batch /openapi-v2beta.json post /beta/teams/{teamUuid}/booking-batches/{batch}/shipments Validates and adds new shipments to an open booking batch. # Create a booking batch Source: https://docs.smartsend.io/api-reference/booking-batches/create-a-booking-batch /openapi-v2beta.json post /beta/teams/{teamUuid}/booking-batches Creates an empty booking batch with an optional callback for progress updates. # Get booking batch Source: https://docs.smartsend.io/api-reference/booking-batches/get-booking-batch /openapi-v2beta.json get /beta/teams/{teamUuid}/booking-batches/{batch} Returns a booking batch's status and progress. # List booking batches Source: https://docs.smartsend.io/api-reference/booking-batches/list-booking-batches /openapi-v2beta.json get /beta/teams/{teamUuid}/booking-batches Lists the team's booking batches, newest first. # List shipments in a batch Source: https://docs.smartsend.io/api-reference/booking-batches/list-shipments-in-a-batch /openapi-v2beta.json get /beta/teams/{teamUuid}/booking-batches/{batch}/shipments Lists shipments in a booking batch in the order they were added. # Combine labels for multiple shipments Source: https://docs.smartsend.io/api-reference/bookings/combine-labels-for-multiple-shipments /openapi-v1.json post /v1/website/{team}/shipments/labels/combine This endpoint is used to combine labels for multiple shipments into one PDF file # Store a new shipment and book a label Source: https://docs.smartsend.io/api-reference/bookings/store-a-new-shipment-and-book-a-label /openapi-v1.json post /v1/website/{team}/shipments/labels This endpoint is used to create a new shipment and book a label in one request # List all addons Source: https://docs.smartsend.io/api-reference/carrier-catalog/list-all-addons /openapi-v2beta.json get /v2/addons Lists the global addon catalogue with codes, names and descriptions. # List all carriers Source: https://docs.smartsend.io/api-reference/carrier-catalog/list-all-carriers /openapi-v2beta.json get /v2/carriers Lists the global carrier catalogue with services, addons and branding. # List closest agents relative to a given address. Source: https://docs.smartsend.io/api-reference/closest-agents/list-closest-agents-relative-to-a-given-address /openapi-v1.json get /v1/website/{team}/agents/closest/carrier/{carrier}/country/{country}/postalcode/{postalCode}/city/{city}/street/{street} This endpoint is used to list closest agents for a given carrier to an address specified by country, postalcode, city and street. # List closest agents relative to a given geospatial point. Source: https://docs.smartsend.io/api-reference/closest-agents/list-closest-agents-relative-to-a-given-geospatial-point /openapi-v1.json get /v1/website/{team}/agents/closest/carrier/{carrier}/country/{country}/coordinates/latitude/{latitude}/longitude/{longitude} This endpoint is used to list closest agents for a given carrier to an given geospatial point. # List closest agents relative to a postal code. Source: https://docs.smartsend.io/api-reference/closest-agents/list-closest-agents-relative-to-a-postal-code /openapi-v1.json get /v1/website/{team}/agents/closest/carrier/{carrier}/country/{country}/postalcode/{postalCode} This endpoint is used to list closest agents for a given carrier to an address specified by country and postalcode. # List closest agents relative to a postal code and city. Source: https://docs.smartsend.io/api-reference/closest-agents/list-closest-agents-relative-to-a-postal-code-and-city /openapi-v1.json get /v1/website/{team}/agents/closest/carrier/{carrier}/country/{country}/postalcode/{postalCode}/city/{city} This endpoint is used to list closest agents for a given carrier to an address specified by country, postalcode and city. # List closest agents relative to a postal code and street. Source: https://docs.smartsend.io/api-reference/closest-agents/list-closest-agents-relative-to-a-postal-code-and-street /openapi-v1.json get /v1/website/{team}/agents/closest/carrier/{carrier}/country/{country}/postalcode/{postalCode}/street/{street} This endpoint is used to list closest agents for a given carrier to an address specified by country, postalcode and street. # Debugging Source: https://docs.smartsend.io/api-reference/debugging Use request headers to trace and debug API calls. When something goes wrong, the fastest path to a fix is being able to pinpoint the exact request that failed. The Smart Send API supports a small set of optional headers that make debugging dramatically easier — both for you and for our support team. ## User-Agent We recommend including a descriptive `User-Agent` header with every API request. This helps us identify your integration and is invaluable when debugging issues on your behalf. Follow the `Product/Version (Comments)` pattern established by [RFC 7231](https://datatracker.ietf.org/doc/html/rfc7231#section-5.5.3). Include your application name and version, along with any relevant platform details in the comments. ```bash Example theme={null} User-Agent: my-shipping-app/1.0.0 (MyPlatform/2.3.1; PHP/8.2) ``` For reference, our own WooCommerce plugin sends the following header: ```bash WooCommerce plugin example theme={null} User-Agent: smart-send-logistics/8.1.0 (WooCommerce/8.5.0; WordPress/6.4.2; PHP/8.1) ``` Without a descriptive `User-Agent`, your requests appear as anonymous traffic, making it much harder for our support team to trace and resolve issues. ## Request-ID The `Request-ID` header is the single most useful tool you have for debugging Smart Send API calls. It is an identifier that you set on each request, and the API echoes the same value back in the response `Request-ID` header. ```bash Example theme={null} Request-ID: order-4521-book-a1b2c3 ``` We recommend the following pattern: Generate a unique identifier on your end before making the request. A UUID works well, but a descriptive key tied to your business logic (for example, an order number combined with the action) is often more useful when you later need to find it in your own logs. Attach the identifier to the request using the `Request-ID` header. The Smart Send API returns the same value in the response `Request-ID` header, so you can verify it was received correctly. Include the `Request-ID` in your own application logs alongside any other context about the request. That way, if anything goes wrong, you can look up the call in your logs and forward the `Request-ID` to Smart Send support. The `Request-ID` is included in our internal logs, so when you contact support about a specific request, providing the `Request-ID` lets us trace it through our systems quickly and pinpoint exactly what happened. Use any string up to 128 characters containing letters, numbers, dots, hyphens, or underscores. # Get delivery options Source: https://docs.smartsend.io/api-reference/delivery-options/get-delivery-options /openapi-v2beta.json post /v2/teams/{teamUuid}/delivery-options Finds available services, addons, estimated costs and delivery windows for a shipment. # Idempotency Source: https://docs.smartsend.io/api-reference/idempotency Safely retry API requests without creating duplicate side effects. Idempotency is a new feature only available in the upcoming API that is currently in beta. The behavior described below is subject to change until the API is released in *General Availability*. Network errors, timeouts, and other transient failures can leave you uncertain whether a request actually reached Smart Send. Idempotency lets you retry such requests safely, without risk of booking the same shipment twice or creating duplicate resources. ## How idempotency works Idempotency is opt-in. To enable it, include an `Idempotency-Key` header on a write request: ```bash Example theme={null} Idempotency-Key: order-4521_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 ``` When the API receives a key it has not seen before, it processes the request normally and stores the response against that key. If you retry the same API request with the **same key and the same payload** within 24 hours, the API returns the stored response instead of running the operation again. The retry is therefore safe: eg. a shipment is booked once, even if you send the request twice. Requests sent **without** an `Idempotency-Key` header are not deduplicated. Each one is processed independently. Idempotency applies to write operations (`POST` and `DELETE`). Read operations (`GET`) are already safe to retry, so they ignore the header. When a stored response is replayed, the API includes an `Idempotency-Replayed: true` response header so you can tell a replay apart from a freshly executed request. ## Creating an idempotency key The key is a string that uniquely identifies a single logical operation. It must meet these requirements: | Requirement | Value | | - | - | | Length | 16–128 characters | | Allowed characters | Letters, digits, `.`, `_`, `-` | | Case | Case-sensitive (`ABC` and `abc` are different keys) | | Scope | Unique per operation, per client | A random UUID v4 works, but it forces you to generate the key up front and store it alongside the order so you can reuse the exact same value on a retry. A simpler approach is to **derive the key deterministically** from data you already have, such as the order ID combined with the request payload. Because the same inputs always produce the same key, a retry recomputes the identical key without you having to store anything: ```php PHP theme={null} // $orderId is your own order reference; $payload is the exact body you will send. $key = $orderId . '_' . hash('sha256', json_encode($payload)); // $key is your order reference followed by a 64-character hex hash, e.g. // "order-4521_9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" ``` ```javascript JavaScript theme={null} import { createHash } from 'node:crypto'; // orderId is your own order reference; payload is the exact body you will send. const hash = createHash('sha256').update(JSON.stringify(payload)).digest('hex'); const key = `${orderId}_${hash}`; ``` Send the derived value in the `Idempotency-Key` header. If the request fails and you retry, recompute the key from the same order and payload, and the API recognises it as the same operation. Including the payload in the key means that a different payload produces a different key, which the API treats as a new operation. If you instead key on a stable identifier alone (for example just the order ID), reusing it with a changed payload is reported as a conflict — see below. ## How repeated requests are handled | Situation | Result | | - | - | | New key | The request is processed normally and the response is stored. | | Same key, same payload, original finished | The stored response (status code and body) is returned without re-executing the operation. The response includes the header `Idempotency-Replayed: true`. | | Same key, **different** payload | `422 Unprocessable Entity`. The key is already associated with a different request. | | Same key, original still in progress | `409 Conflict` with a `Retry-After` header indicating how many seconds to wait before retrying. | Keys are scoped per client and expire automatically 24 hours after first use. After that, the same key can be used again for a new operation. A request that fails validation is not stored against the key. You can correct the payload and retry with the same key. ## Conflicts and errors If you receive a `409 Conflict`, the original request is still being processed. Wait for the number of seconds given in the `Retry-After` response header, then retry with the same key: ```bash Example response theme={null} HTTP/1.1 409 Conflict Retry-After: 1 ``` A `422 Unprocessable Entity` means the key has already been used for a request with a **different payload** which is considered wrong. Either reuse the original payload, or generate a new key for the new operation. # Introduction Source: https://docs.smartsend.io/api-reference/introduction Learn how to use the Smart Send REST API Use the Smart Send API to automate every aspect of your shipping workflows, from booking shipments to tracking and returns. The API powers all official Smart Send integrations, so anything our Shopify and WooCommerce apps can do, you can do too. If you are looking for a ready-made solution for your webshop, explore our e-commerce integrations instead: ## Base URL All API requests are made against the following base URL: ```bash theme={null} https://app.smartsend.io/api ``` ## OpenAPI specification The full API is described in machine-readable OpenAPI specifications. Use them to generate client libraries, import the API into tools like Postman, or explore the available endpoints and schemas. Download the OpenAPI spec for the stable v1 API. Download the OpenAPI spec for v2 and beta endpoints. ## Integrations The Smart Send API is the same API that powers our official integrations. If you are building on top of an existing platform, you can often save time by starting from one of our open-source integrations rather than calling the API directly: ## Authentication The Smart Send API uses bearer tokens for authentication. Generate a token in the Smart Send platform and include it in the `Authorization` header of every request. Learn how to generate, use, and revoke API tokens. ## Make your first request Once you have an API token, you can verify your setup with a simple request. The example below lists the carrier agents available in Denmark: ```bash theme={null} curl https://app.smartsend.io/api/v2/agents/dk \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Accept: application/json" ``` If your token is valid, the API responds with a JSON payload describing the available carrier agents. From here, you can start exploring the rest of the API. ## Next steps Generate, rotate, and revoke API tokens. Use headers like `User-Agent` and `Request-ID` to trace requests. Browse the API sidebar to see available resources and request schemas. # Localization Source: https://docs.smartsend.io/api-reference/localization Translate customer-facing strings in API responses using the Accept-Language header. The Smart Send API can return customer-facing strings in several languages. Use the `Accept-Language` header to tell the API which language you prefer, and the API will negotiate the best available match. ## What gets translated Only strings that are likely to be shown to an end user in a UI are translated. Examples include service display names, addon descriptions, and human-readable status messages. Identifiers, keys, enum values, and other machine-readable fields are **not** translated. Their values are stable across languages so your integration can rely on them for logic and storage. For example, a shipping service might be returned as: ```json theme={null} { "carrier": "postnord", "service": "mypack_collect", "name": "MyPack Collect" } ``` The `carrier` and `service` keys remain identical regardless of the requested language, while `name` is translated to match the `Accept-Language` header. ## Accept-Language header Set the `Accept-Language` header on each request to indicate your preferred languages. The header follows [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-accept-language) and supports quality values for ranking preferences. ```bash Example theme={null} Accept-Language: da-DK, da;q=0.9, en;q=0.5 ``` If you do not send an `Accept-Language` header, the API falls back to its default language. ## Language negotiation The API picks the best available translation by matching your `Accept-Language` preferences against the languages it supports: 1. The most preferred language that the API supports is used. 2. If no preferred language is supported, the API falls back to its default language. 3. If a specific string has not been translated into the negotiated language, the default language is used for that string. This means you will always receive a usable response, even if your preferred language is not fully supported for every field. # Get authenticated user Source: https://docs.smartsend.io/api-reference/me/get-authenticated-user /openapi-v2beta.json get /v2/me Returns the authenticated user's profile. # List available routes Source: https://docs.smartsend.io/api-reference/routing/list-available-routes /openapi-v2beta.json get /v2/teams/{teamUuid}/routes Lists shipping services and addons available through the team's carrier accounts. # Get closest service points Source: https://docs.smartsend.io/api-reference/service-points/get-closest-service-points /openapi-v2beta.json get /v2/teams/{teamUuid}/service-points/closest Lists the nearest service points to an address, with optional text and bounding-box filters. # Get service point by code Source: https://docs.smartsend.io/api-reference/service-points/get-service-point-by-code /openapi-v2beta.json get /v2/teams/{teamUuid}/service-points/{carrier}/{country}/{code} Returns a service point by carrier, country and service-point code. # Get service point by UUID Source: https://docs.smartsend.io/api-reference/service-points/get-service-point-by-uuid /openapi-v2beta.json get /v2/teams/{teamUuid}/service-points/{uuid} Returns a service point by UUID. # List all service points Source: https://docs.smartsend.io/api-reference/service-points/list-all-service-points /openapi-v2beta.json get /v2/teams/{teamUuid}/service-points Lists service points for a carrier and country, with optional type and bounding-box filters. # Create and book shipment Source: https://docs.smartsend.io/api-reference/shipments/create-and-book-shipment /openapi-v2beta.json post /v2/teams/{teamUuid}/shipments Validates and books a shipment with the selected carrier service. # Delete shipment Source: https://docs.smartsend.io/api-reference/shipments/delete-shipment /openapi-v2beta.json delete /v2/teams/{teamUuid}/shipments/{shipment} Deletes a shipment only if it has never been booked, retaining its internal audit history. # Get a list of a websites shipments Source: https://docs.smartsend.io/api-reference/shipments/get-a-list-of-a-websites-shipments /openapi-v1.json get /v1/website/{team}/shipments This endpoint is used to index a websites shipments or filter/search based on input # Get a specific shipment Source: https://docs.smartsend.io/api-reference/shipments/get-a-specific-shipment /openapi-v1.json get /v1/website/{team}/shipments/{shipment} This endpoint is used to fetch a specific shipments # Get shipment Source: https://docs.smartsend.io/api-reference/shipments/get-shipment /openapi-v2beta.json get /v2/teams/{teamUuid}/shipments/{shipment} Returns a shipment with its current booking status, tracking numbers and URLs, documents and codes. # List shipments Source: https://docs.smartsend.io/api-reference/shipments/list-shipments /openapi-v2beta.json get /v2/teams/{teamUuid}/shipments Lists shipments with filters and cursor pagination for browsing or synchronisation. # Store a new shipment Source: https://docs.smartsend.io/api-reference/shipments/store-a-new-shipment /openapi-v1.json post /v1/website/{team}/shipments This endpoint is used to create a new shipment # Void shipment Source: https://docs.smartsend.io/api-reference/shipments/void-shipment /openapi-v2beta.json post /v2/teams/{teamUuid}/shipments/{shipment}/cancel Cancels only booked shipments internally and requests carrier cancellation where supported. # Get team details Source: https://docs.smartsend.io/api-reference/teams/get-team-details /openapi-v2beta.json get /v2/teams/{teamUuid} Returns details of a team the authenticated user belongs to. # List all teams Source: https://docs.smartsend.io/api-reference/teams/list-all-teams /openapi-v2beta.json get /v2/teams Lists the teams the authenticated user belongs to. # List team members Source: https://docs.smartsend.io/api-reference/teams/list-team-members /openapi-v2beta.json get /v2/teams/{teamUuid}/members Lists the members of a team. # Get tracking information Source: https://docs.smartsend.io/api-reference/tracking/get-tracking-information /openapi-v2beta.json get /beta/teams/{teamUuid}/tracking/{trackingNumber} Returns tracking status and event history for a shipment using its carrier tracking number. # Read the tracking event feed Source: https://docs.smartsend.io/api-reference/tracking/read-the-tracking-event-feed /openapi-v2beta.json get /beta/teams/{teamUuid}/tracking/events Lists newly published tracking events and delivery estimates for incremental synchronisation. # Connect agreement Source: https://docs.smartsend.io/carriers/bifrost/connect Connect Bifrost Logistics to your Smart Send account. To use Bifrost with Smart Send, you need an active shipping agreement with Bifrost. ## Connect agreement To connect Bifrost to Smart Send, contact your Bifrost representative. They will provide us with the necessary details for us to connect your account. If you have questions or need further assistance, reach out to your Bifrost contact or [Smart Send support](/troubleshooting/support). ## Get agreement If you do not have an agreement with Bifrost yet, then contact then for prices and terms. Visit the Bifrost contact page to start your agreement request. If you prefer, you can also reach out to [Smart Send support](/troubleshooting/support). We are happy to assist you with the process. # About Source: https://docs.smartsend.io/carriers/bifrost/introduction Swedish 3PL specializing in international small parcel express freight. Bifrost Logistics is a Swedish third-party logistics (3PL) provider specializing in international express freight for small parcels. Bifrost combines truck-based express delivery, cross-border flights, and last mile distribution through the UPU network to serve e-commerce businesses with fast, reliable shipping. Go to bifrostlogistics.com for more details. ## Company background Founded in 2016 by Stefan and Samir, Bifrost Logistics draws on over 30 years of experience in cross-border distribution of newspapers, catalogs, and magazines. The company was created to address the needs of a digital, global e-commerce market, with a focus on optimizing delivery chains and improving speed and reliability. Bifrost started as a freight consultancy for e-commerce retailers expanding internationally. By streamlining logistics, reducing lead times, and providing a free transport administration (TA) system—developed in partnership with Smart Send—Bifrost enabled customers to manage shipments efficiently and cost-effectively. ## Growth and services Bifrost quickly gained clients such as Hatstore, StickerApp, and the publicly listed Haypp Group. The company’s first 3PL assignment was with Haypp Group, where Bifrost enabled late cut-off times for order picking and packing. This allowed orders to reach most EU countries the morning after packing, ensuring a rapid start to last mile delivery. Today, Bifrost Logistics is an established 3PL partner for over 20 e-commerce retailers and continues to support freight-only customers with optimized logistics solutions. Bifrost’s trackable express letter service is among the fastest available from any Swedish provider, making it a leading partner for e-commerce distribution focused on speed, precision, and reliability. ## Expertise and innovation Bifrost’s expertise is built on both long-standing industry experience and a commitment to continuous improvement. By combining technical know-how with deep logistics knowledge, Bifrost helps e-commerce businesses gain a competitive edge in a demanding market. The company continues to evolve alongside its customers, aiming to stay ahead in the rapidly changing world of e-commerce logistics. For information about connecting Bifrost to Smart Send, see [Connect Bifrost](/carriers/bifrost/connect). For details on obtaining a shipping agreement, see [Get a Bifrost agreement](/carriers/bifrost/connect#get-agreement). # Shipping Services Source: https://docs.smartsend.io/carriers/bifrost/shipping-services Bifrost Logistics shipping services and delivery times. Use Bifrost Logistics to ship small parcels internationally fast, reliable, and trackable — ideal for e-commerce businesses serving Swedish customers. Operating from Sweden, Bifrost specializes in cross-border distribution and partners with the UPU network to provide end-to-end solutions, including some of the fastest air freight options in Europe at competitive prices. ## Shipping Services Bifrost offers these shipping services: * **eTailTracked**: Tracked shipments up to 33 × 23 × 3 cm and 2 kg. * **eTailTracked Large**: Tracked shipments up to 60 cm in length, with a combined height and width (H+W+H) of up to 90 cm, and a maximum weight of 2 kg. * **Nordic Express Home**: Delivery to the doorstep or mailbox (currently available only in Denmark). * **Nordic Express Collect**: Delivery to a pickup location (currently available only in Denmark). ## Delivery time Below is a dataset of the recorded delivery times of a sample of 285.000 random shipments delivered in August 2025. | Destination | 10-90% delivery time | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | >17 | | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | AT | **2-3 days** | 0,0% | 0,0% | 68,5% | 95,7% | 98,5% | 99,8% | | | | | | | | | | | | | | | BE | **1-3 days** | 0,0% | 13,6% | 81,8% | 94,8% | 99,5% | 99,8% | 99,9% | 99,9% | 99,9% | 100,0% | | | | | | | | | | | CH | **2 days** | 0,0% | 0,6% | 91,2% | 98,5% | 99,5% | 99,8% | 99,9% | 99,9% | 99,9% | 100,0% | | | | | | | | | | | CZ | **2-4 days** | 0,0% | 0,0% | 64,2% | 89,3% | 95,6% | 99,0% | 99,5% | 100,0% | | | | | | | | | | | | | DE | **1-2 days** | 8,0% | 67,7% | 93,0% | 97,7% | 98,5% | 99,0% | 99,6% | 99,8% | 99,9% | 99,9% | 100,0% | | | | | | | | | | EE | **1-2 days** | 1,0% | 36,3% | 98,4% | 99,8% | 100,0% | | | | | | | | | | | | | | | | ES | **1-4 days** | 3,8% | 17,5% | 46,9% | 78,5% | 91,4% | 95,8% | 97,4% | 98,4% | 98,8% | 99,0% | 99,3% | 99,5% | 99,6% | 99,6% | 99,7% | 99,8% | 99,8% | 99,9% | 100,0% | | FI | **1-3 days** | 2,4% | 12,6% | 74,6% | 94,6% | 98,6% | 99,2% | 99,3% | 99,4% | 99,5% | 99,8% | 99,9% | 99,9% | 99,9% | 99,9% | 99,9% | 99,9% | 100,0% | | | | FO | **2-4 days** | 0,6% | 3,4% | 55,3% | 80,8% | 91,0% | 95,4% | 97,0% | 97,9% | 98,1% | 98,7% | 99,0% | 99,1% | 99,1% | 99,1% | 99,1% | 99,3% | 99,3% | 99,4% | 100,0% | | FR | **3-5 days** | 0,0% | 0,0% | 9,5% | 52,9% | 87,1% | 96,7% | 98,2% | 99,0% | 99,5% | 99,8% | 99,9% | 99,9% | 99,9% | 100,0% | | | | | | | GB | **1-3 days** | 0,0% | 15,8% | 81,2% | 96,3% | 99,0% | 99,5% | 99,8% | 99,9% | 99,9% | 99,9% | 99,9% | 100,0% | | | | | | | | | GL | **1-7 days** | 1,2% | 11,2% | 28,7% | 49,7% | 63,4% | 75,0% | 84,7% | 90,3% | 93,6% | 95,6% | 96,5% | 97,2% | 97,4% | 97,8% | 97,9% | 98,3% | 98,3% | 98,8% | 100,0% | | GR | **2-8 days** | 0,0% | 3,0% | 32,3% | 55,5% | 73,2% | 82,9% | 86,9% | 89,9% | 92,3% | 93,6% | 94,6% | 95,5% | 96,1% | 96,8% | 97,4% | 98,1% | 98,3% | 98,3% | 100,0% | | HR | **1-6 days** | 0,0% | 19,2% | 49,6% | 70,3% | 84,6% | 89,5% | 92,1% | 94,3% | 95,6% | 97,0% | 97,7% | 97,7% | 98,7% | 98,9% | 99,0% | 99,3% | 99,7% | 99,7% | 100,0% | | HU | **2-4 days** | 0,0% | 0,0% | 45,1% | 81,9% | 97,3% | 99,3% | 99,3% | 100,0% | | | | | | | | | | | | | IE | **1-3 days** | 0,0% | 59,4% | 87,8% | 95,9% | 98,7% | 99,3% | 99,5% | 99,7% | 99,7% | 99,7% | 99,8% | 99,8% | 99,9% | 100,0% | | | | | | | IS | **1-3 days** | 5,1% | 48,5% | 81,9% | 93,1% | 97,9% | 99,3% | 99,5% | 99,6% | 99,7% | 99,7% | 99,9% | 100,0% | | | | | | | | | IT | **2-4 days** | 0,0% | 0,1% | 36,2% | 81,3% | 96,2% | 98,7% | 99,4% | 99,5% | 99,6% | 99,6% | 99,6% | 99,6% | 99,7% | 99,7% | 99,7% | 99,8% | 99,8% | 99,8% | 100,0% | | LT | **1-8 days** | 2,4% | 39,1% | 74,2% | 79,4% | 82,0% | 84,9% | 85,0% | 89,7% | 96,5% | 99,7% | 100,0% | | | | | | | | | | LU | **2-3 days** | 0,0% | 0,0% | 83,2% | 95,8% | 99,7% | 100,0% | | | | | | | | | | | | | | | LV | **1 day** | 9,1% | 95,6% | 99,7% | 99,9% | 100,0% | | | | | | | | | | | | | | | | NL | **1-3 days** | 0,0% | 14,5% | 83,2% | 98,2% | 99,8% | 100,0% | | | | | | | | | | | | | | | NO | **1-3 days** | 0,4% | 12,0% | 57,8% | 94,5% | 98,0% | 99,2% | 99,6% | 99,8% | 99,8% | 99,9% | 99,9% | 100,0% | | | | | | | | | PL | **3-5 days** | 0,0% | 0,0% | 0,0% | 40,5% | 73,4% | 90,1% | 95,1% | 97,8% | 98,5% | 98,9% | 99,0% | 99,3% | 99,5% | 99,7% | 99,9% | 99,9% | 99,9% | 100,0% | | | PT | **2-4 days** | 0,0% | 2,8% | 35,9% | 75,6% | 95,9% | 98,5% | 99,0% | 99,3% | 99,4% | 99,6% | 99,6% | 99,7% | 99,7% | 99,7% | 99,7% | 99,7% | 99,7% | 99,7% | 100,0% | | RO | **3-9 days** | 0,0% | 0,1% | 5,5% | 21,8% | 41,9% | 58,7% | 70,9% | 78,9% | 88,9% | 94,7% | 97,5% | 98,4% | 98,9% | 99,2% | 99,4% | 99,6% | 99,7% | 99,7% | 100,0% | | SE | **1-3 days** | 0,0% | 42,6% | 89,9% | 97,7% | 99,6% | 99,9% | 99,9% | 100,0% | | | | | | | | | | | | | SI | **1-3 days** | 8,4% | 29,3% | 78,5% | 97,4% | 99,1% | 99,8% | 100,0% | | | | | | | | | | | | | | SK | **2-4 days** | 0,0% | 0,0% | 57,4% | 86,9% | 98,2% | 99,0% | 99,5% | 99,5% | 99,7% | 100,0% | | | | | | | | | | | US | **3-6 days** | 0,0% | 0,5% | 5,0% | 24,5% | 59,8% | 84,1% | 93,7% | 97,0% | 98,3% | 98,9% | 99,1% | 99,3% | 99,5% | 99,6% | 99,7% | 99,8% | 99,8% | 99,8% | 100,0% | # Connect agreement Source: https://docs.smartsend.io/carriers/bring/connect Connect Bring to your Smart Send account. ## Connect agreement To connect your Smart Send account with Bring, you need an active Bring shipping agreement. When you receive your agreement, you also get access to Bring's platform, **MyBring**. This is the account you will use to connect Bring to Smart Send. To connect Bring, start by logging into the Smart Send platform . Go to **Carrier Accounts** Next to *Bring* click the **Connect** button Carrier accounts overview with Bring connect button Enter the following MyBring details: * **MyBring username** * **MyBring password** * **MyBring API key** (see picture below where to find this) * **Bring customer number** (see picture below where to find this) Bring connection form with MyBring details filled in Save the settings You can find all of the required information by logging in to MyBring and navigating to the API section. MyBring account page showing API key and customer number The connection is instant and you should be able to book Bring shipments imidiatly after saving the connection. ## Get agreement If you do not have an agreement with Bring yet, then contact then for prices and terms. Contact Bring or signup online # About Source: https://docs.smartsend.io/carriers/bring/introduction Bring is part of Posten Bring Group, offering logistics solutions for corporate customers in the Nordic market and private customers outside Norway. Bring is part of the Posten Bring Group and serves as their logistics offer to the Nordic market. Bring provides comprehensive parcel, mail, and cargo services across Norway, Sweden, Denmark, Finland, Poland, the Netherlands, and the United Kingdom. The company focuses on flexible, sustainable logistics solutions for corporate customers in the Nordic region and for private customers outside Norway. Go to bring.com for more details. ## Main markets Bring operates throughout the Nordic region and Europe, serving Norway, Sweden, Denmark, Finland, Poland, the Netherlands, and the United Kingdom. Their primary focus is on corporate customers in the Nordic market, while private customer solutions are available outside Norway. ## Key services Bring offers a wide range of logistics services, including: * Cargo and freight delivery * Nordic Pickup Point network * Fulfillment services (*Bring Shelfless*) * Temperature-controlled logistics for sensitive goods * Installation services for items such as washing machines and furniture * Standard parcel and mail delivery ## Service advantages Bring’s strengths include Nordic expertise and a strong focus on sustainability: * Comprehensive coverage across the Nordic region and Europe * Sustainable delivery solutions using biogas, biodiesel, and electric vehicles * Carbon dioxide-free distribution in city centers * Flexible logistics for both B2B and B2C customers * Specialized services such as temperature-controlled and installation logistics * Commitment to environmental responsibility and sustainable practices For information about connecting Bring to Smart Send, see [Connect Bring](/carriers/bring/connect). For details on obtaining a shipping agreement, see [Get a Bring agreement](/carriers/bring/connect#get-agreement). # Connect agreement Source: https://docs.smartsend.io/carriers/dao/connect Connect DAO to your Smart Send account. ## Connect agreement To connect your Smart Send account with DAO, you need an active DAO shipping agreement. When your agreement is set up, you will receive a welcome email from DAO containing your account details. To connect DAO, start by logging into the Smart Send platform . Go to **Carrier Accounts** Next to *DAO* click the **Connect** button Carrier accounts overview with DAO connect button Enter the following DAO details: * **Customer number** (usually 4 digits) * **API key** (alphanumeric string) * **Profile** (leave empty unless DAO has provided a specific value) DAO connection form with customer details filled in Save the settings You can find your customer number and API key in your DAO welcome email or agreement confirmation. The "*Profile*" field is rarely used—leave it blank unless DAO has instructed you otherwise. The connection is instant. You can book DAO shipments immediately after saving the connection. ## Get agreement If you do not have a DAO agreement yet, contact DAO to request pricing and terms. Contact DAO for an agreement ## Aggrement conditions DAO supports two types of agreements: * **Pickup at your location**: DAO collects parcels directly from your business address. * **Drop-off at a DAO point**: You deliver parcels to a DAO pickup point. DAO typically requires a minimum shipping volume for pickups, making this the preferred option for many businesses. However, if your business is located near a DAO pickup point, using drop-off can be a suitable and cost-effective alternative. # About Source: https://docs.smartsend.io/carriers/dao/introduction Danish parcel delivery specialist (Dansk Avis Omdeling) offering fast and affordable services for private consumers. DAO (*"Dansk Avis Omdeling"* which is Danish for *Danish Newspaper Distribution*) has delivered newspapers across Denmark since 1921 and expanded into parcel distribution in 2011. Go to dao.as for more details. ## Main markets DAO operates primarily in Denmark, providing comprehensive coverage across the country with a focus on consumer-friendly delivery solutions. DAO is part of an international parcel delivery collaboration making it possible to send from DAO to a range of countries using DAO. ## Key services DAO operates day and night, year-round, to ensure parcels, magazines, letters, and newspapers reach their destinations safely and quickly. The company continually evolves to strengthen Danish distribution, delivering to kiosks, mailboxes, and directly to doors—wherever it suits the recipient. DAO offers several specialized delivery services designed for different customer needs: **daoSHOP** – Delivery to parcel shops for convenient pickup. **daoHOME** – Morning home delivery service for time-sensitive packages. **daoDIRECT** – Direct-to-door delivery with optional signature confirmation. ## Service advantages DAO's strength lies in its consumer-focused approach, offering: * Widespread distribution network across Denmark with numerous parcel shops * Ability to leave parcels at the doorstep - within the staircase as they have keys to most reseential buildings due to their newspaper distribution history * Fast delivery due to their early morning delivery For information about connecting DAO to Smart Send, see [Connect DAO](/carriers/dao/connect). For details on obtaining a shipping agreement, see [Get a DAO agreement](/carriers/dao/connect#get-agreement). # Connect agreement Source: https://docs.smartsend.io/carriers/gls/connect Connect GLS to your Smart Send account. ## Connect agreement To connect your Smart Send account with GLS, you need an active GLS shipping agreement. GLS has launched a new IT system called **Click\&Ship** which is meant to replace their older system **YourGLS**. We currently integrate with YourGLS and all GLS customers can get a YourGLS account for free. This is the account you will use to connect GLS to Smart Send. To connect GLS, start by logging into the Smart Send platform . Go to **Carrier Accounts** Next to *GLS* click the **Connect** button Carrier accounts overview with GLS connect button Enter the following YourGLS details: * **YourGLS username** * **YourGLS password** * **CustomerId** (usually the same as YourGLS username) * **ContactId** (see instructions below to find this) GLS connection form with YourGLS details filled in Save the settings ## Finding CustomerId and ContactId To find the CustomerId and ContactId, do the following: 1. Login to YourGLS *here * or by selecting YourGLS in the top right corner from the GLS website (after selecting country if asked) 2. Select **Shipper addresses** from the dropdown menu **Administration** at the top right of the page 3. The **CustomerId** and **ContactId** will be displayed as gray text as the *Shipper number* and the fields are split by a space YourGLS shipping addresses page showing where to find CustomerId and ContactId YourGLS shipper account details The connection is instant and you should be able to book GLS shipments immediately after saving the connection. ## Get agreement If you do not have an agreement with GLS yet, then contact them for prices and terms. Contact GLS or signup online # About Source: https://docs.smartsend.io/carriers/gls/introduction European parcel delivery network offering reliable, fast, and cost-effective services across Denmark and wider Europe. GLS offers reliable, fast, and cost-effective parcel delivery services across Europe. Known for their strong network and predictable delivery times, GLS provides comprehensive logistics solutions for both business and consumer needs. Go to gls-group.eu for more details. ## Main markets GLS was originally founded in Germany as German Parcel in 1989 and was later acquired by Royal Mail Group, becoming part of International Distributions Services plc. Today, GLS operates an extensive parcel delivery network across a wide range of countries in Europe and North America, including: * Andorra * Austria * Belgium * Bulgaria * Canada * China * Croatia * Cyprus * Czech Republic * Denmark * Estonia * Finland * France * Germany * Greece * Hungary * Ireland * Italy * Latvia * Liechtenstein * Lithuania * Luxembourg * Malta * Monaco * Netherlands * Norway * Poland * Portugal * Romania * San Marino * Serbia * Slovakia * Slovenia * Spain * Sweden * Switzerland * United Kingdom * United States * Vatican City GLS provides reliable delivery services and extensive coverage throughout these markets. ## Key services GLS offers several specialized delivery services designed for different shipping needs: **BusinessParcel** – standard B2B shipping for business customers **ShopDeliveryParcel** – delivery to GLS ParcelShops for convenient pickup **FlexDeliveryService** – provides recipients with flexible delivery options and scheduling ## Service advantages GLS's strength lies in its European network and service reliability: * Strong European network with predictable delivery times * Cost-effective shipping solutions * Flexible delivery options for recipients * Comprehensive B2B and B2C services * Reliable tracking and delivery confirmation For information about connecting GLS to Smart Send, see [Connect GLS](/carriers/gls/connect). For details on obtaining a shipping agreement, see [Get a GLS agreement](/carriers/gls/connect#get-agreement). # Overview Source: https://docs.smartsend.io/carriers/overview List of compatible carriers ## What does it mean to connect a carrier? Connecting a carrier to Smart Send authorizes us to communicate directly with the carrier on your behalf. This connection allows Smart Send to: * Book shipments using your carrier agreement. * Track parcels and update shipment statuses. * Generate shipping labels and required documents. * Access carrier-specific features and rates. Your credentials are used securely to enable these features. You remain in control of your carrier agreements and can manage or remove connections at any time in the dashboard. ## Carriers Smart Send support multipe different carriers. Read more about each carrier, their offerings and how to connect them to your account. # Connect agreement Source: https://docs.smartsend.io/carriers/postnord/connect Connect PostNord to your Smart Send account. ## Connect agreement To connect your Smart Send account with PostNord, you need an active PostNord shipping agreement. When you receive your agreement, you also get access to PostNord's platform, **Customer Portal** where your account information can be located. To connect PostNord, start by logging into the Smart Send platform . Go to **Carrier Accounts** Next to *PostNord* click the **Connect** button Carrier accounts overview with PostNord connect button Select the country of your agreement (PostNord Denmark / PostNord Sweden / ...) Enter your **Production Customer Number** (not to be confused with the *Customer Number*). See [where to find the Production Customer Number](#finding-your-production-customer-number). PostNord connection form with customer number filled in Save the settings ### Finding your production customer number You can find all of the required information by logging in to PostNord Customer Portal and navigating Company settings -> **Details** and look in the column **Production number**. PostNord portal showing where to find the production customer number The **Productio Customer Number** should not be confused with the *Customer Number*. It can be found in the welcome email you receive after getting an agreement or it can be located at PostNord's Customer Portal. The format is: * PostNord Denmark: 9 digits * PostNord Sweden: 10 digits * PostNord Finland: 10 digits * PostNord Norway: 7 digits ## Get agreement You can create a PostNord business agreement online without needing to contact a sales representative. PostNord does not require a minimum shipping volume—if you send fewer than 200 parcels per month, you will automatically receive their fixed online business prices. The signup process is fully digital and typically takes less than an hour. Go to PostNord's online signup page ### Aggrement conditions PostNord offers several ways to hand over your parcels depending on your agreement with them: * **Regular pickups**: Schedule recurring pickups from your business address. * **Ad-hoc pickups**: Request one-time pickups as needed. * **Drop-off at a service point**: Bring parcels to a PostNord service point or parcel shop. Choose the option that best fits your shipping workflow. You can manage pickup requests and find nearby drop-off locations in the PostNord Customer Portal . # Good to know Source: https://docs.smartsend.io/carriers/postnord/good-to-know Relevant notes about PostNord when shipping through Smart Send. ## Surcharge fees ### Missing, delayed or incorrect EDI PostNord charges a surcharge fee called "Missing, delayed or incorrect EDI" when shipment data is not transmitted electronically or is received late or incorrectly. This fee does **not** affect Smart Send customers. When you book shipments through Smart Send, the EDI data is sent directly to PostNord at the time of booking. If this fee appears on your PostNord invoice, contact PostNord and ask them to credit it. We have seen this happen for completely new customers that start producing labels just hours after their PostNord account was created. ## Customs fees ### Entry of customs information per parcel When you provide customs information during booking via Smart Send, PostNord does not charge the "Entry of customs information per parcel" fee. This fee only applies when customs data is missing and PostNord has to enter it manually. ### Export declaration Similarly, there is no "Export declaration" fee when customs information is provided during booking via Smart Send. By including the required customs details at the time of booking, the export declaration is generated automatically. # About Source: https://docs.smartsend.io/carriers/postnord/introduction Leading Nordic logistics provider offering comprehensive parcel services for both B2C and B2B deliveries across the Nordic region. PostNord is one of the largest logistics providers in the Nordics, offering a wide range of parcel services for both B2C and B2B deliveries. With extensive coverage across the Nordic region, PostNord provides reliable and comprehensive logistics solutions for businesses and consumers. See shipping methods for shipping from Denmark. See shipping methods for shipping from Sweden. Go to postnord.com for more details. ## Main markets PostNord was established in 2009 through the merger of the Danish postal service (*Post Danmark A/S*) and the Swedish postal service (*Posten AB*). This merger created a unified logistics and postal provider serving the entire Nordic region, combining decades of experience from both national organizations. PostNord AB now operates as the main provider of postal and logistics services in Denmark and Sweden, providing a strong logistics coverage throughout the Nordic countries; Denmark, Sweden, Norway, and Finland. ## Key services PostNord offers several specialized delivery services designed for different customer needs: * **MyPack Collect** – for pickup point deliveries at convenient locations * **MyPack Home** – for home delivery to consumers with flexible scheduling * **Parcel** – for business shipments with reliable B2B delivery solutions * Many more services and addons ## Service advantages PostNord's strength lies in its Nordic market leadership and comprehensive service offering: * Largest logistics provider in the Nordic region * Extensive coverage across Denmark, Sweden, Norway, and Finland * Extensive network of pickup points across the Nordic countries and through collaboration in the rest of Europe * Comprehensive B2B and B2C delivery solutions * Reliable and established network with proven track record * Flexible delivery options including home delivery and pickup points * Strong business focus with specialized B2B services For information about connecting PostNord to Smart Send, see [Connect PostNord](/carriers/postnord/connect). For details on obtaining a shipping agreement, see [Get a PostNord agreement](/carriers/postnord/connect#get-agreement). # Shipping options Source: https://docs.smartsend.io/carriers/postnord/shipping-options PostNord parcel services, add-ons, and shipping options for Denmark and Sweden As of January 1st, 2026, PostNord Denmark has stopped serving letter post in Denmark. Letter post services in Denmark are now handled by DAO going forward. ## General information When you book a shipment via Smart Send, we send the shipment data electronically to PostNord. This means the shipment is registered in PostNord's systems instantly. ### Overview | Service | Delivery Area | Recipient Type | Delivery Mode | Max Weight | | - | - | - | - | - | | Parcel Locker | DK / Nordic | Private/Business | Pickup | 10–20 kg | | Service Point | DK / EU | Private/Business | Pickup | 20 kg | | Home | DK / Intl | Private | Home | Up to 35 kg | | Parcel | DK / Intl | Business | Address | Up to 35 kg | | Return | DK | Business | Drop-off | 20 kg | | Return Pickup | DK | Business | Address | 20 kg | | Tracked | International | Both | Mailbox/Home | 2 kg | | Rekommanderet | International | Both | Signature | 2 kg | ## Shipping from Denmark Package will be delivery to a *PostNord parcel locker* where the recipient collects the parcel. Parcel lockers require the receiver to use the PostNord mobile app to unlock the parcel locker * **Destinations**: The Nordic countries * **Delivery time**: Next-day delivery Monday to Saturday for domestic parcels in Denmark. * **Notification:** PostNord app, SMS, email * **Pickup deadline:** 7 days * **Signature:** No * **Max weight:** 10 kg (Denmark), 20 kg (Finland) * **Max dimensions:** 42 × 49 × 60 cm * **Special requirements:** Requires PostNord app for locker access * **Redirection:** Parcel is redirected to another pickup point if the locker is full Package will be delivery to a staffed PostNord Parcel Shop for customer pickup. * **Destinations**: Many European countries * **Delivery time**: Next-day delivery Monday to Saturday for domestic parcels in Denmark. * **Notification:** SMS, email, PostNord app * **Pickup deadline:** 7 days * **Signature:** No (unless add-on applied) * **Max weight:** 20 kg * **Max dimensions (Denmark/Norway/Sweden/Finland):** * Max length: 150 cm * Length + girth: 300 cm * **Max dimensions (selected EU countries):** * Max length: 100 cm * Length + girth: 250 cm * **Redirection:** Parcel may be redirected to another Service Point if the choosen location is full. Delivery to a private recipient's home address. * **Delivery type:** Home delivery * **Delivery time (Denmark):** Next business day (minimum service level) * **Notification:** SMS, email, PostNord app * **Standard delivery:** Mailbox or doorstep * **Max weight:** * Denmark/Nordics: 35 kg * EU/Switzerland/UK: 31.5 kg * Rest of world: 20 kg * **Max dimensions:** * Length: up to 175 cm * Length + girth: 300 cm * **Max dimensions (Denmark only, with surcharge):** * Length up to 220 cm, or * Length + girth up to 360 cm * **Failed delivery:** Parcel is redirected to a Service Point Delivery to a commercial address during daytime. * **Type**: Business / Private * **Delivery type:** Business address * **Delivery time (Denmark):** Next business day (minimum) * **Signature:** Required by default * **Notification:** SMS, email, PostNord app * **Max weight and dimensions:** Same as PostNord Home * **Important:** If the recipient is identified as a private individual, the shipment may be reclassified as PostNord Home and surcharged. Return shipment dropped off by the recipient at a Service Point or Parcel Locker. * **Type**: Business / Private * **Drop-off:** At Service Point or Parcel Locker * **Max weight:** 20 kg * **Notifications:** Recipient and sender * **Typical use:** Cost effective return option for private parcels. Return shipment collected at the recipient's address. * **Pickup:** At recipient address * **Max weight:** 20 kg * **Shipments over 20 kg:** Must be delivered to a business hand-in location * **Notifications:** SMS, email * **Typical use:** For commercial parcels or private parcels where the receiver is not catable of returning the package from a service point eg. due to heavy content. Lightweight, trackable international letters and small parcels. * **Destinations:** International, including Faroe Islands and Greenland * **Type**: Business / Private * **Tracking:** Yes * **Add-ons:** Not supported * **Delivery time targets (EU):** * 85% within 3 business days * 97% within 5 business days * **Formats:** * Small: Up to 500 g (some countries allow up to 2 kg) * Large: Up to 2 kg * **Max dimensions:** * Small: 33 × 23 × 1 cm * Large: Length up to 60 cm, length + width + height ≤ 90 cm * **Requirements:** EDI including weight * **Compensation:** No compensation for loss or delay (UPU rules) Registered international mail with signature and limited compensation. * **Destinations:** International * **Type**: Business / Private * **Max weight:** 2 kg * **Signature on delivery:** Yes * **Tracking:** Yes * **Content restrictions:** Documents and limited cash only * **Delivery time guarantee:** No Addons are extra services that can be enabled - often at an extra cost. Availability depends on service and route. Leave the parcel without requiring a signature. * **Purpose:** Allow delivery without recipient signature * **Availability:** Must be specified in EDI booking * **Risk:** Responsibility transfers upon delivery Require signature on delivery for confirmation. * **Purpose:** Proof of delivery with recipient signature * **Availability:** Specified in EDI booking * **Use case:** Valuable or important shipments Additional insurance for high-value items. * **Purpose:** Extended liability coverage * **Availability:** Must be booked in EDI * **Restrictions:** May limit recipient flexibility options Special handling for large or heavy parcels. * **Purpose:** Additional handling for parcels exceeding standard dimensions * **Requirements:** Must be specified when booking * **Surcharges:** May apply based on dimensions Transport of dangerous goods in limited quantities. * **Purpose:** Shipping restricted items in compliance with regulations * **Requirements:** Must comply with IATA/ADR regulations * **Declaration:** Required in EDI The receiver will receive a notification via email/sms and can change delivery information like delivery time window or pickup point. * **Purpose:** Allow receiver to modify delivery * **Options:** * Allow drop-off without signature * Redirect parcel to a Service Point * **Availability:** Only if Modtagerflex is not active * **Not available for:** * Parcels over 20 kg * Certain add-ons (e.g., valuables) As a private receiver then it is possible to signup for *Recipient Flex* (In Danish *ModtagerFlex*) which grants PostNord permission to leave parcels unattended at a greed upon location like the frontdoor or the garage. The courier takes a photo of the parcel and its placement, which you the receiver can view instantly in the PostNord mobile app (if the user has verified with *MitID*). ## Shipping from Sweden PostNord Sweden offers similar services to Denmark with some variations in availability and specifications. Delivery to a PostNord parcel locker where the recipient collects the parcel using the PostNord app. Parcel lockers require the receiver to use the PostNord mobile app to unlock the parcel locker * **Delivery type:** Pickup (parcel locker) * **Notification:** PostNord app, SMS, email * **Pickup deadline:** 7 days * **Signature:** No * **Max weight:** 10 kg * **Max dimensions:** 42 × 49 × 60 cm * **Special requirements:** Requires PostNord app for locker access * **Redirection:** Only if locker is full Delivery to a staffed PostNord Service Point for customer pickup. * **Delivery type:** Pickup * **Notification:** SMS, email, PostNord app * **Pickup deadline:** 7 days * **Signature:** No (unless add-on applied) * **Max weight:** 20 kg * **Max dimensions:** * Max length: 150 cm * Length + girth: 300 cm * **Note:** Sender must specify preferred pickup location in EDI. Parcel may be redirected if the location is full. Delivery to a private recipient's address in Sweden. * **Delivery type:** Home delivery * **Notification:** SMS, email, PostNord app * **Standard delivery:** Mailbox or doorstep * **Max weight:** 35 kg * **Max dimensions:** * Length: up to 175 cm * Length + girth: 300 cm * **Failed delivery:** Parcel is redirected to a Service Point Delivery to a business recipient's address. * **Delivery type:** Business address * **Signature:** Required by default * **Notification:** SMS, email, PostNord app * **Max weight and dimensions:** Same as PostNord Home * **Important:** If the recipient is identified as a private individual, the shipment may be reclassified as PostNord Home and surcharged. Return shipment dropped off by the recipient at a Service Point or Parcel Locker. * **Drop-off:** At Service Point or Parcel Locker * **Max weight:** 20 kg Return shipment collected at the recipient's address. * **Pickup:** At recipient address * **Max weight:** 20 kg PostNord Sweden supports the same add-ons as Denmark. Availability depends on service and route. Leave the parcel without requiring a signature. Require signature on delivery for confirmation. Additional insurance for high-value items. Special handling for large or heavy parcels. Transport of dangerous goods in limited quantities, in compliance with IATA/ADR regulations. One-time delivery modification by the receiver, such as changing the delivery time window or pickup point. As a private receiver it is possible to sign up for *Recipient Flex* (in Danish *ModtagerFlex*), a standing agreement that grants PostNord permission to leave parcels unattended at a predefined location like the front door or the garage. ## Special geographic considerations ### Islands, Faroe Islands, and Greenland Shipping to remote locations requires special consideration: * **Delivery frequency:** Not all destinations have daily delivery service * **Greenland specifics:** * Parcels may be transported by air if sea transport is unavailable * Air transport may trigger additional surcharges * Significantly longer delivery times must be expected * **Island destinations:** Extended delivery times and potential access limitations * **Planning:** Allow extra time for deliveries to remote areas PostNord is the result of the merger between the Swedish postal service (Posten AB) and the Danish postal service (Post Danmark A/S) in 2009. While they operate under one brand, there are significant differences between shipping from Denmark and shipping from Sweden with PostNord. # Shipping to USA Source: https://docs.smartsend.io/carriers/postnord/shipping-to-usa Learn how to ship parcels to the United States using PostNord services and understand the requirements and considerations. **Service Update**: PostNord temporarily suspended shipments with values below \$800 USD to USA and Puerto Rico from August 23rd to October 23rd, 2025, following the Trump administration's changes to de minimis rules. Service has now resumed with updated customs handling procedures. PostNord offers shipping services to the United States and Puerto Rico. Due to recent changes in US customs regulations, there are important updates and requirements you need to know about when shipping to these destinations. ## De minimis changes **De minimis** refers to the threshold value below which imported goods are exempt from customs duties and taxes. Traditionally, shipments to the USA with a value under \$800 USD were exempt from customs duties. Effective August 29th, 2025, the Trump administration cancelled the de minimis exemption. This means **all shipments to the USA**, including small, low-value items, are now subject to customs duties and taxes. The only exception is gifts under \$100 USD sent by private customers, which remain exempt from duties. ## Postal Delivered Duties Paid (PDDP) PostNord has resumed shipping services to the USA and Puerto Rico as of October 23rd, 2025. PostNord offers a **PDDP solution (Postal Delivered Duties Paid)** where customs duties and fees are handled in advance, so there is no extra charges to the receiver. ### Costs and payment * Customs duties and fees are calculated based on the item's value, country of origin, and tariff code * A fixed customs clearance fee of \$3 USD applies per package * Duties and fees are calculated after shipping and appear on your invoice in USD ## Documentation requirements All shipments to the USA now require comprehensive customs documentation. Smart Send will automatically create all necessary customs documents during the booking process, ensuring compliance with US customs requirements. ### Required information The following information must be provided during booking of shipment. If you use one of our integrations then this information will be taken from the order automatically. * **Item description**; Detailed item descriptions in English * **Customs invoice**: Required for commercial shipments * **Country of origin**: Must be clearly stated for all items * **10-digit HS codes**: Harmonized System tariff codes for all products * **Values in USD**: All item values must be declared in US dollars PostNord among the first to resume deliveries to the United States and Puerto Rico for all customers # Address book Source: https://docs.smartsend.io/features/address-book Save and manage delivery addresses for faster shipment creation The address book stores receiver addresses for reuse when creating shipments. Addresses can be added manually or saved automatically when booking shipments — see [Settings](/fundamentals/settings) to configure automatic saving. ## View addresses To view your saved addresses, go to **Address Book** in the Smart Send platform . Address book list showing saved receiver addresses ## Add an address To add a new address manually, start by logging into the Smart Send platform . Go to **Address Book** and click **Create** Enter the receiver's required information and press **Save** Address book form with receiver details filled in # Pickup points Source: https://docs.smartsend.io/features/pickup-points Start offering shipping to pickup points using Shopify, WooCommerce, or the API. Offer shipping to pickup points to give your customers a flexible and convenient delivery option. ## How it works When a customer enters their shipping address at checkout, Smart Send automatically finds the nearest available pickup points and lists them as delivery options. The customer can then select the preferred pickup point which might not be the closest but one they often cross during their daily routines. We will make sure to keep the database of pickup points up-to-date so you only need to worry about what shipping cost you wanna charge your customers. ## Get started Choose your integration for details on how to setup pickup point delivery. ## Learn more Learn how pickup points work and considerations to make. # Returns Source: https://docs.smartsend.io/features/return See your options for creating return labels and handling returns with Smart Send Use Smart Send to generate return labels for your shipments. You can create a return label and include it in the parcel you send to your customer. You only pay for return labels that are actually used—there is no charge for unused labels. ## How returns work Just like booking an outgoing shipment, then you can book a return shipment 1. Book a shipment using one of the *return shipping methods* 2. Place the return label inside the parcel before shipping to your customer. 3. If the customer needs to return the item, they attach the label and hand in the parcel at a carrier pickup point. > The most common return method in e-commerce is for customers to hand in their return parcel at a pickup point. This method is supported by all major carriers. ## Learn more Best practices, regulations, and advanced return workflows # Booking Source: https://docs.smartsend.io/features/shipments/booking Learn how booking shipments with carriers works and what data is required for successful shipment registration Booking is the process of digitally registering shipments with carriers to create shipping labels and assign tracking numbers. When you book a shipment, you provide all the necessary information to the carrier so they can process and deliver your package. ## What is booking? Booking a shipment means registering all the required details with your chosen carrier's system. This digital registration creates an official record of your shipment, assigns tracking numbers, and generates the necessary shipping documents like labels and customs forms. Once a shipment is booked and the package enters the carrier's network, delivery personnel can scan the parcel and it will be registered correctly in their system, enabling accurate tracking and delivery. ## Required booking data To successfully book a shipment, you need to provide several categories of information: ### Sender information Details about where the package is being sent from, including: * Company name and VAT registration numbers * Address * Contact information This information is stored on the Smart Send account and used for all bookings on a *Team* ### Receiver information Details about the person/company that should receive the parcel: * Recipient name * Delivery address * Contact information ### Delivery parties Additional parties involved in the shipping process: * **Pickup points**: Designated locations where packages can be collected * **Third-party recipients**: Alternative pickup locations, authorized recipients or importer * **Return addresses**: Where packages should be sent if delivery fails ### Shipping method and addons How the package should be delivered: * **Service type**: Standard, express, economy delivery options, ... * **Delivery preferences**: Specific time windows, locations it can be left unattended, ... * **Additional services**: Insurance, signature confirmation, age verification, ... * **Special handling**: Fragile items, hazardous materials, temperature-controlled, ... ### Physical package details Information about the actual parcel: * **Weight**: Package weight in kilograms or pounds * **Dimensions**: Length, width, height measurements * **Package type**: Box, envelope, tube, or custom packaging * **Content description**: Information about the individual items inside the parcel ### Customs information (international shipments) For cross-border shipments: * **Item descriptions**: Detailed content information * **Value declarations**: Monetary value of contents * **Harmonized codes**: Product classification codes * **Country of origin**: Where items were manufactured **Not all data is always required.** The specific information needed depends on the carrier, shipping method, destination, and package contents. Smart Send automatically determines what data is required for each booking. ## What happens after booking? Once you successfully book a shipment, several things occur automatically: ### Tracking number assignment Each package receives a unique tracking number that allows you and your customers to monitor the shipment's progress through the carrier's network. ### Document generation The system creates all necessary shipping documents: * **Shipping labels**: Address labels with barcodes for package identification * **Customs documents**: Required forms for international shipments * **Waybills**: Shipping manifests for carrier processing * ... ### Carrier notification The carrier is notified of the new shipment and can begin processing it for pickup and delivery. ## Benefits of Smart Send booking Smart Send simplifies the booking process by handling the complexity for you: ### Centralized management All booking logic is maintained centrally in our system, so you don't need to constantly update plugins or modify your webshop system when carriers change their requirements. ### Automatic data validation Our system validates all booking data before submission to carriers, reducing errors and failed bookings. ### Multi-carrier support Book shipments with different carriers using the same interface and data structure, making it easy to compare rates and services. ### Integration flexibility Whether you're using our Shopify app, WooCommerce plugin, or REST API, the booking process works consistently across all platforms. ## Getting started with booking To start booking shipments, you need: 1. **Carrier connections**: Set up your carrier accounts in Smart Send 2. **Sender information**: Configure your business details 3. **Integration**: Connect your webshop or use our web interface # Creating shipments Source: https://docs.smartsend.io/features/shipments/creating Create shipments manually or via bulk upload in Smart Send Shipments can be created in Smart Send through several methods depending on your workflow. ## How to create shipments Create individual shipments directly in the Smart Send platform using the shipment form. Import orders automatically from your connected webshop (Shopify, WooCommerce, etc.). Create shipments programmatically using the Smart Send API. To create a shipment manually, start by logging into the Smart Send platform . Go to **Shipments** and click **Create** Shipments page with Create button highlighted Enter the receiver information, select a carrier and service, and provide package details Click **Book** to register the shipment with the carrier and generate a shipping label # Shipment history Source: https://docs.smartsend.io/features/shipments/history Search, filter, and view historical shipments in Smart Send The shipment list is the central hub for viewing all booked shipments. You can search, filter by date, and review details for any shipment created through Smart Send. Shipment history list showing booked shipments ## Search Use the search bar at the top of the shipment list to find specific shipments. You can search by tracking number, receiver name, or address. Shipment search bar with search results ## Filter Besides searching then shipments can be filtered down to get a more precise overview. ### Date range Use the date picker to narrow down the shipment list to a specific time period. This is useful for reviewing shipments from a particular day, week, or month. Date filter showing date range selection for shipments ## Export Export your shipment data as XLSX or CSV files for reporting, accounting, or further analysis. The export includes all shipment details for the selected time period. To export shipments, start by logging into the Smart Send platform . Go to **Shipments** Click the **Export** button at the top of the shipment list Shipment list with Export button highlighted Select the preferred format and the export will be queued. Export options showing format selection and date range Once the export is done then it will be emailed to you. Email notification with download link for the exported shipment data # Tracking Source: https://docs.smartsend.io/features/tracking Centralized, cross-carrier tracking for every shipment booked through Smart Send. Smart Send tracks every shipment you book, regardless of which carrier delivers it. Tracking numbers are assigned at booking, status updates are collected from the carrier, and the result is shown in one place in the Smart Send platform. ## How tracking works When you book a shipment, the carrier returns a tracking number that is stored on the shipment in Smart Send. Status updates from the carrier are then associated with that shipment so you can follow its progress without logging in to each carrier separately. This applies to all carriers Smart Send integrates with, but the update frequency can vary from carrier to carrier. ## The shipment list You can review tracking information for your shipments in the **Shipments** view in the Smart Send platform . Each shipment shows its tracking number and a link to the carrier's tracking page for real-time details. ## Cross-carrier status Each carrier reports tracking events in its own format. Smart Send maps every event to one of a shared set of categories so you can see, at a glance, where a shipment is in its journey without learning each carrier's terminology. Each category groups many carrier-specific event types that share the same meaning. | Category | Meaning | | - | - | | `AvailableForPickup` | The parcel is ready to be collected by the recipient. | | `Change` | The delivery has changed (destination, shipping method, delivery timeslot, etc.). | | `Delayed` | Delivery has been delayed but the parcel will still be delivered. | | `Delivered` | The parcel has been delivered. | | `DeliveryFailure` | Delivery was attempted but did not succeed. | | `Error` | A technical error occurred, often the inability to fetch tracking information from the carrier. | | `Exception` | Something out of the ordinary happened. The parcel may be shipped back, the customer contacted, or delivery retried. | | `Expired` | Tracking information has expired and will no longer receive updates. | | `Info` | Informational events. | | `Internal` | Events from Smart Send, not from the carrier (for example scanning, packing, quality control). | | `InTransit` | The parcel is on its way through the carrier's network. | | `Notification` | A party was notified by the carrier, typically the recipient. | | `OutForDelivery` | The parcel is scheduled for delivery. | | `System` | A system event not intended to be shown to end customers. | For the authoritative, real-time view of a single shipment, use the carrier tracking link shown on the shipment. ## Customer notifications For webshops, we recommend including the tracking number and tracking link in your normal order emails and letting the carrier handle delivery notifications. Do not enable Smart Send's own tracking emails on top of this — the carrier will already keep the recipient informed. The type of notifications a recipient receives varies by carrier and may include phone app notifications, SMS, and email. Smart Send cannot configure which channels each carrier uses. If you do not have a webshop integration that surfaces tracking, Smart Send can send tracking emails directly to the recipient. To configure them, go to **Notifications** in your team settings. ## Integration-specific tracking If you use a webshop integration, tracking numbers and links are also written back to the order in your shop so customers can see them in the standard order emails and account pages. # Account Source: https://docs.smartsend.io/fundamentals/account Manage your personal profile, account details, and preferences in Smart Send. ## Update profile To update your name or email address, start by logging into the Smart Send platform . Click your name in the bottom left corner and select **Your Profile** Navigation menu with profile option highlighted Update your **name** or **email address** in the profile form and click **Save** to apply your changes Profile page with updated information saved ## Change password To change your password, start by logging into the Smart Send platform . This way of changing password require that you know the **current password** - if you do not know that, instead use the [recover password](#recover-password) guide. Click your name in the bottom left corner and select **Your Profile** Navigation menu with profile option highlighted Select **Password** in the submenu. Enter your **current password**, then choose a **new password**, confirm it and click **Save** to update your password Password change form with fields filled in ## Sessions View all active sessions for your account. To log out of other devices or browsers, start by logging into the Smart Send platform . Click your name in the bottom left corner and select **Your Profile** Navigation menu with profile option highlighted Select **Sessions** in the submenu to view all active sessions. Click **Log out other browser sessions** to end all sessions except the current one. Active sessions list showing devices and browsers ## Preferences Set your personal preferences to customize your experience. To configure preferences, start by logging into the Smart Send platform . Click your name in the bottom left corner and select **Your Profile** Navigation menu with profile option highlighted Select **Preferences** in the submenu. Adjust the settings to match your workflow and click **Save** to apply your preferences User preferences page with available options Personal preferences only affect your user account. Most configuration is managed at the team level. To update team-wide settings, go to the team settings page. ## Delete account Deleting your account is permanent and cannot be undone. Before you can delete your account, you must first cancel subscriptions for all teams you are a member of. To delete your account, start by logging into the Smart Send platform . Click your name in the bottom left corner and select **Your Profile** Navigation menu with profile option highlighted Scroll down to the **Delete Account** section at the bottom of the page and click **Delete Account**. Delete Account section at the bottom of the profile page Enter the current user password and confirm the deletion by clicking **Delete Account** in the confirmation modal. Confirmation dialog for account deletion ## Recover password If you have forgotten your password, you can reset it using the password recovery flow explained below. If you know the existing password but just wanna change it, then instead use the [Change password](#change-password) guide. Navigate to the forgot password page that is always available from the login page. Forgot password page with email address filled in Enter your **email address** and click **Email Password Reset Link**. Note that the link in the email you receive is only valid for short time, so ideally set the new password once after you receive the email without waiting. Password reset email with reset link Click the password reset link in the email you receive, then enter and confirm your **new password**. Reset password form with new password filled in # Activity log Source: https://docs.smartsend.io/fundamentals/activities Track all activities across your account and team Smart Send logs all relevant activities so you always have full visibility into what happens on your account. Every action is recorded with details about who performed it and when. ## Your activities Any user can view their own activity log under their profile. To view your personal activities, start by logging into the Smart Send platform . Go to **Profile** Profile menu with activity log highlighted Select the activity type you want to review. Security activities include login attempts, password changes, and session management. Security activity log showing login attempts and password changes Changes track modifications you have made to settings, carrier connections, and other configurations. Changes activity log showing setting modifications History shows your shipment bookings, label creation, and other operational activities. History activity log showing shipment bookings and label creation ## Team activities It is possible to see all relevant activities for a given team across all users on the team, providing full transparency on who did what and when. This is useful for accountability, audit trails, and troubleshooting. Only Team admins can see team activities across all users. Go to **Activities** Select the activity type you want to review. Security activities for all team members, including login attempts, password changes, and session management. Team security activity log showing login attempts across all members All changes made by team members to settings, carrier connections, and other configurations. Team changes activity log showing setting modifications by all members Complete history of shipment bookings, label creation, and other operational activities across the team. Team history activity log showing all operational activities # Billing Source: https://docs.smartsend.io/fundamentals/billing Manage billing and subscription settings ## Trial and plans We offer both a **free version** and several paid versions of our application. See our pricing page for current plans, their pricing and what features are included in which plan. **No credit card needed up front** - newly created accounts get a 10-day free trial with no strings attached 👍 ### Trial We provide a 10-day free trial for all new accounts. You can try out our features unlimited without any commitment for 10 days, without even entering your credit card information. #### What happens when the trial ends? Once the trial period ends, your account automatically continues on the **free version**. You can always upgrade to a paid plan at any time during the trial period or after it ends. The paid plan starts immediately after choosing it. #### How do I ensure everything works after my trial ends? To continue using Smart Send after your 10-day trial ends, simply sign up for one of our subscription plans before the trial period expires. This ensures uninterrupted access to all features and prevents any service disruption. ### Plans We offer different subscription plans depending on your needs. You can choose to commit either monthly or yearly, with a 40% discount when choosing yearly payment. The plans, features included in each plan, and prices can always be seen on our website. See our plans and features . ## Subscription status Your billing page shows the current status of your subscription. Here is what each status looks like: When no subscription is active, you are on the free version. Billing page showing no active subscription During your 10-day trial, you have access to all features. Billing page showing active trial period When you have an active subscription, your current plan and billing period are displayed. Billing page showing active subscription ## Create subscription Check our pricing page for a comparison of the different subscription plans and what features are included in which plans before signing up for a subscription. Once you have determined the proper subscription plan, start by logging into the Smart Send platform . Go to **Billing** Choose whether you want to pay **Monthly** or **Yearly** in the toggle at the top of the page Locate the plan that is suitable and click the **Subscribe** button Select the country in the dropdown and click the button **Add VAT number** Enter the *billing address* and the business VAT number (**must** be prefixed with the country code). Enter the *Business name* in the field **Extra Billing Information** Click the **Continue To Payment** button, fill out *Payment details* and complete *3D Secure payment* if requested The yearly payment provides a discount of \~40% compared to paying monthly. ## Manage subscription If you have an active subscription already, then you can easily change the plan and/or the billing period. That means you can either change a *Monthly Standard* subscription to a *Yearly Standard* subscription or you change a *Standard* subscription to a *Professional* subscription. To manage your subscription, start by logging into the Smart Send platform . Go to **Billing** and find the section **Current Subscription Plan** Click the **Change Subscription Plan** button (also if you just want to change the billing period) Choose whether you want to pay **Monthly** or **Yearly** in the toggle at the top of the page Click the **Subscribe** button next to the subscription plan you want to switch to **Prorating:** When you upgrade or downgrade your plan, you'll only be charged or credited for the price difference between the plans for the remaining billing period. *Upgrading a plan* takes effect immediately and you will be charged the difference between what you have already paid and what the new subscription package costs. *Downgrading* is effective immediately and you will be credited for the unused timeframe. The money is not refundable but the credit will be used to pay any future invoices, such as for the next billing period. Change subscription plan page ## Cancel a subscription You can easily cancel your subscription in the same place you created it. It is only possible to cancel the subscription through your own login to our webapp. It is not possible to cancel your subscription by contacting our support by mail or phone. To cancel your subscription, start by logging into the Smart Send platform . Go to **Billing** and find the section **Cancel Subscription** Click the **Cancel subscription** button Canceling your subscription may break existing shipping workflows and affect all team members. **Grace period:** Your account will continue to have access to all features in your current plan for the remainder of the already paid billing period. When the subscription period ends, your account will not be renewed and will revert to the free version. ## Update billing information Only team admins can manage billing settings and subscriptions. Payment details are the details available on invoices and receipts and consists of a billing address and a VAT number. A European VAT number is prefixed with the two-letter country code without a space. As an example then Smart Send's VAT number is `DK32342892` Payment details can be entered before signing up for a subscription plan and can also be updated while having an active subscription. To update payment details, start by logging into the Smart Send platform . Go to **Billing** In the section **Payment Information** click the **Update Payment Information** button Enter the payment information and click the **Update Payment Information** button Payment details form with billing address and VAT number ## Update payment method It is possible to add a payment method either before subscribing or when creating a new subscription. It is also possible to update payment information eg. when you get a new credit card. To update your payment method, start by logging into the Smart Send platform . Go to **Billing** and find the section **Payment Methods** Click the **Add Payment Method** button Fill out the form and click the **Save card** button Complete *3D secure payment* if requested Assign the new credit card as the default card by clicking the **Make default** link next to the new credit card Delete the old payment method by clicking the **Delete** icon next to the old payment method ## Invoices ### Receipt notification You can provide extra email addresses that will receive a copy of the invoice for each payment. To configure receipt notifications, start by logging into the Smart Send platform . Go to **Billing** and find the section **Invoice Email Addresses** Enter one or more comma-separated email addresses in the field **Email Addresses** and click **Save** ### Downloading historical receipts To download historical receipts, start by logging into the Smart Send platform . Go to **Billing** and find the section **Receipts** Click the **Download** button next to a receipt to download it as a PDF file Historical receipts list with download options ## Billed via invoice/EAN Some teams are not billed through the standard subscription system. Instead, billing is handled externally — either via invoice/EAN or through the Shopify App Store. If your team is billed externally, the billing page reflects this and you do not need to manage payment methods or subscriptions in Smart Send. Teams billed via invoice or EAN see their billing managed through an external invoicing system. Billing page showing external invoice/EAN billing Teams using the Shopify app are billed through the Shopify App Store. Subscription management is handled directly in Shopify. Billing page showing Shopify App Store billing # Carrier Connections Source: https://docs.smartsend.io/fundamentals/carrier-connections Autenticate Smart Send to manage shipments Carrier connections are added to the *Team* allowing all members to use the same carrier agreements and settings. ## What are carrier connections? Before you can start booking shipments, you need to connect your carrier agreement(s) to Smart Send. By adding your carrier agreement, you authorize Smart Send to book shipping labels on your behalf according to your agreement with the carrier. When a label is booked, a tracking number is assigned and the required shipping documents are created. Invoicing for the actual shipping cost is handled directly by the carrier according to your agreement with them. Smart Send simply registers the shipment with the carrier on your behalf. **Need a carrier agreement?** If you don't yet have a carrier agreement, we'll happily assist you with choosing the correct carrier for your needs. [Contact our support team](/troubleshooting/support) for personalized recommendations. ## Managing carrier connections For details on connecting to a particular carrier, see the carrier-specific guides below: To update or remove carrier connections, start by logging into the Smart Send platform . Go to **Settings** → **Carrier Accounts** to manage your connections. Find the connection you want to modify, then click **Edit** to update credentials or settings, or click **Remove** to delete the connection Carrier accounts page with edit and remove options Removing a carrier connection affects all team members and may break existing shipping workflows. # Print setup Source: https://docs.smartsend.io/fundamentals/print-setup Configure your printer for shipping labels with Smart Send Shipping labels generated through Smart Send can be printed on all printers. This guide covers setup for both dedicated label printers and standard A4 printers. ## Recommended setup We recommend using a [label printer](#label-printers) with the [Smart Send print client](#print-client-setup) configured for the best experience. The optimal label size depends on the carrier you use — read more under [label sizes by carrier](#label-sizes-by-carrier). A dedicated label printer is a relatively small investment that quickly pays for itself in saved time and materials. If you ship more than a few parcels per week, we strongly recommend getting one. Clicking the print button and confirming the browser's print dialog is not a big task in itself, but when you process many orders per day, avoiding that step entirely with automatic printing using the [print client](#print-client-setup) is a real timesaver. ### Printer types Read more on the different printer types below: A dedicated label printer prints directly onto adhesive labels that you peel off and stick to your parcel. This is the fastest and most convenient option for daily shipping. A standard A4 printer prints the label on regular paper. You then fold the paper and attach it to your parcel using tape or an adhesive document pouch. ## Buying printer and shipping labels Smart Send works with any printer and shipping labels. To make it easy, we have listed our suggestions below. For the reasoning behind label materials, quality grades, and warehouse labels, see [Labels](/knowledge/general/labels). ### Label printers There are many label printers available on the market. We recommend a thermal label printer with at least 203 DPI resolution. Here are our suggestions: | Printer | Description | | - | - | | **Zebra ZD421d** | Our recommended choice. Preferably with WiFi or Ethernet so you can print from multiple computers. | | **Zebra GK420d** | Older, more affordable version of the ZD421d. | | **Zebra ZD220** | A budget-friendly yet high-quality option if you don't have the biggest volume. | ### Label sizes by carrier Choose the right label size based on your carriers: | Carrier | 102x192mm | 100x150mm | | - | :-: | :-: | | **PostNord** | ✓ | | | **GLS** | ✓ | ✓ | | **DAO** | ✓ | ✓ | | **Bring** | ✓ | Some services | Use the coupon code **SmartSend** to get 10% discount on labels from [billige-fragtlabels.dk](https://www.billige-fragtlabels.dk/produkt/smart-send-luksus-fragtlabels-paa-rulle-102x192-mm). ## Print client setup The Smart Send print client is a desktop application that connects to your printer and automatically prints shipping labels and documents as they are generated. The print client must be running on a computer connected to the internet and the printer, and can be installed on multiple computers at the same time. The print client requires a paid plan. See our pricing page for details. To set up the print client, start by logging into the Smart Send platform . Go to **Settings** → **Print settings**, download and install the print client for your operating system (Mac or Windows). Print settings page with download links for Mac and Windows print client Copy the **username** and **password** shown on the *Print settings* page and paste them into the print client login form and then press **Sign in**. Print settings page showing the username and password credentials for the print client Print settings page showing the username and password credentials for the print client Once connected, select your **default label printer** and **default document printer**. You can use the **Print test** button to verify each printer works correctly. Print settings page showing configured label printer and document printer ## Printing manually If you are not using the print client, you can print shipping labels manually from your browser or a PDF viewer. The setup depends on your printer and the application you are printing from. ### Label printers When printing on a label printer, then remember to configure the correct paper size in the printer setting (most likely you use labels of sie **102x192mm** or **100x150mm**). If you are using a Zebra label printer, see the [Zebra printer setup guide](/fundamentals/print-setup/zebra-printer-setup) for instructions on configuring the paper size on Mac and Windows. ### A4 printers Set the print options to **2 pages per sheet** and **actual size (100% scale)**. This prints the label at the correct dimensions on one half of the A4 page, making it easy to fold and attach to your parcel. A4 print example showing two labels per page If you add a **copy** of your A4 printer and configure the default settings to 2 pages per sheet, you won't need to set these values on every print. Mac A4 printing settings in Preview Mac A4 printing settings in Google Chrome Mac A4 printing settings in Safari Mac A4 printing settings in Mozilla Firefox Windows A4 printing settings in Adobe Acrobat Reader Windows A4 printing settings in Google Chrome - Step 1 Windows A4 printing settings in Google Chrome - Step 2 Windows A4 printing settings in Microsoft Edge - Step 1 Windows A4 printing settings in Microsoft Edge - Step 2 Windows A4 printing settings in Mozilla Firefox ## Test labels Download sample labels below to test your printer setup: PostNord label (102x192mm) GLS label (102x192mm) DAO label (102x192mm) Bring label (102x192mm) # Zebra printer setup Source: https://docs.smartsend.io/fundamentals/print-setup/zebra-printer-setup Configure paper size and label size on Zebra label printers, and read their status lights Zebra label printers such as the ZD421d, ZD420d, ZD220, and GK420d need to be configured with the correct paper size before printing shipping labels. The paper size should be set to **102x192mm** or **100x150mm** depending on the labels you are using. ## Paper size on your computer The Zebra label printers are installed on Mac like any other printer. Make sure to select the **Zebra ZPL Label Printer** driver. To configure the paper size: 1. Open a [test label](/fundamentals/print-setup#test-labels) in the Preview app 2. Select **Print** 3. Under **Paper Size**, select "Manage Custom Sizes..." 4. Press **+** to add a new size 5. Specify the custom paper size: * Width: **102mm** * Height: **192mm** * Non-Printable Area: **User defined** * Top: **0 mm**, Right: **0 mm**, Bottom: **0 mm**, Left: **0 mm** 6. Double-click the paper size to rename it to "102x192mm" Once configured, select that printer when printing shipping labels. All Zebra label printers must be installed on Windows via the Zebra Setup Utilities . The setup process will prompt for the paper size, which should be set to **102x192mm** or **100x150mm**. Once the printer is configured, select that printer when printing shipping labels. ## Printer models ### Zebra GK420d If the green status light flashes and nothing prints, the printer is probably paused. Press **Feed** once. The light should turn solid green, and the printer resumes printing. The GK420d has no display. Everything you can set from the printer runs through the **Feed** button and the green status LED. With the printer switched on and the top cover closed, press and hold **Feed**. The green LED flashes in sequences — one flash, then two, then three, and so on. Release the button after the sequence you want and before the next one starts. Releasing after the second flash runs a standard auto media calibration. The printer detects the type and length of the labels you have loaded and adjusts its media sensors to match, feeding one to four labels while it works. Run it when you load a different label stock, or when the printer skips labels, prints across the gap between labels, or feeds blank labels. If auto calibration does not get it right, keep holding to the seventh flash instead. That runs a manual media calibration , a more extensive set of tests for stock the automatic routine cannot read. Releasing after the first flash prints the configuration status label — the printer's current settings, including darkness, print speed and label size. Print one before you change any setting so you have a record of where you started, and again afterwards to confirm the change stuck. On a GK420d with the internal print server option, the lower half of this label also lists network settings such as the IP address, which is the quickest way to find the address of a printer you cannot reach. Networked models print an additional network configuration label as well. Releasing after the sixth flash prints a succession of barcode patterns at increasing darkness levels. Press **Feed** once when the pattern is clear and legible, and the printer keeps that darkness. This is the on-printer alternative to the [Print Quality Assistant](/troubleshooting/print-quality#finding-the-right-settings-on-a-zebra-printer) when you have no computer or phone to hand. For the full list of sequences, see Zebra's Feed button modes . Holding **Feed** while you switch the printer **on** is a different mode and enters firmware download. Power the printer up first, then hold **Feed**. The GK420d has a single status light next to the **Feed** button. Its color and flash pattern tell you what the printer is doing. | Status light | Meaning | What to do | | - | - | - | | Off | The printer has no power. | Check that the printer is switched on and that the power cable is connected at both ends. | | Solid green | The printer is on and ready. | Nothing. | | Flashing green | The printer is receiving data. | Wait. The light turns solid green when all data has been received. | | Double flashing green | The printer is paused. | Press **Feed** to resume printing. | | Solid amber | The printer failed its power-on self-test, has a memory error, or the printhead needs to cool down. | Switch the printer off and on. If the light stays amber, switch it off for at least five minutes. If it still stays amber, the printer needs service. | | Flashing amber | The printhead is too hot. | Wait. The printer resumes automatically when the printhead has cooled down. | | Flashing red | The labels have run out, or the top cover is open. | Load new labels or close the top cover, then press **Feed**. | | Alternately flashing green and red | The printer needs service. | Contact your Zebra reseller. | | Flashing red, red, green | The printhead or motor has failed. | Contact your Zebra reseller. | | Flashing red, amber, green | The printer is defragmenting its memory. | Wait, and do not switch the printer off. | For details, see Zebra's status light descriptions . ### Zebra ZD420d and ZD421d If the **PAUSE** indicator lights orange, the printer is paused. Press **PAUSE** once to resume printing. If the **STATUS** indicator — the leftmost indicator — slowly flashes green, the printer is in sleep mode. Press **PAUSE** once to wake it. These models use button combinations rather than flash counts. Wait until the printer is ready — the **STATUS** indicator lit solid green — before pressing anything. With labels loaded and the top cover closed, press and hold **PAUSE** and **CANCEL** together for two seconds, then release. This is SmartCal media calibration: the printer feeds and measures several labels and adjusts its media sensing levels. The **STATUS** indicator returns to solid green when it succeeds. Run it when you load a different label stock. You do not need to repeat it for another roll of the same stock — a press or two of **FEED** is enough to resynchronise the printer. See Zebra's instructions for the ZD421 and ZD621 or the ZD420 and ZD620 . Press and hold **FEED** and **CANCEL** together for two seconds, then release. The printer prints both the printer configuration report and the network configuration report, then returns to ready. The network report covers the Ethernet, Wi-Fi and Bluetooth settings, so this is the quickest way to read the IP address of a printer you cannot reach from your computer. The printer report gives you the current darkness, speed and label size. See Zebra's instructions for the ZD421 and ZD621 or the ZD420 and ZD620 . The print quality report prints a range of test labels at speeds and darkness levels above and below the printer's current settings, so you can pick the best one by eye. 1. Print a configuration report with **FEED** + **CANCEL** so you know the current darkness value. 2. Switch the printer off. 3. Press and hold **FEED** while you switch the printer on. Release **FEED** when the status indicator is the only indicator lit. 4. Find the label that prints best. Bars and spaces should be distinct and the text complete — not so dark that small text fills in, and not so light that the bars lose definition. 5. Add the relative darkness value printed on that label to your current darkness value, and set the result on the printer. See printing a print quality report . Printers with the Wi-Fi option can join your wireless network. You set this up from the Zebra Printer Setup Utility app on your phone, which connects to the printer over Bluetooth. Have the network name and password ready before you start. Open the app and open the printer list. Under **Discovered Printers**, tap your printer. Printers found over Bluetooth show the Bluetooth icon. Discovered Printers list in the Zebra app with a ZD421 found over Bluetooth On the **Printer Setup** screen, tap **Connectivity Settings**. Printer Setup screen in the Zebra app with the Connectivity Settings menu item Tap **Wireless**. Connectivity Settings screen with the Wireless and Bluetooth options Turn on **Wireless**. Leave **IP Addressing Protocol** set to **All** and **Power Save Mode** turned off, then tap **Next**. Wireless screen with Wireless turned on, hostname, IP addressing protocol and power save mode Leave **Client ID** turned off and tap **Next**. Wireless Client ID screen with Client ID turned off Enter the name of your wireless network in **ESSID**, exactly as it appears on your other devices. Set **Security Mode** to match your router — most networks use **WPA PSK**. Leave **Wireless Band** set to **All**, then tap **Next**. Wireless Details screen with ESSID, Security Mode, Wireless Band, Country and Channel List On the **WPA Settings** screen, enter your Wi-Fi password and tap **Next**. Wireless Security screen with the WPA Settings password field Leave **Save settings to file** unchecked and tap **Apply**. The printer does not save the settings until you tap **Apply**. Apply Settings screen with the Save settings to file checkbox and the Apply button To confirm the printer is on the network, print a status page with **FEED** + **CANCEL** and check that the network configuration report shows an IP address for Wi-Fi. These models have five indicator lights above the buttons: **STATUS**, **PAUSE**, **DATA**, **SUPPLIES**, and **NETWORK**. The combination of lit indicators tells you what the printer is doing. | Indicators | Meaning | What to do | | - | - | - | | **STATUS** solid green | The printer is on and ready. | Nothing. | | **STATUS** slowly flashing green | The printer is in sleep mode. | Press **PAUSE** to wake the printer. | | **PAUSE** orange | The printer is paused. | Press **PAUSE** to resume printing. | | **DATA** flashing green | The printer is receiving data. | Wait. | | **STATUS** red and **SUPPLIES** red | The labels have run out. | Load new labels. | | **STATUS** red and **PAUSE** orange | The top cover is open. | Close the top cover. | For the full list, including network indicators, see Zebra's indicator light patterns for the ZD421 and ZD621 or the ZD420 and ZD620 . Reset the printer when a setting is wrong and you cannot find which one, or when you want to start over with a known configuration. Print a status page with **FEED** + **CANCEL** first so you have a record of the settings you are about to lose. This resets only the network settings, including Wi-Fi, to their factory defaults. Label size, darkness and other printer settings are kept. 1. Switch the printer off. 2. Press and hold **PAUSE** and **CANCEL** while you switch the printer on. 3. Release the buttons when the **STATUS** indicator is the only indicator lit. The printer does not print a report afterwards. To use Wi-Fi again, work through **Connect to Wi-Fi** on the **Settings** tab. See Zebra's instructions for the ZD421 and ZD621 or the ZD420 and ZD620 . This resets the printer settings, such as label size, darkness and print speed, to their factory defaults. Network settings are kept. 1. Switch the printer off. 2. Press and hold **PAUSE** and **FEED** while you switch the printer on. 3. Release the buttons when the **STATUS** indicator is the only indicator lit. 4. Set the label size again with **PAUSE** + **CANCEL** — see **Set the label size** on the **Settings** tab. See Zebra's instructions for the ZD421 and ZD621 or the ZD420 and ZD620 . The **RESET** button sits in a small hole on the underside of the printer. Press it with a paper clip or a similar small object while the printer is switched on. How long you hold it decides what happens. | Hold for | Result | | - | - | | 1 second or less | Nothing. | | 1 to 5 seconds | Factory reset. The printer resets its settings and prints a printer configuration report. | | 6 to 10 seconds | Network reset. The printer drops its network connection, resets the network settings to their factory defaults, and prints a printer and a network configuration report. | | More than 10 seconds | Nothing. The printer leaves reset mode without changing any settings. | After a factory reset, set the label size again with **PAUSE** + **CANCEL**. After a network reset, connect the printer to Wi-Fi again. See Zebra's description of the RESET button for the ZD421 and ZD621 or the ZD420 and ZD620 . Calibrating the label size on the printer is not the same as setting the paper size on your computer. Both need to match your labels, so work through [Paper size on your computer](#paper-size-on-your-computer) above as well. # Sender Information Source: https://docs.smartsend.io/fundamentals/sender-information Configure your company details and address information ## Why is this needed? Sender information is the company details that identify you as the shipper when creating shipments. This includes your company name, address, and contact details that are used when booking shipments with carriers and appear on shipping labels and tracking pages. The sender information you provide is primarily used to: * **Determine correct booking methods** - Different carriers may have specific requirements based on your location and business type * **Meet carrier requirements** - Most carriers require complete sender information during the booking process * **Display on shipping materials** - Your information appears on labels, tracking pages, and customer notifications **Information visibility**: The sender information you enter will likely be visible to shipment recipients. This information can appear in: * Customer tracking notifications * Public tracking pages * Shipping labels attached to packages * Carrier's internal systems Some carriers may use their own registry data for sender information on labels. Check your specific carrier's documentation for details about how your information appears. ## Configure sender address To set up your sender address, start by logging into the Smart Send platform . Go to **Sender Address** Enter your company details: * **Country** * **VAT Number** - Your business VAT number, if an EU based company then this will be prefixed with the country code eg `DK32342892` * **Company** - Your business name as it should appear on shipments * **Address line** * **Postal code** * **City** * **Contact person** - Name of the person handling shipments (you can use "Warehouse" or similar if preferred) * **Email address** - Email for shipping notifications and communications Sender address form with company details filled in Click **Save** to apply your changes All fields are required for proper shipment booking. If you prefer not to use a specific person's name, you can enter generic terms like "Warehouse," "Shipping Department," or "Customer Service" in the contact person field. ## Customs numbers For international shipments, you need to provide customs identification numbers that vary by country. These numbers are essential for proper customs clearance and compliance. Example of customs numbers: * **EORI number** - European Union registration and identification number * **EU VAT number** - European Union value-added tax identification number * **VOEC number** - Norwegian VAT on e-commerce number * **Country-specific numbers** - Other national customs and tax identification numbers ### Adding customs numbers To configure customs numbers for international shipping, start by logging into the Smart Send platform . Go to **Customs** Select the **country** for which you're adding a customs number Enter the **customs number** in the provided field Customs number form with number entered Click **Add** to save the number You can add multiple customs numbers for different countries. Each number is associated with a specific country and type, allowing you to ship internationally with the correct customs identification. # Settings Source: https://docs.smartsend.io/fundamentals/settings Manage shared team settings that affect all members You can modify your *personal preferences* under your [account settings](/fundamentals/account), while *team settings* affect all members of the team. ## Preferences The teams preferences are managed by first logging into the Smart Send platform . Go to **Settings** → **Preferences** Team settings with address book auto-save option enabled Set the preferences as you see fit and press **Save**. ### Automatic tracking emails Enable automatic tracking emails to notify customers when their shipments are booked. When enabled, customers receive an email containing their tracking number and a link to track their package immediately after booking. Example tracking email sent to customers after booking Tracking emails are sent immediately after a shipment is successfully booked with the carrier. ### Address book management Automatically add new receivers to your [address book](/features/address-book) to build a database of customer addresses. This feature is particularly useful when using the manual booking form, as it helps maintain a comprehensive list of shipping destinations. New receivers are automatically added to your address book when shipments are created through any booking method. # Team Source: https://docs.smartsend.io/fundamentals/team Manage team members settings and resources for perfect collaboration ## What are teams? A *Team* in Smart Send is a logical grouping where one or more users can access shared resources. *Teams* are what is also sometimes referred to as *Organizations* in other systems - we simply call them *Teams*. A *Team* provide access to shared resources including: * **Shipping labels** - All team members can create and manage labels * **Reports** - Shared access to shipping analytics and performance data * **Address book** - Common contact and delivery address database * **Carrier connections** - Shared carrier agreements and settings The main reason to have multiple users on a team is when multiple people need to access the Smart Send dashboard. All activities are logged on a per-user level, so you can track what each user did and when they did it. Every Smart Send account requires at least one team, even for individual users. When you create your account, a team is automatically created for you. You can add more team members later or continue using the team as a single-user workspace. ## Manage Team ### Rename Team To rename your team, start by logging into the Smart Send platform . Go to **Settings** → **Team Name** Enter the new name of the team Click **Save** The team name change takes effect immediately for all team members. The team name is only used internally for references and is not shown to shipment receivers in any way. The company information presented to end-customers can be configured under [sender information](/fundamentals/account). ### Team settings We have an entire page dedicated to configuring the settings for your team. See [Settings](/fundamentals/settings) for details. ### Delete Team Deleting a team permanently removes the team and all of its resources, including shipping labels, reports, the address book and carrier connections. Only the team owner can delete a team. Team admins cannot delete the team. Before you delete the team, download any data or information regarding the team that you wish to retain. To delete your team, start by logging into the Smart Send platform . Go to **Settings** → **General** and scroll down to the **Delete Team** section Click **Delete Team** Confirm the deletion in the dialog by clicking **Delete Team** Deleting a team cannot be undone. All resources and data belonging to the team are permanently deleted. ## Roles and permissions Smart Send offers different role levels to control what team members can access and modify: | Feature | Admin | Member | | - | - | - | | Create and manage shipments | ✅ | ✅ | | View shipping labels and orders | ✅ | ✅ | | View team shipping history | ✅ | ✅ | | Modify team settings | ✅ | ❌ | | Modify carrier connections | ✅ | ❌ | | Add and remove team members | ✅ | ❌ | | Manage billing and subscriptions | ✅ | ❌ | ## Managing team members Team members list showing current members and their roles ### Adding team members Only team admins can add new members to the team. To invite new members to your team, start by logging into the Smart Send platform . Go to **Settings** → **Members** → **Add Team Member** Fill out the user's **email address** and select the desired **role** for the new team member Team member invite form with email and role filled in Click **Add** The invited member receives an email with a link to join your team. They must accept the invitation to gain access. ### Removing team members To remove a member from your team, start by logging into the Smart Send platform . Go to **Settings** → **Members** Find the member you want to remove and click the **Remove** button next to their name Team member list with Remove button highlighted Confirm the removal in the dialog by clicking **Remove**. Confirmation dialog for removing a team member The member immediately loses access to the team and all associated resources. Removing a team member cannot be undone. The member will need to be re-invited to regain access. ### Changing member roles To update a member's role, start by logging into the Smart Send platform . Go to **Settings** → **Members** Find the member whose role you want to change Click **Edit** next to their name Select the new role from the dropdown Click **Save changes** # Webhooks Source: https://docs.smartsend.io/fundamentals/webhooks Receive real-time notifications when events occur in Smart Send Webhooks allow you to receive real-time HTTP POST notifications at your own endpoint when events occur in Smart Send. This is useful for building custom integrations, updating external systems, or triggering automated workflows. ## Create a webhook To set up a new webhook, start by logging into the Smart Send platform . Go to **Settings** → **Webhooks** Enter the **URL** of your endpoint and select the **events** you want to receive notifications for Webhook creation form with URL and events configured Click **Create** to save the webhook ## Delete a webhook To remove a webhook, start by logging into the Smart Send platform . Go to **Settings** → **Webhooks** Find the webhook you want to remove and click **Delete** next to it. Webhook list showing configured webhooks Confirm delition by clicking **Delete** in the confirmation modal Confirmation dialog for deleting a webhook Deleting a webhook stops all notifications to that endpoint. Any external systems relying on the webhook will no longer receive updates. # Introduction Source: https://docs.smartsend.io/index Get started with Smart Send—shipping made simple for everyone. Smart Send makes shipping easy for everyone—no matter your experience or the size of your business. Automate, optimize, and scale your e-commerce deliveries with tools designed to simplify the complex world of shipping. Currently viewing the documentation in English Læs vores dokumentation på dansk ## Get started quickly Begin with our Quick start guide to set up Smart Send and start shipping in minutes. ## Integrate with your platform We believe you should not have to juggle multiple systems to manage your shipping. For most small and medium-sized businesses, working directly from your webshop is the natural choice. That’s why we provide integrations that let you handle all your shipping tasks entirely within your webshop platform. Connect using our Shopify App Connect using our WooCommerce Plugin ## Explore key features Use Smart Send to streamline every part of your shipping workflow. Learn more about each feature: Offer flexible delivery to pickup locations. Simplify returns for you and your customers. ## Wanna learn more? Find in-depth articles about shipping, ecommerce, and best practices in our knowledge base. Explore detailed guides and articles to deepen your understanding of shipping and ecommerce. # Rest API Source: https://docs.smartsend.io/integrations/api Connect any system to Smart Send using our Rest API. ## Use the Smart Send API You can use the Smart Send REST API to create shipping labels and manage shipments from any external system. All official Smart Send integrations use this same API, ensuring reliability and consistency across platforms. The API is suitable for custom integrations, automation, or connecting third-party systems to Smart Send. See our OpenAPI specification ## Authentication All requests to the Smart Send API require authentication using an API token. The token must be included in the `Authorization` header as a Bearer token. ### Creating an API Token To create an API token, start by logging into the Smart Send platform . Go to **API Tokens** In the section **Create API Token** fill in a name which is only used for your internal classification Create API Token form with token name field Click the **Create** button which will open a modal displaying the newly generated *API Token* Modal displaying the newly generated API token Note that for security reasons then the API Token is only shown once. You can always delete it and create a new one if need be. ### Revoking an API Token To revoke an API token, start by logging into the Smart Send platform . Go to **API Tokens** In the section **Manage API Tokens** find the API Token you want to delete List of API tokens with delete option Click the **Delete** button next to the API Token you want to delete and confirm the action Confirmation dialog for deleting an API token Deleting an API Token is irreversible and can break any integrations that is using that API Token. # Overview Source: https://docs.smartsend.io/integrations/overview Smart Send integrations ## Integration options Use Smart Send integrations to bring shipping and delivery features directly into your webshop. Integrate with your checkout and order pages to provide a seamless experience for your customers, keeping your webshop at the center of the process. You can connect Smart Send to popular ecommerce platforms or use our REST API to build custom integrations for any system. # Collaborator access Source: https://docs.smartsend.io/integrations/shopify/collaborator-access Grant Smart Send team access to your Shopify store for support and configuration assistance Collaboration access allows Smart Send support staff to access your Shopify admin to help with app configuration, troubleshooting, and optimization. ## What is collaborator access? Collaborator access is a secure way to grant temporary access to your Shopify stores Admin without sharing your personal login credentials. When you grant collaborator access, Smart Send team members can: * **Install the Smart Send App** * **Configure the Smart Send App** * **Configure shipping** * **Configure product information like customs tariff codes** * **Troubleshoot integration issues** Collaborator access is **temporary** and can be revoked at any time. Smart Send staff will only access your store when working on your specific support case. ## How to grant Collaborator Access We can request access to your store once we know your unique myshopify url and have your *Collaborator Request Code*. See below how to get that information which should then be emailed to us. Once we have this information then we can request a *Collaborator Access* which you then need to accept before we are allowed access to your store. Learn more about collaborator accounts and codes in the official Shopify documentation. ### Find myshopify url Go to Settings > Domains in your Shopify admin. Find the domain ending with `.myshopify.com` in the list and copy the full url. Provide the myshopify url with us along with the Collaborator Request Code. ### Find the Collaborator Request Code From your Shopify admin, go to Settings > Users and permissions. Copy the 4-digit **Collaborator Request Code** Provide the 4-digit Collaborator Request Code to us. # Connection Source: https://docs.smartsend.io/integrations/shopify/connection Connect your Shopify store to your Smart Send account After installing the Smart Send app, you need to connect it to your Smart Send account to enable shipping functionality. You can either connect an existing Smart Send account or create a new account. ## Connect to existing account If you already have a Smart Send account: 1. **Open the Smart Send app** in your Shopify admin 2. **Enter your API token** in the connection form 3. **Click Connect** to link your store Your API token can be found in your Smart Send account under Settings > API tokens. ## Create new account If you don't have a Smart Send account yet: 1. **Open the Smart Send app** in your Shopify admin 2. **Select "Create new account"** 3. **Enter your email and password** for the new account 4. **Click Create and Connect** The password you enter will be used for your new Smart Send account. Make sure to use a strong, unique password. ## Connection interface The connection screen looks like this: Smart Send connection interface showing options for existing account or creating new account ## Next steps Once connected, you can: 1. [Configure your shipping methods](/integrations/shopify/shipping-methods) 2. [Set up pickup points](/integrations/shopify/pickup-points) (optional) 3. [Create shipping labels](/integrations/shopify/shipping-labels) Your Shopify store is now connected to Smart Send and ready for configuration. # Customs Source: https://docs.smartsend.io/integrations/shopify/customs Configure customs information in Shopify Selling internationally often requires you to provide customs information to the carrier for each shipment. This page explains how to properly fill out the customs information in Shopify. The Smart Send Shopify App will make sure to include a product's customs information properly when booking shipments. Read our detailed article for tips and guidance on customs requirements and best practices. ## Add product customs information To ensure smooth customs processing, you need to provide standardized customs information for each product. This includes the *Harmonized System (HS) code* and the *country of origin*. HS codes are internationally recognized numbers that classify traded products. Some countries require country-specific tariff codes, which often extend the standard HS code system. We recommend adding a general 6-digit HS code to all products and region-specific codes to the destinations where this is required. ### Add general customs information Follow the steps below for adding general customs information to a product in Shopify or see Shopify's documentation on HS codes for more information. Go to the **Product** in Shopify Admin or the **Variant** if the product has multiple variants. Locate the **Shipping** section. Select the *country of origin* and search for the appropriate *Harmonized System (HS) code*. Adding general customs information for a product in Shopify ### Add region-specific customs information After adding the *general customs information* click the three dots next to the **Harmonized System (HS) code** field and select **Add HS codes by country/region**. **USA**: As of August 2025, the United States requires a country-specific HS code following a policy change by the Trump administration. This means that you should add country-specific tariff codes for the US. These codes are often 10 digits and extend on the HS codes. Adding country/region specific tariff information for a product in Shopify Adding US specific tariff information for a product in Shopify # Fulfillments Source: https://docs.smartsend.io/integrations/shopify/fulfillments Order fulfilling in Shopify ## Introduction to fulfillments Fulfillments in Shopify track the process of delivering items from an order to the customer. When you fulfill an order, you confirm that products have been shipped, and Shopify updates the order status accordingly. Fulfillments can be managed manually or automatically, and are essential for keeping customers informed about their order progress. ## One or more fulfillments Most orders should have just a single fulfillment containing all of the order's items, which are shipped at once in a single physical parcel. Sometimes however, an order may be split into multiple fulfillments for different reasons which could be: * Some products are not in stock and the products that are in stock should be shipped now * All products cannot fit into a single physical package and needs to be split into multiple packages * Items are stocked at different locations and shipped separately. ## Shipping fulfillments When booking a shipment, each fulfillment represents a single physical box that needs to be shipped, and each will receive its own tracking number. If you book multiple fulfillments at the same time, they are treated as a shipment with multiple parcels—known as *colli*. This approach is often more cost-effective than booking each fulfillment separately, as carriers may offer discounted rates for multi-parcel shipments. # Installation Source: https://docs.smartsend.io/integrations/shopify/installation Install the Smart Send app from the Shopify App Store Install the Smart Send app through the Shopify App Store to get started with automated shipping and pickup points. ## Install from Shopify App Store Go to your Shopify admin . Click **Apps** in the left sidebar. Shopify Apps page showing the App Store Search for "Smart Send" in the marketplace or click here to go directly to our app . Smart Send app listing in Shopify App Store Click **Add app** to begin the installation process. Review the app permissions and click **Install app** to complete the installation. Smart Send app installation confirmation ## Next steps Once the app is installed, you'll need to: 1. [Connect to your Smart Send account](/integrations/shopify/connection) 2. [Configure your shipping methods](/integrations/shopify/shipping-methods) The app is now installed but not yet configured. Continue with the connection setup to link your Shopify store with your Smart Send account. # Introduction Source: https://docs.smartsend.io/integrations/shopify/introduction Connect your Shopify store with Smart Send for automated shipping and pickup points The Smart Send Shopify app integrates your store with our shipping platform, enabling you to: * **Show pickup points** directly in your checkout process * **Create shipping labels** automatically from orders * **Track shipments** with automatic customer notifications ## How it works Once installed and configured, the Smart Send app: 1. **Displays pickup points** during checkout (if enabled) 2. **Links your shipping rates** to specific carrier methods 3. **Generates shipping labels** when you fulfill orders 4. **Sends tracking information** to customers automatically ## Prerequisites Before you begin, ensure you have: * A Shopify store with admin access * A Smart Send account (or create one during setup) * For pickup points: Shopify Advanced plan or higher (required for Carrier Service API) ## Getting started Follow these steps to set up your Shopify integration: 1. [Install the Smart Send app](/integrations/shopify/installation) 2. [Connect to your Smart Send account](/integrations/shopify/connection) 3. [Configure shipping methods](/integrations/shopify/shipping-methods) 4. [Set up pickup points](/integrations/shopify/pickup-points) (optional) Install the Smart Send app from the Shopify App Store Connect your Shopify store to your Smart Send account Configure how orders map to carrier shipping methods Enable customers to choose pickup locations during checkout # Pickup points Source: https://docs.smartsend.io/integrations/shopify/pickup-points Enable customers to choose pickup locations during checkout Pickup points allow customers to select their preferred pickup location during checkout, providing flexibility and convenience for package delivery. ## How pickup points work Pickup points are presented to the customer during checkout. The plugin will automatically determine the closest pickup points based on the shipping address entered by the customer. Show closest pickup points in Shopify Since each pickup point is a separate shipping method in Shopify then the list should be keep relatively short which is why we currently only show the 5 closest pickup points. ## Requirements Pickup points require Shopify's **Carrier Service API**, which is only available on certain Shopify plans: ### Shopify plan requirements | Plan | Carrier Service | Pickup points available | | - | - | - | | Basic | ❌ Not included | ❌ No | | Grow | ✅ Included (⚠️ Only for yearly Shopify subscribers) | ✅ Yes (⚠️ Only for yearly Shopify subscribers) | | Advanced | ✅ Included | ✅ Yes | | Plus | ✅ Included | ✅ Yes | | Development store | ✅ Included | ✅ Yes | Shopify previously named the **Grow** plan "Shopify". On the **Grow** plan, third-party carrier-calculated shipping — which pickup points rely on — is only included when you're on a **yearly** Shopify subscription. See Shopify's documentation on third-party carrier-calculated shipping for details. If you don't have Carrier Service activated, you'll see a "Failed to create carrier service" error when trying to enable pickup points. ### Error handling If you see this error, you need to upgrade your Shopify plan: Error message showing failed to create carrier service Shopify doesn't provide discount information to third-party shipping calculators like Smart Send. The subtotal value excludes any discounts or gift cards applied at checkout. ## Setup pickup points Once you have Carrier Service activated, follow these steps. Open the Smart Send app in your Shopify admin Navigate to **Pickup points** in the top menu Configure shipping rates based on cart weight and subtotal Save your configuration ## Configuration options You can set up different shipping rates for pickup points based on: * **Cart weight** - Different rates for different weight ranges * **Order subtotal** - Different rates based on order value * **Geographic zones** - Different rates for different regions ## Customer experience When customers reach checkout: 1. They see pickup point options for their selected shipping method 2. They can browse and select from available locations 3. The pickup point information is included in their order 4. They receive confirmation with pickup point details ## Next steps After setting up pickup points: 1. [Create shipping labels](/integrations/shopify/shipping-labels) for orders with pickup points 2. [Set up tracking notifications](/integrations/shopify/tracking) for customers # Shipping labels Source: https://docs.smartsend.io/integrations/shopify/shipping-labels Create and print shipping labels directly from Shopify orders Create shipping labels for your orders directly from the Shopify admin interface. The Smart Send app automatically generates labels using the configured shipping methods. ## Create a shipping label This is how it looks to print shipping labels: Creating shipping labels from Shopify Go to the Shopify order you want to create a label for. Click the **More actions** button at the top and then select the **Generate label** action. Print the generated label on your printer. ## How label creation works The Smart Send app handles label creation intelligently: ### Existing fulfillments If fulfillments without tracking numbers already exist: * Creates a shipping label for each fulfillment (as separate colli) * Uses the existing fulfillment structure ### New fulfillments If no fulfillments exist: * Automatically creates a new fulfillment * Adds all unfulfilled items to the fulfillment * Generates the shipping label ## Label information Each shipping label includes: * **Carrier information** (Bring, PostNord, etc.) * **Tracking number** for shipment tracking * **Delivery address** from the order * **Return address** from your Smart Send settings * **Package details** (weight, dimensions) * **Service type** (standard, express, etc.) ## Printing labels After generating a label: 1. **Review the label preview** in the popup window 2. **Click "Print label"** to open the print dialog 3. **Select your printer** and print settings 4. **Print the label** on standard label paper Make sure you have the correct label size for your printer. Most carriers accept standard 4x6 inch labels. ## Label management * **Labels are automatically saved** to your Smart Send account * **Tracking numbers are added** to the Shopify fulfillment * **Customers receive tracking notifications** automatically * **Labels can be re-printed** from your Smart Send dashboard if needed ## Troubleshooting If you encounter issues creating labels: 1. **Check your shipping method configuration** - ensure rates are properly linked 2. **Verify carrier connection** - make sure your carrier is connected in Smart Send 3. **Check order details** - ensure shipping address is complete and valid 4. **Review fulfillment status** - check if items are properly fulfilled For more help, see our [troubleshooting guide](/integrations/shopify/troubleshooting). # Shipping methods Source: https://docs.smartsend.io/integrations/shopify/shipping-methods Configure how Shopify shipping rates map to Smart Send carrier methods Configure your shipping methods to link Shopify shipping rates with specific carrier shipping methods. This ensures the correct shipping method is used when creating labels for orders. ## How shipping methods work Your Shopify **shipping rates** determine the price customers pay during checkout. When you create a shipping label, Smart Send needs to know which **carrier shipping method** to use for that order. By linking each Shopify shipping rate to a Smart Send shipping method, the system automatically selects the correct carrier method for each order. ## Add Shopify shipping rates If you don't have shipping rates set up yet, follow these steps in your Shopify admin . If you want to enable pickup points for customers during checkout, see [how to set up pickup points](/integrations/shopify/pickup-points) instead. Shopify shipping settings page Click **Manage rates** next to the shipping zone you want to configure. Shipping zones with manage rates option Click **Add rate**. Add rate button in shipping configuration Select **Set up your own rates** and configure the settings as needed. Shipping rate configuration form For free shipping, create two rates with different conditions. For example: one rate for orders 0-100 EUR and another for orders 100+ EUR. Learn more about Shopify shipping rates . ## Link shipping methods After setting up your Shopify shipping rates, you need to link each rate to a Smart Send shipping method. Open the Smart Send app in your Shopify admin Navigate to the shipping methods section For each shipping rate, select the corresponding Smart Send shipping method from the dropdown Shipping rates linked to Smart Send shipping methods ## Configuration example Here's how the linking works: | Shopify shipping rate | Smart Send shipping method | Result | | - | - | - | | Standard shipping (5-7 days) | Bring Standard | Orders with this rate use Bring Standard when creating labels | | Express shipping (1-2 days) | Bring Express | Orders with this rate use Bring Express when creating labels | | Free shipping (over 100 EUR) | Bring Standard | Free shipping orders still use Bring Standard method | ## Next steps After configuring your shipping methods: 1. [Set up pickup points](/integrations/shopify/pickup-points) (optional) 2. [Create your first shipping label](/integrations/shopify/shipping-labels) # Tracking Source: https://docs.smartsend.io/integrations/shopify/tracking Automatic tracking notifications for customers The Smart Send app automatically adds tracking information to fulfillments and sends notifications to customers when shipping labels are created. ## How tracking works When you create a shipping label through the Smart Send app: 1. **Tracking number is added** to the Shopify fulfillment 2. **Shopify sends an "Order Shipped" email** to the customer 3. **Email includes tracking number and tracking link** 4. **Customer can track their package** using the provided link ## Customer notifications Customers receive an automated email that includes: * **Tracking number** for their shipment * **Direct tracking link** to the carrier's website * **Estimated delivery information** (when available) * **Pickup point details** (if applicable) ### Email example Shopify order shipped email with tracking information ## Admin notifications In your Shopify admin, you'll see: * **"Smart Send sent a Shipping Update email to \[customer]"** message * **Tracking number displayed** in the fulfillment details * **Link to carrier tracking** for real-time updates The email notification is sent by Shopify, not Smart Send. You can customize the email template in your Shopify settings under Settings > Notifications. ## Tracking information sources Tracking data comes from: * **Carrier APIs** - Real-time tracking updates * **Smart Send platform** - Centralized tracking management * **Shopify integration** - Automatic fulfillment updates ## Customizing notifications To customize the tracking email template: 1. **Go to Settings > Notifications** in your Shopify admin 2. **Find "Order shipped"** in the customer notifications list 3. **Click "Customize"** to edit the template 4. **Add or modify tracking information** as needed 5. **Save your changes** ## Tracking status updates The system automatically updates tracking status when: * **Package is picked up** by the carrier * **Package is in transit** with location updates * **Package is out for delivery** * **Package is delivered** or available for pickup * **Delivery exceptions** occur (failed delivery, etc.) ## Troubleshooting tracking If customers aren't receiving tracking notifications: 1. **Check email settings** - ensure customer email is valid 2. **Verify notification settings** - confirm "Order shipped" notifications are enabled 3. **Check spam folders** - tracking emails might be filtered 4. **Review fulfillment status** - ensure tracking number was added correctly For more help, see our [troubleshooting guide](/integrations/shopify/troubleshooting). # Troubleshooting Source: https://docs.smartsend.io/integrations/shopify/troubleshooting Common issues and solutions for the Smart Send Shopify app This guide helps you resolve common issues with the Smart Send Shopify integration. ## Connection issues ### App won't connect to Smart Send **Symptoms:** * Connection fails when entering API token * "Invalid credentials" error message **Solutions:** 1. **Verify your API token** - Check that you're using the correct token from your Smart Send account 2. **Check token permissions** - Ensure the token has the necessary permissions 3. **Try creating a new token** - Generate a fresh API token in your Smart Send settings 4. **Check account status** - Verify your Smart Send account is active ### New account creation fails **Symptoms:** * "Failed to create account" error * Account creation process hangs **Solutions:** 1. **Check email format** - Ensure you're using a valid email address 2. **Use strong password** - Password must meet security requirements 3. **Try different email** - The email might already be registered 4. **Check internet connection** - Ensure stable connection during setup ## Pickup points issues ### "Failed to create carrier service" error **Symptoms:** * Error when trying to enable pickup points * Carrier service creation fails **Solutions:** 1. **Check your Shopify plan** - You need Advanced plan or higher 2. **Verify Carrier Service access** - Contact Shopify support if you have Advanced+ plan 3. **Try disabling and re-enabling** - Sometimes a refresh helps 4. **Check app permissions** - Ensure the app has necessary permissions Failed to create carrier service error message ### Pickup points not showing during checkout **Symptoms:** * Customers don't see pickup point options * Pickup points section is missing **Solutions:** 1. **Check shipping zone configuration** - Ensure pickup points are enabled for the correct zones 2. **Verify shipping rates** - Pickup points need specific shipping rate configuration 3. **Test with different addresses** - Some areas might not have pickup points available 4. **Check carrier coverage** - Verify the carrier has pickup points in the customer's area ## Shipping label issues ### Can't create shipping labels **Symptoms:** * "Print shipping label" option is missing * Label creation fails with error **Solutions:** 1. **Check shipping method configuration** - Ensure rates are properly linked to Smart Send methods 2. **Verify carrier connection** - Make sure your carrier is connected in Smart Send 3. **Check order details** - Ensure shipping address is complete and valid 4. **Review fulfillment status** - Check if items are properly fulfilled ### Labels print incorrectly **Symptoms:** * Labels are cut off or misformatted * Print quality is poor **Solutions:** 1. **Check label size** - Ensure you're using the correct label dimensions (usually 4x6 inches) 2. **Update printer drivers** - Make sure your printer drivers are up to date 3. **Check print settings** - Verify scaling and orientation settings 4. **Try different browser** - Some browsers handle printing differently ## Tracking issues ### Customers not receiving tracking emails **Symptoms:** * No tracking notifications sent * Customers report missing tracking information **Solutions:** 1. **Check email settings** - Ensure customer email addresses are valid 2. **Verify notification settings** - Confirm "Order shipped" notifications are enabled in Shopify 3. **Check spam folders** - Tracking emails might be filtered 4. **Review email templates** - Ensure tracking information is included in the template ### Tracking numbers not updating **Symptoms:** * Tracking shows "Label created" but no updates * Status doesn't change after pickup **Solutions:** 1. **Check carrier connection** - Verify the carrier is properly connected 2. **Wait for carrier pickup** - Tracking updates only after the carrier scans the package 3. **Contact carrier support** - Some packages might have tracking issues 4. **Check Smart Send dashboard** - Verify tracking is working in your Smart Send account ## General troubleshooting ### App appears broken or unresponsive **Solutions:** 1. **Refresh the page** - Simple page refresh often resolves display issues 2. **Clear browser cache** - Clear cookies and cache for your Shopify admin 3. **Try different browser** - Test with Chrome, Firefox, or Safari 4. **Disable browser extensions** - Some extensions can interfere with app functionality ### Performance issues **Symptoms:** * App loads slowly * Actions take a long time to complete **Solutions:** 1. **Check internet connection** - Ensure stable, fast connection 2. **Close other browser tabs** - Free up system resources 3. **Restart browser** - Clear memory and refresh browser state 4. **Check Shopify status** - Verify Shopify services are running normally ## Getting help If you continue to experience issues: 1. **Check our status page** - Verify Smart Send services are operational 2. **Contact support** - Reach out to our support team with specific error details 3. **Include error screenshots** - Visual information helps diagnose issues faster 4. **Provide order details** - Include order numbers and specific steps that led to the error When contacting support, include your Shopify store URL, order numbers (if applicable), and any error messages you're seeing. # Developer reference Source: https://docs.smartsend.io/integrations/woocommerce/developers The Smart Send plugin's hooks, code snippets, metadata and API for customizations and reading WooCommerce order delivery and booking data. Customize the Smart Send plugin with WordPress filters and actions in your own webshop. Hooks let you adjust checkout, delivery choices and booking behavior without editing the plugin’s code. Use the [metadata reference](#metadata) to understand stored values and the [API](#api) to read pickup points, shipping methods and bookings for a WooCommerce order. Use the [code snippets](#code-snippets) for ready-to-use customizations. ## Filters and actions Choose the stage that matches your customization. Each stage and hook below links to its detailed contract and example. | Stage | Purpose | Relevant hooks and filters | | - | - | - | | [Checkout availability and rates](#checkout-availability-and-rates) | Control availability, free shipping and additional rates. | [`woocommerce_shipping_smart_send_shipping_is_available`](#woocommerce-shipping-smart-send-shipping-is-available), [`woocommerce_shipping_smart_send_shipping_is_free_shipping`](#woocommerce-shipping-smart-send-shipping-is-free-shipping), [`woocommerce_smart_send_shipping_shipping_add_rate`](#woocommerce-smart-send-shipping-shipping-add-rate) | | [Pickup points](#pickup-points) | Adjust lookup, ordering, labels and pickup-point timeouts. | [`smart_send_pickup_point_search_params`](#smart-send-pickup-point-search-params), [`smart_send_pickup_point_list`](#smart-send-pickup-point-list), [`smart_send_pickup_point_label`](#smart-send-pickup-point-label), [`smart_send_pickup_point_timeout`](#smart-send-pickup-point-timeout) | | [Shipping label booking](#shipping-label-booking) | Control shipping methods, colli allocation and weight, order data, booking requests and events. | [`smart_send_fulfillment_shipping_methods`](#smart-send-fulfillment-shipping-methods), [`smart_send_delivery_details`](#smart-send-delivery-details), [`smart_send_parcel_default_weight`](#smart-send-parcel-default-weight), [`smart_send_order_receiver`](#smart-send-order-receiver), [`smart_send_receiver_phone`](#smart-send-receiver-phone), [`smart_send_payload_receiver`](#smart-send-payload-receiver), [`smart_send_payload_items`](#smart-send-payload-items), [`smart_send_payload_totals`](#smart-send-payload-totals), [`smart_send_shipment_freetext`](#smart-send-shipment-freetext), [`smart_send_booking_request`](#smart-send-booking-request), [`smart_send_booking_completed`](#smart-send-booking-completed), [`smart_send_booking_failed`](#smart-send-booking-failed) | | [Order side effects and final result](#order-side-effects-and-final-result) | Control documents, notes, tracking and status, and read the final result. | [`smart_send_fulfillment_save_documents`](#smart-send-fulfillment-save-documents), [`smart_send_fulfillment_order_note`](#smart-send-fulfillment-order-note), [`smart_send_fulfillment_tracking`](#smart-send-fulfillment-tracking), [`smart_send_fulfillment_order_status`](#smart-send-fulfillment-order-status), [`smart_send_order_fulfilled`](#smart-send-order-fulfilled) | | [Plugin settings](#plugin-settings) | Adjust the API connection, logging, links and plugin update message. | [`smart_send_api_endpoint`](#smart-send-api-endpoint), [`smart_send_sslverify`](#smart-send-sslverify), [`smart_send_logging`](#smart-send-logging), [`smart_send_configuration_url`](#smart-send-configuration-url), [`smart_send_support_url`](#smart-send-support-url), [`ss_in_plugin_update_message`](#ss-in-plugin-update-message) | WooCommerce and Subscriptions integration points are listed in the [integration reference](#integration-reference). `$is_return` is `false` for outbound and `true` for return wherever the signature includes it. A combined booking can run a callback twice, once for each direction. Events with a `Booked_Shipment` instead expose `$shipment->is_return()`. `smart_send_booking_completed` means Smart Send has created one shipment. It fires before the plugin saves its booking information to the WooCommerce order. Use `smart_send_order_fulfilled` when you need the final order-side result, including an outbound success with a return failure. Signatures list the filter value first, followed by context arguments; `→` states the required return type. Actions have no useful return value. Examples are independent customizations, not a file to install in full. For complete, ready-to-use customizations, see [Code snippets](#code-snippets). Open a hook and select **Description** for its contract or **Example** for the PHP customization and usage guidance. ### Checkout availability and rates **Filter** · `(bool $is_available, array $package, Smart_Send\Shipping_Method\Method $method) → bool` Runs after the method's shipping-class and customer-role checks. Return `false` to hide this Smart Send instance for the package; return the incoming value to preserve its existing restrictions. Returning `true` does not create a price outside the weight table. Checkout only; no booking or order updates. This example additionally limits the method to Denmark. ```php theme={null} add_filter( 'woocommerce_shipping_smart_send_shipping_is_available', function ( bool $available, array $package, \Smart_Send\Shipping_Method\Method $method ): bool { return $available && 'DK' === ( $package['destination']['country'] ?? '' ); }, 10, 3 ); ``` **Filter** · `(bool $is_free, array $package, Smart_Send\Shipping_Method\Method $method) → bool` Runs after the configured minimum/coupon condition is evaluated, when the cart weight is allowed. `true` selects **Flat fee cost**, which is not necessarily zero; `false` uses normal weight-price calculation. It does not override zone, role, class or weight availability. The example disables the flat-fee branch, preserving ordinary rate calculation. ```php theme={null} add_filter( 'woocommerce_shipping_smart_send_shipping_is_free_shipping', '__return_false' ); ``` **Action** · `(Smart_Send\Shipping_Method\Method $method, array $rate) → void` Runs at the end of a Smart Send rate calculation. `$rate` contains `id`, `label`, `cost`, `meta_data` and `package`. It can run even when weight rules produced no rate, so check `$method->rates` before deriving an extra option. The example adds 10 in the store currency to an existing rate, before WooCommerce tax calculation. It preserves the original service metadata; it does not book a different carrier service. ```php theme={null} add_action( 'woocommerce_smart_send_shipping_shipping_add_rate', function ( \Smart_Send\Shipping_Method\Method $method, array $rate ): void { if ( ! isset( $method->rates[ $rate['id'] ] ) ) { return; } $rate['cost'] = (float) $method->rates[ $rate['id'] ]->get_cost() + 10; $rate['id'] .= ':extra-handling'; $rate['label'] = 'Delivery with extra handling'; $method->add_rate( $rate ); }, 10, 2 ); ``` ### Pickup points **Filter** · `(array $params) → array` Runs before a nearest-point API lookup when a token is configured. Keys: `carrier`, `country`, `postal_code`, `street` (strings) and `city` (string or null). Return all keys. The API determines result count; trim results with `smart_send_pickup_point_list`. Search parameters do not rewrite the customer's order address. This example removes surrounding postal-code whitespace. ```php theme={null} add_filter( 'smart_send_pickup_point_search_params', function ( array $params ): array { $params['postal_code'] = trim( $params['postal_code'] ); return $params; } ); ``` **Filter** · `(Smart_Send\Delivery\Pickup_Point[] $points, array $params) → Smart_Send\Delivery\Pickup_Point[]` Runs after a non-empty API result has become typed points, before session caching/display. Return a reindexed list of compatible `Pickup_Point` objects. The plugin removes objects that do not match the lookup's carrier/country. It does not call this filter for an empty API result. Reordering influences **Select Default** only when no compatible explicit customer choice exists; this is not a way to revoke an existing compatible selection. This example puts points with a Saturday opening interval first, preserving the existing distance order within each group, then offers at most five. It does not invent or modify pickup addresses. An unknown opening-hours list is treated as not known to be open Saturday. ```php theme={null} add_filter( 'smart_send_pickup_point_list', function ( array $points, array $params ): array { $saturday = array(); $other = array(); foreach ( $points as $point ) { $open_saturday = false; foreach ( $point->get_opening_hours() as $interval ) { if ( 'saturday' === $interval['day'] ) { $open_saturday = true; break; } } if ( $open_saturday ) { $saturday[] = $point; } else { $other[] = $point; } } return array_slice( array_merge( $saturday, $other ), 0, 5 ); }, 10, 2 ); ``` **Expected result:** for nearest-first points A (Monday), B (Saturday), C (Saturday), D (unknown), the order is B, C, A, D. With **Select Default** enabled and no explicit selection, B becomes the default. A compatible point explicitly chosen by the customer remains selected even if it is outside the new top five. The filter is for offering/reordering candidates, not invalidating that choice. Test with a refreshed address because results can be cached in the checkout session. **Filter** · `(string $label, Smart_Send\Delivery\Pickup_Point $point) → string` Runs when a pickup label is formatted, after **Dropdown format**. Return plain text, not HTML or pre-escaped entities. Each renderer escapes its output. This affects display, not the point's identity or saved address. Identity is the exact agent number together with carrier and country. Append the agent number to the existing label in Classic Checkout and Checkout Block. Return unescaped plain text: an ampersand in a company name must remain `&`, not `&`. The renderer handles escaping. The saved point does not change. ```php theme={null} add_filter( 'smart_send_pickup_point_label', function ( string $label, \Smart_Send\Delivery\Pickup_Point $point ): string { return $label . ' (#' . $point->get_agent_no() . ')'; }, 10, 2 ); ``` **Expected result:** `Corner Shop & Kiosk (#00123)`. Leading zeroes in the agent number are preserved. Verify both checkout types and confirm the selected point on the order. **Filter** · `(int $seconds) → int|float` Default: 4 seconds. Runs for both nearest-point and single-point API requests. Return a positive timeout in seconds. Increasing it can lengthen checkout waits; it does not guarantee results. The example allows six seconds. ```php theme={null} add_filter( 'smart_send_pickup_point_timeout', function ( int $seconds ): int { return 6; } ); ``` ### Shipping label booking Customize the order-page shipping methods, delivery details, colli allocations and parcel weights, recipient and order data, and the booking request. The hooks below follow the booking flow and include success and failure events. Use [`smart_send_delivery_details`](#smart-send-delivery-details) to change item allocations and [`smart_send_parcel_default_weight`](#smart-send-parcel-default-weight) to adjust calculated parcel weights when booking. **Filter** · `(array $carriers, WC_Order $order, bool $is_return) → array` Runs separately for the outbound and return service lists on the order screen. Shape: each carrier has `code`, `name`, `services`; each service has `code`, `name`, `addons` (currently an empty array). A booking method is `carrier_service`, for example `postnord_agent`. Return the filtered carrier list. The resolved selected method is always re-added if missing, even if you return `[]`. This narrows the UI; it is not an authorization boundary. Enforce booking rules in `smart_send_delivery_details`. The example offers only PostNord for outbound, subject to that selected-method safeguard. ```php theme={null} add_filter( 'smart_send_fulfillment_shipping_methods', function ( array $carriers, \WC_Order $order, bool $is_return ): array { if ( $is_return ) { return $carriers; } return array_values( array_filter( $carriers, function ( array $carrier ): bool { return 'postnord' === $carrier['code']; } ) ); }, 10, 3 ); ``` **Filter** · `(Smart_Send\Delivery\Delivery_Details $details, WC_Order $order, bool $is_return) → Smart_Send\Delivery\Delivery_Details` Runs once per attempted direction after stored configuration, resolved service and submitted overrides are merged, before pickup validation and booking. Return the details object. Use `set_shipping_method()`, `set_pickup_point()` or `set_parcel_plan()`; use `clear_pickup_point()` for an explicit clear in a partial details object. Throw `Smart_Send\Booking\Exceptions\Booking_Exception` to reject a business rule before booking. Filter changes affect this booking; they are not automatically persisted. See [delivery details and persistence](#delivery-details-and-persistence). This narrowly scoped example splits an outbound order with exactly one line and three whole units into two colli: 2 + 1. It leaves return bookings and any existing or submitted parcel plan unchanged. Adapt the matching rule to the products and packing process you actually use before enabling it. The IDs passed to `add_item()` are **WooCommerce order-item IDs**, not product or variation IDs. Measurements below are in centimeters. Weight remains automatic; the [packaging-weight example](#smart-send-parcel-default-weight) can therefore apply to each colli. ```php theme={null} add_filter( 'smart_send_delivery_details', function ( \Smart_Send\Delivery\Delivery_Details $details, \WC_Order $order, bool $is_return ): \Smart_Send\Delivery\Delivery_Details { if ( $is_return || null !== $details->get_parcel_plan() ) { return $details; } $items = array_values( $order->get_items() ); if ( 1 !== count( $items ) || 3.0 !== (float) $items[0]->get_quantity() ) { return $details; } $item = $items[0]; $first = new \Smart_Send\Delivery\Parcel_Spec(); $first->add_item( $item->get_id(), 2, $item->get_name() ) ->set_length( 30 )->set_width( 20 )->set_height( 15 ); $second = new \Smart_Send\Delivery\Parcel_Spec(); $second->add_item( $item->get_id(), 1, $item->get_name() ) ->set_length( 30 )->set_width( 20 )->set_height( 10 ); $plan = new \Smart_Send\Delivery\Parcel_Plan(); $plan->add_spec( $first )->add_spec( $second ); return $details->set_parcel_plan( $plan ); }, 10, 3 ); ``` **Expected result:** an order line with ID 701 and quantity 3 becomes allocations `(701, 2)` and `(701, 1)`. All three units are allocated once. For a 0.50 kg product and 0.20 kg packaging per colli, the weights are 1.20 kg and 0.70 kg. Missing product weight still needs correction or an explicit parcel weight. The generated plan controls this booking; filter output is not automatically saved as the order's parcel configuration. See [Colli shipments](/integrations/woocommerce/shipping-labels#colli-shipments) for the merchant workflow. **Filter** · `(float $weight, Smart_Send\Delivery\Parcel_Spec $spec, WC_Order $order) → float` Runs **when booking** each parcel without an explicit weight. Input is the combined product weight of the items and quantities allocated to that parcel, in **kg**, possibly zero. The filter changes the booking’s parcel weight; it does not change item allocations, the calculated weight displayed on the order page, or the saved parcel plan. Return a finite usable weight including packaging. An explicit `Parcel_Spec::set_weight()` or order-screen weight bypasses the filter. An allocated deleted product with unknown weight produces a validation error before the filter; provide an explicit positive parcel weight instead. There is no direction argument; the filter can run for outbound and return. Add 0.20 kg of packaging to each parcel whose weight is computed from its items. The filter uses kilograms regardless of the shop's catalog weight unit. It can run for both outbound and return parcels. ```php theme={null} add_filter( 'smart_send_parcel_default_weight', function ( float $weight, \Smart_Send\Delivery\Parcel_Spec $spec, \WC_Order $order ): float { return $weight + 0.20; }, 10, 3 ); ``` **Expected result:** items totaling 1.50 kg are booked with a parcel weight of 1.70 kg. The calculated order-page display remains 1.50 kg. An explicitly entered parcel weight of 2.00 kg stays 2.00 kg; it already represents the total including packaging. A deleted product with unknown weight still requires an explicit positive parcel weight. This filter does not change checkout weight-band prices or saved product weights. **Filter** · `(array $shipping_address, int $order_id) → array` Runs when reading the order's shipping address, before phone/email fallback and conversion to receiver data. Uses WooCommerce address keys such as `first_name`, `last_name`, `company`, `address_1`, `address_2`, `postcode`, `city`, `country`, and optional `phone`/`email`. Return the complete address. The second argument is the order ID, not a `WC_Order`. Both directions use the same reading stage; this filter does not save the address. ```php theme={null} add_filter( 'smart_send_order_receiver', function ( array $address, int $order_id ): array { $address['country'] = strtoupper( $address['country'] ); return $address; }, 10, 2 ); ``` **Filter** · `(string|null $phone, WC_Order $order) → string|null` Runs after choosing shipping phone, or billing phone when shipping and billing countries match, then trimming whitespace. Return a phone number or `null`. No direction flag is supplied. The example removes spaces without guessing a country calling code. ```php theme={null} add_filter( 'smart_send_receiver_phone', function ( ?string $phone, \WC_Order $order ): ?string { return null === $phone ? null : preg_replace( '/\s+/', '', $phone ); }, 10, 2 ); ``` **Filter** · `(array $receiver, WC_Order $order) → array` Runs after receiver mapping and phone/email fallback. Keys: `company`, `name_line1`, `name_line2`, `address_line1`, `address_line2`, `postal_code`, `city`, `country` (strings), `phone` and `email` (string or null). Return all keys. This is plugin-level data, not a raw HTTP payload, and it is used in either direction. The example removes accidental whitespace around a non-null email. ```php theme={null} add_filter( 'smart_send_payload_receiver', function ( array $receiver, \WC_Order $order ): array { if ( null !== $receiver['email'] ) { $receiver['email'] = trim( $receiver['email'] ); } return $receiver; }, 10, 2 ); ``` **Filter** · `(array[] $items, WC_Order $order) → array[]` Runs after reading one row per order line, before allocation to parcels, in either direction. Return the same identities and valid quantities; use `smart_send_delivery_details` to distribute them. See the [item row schema](#item-rows). Net/tax values are discounted **line totals**, not unit prices. The example trims a customs description without fabricating one for a deleted product. ```php theme={null} add_filter( 'smart_send_payload_items', function ( array $items, \WC_Order $order ): array { foreach ( $items as &$item ) { if ( is_string( $item['description'] ) ) { $item['description'] = trim( $item['description'] ); } } unset( $item ); return $items; }, 10, 2 ); ``` **Filter** · `(array $totals, WC_Order $order) → array` Runs after order totals have been derived and negative net/tax values clamped to zero. Return all keys in the [totals schema](#totals). Later values are used as returned; preserve reconciliation and non-negative amounts. Order-level fees are included in shipment totals, whereas parcel totals contain allocated merchandise. The example logs only the currency and order total, leaving the booking values unchanged. ```php theme={null} add_filter( 'smart_send_payload_totals', function ( array $totals, \WC_Order $order ): array { wc_get_logger()->info( 'Booking value', array( 'source' => 'my-shop-shipping', 'currency' => $totals['currency'], 'total' => $totals['total_net_amount'] + $totals['total_tax_amount'], ) ); return $totals; }, 10, 2 ); ``` **Filter** · `(string|null $freetext, WC_Order $order) → string|null` Runs when reading text for the label, in either direction. Input is the customer's order comment when **Include order comment on label** is enabled, otherwise `null`. Return text or `null`; do not return HTML. This does not control WooCommerce order-history notes. The example omits customer comments from labels. ```php theme={null} add_filter( 'smart_send_shipment_freetext', '__return_null' ); ``` **Filter** · `(Smart_Send\Booking\Shipment $shipment, WC_Order $order, bool $is_return) → Smart_Send\Booking\Shipment` Runs after data extraction and parcel construction, immediately before translation into the API request. Return a `Shipment`. Prefer earlier filters for allocation/weight rules because this is after parcel validation. The example adds an outbound-only internal reference; it does not update the order or persist delivery settings. ```php theme={null} add_filter( 'smart_send_booking_request', function ( \Smart_Send\Booking\Shipment $shipment, \WC_Order $order, bool $is_return ): \Smart_Send\Booking\Shipment { if ( ! $is_return ) { $shipment->set_internal_reference( 'WEB-' . $order->get_order_number() ); } return $shipment; }, 10, 3 ); ``` **Action** · `(Smart_Send\Booking\Booked_Shipment $booked, Smart_Send\Booking\Shipment $request, WC_Order $order) → void` Runs once per successfully booked direction, after the API response is mapped and before order-side persistence or document copying. Use `$booked->is_return()` for direction. It does not mean the whole outbound/return run succeeded, and a document's local copy is not ready yet. Do not throw from the listener: a shipment already exists. Use `smart_send_order_fulfilled` when you need stored order results. Record the shipment identity and direction without relying on order metadata that has not yet been saved. This callback runs separately for outbound and return, including when outbound succeeds and return later fails. ```php theme={null} add_action( 'smart_send_booking_completed', function ( \Smart_Send\Booking\Booked_Shipment $booked, \Smart_Send\Booking\Shipment $request, \WC_Order $order ): void { wc_get_logger()->info( 'Smart Send shipment booked', array( 'source' => 'my-shop-shipping', 'order_id' => $order->get_id(), 'shipment_id' => $booked->get_shipment_id(), 'direction' => $booked->is_return() ? 'return' : 'outbound', ) ); }, 10, 3 ); ``` **Expected result:** one entry per created shipment in WooCommerce logs under `my-shop-shipping`. No entry is added for a rejected booking. This example does not create another shipment, save an order note or send customer notifications. For an external integration, use the shipment ID as its idempotency key and handle delivery failures without throwing from this callback. **Action** · `(Smart_Send\Booking\Exceptions\Booking_Exception $exception, Smart_Send\Booking\Shipment $request, WC_Order $order) → void` Runs when the booking API call throws a handled HTTP client exception, just before it is rethrown as `Booking_Exception`. Read `getMessage()`, `errors()` (field → message list), and `response_id()` (string or null). This is not an all-failures event: local allocation, pickup or delivery validation can fail before the API call. No direction boolean is provided. The example logs a response ID, without address data or field values. ```php theme={null} add_action( 'smart_send_booking_failed', function ( \Smart_Send\Booking\Exceptions\Booking_Exception $error, \Smart_Send\Booking\Shipment $request, \WC_Order $order ): void { wc_get_logger()->warning( 'Smart Send booking failed', array( 'source' => 'my-shop-shipping', 'order_id' => $order->get_id(), 'response_id' => $error->response_id(), ) ); }, 10, 3 ); ``` ### Order side effects and final result **Filter** · `(bool $save, Smart_Send\Booking\Booked_Shipment $shipment, WC_Order $order) → bool` Runs after successful booking and persistence of submitted delivery overrides, before document-copy attempts and shipment-history persistence. Defaults to **Save a copy of the PDF** for either direction. Return `false` to skip local copies. A copy failure adds a warning; the booked shipment remains fulfilled and document URLs fall back to Smart Send. The example keeps documents remote. ```php theme={null} add_filter( 'smart_send_fulfillment_save_documents', '__return_false' ); ``` **Filter** · `(string $note_html, Smart_Send\Booking\Booked_Shipment $shipment, WC_Order $order) → string` Runs after shipment history is saved, before the native order note is added. Return safe HTML/text, or `''` to omit the note. Notes are saved using `WC_Order::add_order_note()` when the caller requests a note. WooCommerce's history refreshes after a page reload; the Smart Send result can appear immediately. The example writes a short plain-text note for either direction. ```php theme={null} add_filter( 'smart_send_fulfillment_order_note', function ( string $note, \Smart_Send\Booking\Booked_Shipment $shipment, \WC_Order $order ): string { return esc_html( 'Smart Send shipment ' . $shipment->get_shipment_id() ); }, 10, 3 ); ``` **Filter** · `(bool $push, Smart_Send\Booking\Booked_Shipment $shipment, WC_Order $order) → bool` Runs after the order-note step, before forwarding parcel tracking to the optional WooCommerce Shipment Tracking plugin. Default: `true` outbound, `false` return. This does not create live tracking updates or install that plugin. Returning `false` leaves the booked shipment's own tracking data intact. The example disables forwarding. ```php theme={null} add_filter( 'smart_send_fulfillment_tracking', '__return_false' ); ``` **Filter** · `(string|false $status, Smart_Send\Booking\Booked_Shipment $shipment, WC_Order $order) → string|false` Runs after tracking. Return a registered WooCommerce status such as `wc-completed`, or `false` to leave the order unchanged. Default: configured **Set order status after label print** for outbound; `false` for return. Updating status can trigger WooCommerce/third-party status hooks and emails. The example prevents Smart Send from changing status for either direction. ```php theme={null} add_filter( 'smart_send_fulfillment_order_status', '__return_false' ); ``` **Action** · `(WC_Order $order, Smart_Send\Fulfillment\Fulfillment_Result $result) → void` Runs once after all attempted directions and their order-side steps, when at least one direction was fulfilled. A total failure does not fire it. It can carry outbound success alongside return failure. Inspect `get_outbound_shipment()`, `get_return_shipment()`, `shipments()`, `get_steps($shipment)`, `get_order_note_id($shipment)` and `get_warnings($shipment)`. `get_validation_errors($is_return)` and `get_error_details($is_return)` describe failures. See the [booked result contracts](#read-booked-results); do not assume every optional step ran. Use this event when you need saved note IDs, final document URLs or the outcome of both booking directions. The example records successful shipments and separately flags a failed return. It does not assume that every optional side effect was enabled. ```php theme={null} add_action( 'smart_send_order_fulfilled', function ( \WC_Order $order, \Smart_Send\Fulfillment\Fulfillment_Result $result ): void { foreach ( $result->shipments() as $shipment ) { $label = $shipment->label_document(); wc_get_logger()->info( 'Smart Send order updated', array( 'source' => 'my-shop-shipping', 'order_id' => $order->get_id(), 'shipment_id' => $shipment->get_shipment_id(), 'note_id' => $result->get_order_note_id( $shipment ), 'has_document' => null !== $label, 'warning_count' => count( $result->get_warnings( $shipment ) ), ) ); } if ( null !== $result->get_return_error() ) { wc_get_logger()->warning( 'Return booking needs attention', array( 'source' => 'my-shop-shipping', 'order_id' => $order->get_id(), ) ); } }, 10, 2 ); ``` **Expected result:** a combined success logs two shipments. An outbound success/return failure logs the outbound shipment and one warning; retry only the failed direction. If a local PDF copy fails, the shipment is still listed and `warning_count` increases. When using document URLs in your own integration, read `$label->download_url()` only after checking `$label` is not null. Do not log private document URLs. This event does not run when every attempted direction fails. ### Plugin settings **Filter** · `(string $host) → string` Runs when constructing the API client. Default host: `https://app.smartsend.io`. Return the scheme and hostname only, for example `https://app.smartsend.dev`; the client appends the API version path. Applies to authentication, pickup lookup and booking. Use credentials for the selected environment; a staging site alone does not change this host. Use an explicitly designated test shop and credentials for the Smart Send sandbox. Confirm the intended sandbox account and carrier setup before booking. The host filter affects token validation, pickup lookup and booking together. 1. Set WordPress `WP_ENVIRONMENT_TYPE` to `staging` in the test shop's configuration. 2. Add the callback below to your customization plugin. 3. Enter and save the token for the sandbox environment, then validate it. 4. Check checkout separately, then book a synthetic test order in that configured environment. The callback changes the host only for a staging environment. Do not append `/api/v1/` or another API path; the client adds it. ```php theme={null} add_filter( 'smart_send_api_endpoint', function ( string $host ): string { if ( 'staging' !== wp_get_environment_type() ) { return $host; } return 'https://app.smartsend.dev'; } ); ``` **Expected result:** staging requests use `https://app.smartsend.dev` plus the client-managed API path; production retains the incoming host. Keep TLS certificate verification enabled. Remove the sandbox override and configure the intended production credentials when setting up a production shop. The plugin's automated-test mocks are test-suite fixtures, not a merchant-facing demo switch. **Filter** · `(bool $verify) → bool` Default: `true`. Runs when preparing WordPress HTTP request options. Keep certificate verification enabled for production and sandbox. The example explicitly preserves verification; fix an invalid server certificate or CA configuration rather than disabling verification. ```php theme={null} add_filter( 'smart_send_sslverify', '__return_true' ); ``` **Filter** · `(string $message, string $level, array $context) → string|null|false` Runs only for entries enabled by the plugin's logging policy. `$level` is a WooCommerce log level; `$context` includes `source` (`smart-send-logistics`) and plugin version. Return a rewritten message, or `null`/`false` to suppress the entry. This filter cannot enable disabled entries or replace the context by returning an array. The example suppresses debug messages only. ```php theme={null} add_filter( 'smart_send_logging', function ( string $message, string $level, array $context ) { return 'debug' === $level ? null : $message; }, 10, 3 ); ``` **Filter** · `(string $url) → string` Runs when building the Smart Send row's configuration guide link on the WordPress plugins screen. Default: `https://smartsend.io/woocommerce/configuration/`. Return a URL, not HTML. It does not change the API endpoint. The example routes the link to the local Smart Send settings screen. ```php theme={null} add_filter( 'smart_send_configuration_url', function ( string $url ): string { return admin_url( 'admin.php?page=wc-settings&tab=shipping§ion=smart_send_shipping' ); } ); ``` **Filter** · `(string $url) → string` Runs for the support link on the WordPress plugins screen. Default: `https://smartsend.io/support/`. Return a URL; the renderer escapes it. The example points to a support page on your own shop; create that page before using the snippet. ```php theme={null} add_filter( 'smart_send_support_url', function ( string $url ): string { return home_url( '/shipping-help/' ); } ); ``` **Filter** · `(string $notice_html) → string` Runs when Smart Send displays a major-version update notice in the plugins list. Return trusted, safe HTML: the filtered result is rendered as HTML without another sanitization pass. The example appends static guidance. This is a notice hook, not a shipping/booking hook. ```php theme={null} add_filter( 'ss_in_plugin_update_message', function ( string $notice ): string { return $notice . '

Review your shop customizations before updating.

'; } ); ```
### Data contracts The six order-reading filters above do not receive a return flag. They read the same order data for either direction. `smart_send_payload_totals` and `smart_send_shipment_freetext` run only when item data is non-empty. Use `smart_send_booking_request` for a final direction-specific adjustment. `smart_send_payload_items` receives these keys on each row: | Keys | Type and meaning | | - | - | | `order_item_id` | Integer WooCommerce order-line identity; use it for allocation. | | `product_id`, `variation_id` | Integer catalog references; they do not identify an order line. | | `sku`, `name` | Strings. A missing product has an empty SKU and the translated name **Deleted**. | | `description`, `hs_code`, `country_of_origin` | Product customs strings, or null when the product is unavailable. | | `quantity` | Order-line quantity; parcel allocation requires positive whole quantities. | | `unit_weight` | Float in kg, or null for an unavailable product. | | `total_net_amount`, `total_tax_amount` | Non-negative floats for the entire discounted line. | | `product_missing` | Boolean indicating an unavailable catalog product/variation. | `smart_send_payload_totals` receives floats `subtotal_net_amount`, `subtotal_tax_amount`, `shipping_net_amount`, `shipping_tax_amount`, `total_net_amount`, `total_tax_amount`, plus the string `currency`. Subtotal excludes shipping and includes non-shipping order fees. Ordinarily subtotal + shipping = total, separately for net and tax; clamping negative values can take precedence. Including-tax amounts are net + tax. Preserve those relationships if changing totals. ### Integration reference This background describes platform hooks used by Smart Send, not additional public Smart Send customization hooks. The three WooCommerce-prefixed checkout hooks above are intended for customizations. The table below explains relevant platform hooks that Smart Send **listens to**. Their broader contracts belong to WooCommerce; replacing the Smart Send callbacks is not the supported customization route. | Platform hook and arguments | How Smart Send uses it | | - | - | | `woocommerce_shipping_methods` — filter `(array $methods)` | Registers the Smart Send shipping method; returns the method registry. | | `woocommerce_package_rates` — filter `(WC_Shipping_Rate[] $rates, array $package)` | Sorts calculated rates when configured; returns rate objects keyed by rate ID. Use a later priority for your own final ordering. | | `woocommerce_after_shipping_rate` — action `(WC_Shipping_Rate $rate, int $index)` | Renders pickup selection beside the selected rate in Classic Checkout. | | `woocommerce_after_checkout_validation` — action `(array $data, WP_Error $errors)` | Validates Classic Checkout pickup selection and adds errors. | | `woocommerce_checkout_create_order` — action `(WC_Order $order, array $data)` | Adds the verified Classic Checkout pickup choice before order persistence. | | `woocommerce_store_api_checkout_update_order_from_request` — action `(WC_Order $order, WP_REST_Request $request)` | Validates/persists the Checkout Block choice through the Store API. | | `woocommerce_order_details_after_order_table` — action `(WC_Order $order)` | Displays the saved pickup point on order details. | | `woocommerce_email_after_order_table` — action `(WC_Order $order, bool $sent_to_admin, bool $plain_text, WC_Email $email)` | Displays the saved pickup point in HTML/plain-text email; the Smart Send callback consumes the first three arguments. | | `woocommerce_product_options_shipping` — action `()` | Adds customs fields to the product's Shipping tab. | | `woocommerce_admin_process_product_object` — action `(WC_Product $product)` | Sets submitted customs metadata on the product object before WooCommerce saves it. | Smart Send also uses WooCommerce's Blocks registration and HPOS compatibility mechanisms. These registration details and the experimental Blocks data-attribute filter are implementation details; use the pickup filters above for shared behavior across checkout types. Smart Send uses these Subscriptions filters at priority 10: | Filter | Arguments and return | Smart Send behavior | | - | - | - | | `wc_subscriptions_renewal_order_data` | `(array $metadata) → array` | Excludes completed booking outcomes and copied tracking records. | | `wcs_renewal_order_items` | `(WC_Order_Item[] $items, WC_Order $renewal, WC_Subscription $subscription) → array` | Carries exact source item identities through item copying. | | `wcs_renewal_order_created` | `(WC_Order $renewal, WC_Subscription $subscription) → WC_Order` | Rebinds allocations to new order-item IDs and removes temporary markers; ambiguous plans require a reset. | Keep these filters' return values intact when adding your own Subscriptions callbacks. This integration follows the Subscriptions 4.9+ data-copy API; a test of the hook contract is not a test of the commercial plugin's scheduled renewal/payment engine. See [compatibility](/integrations/woocommerce/introduction#compatibility). These snippets were executed against the plugin's real PHP value objects with isolated WordPress/WooCommerce test doubles. Checks cover plain-text labels, result order/limits, automatic versus explicit weight, colli allocation and outbound/return event results. They do not prove carrier acceptance, your other plugins' interactions or an external system's delivery. Verify the affected workflow on your configured test shop before deploying. ## Code snippets Use these code snippets to change how the Smart Send plugin books shipping labels, for example to add packaging weight or split heavy orders into several parcels. Each snippet uses one of the [hooks above](#filters-and-actions) and works on its own. Code snippets are an advanced feature for developers. A mistake in PHP code can stop your webshop from working. Test a snippet on a staging site before you add it to your live webshop. All snippets require Smart Send for WooCommerce 9.0 or later. To add a snippet: 1. Open the snippet below and select the **Code** tab. 2. Copy the code into one of these places: * The `functions.php` file of a child theme . * A small custom plugin. * A snippets plugin such as Code Snippets . 3. Change the settings at the top of the snippet to match your webshop. 4. Create a shipping label for a test order and check the result. The weight booked for a parcel is the weight of the products in it. The box, filling and tape add weight too, and the carrier can charge extra when a parcel is heavier than booked. This snippet adds a fixed packaging weight to every parcel and books parcels without a product weight with a minimum weight instead of zero. A parcel weight that you enter on the order screen is booked as entered; the snippet only changes calculated weights. **Settings:** `$packaging_weight` is the weight in kg added to every parcel. `$minimum_weight` is the lowest weight in kg a parcel is booked with. **Hook:** [`smart_send_parcel_default_weight`](#smart-send-parcel-default-weight) ```php add-packaging-weight.php theme={null} add_filter( 'smart_send_parcel_default_weight', function ( float $weight, \Smart_Send\Delivery\Parcel_Spec $parcel, WC_Order $order ) { $packaging_weight = 0.3; // kg added to every parcel. $minimum_weight = 0.5; // kg; the lightest weight a parcel is booked with. return max( $weight + $packaging_weight, $minimum_weight ); }, 10, 3 ); ``` Carriers send text messages to the receiver when the parcel is on its way or ready at the pickup point, and they need the phone number in international format. Customers usually type a local number such as `12 34 56 78`. This snippet adds the calling code of the shipping country (`+4512345678`) and removes spaces, dashes and brackets. Numbers that already start with `+` or `00` are only cleaned up. A leading 0 is removed, so `070-123 45 67` in Sweden becomes `+46701234567`. **Hook:** [`smart_send_receiver_phone`](#smart-send-receiver-phone) ```php add-country-code-to-phone-numbers.php theme={null} add_filter( 'smart_send_receiver_phone', function ( $phone, WC_Order $order ) { if ( null === $phone || '' === $phone ) { return $phone; } $number = preg_replace( '/[^0-9+]/', '', $phone ); if ( 0 === strpos( $number, '+' ) ) { return $number; } if ( 0 === strpos( $number, '00' ) ) { return '+' . substr( $number, 2 ); } $country = $order->get_shipping_country() ? $order->get_shipping_country() : $order->get_billing_country(); $calling_code = WC()->countries->get_country_calling_code( $country ); // For example "+45". if ( '' === $calling_code ) { return $phone; // Unknown country: leave the number alone. } return $calling_code . ltrim( $number, '0' ); }, 10, 2 ); ``` The shipping label has room for a short text. This snippet prints the order number and a short packing list on the label, for example `Order 1234: 2 x HOODIE-L, 1 x CAP`, so whoever opens the parcel or handles a return can match it to the order. When **Include order comment on label** is enabled in the Smart Send settings, the customer's comment is added after the packing list. **Settings:** `$max_length` is the maximum number of characters. Keep the text short, as carriers may cut off long texts. **Hook:** [`smart_send_shipment_freetext`](#smart-send-shipment-freetext) ```php print-order-number-on-label.php theme={null} add_filter( 'smart_send_shipment_freetext', function ( $freetext, WC_Order $order ) { $max_length = 100; // Characters. $products = array(); foreach ( $order->get_items() as $item ) { $product = $item->get_product(); $products[] = $item->get_quantity() . ' x ' . ( $product && $product->get_sku() ? $product->get_sku() : $item->get_name() ); } $text = sprintf( 'Order %s: %s', $order->get_order_number(), implode( ', ', $products ) ); if ( $freetext ) { $text .= ' - ' . $freetext; } return mb_substr( $text, 0, $max_length ); }, 10, 2 ); ``` Carriers have a maximum weight per parcel, typically 20 kg for pickup points and 30-35 kg for home delivery. When you create the label, this snippet distributes the order's items over as few parcels as possible without exceeding the maximum weight. A 45 kg order is booked as three parcels without splitting it by hand. The heaviest item is placed first, and each item goes into the first parcel it fits in. A single item heavier than the maximum gets a parcel of its own, which the carrier may refuse. The snippet makes no changes when: * You have already split the order into parcels on the order screen. * All items fit in one parcel. * A product on the order has been deleted, so its weight is unknown. * The label is a return label. Set `$split_return_labels` to `true` to split return labels too. **Reset to one parcel** on the order screen removes your own split, and the snippet then splits the order again. To book a heavy order as one parcel anyway, enter the parcel weight on the order screen. The booked parcels are shown under **Booked shipments** on the order screen. **Settings:** `$max_parcel_weight` is the maximum weight in kg of the items in one parcel. If you also use [Add packaging weight to every parcel](#add-packaging-weight), lower `$max_parcel_weight` by the packaging weight. **Hook:** [`smart_send_delivery_details`](#smart-send-delivery-details) ```php split-orders-into-parcels-by-weight.php theme={null} add_filter( 'smart_send_delivery_details', function ( \Smart_Send\Delivery\Delivery_Details $details, WC_Order $order, bool $is_return ) { $max_parcel_weight = 20.0; // kg of items per parcel. $split_return_labels = false; if ( $is_return && ! $split_return_labels ) { return $details; } // The merchant's own split always wins. $plan = $details->get_parcel_plan(); if ( $plan && ! $plan->is_empty() ) { return $details; } // Every unit of every order line, heaviest first. $units = array(); foreach ( $order->get_items() as $item ) { $product = $item->get_product(); if ( ! $product ) { return $details; // A deleted product: its weight is unknown. } $weight = (float) wc_get_weight( (float) $product->get_weight(), 'kg' ); $quantity = $item->get_quantity(); for ( $i = 0; $i < $quantity; $i++ ) { $units[] = array( 'order_item_id' => $item->get_id(), 'name' => $item->get_name(), 'weight' => $weight, ); } } usort( $units, function ( $a, $b ) { return $b['weight'] <=> $a['weight']; } ); // First fit decreasing. $parcels = array(); foreach ( $units as $unit ) { $placed = false; foreach ( $parcels as $index => $parcel ) { if ( $parcel['weight'] + $unit['weight'] <= $max_parcel_weight ) { $parcels[ $index ]['weight'] += $unit['weight']; $parcels[ $index ]['units'][] = $unit; $placed = true; break; } } if ( ! $placed ) { $parcels[] = array( 'weight' => $unit['weight'], 'units' => array( $unit ), ); } } if ( count( $parcels ) < 2 ) { return $details; } // A parcel lists each order line once, with the number of its units in that parcel. $plan = new \Smart_Send\Delivery\Parcel_Plan(); foreach ( $parcels as $index => $parcel ) { $lines = array(); foreach ( $parcel['units'] as $unit ) { $id = $unit['order_item_id']; if ( ! isset( $lines[ $id ] ) ) { $lines[ $id ] = array( 'quantity' => 0, 'name' => $unit['name'], ); } ++$lines[ $id ]['quantity']; } $spec = ( new \Smart_Send\Delivery\Parcel_Spec() )->set_reference( (string) ( $index + 1 ) ); foreach ( $lines as $order_item_id => $line ) { $spec->add_item( $order_item_id, $line['quantity'], $line['name'] ); } $plan->add_spec( $spec ); } return $details->set_parcel_plan( $plan ); }, 10, 3 ); ``` Each time a shipping label is created, from the order screen or the bulk action, this snippet sends the shipment and its label to an endpoint of your own, such as a warehouse system, an ERP, a print server, Zapier or Make. The outbound label and the return label are sent as separate requests. The request body is JSON: ```json Request body theme={null} { "event": "label_created", "order_id": 1234, "order_number": "1234", "direction": "outbound", "shipment": { "shipment_id": "...", "carrier": "postnord", "tracking_code": "...", "parcels": [], "documents": [] }, "label": { "format": "pdf", "url": "https://...", "content_base64": "JVBERi0..." } } ``` `direction` is `outbound` or `return`. `label.content_base64` contains the label file, so the receiving system does not have to download it. If the plugin cannot download the file, the value is `null` and the receiving system uses `label.url` instead. The request is sent while you wait for the label, so keep the endpoint fast. A failed request never cancels the label. The error is written to the WooCommerce log with the source `smart-send-snippets` and added as a private note on the order. **Settings:** `$endpoint` is the URL that receives the requests. **Hook:** [`smart_send_order_fulfilled`](#smart-send-order-fulfilled) ```php send-labels-to-webhook.php theme={null} add_action( 'smart_send_order_fulfilled', function ( WC_Order $order, \Smart_Send\Fulfillment\Fulfillment_Result $result ) { $endpoint = 'https://example.com/webhooks/smart-send'; // Change to your own endpoint. // One request per label: the outbound label and, when one was created, the return label. foreach ( $result->shipments() as $shipment ) { $label = $shipment->label_document(); $content = null; if ( $label ) { $download = wp_safe_remote_get( $label->get_url(), array( 'timeout' => 30, 'redirection' => 3, 'limit_response_size' => 20 * 1024 * 1024 + 1 ) ); $bytes = wp_remote_retrieve_body( $download ); if ( ! is_wp_error( $download ) && 200 === wp_remote_retrieve_response_code( $download ) && '' !== $bytes && strlen( $bytes ) <= 20 * 1024 * 1024 ) { $content = base64_encode( $bytes ); } } $body = wp_json_encode( array( 'event' => 'label_created', 'order_id' => $order->get_id(), 'order_number' => $order->get_order_number(), 'direction' => $shipment->is_return() ? 'return' : 'outbound', 'shipment' => $shipment->to_array(), 'label' => $label ? array( 'format' => $label->get_format(), 'url' => $label->download_url(), 'content_base64' => $content, ) : null, ) ); $response = wp_remote_post( $endpoint, array( 'timeout' => 10, 'headers' => array( 'Content-Type' => 'application/json', ), 'body' => $body, ) ); $status = wp_remote_retrieve_response_code( $response ); if ( is_wp_error( $response ) || $status < 200 || $status >= 300 ) { $reason = is_wp_error( $response ) ? $response->get_error_message() : 'HTTP ' . $status; wc_get_logger()->warning( sprintf( 'Could not send shipment %s of order %d to %s: %s', $shipment->get_shipment_id(), $order->get_id(), $endpoint, $reason ), array( 'source' => 'smart-send-snippets' ) ); $order->add_order_note( sprintf( 'The shipping label %s could not be sent to %s: %s', $shipment->get_shipment_id(), $endpoint, $reason ) ); } } }, 10, 2 ); ``` ## Metadata Smart Send stores different data on the order, its shipping items and the catalog products. The keys below describe those records; they are not interchangeable. Prefer the documented hooks and [API](#api) when changing booking behavior. Use WooCommerce CRUD objects when inspecting metadata so your integration works with both HPOS and traditional order storage. For order reads and intentional updates, follow [WooCommerce’s HPOS recipe book](https://developer.woocommerce.com/docs/features/orders/high-performance-order-storage/recipe-book/) : obtain the `WC_Order`, use its metadata methods, and save through the object. Do not assume orders are WordPress posts. ### Shipping-item configuration These values belong to each `WC_Order_Item_Shipping`, not to `WC_Order`. WooCommerce copies them from the chosen Smart Send rate when it creates the shipping item. | Key | Stored value | Meaning | | - | - | - | | `smart_send_shipping_method` | String, for example `postnord_agent`. | Outbound Smart Send service selected for this shipping method. | | `smart_send_return_method` | Service-code string, or empty. | Configured return service. A Smart Send shipping item without one does not have a configured return service. | | `smart_send_auto_generate_return_label` | `'yes'` or `'no'`. | Recorded preference for including a return when booking outbound shipping. It does not book anything when the order is placed. | These are snapshots of the method's configuration. Editing a zone's defaults does not rewrite existing shipping items. A service chosen for one booking in the order panel also does not overwrite these values. Read them with `$shipping_item->get_meta( $key, true )`; use `SS_SHIPPING_WC()->method_resolver()` when you need the resolved booking service, including the separate mapping for WooCommerce's native Free Shipping method. ### Order configuration and booking results Read these fields from a `WC_Order` obtained with `wc_get_order()`. Delivery configuration is managed by `Smart_Send\Delivery\Order_Meta`; booking results are managed by `Smart_Send\Fulfillment\Shipment_IDs`. | Key | Stored value | Meaning | | - | - | - | | `ss_shipping_order_agent_no` | Pickup-point number as a string. | The selected pickup point's carrier-facing number. Keep it consistent with the stored point object. | | `_ss_shipping_order_agent` | Plain object with pickup-point data. | The saved pickup address and related data. Both checkout types save a server-verified point. | | `ss_shipping_order_parcels` | Array with a `specs` list. | Reusable allocation of **order-item IDs** and quantities to colli. Explicit weights and dimensions are stored as `null`. | | `_ss_shipping_label_id` | Smart Send shipment ID string. | Latest successfully recorded **outbound** shipment. | | `_ss_shipping_return_label_id` | Smart Send shipment ID string. | Latest successfully recorded **return** shipment. | | `_ss_shipping_labels` | List of booking records. | The newest 50 recorded shipments, stored oldest first within that list. Each row has `direction` (`outbound` or `return`), `shipment_id` (string) and `booked_at` (ISO 8601 UTC string). | Shipment IDs identify Smart Send shipments; they are not tracking numbers, PDF URLs or WordPress attachment IDs. The history contains one row per shipment, not one per colli, and does not represent live carrier events. Outbound and return are recorded separately, including when outbound succeeds but the return fails. Use `SS_SHIPPING_WC()->shipment_ids()->get( $order, false )` for the latest outbound ID, `true` for return, or `labels( $order )` for the history. The ID reader returns an empty string when no ID is stored. For the distinction between submitted values, filter changes and persistent data, see [delivery details and persistence](#delivery-details-and-persistence). Known properties include `agent_no`, `company`, `address_line1`, `address_line2`, `postal_code`, `city` and `country`. A point may also contain `id`, `carrier`, `name_line1`, `name_line2`, `distance`, `coordinates` and `opening_hours`; do not assume every optional property is present. Country is an ISO 3166-1 alpha-2 code. Coordinates have `latitude` and `longitude`; opening-hour rows have `day`, `opens` and `closes`. Use `SS_SHIPPING_WC()->order_meta()->read( $order )->get_pickup_point()` for a `Smart_Send\Delivery\Pickup_Point` or `null`. The typed object supports accessors and `to_array()` without requiring callers to depend on every raw property. For booking changes, use `smart_send_delivery_details`; changing only the raw agent number is not a substitute for resolving and validating a compatible pickup point. This example represents two units from order item `123` in one colli. That ID is local to the order; it is neither a product ID nor a variation ID. ```json theme={null} { "specs": [ { "reference": "1", "weight": null, "length": null, "width": null, "height": null, "items": [ { "order_item_id": 123, "quantity": 2, "name": "Cotton T-shirt" } ] } ] } ``` `reference` and the optional item `name` are labels, not item identities. Quantities and order-item IDs are positive integers. `Parcel_Plan::from_array()` parses the canonical shape; allocation must also be checked against the current order's item IDs and quantities. Saving through `Order_Meta` strips the four measurement fields to `null`. An empty `specs` list means one parcel containing all items. Do not copy this array unchanged to another order. If items or quantities change, an incompatible saved allocation requires a reset before booking. See [delivery details and persistence](#delivery-details-and-persistence) for allocation rules and the measurements that apply only to a booking. The Subscriptions integration excludes `_ss_shipping_label_id`, `_ss_shipping_return_label_id` and `_ss_shipping_labels` from renewal metadata. It preserves reusable delivery configuration and remaps parcel allocations to the renewal's new order-item IDs. If that mapping cannot be verified, `ss_shipping_order_parcels` can contain an internal `unmapped_subscription_plan` wrapper that forces an explicit reset. This is an error marker, not a supported parcel-plan format to write. `_smart_send_renewal_source_item` is a temporary internal product-order-item marker with `order_id` and `item_id`; the integration removes it after processing the copied items. Do not use it as a persistent integration field. `_wc_shipment_tracking_items` belongs to WooCommerce Shipment Tracking. Smart Send uses that extension's API for tracking and excludes copied tracking records from renewals; it does not define the extension's metadata schema. `_vc_aio_options` belongs to vConnect and is read for compatibility when resolving delivery details. Neither field is a Smart Send-owned write contract. A submitted order-screen value takes precedence over a stored value before `smart_send_delivery_details` runs. Following successful booking, the submitted pickup selection and parcel item allocations are saved. The submitted method, parcel weights and dimensions apply only to the current booking. Failed booking does not save those overrides. The filter's returned object determines what is booked, but it does not itself determine what is saved. For a combined outbound/return request, the submitted parcel plan applies to both directions unless a separate return plan overrides it. A null or empty plan means one parcel with all order items. A single spec with no allocations also includes all items and can supply explicit measurements. Multiple specs require complete allocation: every order unit exactly once, positive whole quantities, and no duplicate order-item row within a spec. Unknown order-item IDs and under-/over-allocation are rejected. ### Product customs information These fields belong to a `WC_Product` or `WC_Product_Variation`, not an order or shipping item. | Key | Stored value | Meaning | | - | - | - | | `_ss_country_of_origin` | Country-code string, for example `DK`. | ISO 3166-1 alpha-2 country where the goods were produced. | | `_ss_customs_desc` | Text string. | Description of the goods for customs. | | `_ss_hs_code` | Text string. | HS/tariff classification. Preserve it as text rather than casting it to an integer. | Use `wc_get_product()` and the product's `get_meta()` for reading. To save an intentional product-data change, use `update_meta_data()` followed by the product's `save()`; setting a value does not determine whether it is the correct customs classification. Booking reads the current catalog values. A variation's value takes precedence unless it is `''` or `null`, in which case the parent product's value is used. The plugin's product editor supplies the fields on the main product's Shipping tab; it does not add a separate editor for each variation. These fields are not snapshots copied onto order lines. A deleted catalog product cannot supply its customs data. See the [merchant guide to customs fields](/integrations/woocommerce/shipping-labels#customs-information). ## API Use the plugin's API inside WordPress to read Smart Send data for an existing `WC_Order`. Smart Send and a supported WooCommerce version must be active. Call the examples after Smart Send initializes on `init` at priority `0`, for example from an `init` callback at priority `10` or a later order hook. If you start with an order ID, load it with `wc_get_order($order_id)` and check that the result is a `WC_Order`. These reads use WooCommerce's order and item APIs, so they work with HPOS. They do not book shipments or contact the Smart Send API. The example functions use a `my_shop_` prefix; choose your own prefix in your integration. `SS_SHIPPING_WC()->order_meta()->read($order)` returns `Smart_Send\Delivery\Delivery_Details` with the stored pickup point and parcel plan. `get_pickup_point()` returns a `Smart_Send\Delivery\Pickup_Point` or `null`. See the [pickup point accessors](#pickup-point-accessors) for the available fields. The helper reads the saved point; it does not find nearby points or refresh its address. If no Smart Send point is stored, it also recognizes the supported vConnect pickup point metadata. An agent number stored on its own does not provide a complete pickup point object. Individual fields can be `null`. `get_parcel_plan()` on the same details object returns the saved plan or `null`. To distinguish a missing plan from an invalid saved allocation, use `SS_SHIPPING_WC()->order_meta()->parcel_plan_error($order)`, which returns an explanation or `null`. These stored details do not resolve a shipping method; use the next example for that. Return the saved point's identity and address, or `null` when no point is available. Escape individual values for the output context if you render them in HTML. ```php theme={null} function my_shop_get_order_pickup_point( \WC_Order $order ): ?array { $point = SS_SHIPPING_WC()->order_meta()->read( $order )->get_pickup_point(); if ( null === $point ) { return null; } return array( 'agent_no' => $point->get_agent_no(), 'carrier' => $point->get_carrier(), 'company' => $point->get_company(), 'address_line1' => $point->get_address_line1(), 'address_line2' => $point->get_address_line2(), 'postal_code' => $point->get_postal_code(), 'city' => $point->get_city(), 'country' => $point->get_country(), ); } ``` There are two different IDs to work with: * `$order->get_shipping_methods()` returns the WooCommerce shipping line items saved on the order. `get_method_id()` identifies the WooCommerce method, such as `smart_send_shipping` or `free_shipping`; `get_instance_id()` identifies the shipping-zone method instance. * `SS_SHIPPING_WC()->method_resolver()` resolves one Smart Send service ID for each direction, such as `postnord_agent` or `postnord_returndropoff`. It reads the order's Smart Send shipping-line metadata, the current [mapping for native free shipping](/integrations/woocommerce/shipping-methods#native-free-shipping), or supported third-party method mappings. `resolve_outbound($order)` and `resolve_return($order)` return `''` when no service can be resolved. If a Smart Send shipping line has no return method configured, `resolve_return()` throws `Smart_Send\Booking\Exceptions\Booking_Exception`; the example keeps this distinction in `return_error`. `is_auto_return_enabled($order)` reads the automatic-return setting saved on the shipping line. These are the defaults derived for the order. They do not include unsaved choices in the order screen, submitted booking overrides, or changes made by `smart_send_delivery_details`. They also do not tell you which service a previous shipment was actually booked with; read that from the `Booked_Shipment` delivered to a [booking action](#smart-send-booking-completed). Return both the WooCommerce shipping lines and the resolved Smart Send defaults. The return error is plain text; escape it before displaying it in HTML. ```php theme={null} function my_shop_get_order_shipping_methods( \WC_Order $order ): array { $shipping_lines = array(); foreach ( $order->get_shipping_methods() as $item_id => $item ) { $shipping_lines[] = array( 'order_item_id' => (int) $item_id, 'method_id' => $item->get_method_id(), 'instance_id' => $item->get_instance_id(), 'title' => $item->get_method_title(), ); } $resolver = SS_SHIPPING_WC()->method_resolver(); $return_method = ''; $return_error = null; try { $return_method = $resolver->resolve_return( $order ); } catch ( \Smart_Send\Booking\Exceptions\Booking_Exception $exception ) { $return_error = $exception->getMessage(); } return array( 'shipping_lines' => $shipping_lines, 'outbound' => $resolver->resolve_outbound( $order ), 'return' => $return_method, 'return_error' => $return_error, 'auto_return' => $resolver->is_auto_return_enabled( $order ), ); } ``` `SS_SHIPPING_WC()->shipment_ids()` reads the shipment references saved on the order: | Method | Result | | - | - | | `get($order, false)` | Latest saved outbound shipment ID, or `''`. | | `get($order, true)` | Latest saved return shipment ID, or `''`. | | `labels($order)` | Saved history rows, oldest first; each contains `direction`, `shipment_id` and `booked_at`. Missing history returns an empty array. | `direction` is `outbound` or `return`; `booked_at` is an ISO 8601 UTC timestamp or `null` when unavailable. The plugin retains the latest 50 history rows in total across both directions. The latest ID for each direction is stored separately, so an ID can exist even when `labels()` is empty. A row represents one shipment, which may contain several parcels. These are saved booking references. They do not contain live carrier status, tracking links, documents or the complete `Booked_Shipment`. To read documents and tracking details returned by a booking, listen to [smart\_send\_booking\_completed](#smart-send-booking-completed) or [smart\_send\_order\_fulfilled](#smart-send-order-fulfilled) and use the [booked result accessors](#read-booked-results). A `Fulfillment_Result` describes that particular run, including a possible outbound success and return failure; it is not re-created from the order history. Read the latest shipment ID for each direction and the retained history independently. Do not assume a successful outbound booking also produced a return shipment. ```php theme={null} function my_shop_get_order_bookings( \WC_Order $order ): array { $shipments = SS_SHIPPING_WC()->shipment_ids(); return array( 'latest_outbound_id' => $shipments->get( $order, false ), 'latest_return_id' => $shipments->get( $order, true ), 'history' => $shipments->labels( $order ), ); } ``` `Pickup_Point` supplies `get_agent_no()`, `get_company()`, `get_address_line1()`, `get_address_line2()`, `get_postal_code()`, `get_city()`, `get_country()`, `get_carrier()`, `get_distance()`, `get_latitude()`, `get_longitude()` and `get_opening_hours()`. Optional values can be null. Opening hours are a list of `day`, `opens`, `closes` rows: the day is a lowercase English weekday and times use `HH:MM:SS`. An empty list means unknown opening hours. `to_array()` gives a serializable representation; it is not permission to trust client-submitted names or addresses. `Booked_Shipment` exposes `get_shipment_id()`, `get_carrier()`, `get_service_code()`, `is_return()`, `get_state()`, `get_booked_at()`, `get_tracking_code()`, `get_tracking_url()`, `parcels()`, `documents()` and `codes()`. Optional tracking fields can be null. `label_document()` returns a `Shipment_Document` or null; do not assume a PDF exists for every result. A document's `download_url()` chooses the saved local copy when available, otherwise the Smart Send URL. `Fulfillment_Result::get_steps($shipment)` reports `save_documents` (`true`, `false` or `'failed'`), `order_note` (boolean), `tracking` (whether forwarding was requested) and `order_status` (status or `false`). A tracking step does not prove that an optional third-party integration was installed or delivered an email. Use `get_order_note_id($shipment)` for the saved note's integer ID or null. `get_order_note($shipment)` supplies note HTML for PHP consumers. The serializable `to_array()` instead contains an `order_note` object with an `id`, not note HTML. Its rows have `direction`, `status` (`fulfilled`/`failed`), and shipment/steps/warnings or an error. `get_error_details($is_return)` returns null or an array with `message`, `response_id`, `fields` and `html`; treat `message` as plain text and escape output appropriately. # FAQ Source: https://docs.smartsend.io/integrations/woocommerce/faq Answers, troubleshooting and every Smart Send setting for connection, shipping prices, pickup points, labels and returns in WooCommerce. Find your question or a setting name below. Open an answer for its explanation, default and relevant examples. For an error, note the message and action; the [Smart Send log](#logs) can help identify the cause. ## Where do I find the settings? | Area | Location | Applies to | | - | - | - | | **Global** | **WooCommerce → Settings → Shipping → Smart Send** | The whole shop. | | **Shipping method** | **WooCommerce → Settings → Shipping → Shipping zones → Edit zone → Edit Smart Send method** | One method in one zone. | Click **Save changes** after editing. Defaults describe a newly configured screen; review and save the values you intend to use. See [add a shipping method](/integrations/woocommerce/shipping-methods) if you need to create one first. ## Connection and test setup **Location:** [Global](#settings). **Default: empty.** Open **WooCommerce → Settings → Shipping → Smart Send** and enter the token in **API Token**. It connects the shop to your Smart Send account and enables account validation, pickup lookups and booking. Click **Save changes** before **Validate API Token**; validation reads the saved value. Follow the [connection guide](/integrations/woocommerce/introduction#connect-plugin) to create and check the token. **Location:** [Global](#settings). This is an action button, not a saved setting. It checks the **saved** token and displays the result. It does not create a shipment. See [connection testing](/integrations/woocommerce/introduction#api-token). 1. Open **WooCommerce → Settings → Shipping → Smart Send**. 2. Confirm that the token was copied in full and click **Save changes**. 3. Click **Validate API Token** and read the displayed reason. Replace a token that has been revoked or is invalid. 4. If the response indicates a connection or server failure, check that the shop can make outbound HTTPS requests and examine the relevant log entry. API token validation error asking the merchant to check the token and save settings A successful validation confirms authentication. If booking still fails, follow [booking errors](#booking) and check the carrier connection. See the complete [connection guide](/integrations/woocommerce/introduction#connect-plugin). No. It checks authentication and returns account information. It does not book a shipment or verify all carrier and shipment details. [What each test checks](/integrations/woocommerce/introduction#test-your-setup). Test a known cart and address to check methods, prices and pickup selection. Booking from an order is a separate action and creates a real shipment with normal production credentials. A staging shop alone is not a simulated booking environment. [Test your setup](/integrations/woocommerce/introduction#test-your-setup). ## Shipping methods and availability 1. Check the shipping address and the order of [WooCommerce shipping zones](/integrations/woocommerce/shipping-methods#first-matching-zone). Only the first matching zone supplies methods. 2. Confirm that the intended method is enabled in that zone and has a **Shipping Method** service selected. 3. Compare the cart weight with the configured rows. A 0–5 kg row excludes exactly 5 kg; use the next row for that weight. 4. Review shipping-class and excluded-role conditions when **Advanced Settings** is enabled. Test as the same customer type that reported the issue. 5. If you changed configuration, allow checkout to recalculate with the intended address and cart. WooCommerce’s shipping debug mode can help identify a zone during troubleshooting; it is separate from Smart Send’s **Debug Log**. A matched zone without an available method does not borrow methods from another overlapping zone. See [configuration examples](/integrations/woocommerce/shipping-methods#examples) for known cart/result pairs. WooCommerce uses the first matching zone from top to bottom. If the Nordic zone includes DK and is above Denmark, a Danish address matches the Nordic zone. Move Denmark above it. [Zone order example](/integrations/woocommerce/shipping-methods#first-matching-zone). **Location:** [Shipping method](#settings). **Default:** **Smart Send**. Required customer-facing text, such as `Pickup point` or `Home delivery`. It also identifies the method in the zone. The title does not select a carrier service. **Location:** [Shipping method](#settings). **Default:** **- Select Method -**. Select the outbound carrier service for this method; a valid service is required when saving. Services are grouped by carrier. The choice controls booking and whether checkout shows a pickup selector. Configure a service your Smart Send account and carrier agreement support for the route. **Location:** [Global](#settings). **Default:** off; the zone's method order is used. When enabled, the available shipping rates are sorted from lowest to highest **cost plus tax**. This applies to the package's available methods, including methods supplied by WooCommerce or other plugins. It changes display order, not prices, availability or zone matching. For example, pickup at 39 DKK is listed before home delivery at 59 DKK even if the home method is first in the zone. Check **Advanced Settings**, the selected shipping-class rule and classes, and **Exclude User role**. Different class rules treat “any” and “all” cart items differently. Guest visibility must be checked separately from a logged-in role. [Class and role examples](/integrations/woocommerce/shipping-methods#shipping-classes). **Location:** [Shipping method](#settings). **Default:** off. Enable it to show and apply shipping-class and excluded-role rules. With it off, those saved advanced rules are ignored. It does not disable weight coverage or pricing conditions. For example, enable it before restricting a method to parcels of a particular shipping class. **Location:** [Shipping method](#settings). **Default:** **N/A**. Requires **Advanced Settings** and at least one selected **Shipping classes** entry. Only products that need shipping participate. | Choice | Availability rule | | - | - | | **N/A** | No shipping-class restriction. | | **ALL products belong to one of the shipping classes** | Every physical product belongs to a selected class. | | **At least ONE product belongs to one of the shipping classes** | One or more physical products belong to a selected class. | | **ALL products do NOT belong to one of the shipping classes** | No physical product belongs to a selected class. | | **At least ONE product does NOT belongs to one of the shipping classes** | At least one physical product is outside the selected classes. | The last label is reproduced as it appears in the interface. For a mixed cart, “all outside” and “at least one outside” give different results; see [shipping-class examples](/integrations/woocommerce/shipping-methods#shipping-classes). **Location:** [Shipping method](#settings). **Default:** none selected. Select one or more existing WooCommerce shipping classes for the preceding rule. With none selected, the plugin applies no class restriction. Create classes in WooCommerce and assign them to the products first. Multiple selected classes form one allowed/checked set; a product need not belong to every selected class. **Location:** [Shipping method](#settings). **Default:** none selected. With **Advanced Settings** enabled, hide the method from customers with any selected role. **Guest** means a customer who is not logged in. Selecting **Customer** does not also exclude guests. Roles are those registered in your WordPress shop, plus Guest. For example, select **Guest** to require login for this method. Other availability rules still apply after login. See [customer-role examples](/integrations/woocommerce/shipping-methods#customer-roles). ## Prices, tax and free shipping Check the selected zone and method before editing the price. Compare entered rates with [Tax status](#tax-status) and WooCommerce’s cart tax display, then check [Cost based on weight](#weight-prices). For a threshold, review [Minimum order amount](#minimum-order-amount), [Flat rate requires...](#flat-rate-requires) and [Flat fee cost](#flat-fee-cost). A matching rule can replace the price without making an otherwise unavailable method available. See the [free-shipping examples](/integrations/woocommerce/shipping-methods#free-shipping). Check the discounted subtotal on the store’s checkout tax basis, the minimum amount, and whether the rule requires a free-shipping coupon, a minimum amount, either or both. The replacement **Flat fee cost** must be zero for free shipping; availability restrictions still apply. [Worked free-shipping examples](/integrations/woocommerce/shipping-methods#free-shipping). It depends on WooCommerce’s tax settings and the method’s **Tax status**. In our examples, a taxable rate of 31.20 DKK before VAT displays as 39 DKK with 25% VAT. [Pricing assumptions](/integrations/woocommerce/shipping-methods#examples). **Location:** [Shipping method](#settings). **Default:** **Taxable**. Choices are **Taxable** and **None**. Taxable lets WooCommerce calculate shipping tax using the shop's tax settings; it does not create a tax rate. None leaves this method untaxed. Shipping costs are entered excluding tax. Whether checkout displays an inclusive amount follows WooCommerce's cart/checkout tax-display setting. For example, 31.20 DKK becomes 39.00 DKK with applicable 25% VAT and inclusive display. With rows 0–5 kg and 5–20 kg, exactly 5 kg matches the second row: lower bounds are inclusive and upper bounds exclusive. Exactly 20 kg requires another matching row. [Weight-band example](/integrations/woocommerce/shipping-methods#weight-bands). **Location:** [Shipping method](#settings). Columns: **Minimum**, **Maximum** and **Cost**. The new editor proposes a row from `0` to `20` with a cost of `15`; replace it with your intended coverage and price. Bounds use **WooCommerce → Settings → Products → Weight unit**, not a fixed kg unit. * A nonzero minimum is inclusive; a nonzero maximum is exclusive. A `5`–`20` row covers 5 kg but not 20 kg in a kg shop. * An empty or literal `0` bound is unrestricted on that side. A maximum of `0` does not mean zero-weight products only. * If rows overlap, the **last matching row with a usable cost** determines the price. Avoid overlaps unless that precedence is intentional. * A gap means the method is unavailable at that weight, even when a free-shipping condition is met. * With no rows, every weight passes the weight check, but a rate is offered only if a flat-fee condition applies. There is no normal row price to use otherwise. * A blank cost or literal `0` cost is skipped. Configure free shipping with **Flat fee cost = 0** and the appropriate **Flat rate requires...** rule. Costs can be a fixed amount or a supported formula. See [weight bands](/integrations/woocommerce/shipping-methods#weight-bands) and [formulas](/integrations/woocommerce/shipping-methods#formulas). The calculation uses cart product weight; enter product weights in WooCommerce before testing. **Location:** [Shipping method](#settings). **Default:** **Always disabled**. This decides when **Flat fee cost** replaces the normal weight-row price: | Choice | Condition | | - | - | | **Always disabled** | Always use the normal weight price. | | **Always enabled** | Always use the flat fee, while availability rules still apply. | | **A valid free shipping coupon** | A valid applied coupon has **Allow free shipping** enabled. | | **A minimum order amount** | The qualifying cart amount meets **Minimum order amount**. | | **A minimum order amount OR a coupon** | Either the amount or coupon condition is met. | | **A minimum order amount AND a coupon** | Both conditions are met. | An ordinary discount coupon does not satisfy the free-shipping coupon condition. See [threshold and coupon examples](/integrations/woocommerce/shipping-methods#free-shipping). **Location:** [Shipping method](#settings). **Default:** `0`. The numeric cost excluding tax used when **Flat rate requires...** is satisfied. `0` makes this method free; a positive amount gives a fixed replacement price. For example, `15.20` gives 19.00 DKK including 25% VAT. It replaces the weight-row price rather than being added to it. **Location:** [Shipping method](#settings). **Default:** `0`. Used only by a minimum-amount, OR or AND rule. The qualifying amount is the cart's **displayed product subtotal after product discounts**, rounded to the store's price decimals. It excludes shipping. When cart prices display **including tax**, the calculation includes product tax and subtracts both the discount and its tax. With **excluding tax** display, it uses the subtotal and discount excluding tax. A threshold is therefore not unconditionally VAT-inclusive, even though the field's help text mentions VAT. Example: a 500 DKK inclusive subtotal with a 10% product discount qualifies at 450 DKK, so a 500 DKK minimum is not met. **Location:** [Global](#settings). **Default:** no service selected. Choose the Smart Send carrier service to use when booking an order that used WooCommerce's native **Free Shipping** method. This maps the booking service; WooCommerce still decides when its free-shipping checkout method is available. For example, map native Free Shipping to **PostNord: Private delivery to address (MyPack Home)**. See the [complete example](/integrations/woocommerce/shipping-methods#native-free-shipping). This mapping does not add Smart Send's pickup selector to a native method. ## Pickup point delivery Choose a service that supports customer-selected pickup points. The customer selects a point in checkout. **Select Default** controls automatic initial selection; it does not create a map or choose a service. [Classic and block checkout instructions](/integrations/woocommerce/pickup-points#select-pickup-point). Use a service that supports customer-selected pickup points. After changing the shipping address or carrier, wait for the new lookup and select a compatible point again if requested. An empty result or failed lookup can allow checkout to continue without saving a pickup point. Review such an order before booking and select or correct the pickup details in its Smart Send panel. An explicitly invalid or stale selection can instead be rejected and must be corrected. See [pickup-point selection](/integrations/woocommerce/pickup-points#select-pickup-point). **Location:** [Global](#settings). **Default:** off. **Enable Select Default** preselects the closest point returned by the pickup lookup. Customers can change it. With the setting off, customers must make a choice when points are available. It requires a customer-selection pickup service; it does not select a shipping method for the customer. See [selection and fallback behavior](/integrations/woocommerce/pickup-points#select-pickup-point). Choose **List (recommended)**, **List / Map** or **Drop-down** in the global **Pickup point selector** setting. The old **Dropdown format** setting has been removed. Points are labelled with their name, street, postcode and city, with distance when available. See [pickup-point setup](/integrations/woocommerce/pickup-points). ## Booking, labels and customs Read the message next to the affected field and correct the order or booking details before retrying. Check the selected service, recipient address, required contact details and pickup point. Verify the carrier connection for that service. Booking validation message next to the pickup point field in the Smart Send order panel For missing weight, enter a usable product weight or the appropriate explicit parcel weight including packaging. For several colli, all order quantities must be allocated correctly. Follow [Colli shipments](/integrations/woocommerce/shipping-labels#colli-shipments) for allocation and measurement validation. If the outcome is uncertain, inspect the existing booking history before retrying: another booking can create another shipment. A failed document-copy step is not the same as a failed booking. Open the order’s existing Smart Send booking and use its document link. Downloading or printing that document is different from booking another shipment. [Retrieve labels](/integrations/woocommerce/shipping-labels). Open the successful booking in the order’s Smart Send history and use its document link. A warning that the label was booked but its local copy could not be saved confirms that the shipment is booked. Use the original document link and ask your administrator to investigate uploads-directory permissions or the download error in the log. Do not book again to recover the PDF. See [labels and documents](/integrations/woocommerce/shipping-labels). **Location:** [Global](#settings). **Default:** off. When enabled, the plugin attempts to save a local copy of the generated PDF in WordPress’s uploads folder. The uploads location must be writable. Use the [missing-PDF checks](#documents) if copying fails; a failed copy does not mean the booking failed. The Smart Send panel updates after booking. WooCommerce’s order-note area uses the native order-note API and may need a full page reload to show the new note. [Booking history and notes](/integrations/woocommerce/shipping-labels#history). **Location:** [Global](#settings). **Default:** **Do not change order status**. Choose that option or one of the shop's registered WooCommerce order statuses. The setting changes the order status after a successful outbound booking; it does not wait for paper to emerge from a printer. Return-only booking does not apply this outbound status change. For example, select **Completed** only if an outbound booking is the point at which you want to complete the order. WooCommerce's own status-change behavior, including configured emails, still applies. **Location:** [Global](#settings). **Default:** off. When enabled, the customer's order comment is supplied with the shipment's label-comment information. Its use on the resulting label depends on the carrier service. Use it for relevant delivery instructions, and review the customer's text before [booking](/integrations/woocommerce/shipping-labels). Edit the product under **Products → Product data → Shipping**. Fill in **Country of origin**, **Customs description**, and **Harmonized Tariff Schedule** (HS code), then update the product. [Product customs guide](/integrations/woocommerce/shipping-labels#customs-information). Use the advanced parcel controls to allocate the order’s quantities across colli and check each colli’s weight and dimensions. [Colli shipments](/integrations/woocommerce/shipping-labels#colli-shipments) explains the full process and validation. Bulk printing is coming. The current guide covers booking and retrieving labels for one order at a time. [Book a shipping label](/integrations/woocommerce/shipping-labels). ## Return labels Configure a valid return service, open the order and click **Create return label**. A return can be booked independently of an outbound shipment. [Return booking](/integrations/woocommerce/return-shipping). Keep the successful outbound booking. Correct the return error and click **Create return label** to retry only the return. Booking both again can create another outbound shipment. [Partial-success recovery](/integrations/woocommerce/return-shipping). **Location:** [Shipping method](#settings). **Default:** no service selected. Choose a return service supported by the carrier/account. It supplies the return service recorded on new orders and does not create a separate checkout option or change the checkout price. Changing this default does not replace the service recorded on existing orders. Follow [Book return shipping](/integrations/woocommerce/return-shipping) for return-only and combined bookings. **Location:** [Shipping method](#settings). **Default:** off. When enabled alongside a valid **Return Shipping Method**, the method records the return preference on new orders and preselects **Also create return label** in the booking panel. It does not book a shipment when the customer places the order. The return is attempted after you successfully book the outbound shipment. Changing the default does not update existing orders. Review the return choice in the booking panel before booking. Creating a return label is separate from refunding a WooCommerce payment. See [return booking and recovery](/integrations/woocommerce/return-shipping). ## Logs, support and customizations Go to **WooCommerce → Status → Logs** and filter the source to **smart-send-logistics**. WooCommerce Logs filtered to the smart-send-logistics source Open the relevant log and locate the time of the failed action. Compare the message, HTTP status and any request identifier with the error you saw. Enable **Debug Log** in **WooCommerce → Settings → Shipping → Smart Send**, save and reproduce the issue once. Turn it off after collecting the required details. Warnings and errors can still be logged when debug logging is off. **Location:** [Global](#settings). **Default:** off. **Enable logging** records diagnostic Smart Send communication and shipping decisions in the WooCommerce logs. Use the field's log link or **WooCommerce → Status → Logs**. Enable it while investigating a problem, reproduce the problem, then review the relevant entries. This is separate from WooCommerce's **Shipping debug mode**, which bypasses shipping-rate caching and enables checkout diagnostics. See [logging and support information](#logs). Do not share API tokens or customer details in public support reports. Send the plugin, WooCommerce and WordPress versions; checkout type; exact error and time; affected action; and relevant settings or cart values. Include a short log excerpt when it explains the problem. Remove tokens and unnecessary customer names, addresses and contact details before sharing screenshots or logs. [Contact Smart Send support](/troubleshooting/support) with those details. Do not send a full API token. [Developer reference](/integrations/woocommerce/developers) brings together filters and actions with contracts and examples, plugin metadata, and the API for reading an order’s pickup point, shipping methods and bookings. Use the documented hooks to customize the Smart Send plugin in your webshop. # Get started Source: https://docs.smartsend.io/integrations/woocommerce/introduction Install Smart Send for WooCommerce, connect your account, and move on to shipping setup and your first label. Smart Send connects your WooCommerce store to your carrier accounts. You choose the delivery options and prices at checkout and book shipments from the order page. This guide covers Smart Send 9.