This guide provides instructions for installing, configuring, and customizing the HubBox cartridge on your Salesforce Commerce Cloud (SFCC) storefront using the Storefront Reference Architecture (SFRA). This cartridge enables HubBox pickup point selection functionality directly within your SFCC checkout flow.
This guide focuses on SFRA. While HubBox can support older Site Genesis implementations, this requires a custom approach - please contact your HubBox representative if you are using Site Genesis.
sgmf-scripts
or compatible build tooling, SFCC UX Studio or VS Code with Prophet Debugger extension).int_hubbox_sfra_vx.y.z.zip
) provided by HubBox.Follow these steps to install the HubBox cartridge in your SFRA development environment.
Download the latest version of the int_hubbox_sfra
cartridge .zip
file.
If you cannot see a download link, please ensure you are logged in or contact your HubBox representative.
int_hubbox_sfra_vx.y.z.zip
).int_hubbox_sfra
folder into the cartridges
directory within your SFCC project's codebase repository.The HubBox cartridge needs to be added to your site's cartridge path to be active. It should be placed early in the path, typically before the base storefront cartridge (app_storefront_base
).
int_hubbox_sfra:
to the beginning of the path, ensuring it's separated by colons. Example: If your path was app_storefront_base:plugin_x:plugin_y
, it should become int_hubbox_sfra:app_storefront_base:plugin_x:plugin_y
Example Cartridge Path showing int_hubbox_sfra added
npm run build
, yarn build
, or equivalent).sgmf-scripts
: npm run uploadCartridge
(or yarn uploadCartridge
)The HubBox cartridge requires specific metadata objects and attributes to be imported into your SFCC instance via Business Manager. The necessary XML files are located within the cartridge/metadata
folder of the int_hubbox_sfra
cartridge you added.
These files define storage for HubBox API credentials and configuration settings.
HubBox.CustomObject.xml
. (Purpose: Securely stores HubBox API authentication tokens).HubBox.SitePreferences.xml
. (Purpose: Creates the 'HubBox Configs' custom site preference group for configuration).
Site Import & Export screen for Metadata
This file adds custom attributes to the standard SFCC Shipment object to store HubBox details.
HubBox.Shipment.xml
.hubBox_
):collectPointId
(String): Stores the unique ID of the selected HubBox location.collectPointName
(String): Stores the name of the selected HubBox location.collectPointNetwork
(String): Stores the network key (e.g., 'ups', 'dpd').collectPointType
(String): Stores the type ('public' or 'private').This file sets up the necessary HTTP service definition used by the cartridge to communicate with the HubBox API.
HubBox.Services.xml
.
Import & Export screen for Services
After installing the cartridge and importing metadata, configure the HubBox settings for your site.
In Business Manager, navigate to Merchant Tools > Site Preferences > Custom Site Preference Group*.
Select HubBox Configs. If this option is missing, double-check that HubBox.SitePreferences.xml
was imported correctly in Step 5.
Enter the required values provided by HubBox and configure the URLs according to your environment:
Preference ID | Display Name | Description | Source |
---|---|---|---|
HubBoxEnvironment |
HubBox Environment | Which HubBox Environemnt to connect with. All non production environments should be set to Sandbox. Production should be set to Production. | Retailer provides |
HubBoxConfigId |
Retailer Config Id | Your unique HubBox configuration ID, defining enabled networks, base styling, etc. | Provided by HubBox |
HubBoxClientId |
HubBox API Client ID | Client ID used to authenticate with HubBox API can be generated in console credential management | Provided by HubBox |
HubBoxClientSecret |
HubBox API Client Secret | Client Secret used to authenticate with HubBox API generate at same time as Client ID | Provided by HubBox |
Click Save.
Locating HubBox Configs in Custom Site Preferences
HubBox Configuration Panel
The HubBox cartridge integrates automatically with the SFRA checkout flow however to complete the process you will need to adjust CheckoutServices
PlaceOrder
process.
For SFRA in {YOUR_STOREFRONT_CARTRIDGE|app_storefront_base}/controllers/CheckoutServices.js
in the PlaceOrder
handler locate the placeOrderResult
section amend such that HubBoxHelper.placeOrder(order)
is called after. Result should look like this based on the default SFRA Behavior
....
// Places the order
var placeOrderResult = COHelpers.placeOrder(order, fraudDetectionStatus);
if (placeOrderResult.error) {
res.json({
error: true,
errorMessage: Resource.msg('error.technical', 'checkout', null)
});
return next();
}
// this can be extracted to require block at top of file
var HubBoxHelper = require('*/cartridge/scripts/helpers/HubBoxHelper');
// This function triggers a transaction the populates the custom shipment data and address
HubBoxHelper.placeOrder(order);
....
The int_hubbox_sfra
cartridge overrides the standard checkout/shipping/shipmentCard.isml
template. Within this override, it includes hubbox/launch.isml
, which contains the necessary frontend code (HTML placeholders, JavaScript initialization) to load and display the HubBox UI components (e.g., Toggles or Buttons for delivery choice).
If you need to heavily customize the appearance or placement beyond standard CSS, you can modify the int_hubbox_sfra/cartridge/templates/default/hubbox/launch.isml
template (ensure you copy it to your custom storefront cartridge to avoid modifying the base HubBox cartridge directly, following SFRA best practices).
The HubBox UI elements are built using Web Components. You can style them using standard CSS targeting the component tags (e.g., hubbox-local-pickup-toggles
) and their exposed ::part()
pseudo-elements. Add your custom CSS rules to your theme's CSS files. Refer to the general HubBox Components Documentation for details on available parts and CSS variables.
The appearance and behaviour of the map/list modal widget itself (e.g., colours, map settings) are primarily controlled by the configuration associated with your configId
. Minor adjustments might be possible via CSS. Refer to the Widget Configuration documentation.
In some cases, you may wish to prevent the HubBox pickup option from being offered if the cart contains items unsuitable for pickup (oversized, hazardous, etc.). See Product Eligibility documentation for strategy.
This typically requires custom development within your SFCC implementation. There isn't a standard built-in feature in the HubBox cartridge for this. Common approaches include:
Product
system object (e.g., isPickupEligible
(Boolean)).dw.order.ShippingMgr
, relevant script files in app_storefront_base
or custom cartridges) to check this attribute for all items in the cart.This feature is used to show/hide specific SFCC shipping methods based on whether the customer chooses Home Delivery or HubBox Pickup. Essential if offering different rates/services or using specific carriers for pickup. See Shipping Rate Filtering documentation for strategy.
Uses custom attributes on Shipping Methods for flexibility.
ShippingMethod
system object with Boolean custom attributes (e.g., isHomeDeliveryMethod
, isInstoreDeliveryMethod
, isHubBoxDeliveryMethod
). Group these under a custom attribute group (e.g., "HubBox Filtering").<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="[http://www.demandware.com/xml/impex/metadata/2006-10-31](http://www.demandware.com/xml/impex/metadata/2006-10-31)">
<type-extension type-id="ShippingMethod">
<custom-attribute-definitions>
<attribute-definition attribute-id="isHomeDeliveryMethod">
<display-name xml:lang="x-default">Is Home Delivery Method?</display-name>
<description xml:lang="x-default">Display for standard home/alternative address delivery.</description>
<type>boolean</type>
<mandatory-flag>false</mandatory-flag>
<default-value>false</default-value>
</attribute-definition>
<attribute-definition attribute-id="isInstoreDeliveryMethod">
<display-name xml:lang="x-default">Is In-Store Pickup Method?</display-name>
<description xml:lang="x-default">Display when customer collects from your own store (BOPIS).</description>
<type>boolean</type>
<mandatory-flag>false</mandatory-flag>
<default-value>false</default-value>
</attribute-definition>
<attribute-definition attribute-id="isHubBoxDeliveryMethod">
<display-name xml:lang="x-default">Is HubBox Network Pickup Method?</display-name>
<description xml:lang="x-default">Display when customer selects a HubBox network pickup point.</description>
<type>boolean</type>
<mandatory-flag>false</mandatory-flag>
<default-value>false</default-value>
</attribute-definition>
</custom-attribute-definitions>
<group-definitions>
<attribute-group group-id="HubBoxFiltering">
<display-name xml:lang="x-default">HubBox Delivery Type Filtering</display-name>
<attribute attribute-id="isHomeDeliveryMethod"/>
<attribute attribute-id="isInstoreDeliveryMethod"/>
<attribute attribute-id="isHubBoxDeliveryMethod"/>
</attribute-group>
</group-definitions>
</type-extension>
</metadata>
isHomeDeliveryMethod
, isInstoreDeliveryMethod
, or isHubBoxDeliveryMethod
) to assign the method to that delivery type. Leave boxes unchecked if a method should not appear for that type.~/cartridge/scripts/checkout/shippingHelpers.js
(specifically the getApplicableShippingMethods
function) already contains logic to read these custom attributes. It checks if the current shipment is flagged as HubBox/Instore (using HubBoxHelper.isShipmentClickAndCollect
, etc.) and filters the available shipping methods based on the corresponding is*DeliveryMethod
custom attribute you set in Business Manager.// Simplified logic within shippingHelpers.js (Provided by int_hubbox_sfra)
// ... finds applicable methods based on address ...
var filteredMethods = [];
collections.forEach(shippingMethods, function (shippingMethod) {
var isClickAndCollect = HubBoxHelper.isShipmentClickAndCollect(shipment);
var isHubBoxNetwork = HubBoxHelper.isShipmentHubBox(shipment);
var isInstore = HubBoxHelper.isShipmentInstore(shipment); // Assumes BOPIS helper exists
if (isClickAndCollect) {
// Show if it's a HubBox network method OR an In-store method, matching the flags
if ((isHubBoxNetwork && shippingMethod.custom.isHubBoxDeliveryMethod) || (isInstore && shippingMethod.custom.isInstoreDeliveryMethod)) {
filteredMethods.push(new ShippingMethodModel(shippingMethod, shipment));
}
} else {
// Show if it's flagged as a Home Delivery method
if (shippingMethod.custom.isHomeDeliveryMethod) {
filteredMethods.push(new ShippingMethodModel(shippingMethod, shipment));
}
}
// Original logic might exist here too, e.g., related to storePickupEnabled
});
return filteredMethods;
The cartridge also contains commented-out examples within shippingHelpers.js
showing how to filter based on hardcoded Shipping Method IDs. This is not recommended as it's less flexible than using BM attributes.
You can configure HubBox to display your own physical stores (defined in SFCC Business Manager under Merchant Tools > Stores) as pickup options alongside network locations. This requires setting up a data sync.
(Optional) Add Custom Attribute: To control which stores are offered for pickup, add a Boolean custom attribute (e.g., isClickAndCollectEnabled
) to the Store
system object definition via metadata import (similar process to Step 6/Shipping Method extension).
(Optional) Configure Stores: In Merchant Tools > Stores, edit each store and check the isClickAndCollectEnabled
custom attribute only for those locations that should offer BOPIS.
Provide Sync URL to HubBox: The HubBox cartridge includes a controller (HubBoxStoreSync-Stores
) that exposes your store data as JSON. You need to provide the secure URL for this controller on your instance (Sandbox for setup, Production for live) to your HubBox Integrations Manager.
https://YOUR_INSTANCE_HOSTNAME/on/demandware.store/YOUR_SITE_ID/YOUR_LOCALE/HubBoxStoreSync-Stores
(e.g., https://dev01-your-site.demandware.net/on/demandware.store/Sites-YourSite-Site/en_GB/HubBoxStoreSync-Stores
)(Optional) Modify Controller for Filtering: If you added the isClickAndCollectEnabled
attribute (Step 1) and want to only sync enabled stores, you (or your developer) will need to slightly modify the int_hubbox_sfra/cartridge/controllers/HubBoxStoreSync.js
controller. Uncomment or adapt the filtering logic within the Stores
function to check for store.custom.isClickAndCollectEnabled === true
.
// Example snippet from HubBoxStoreSync.js (Illustrative - check cartridge code)
server.get("Stores", function (req, res, next) {
// Original might fetch all stores: StoreMgr.getAllStores()
// Modified to fetch only enabled stores:
var storeList = HubBoxStoreHelper.getPickupInStoreEnabledStores(); // Assumes helper checks the custom attribute
// OR filter inline:
// var allStores = StoreMgr.getAllStores();
// var storeList = collections.filter(allStores, function(store){
// return store.custom.isClickAndCollectEnabled === true;
// });
// ... rest of code maps store data to JSON ...
res.json({ stores: mappedStoreList }); // Ensure correct variable is used
return next();
});
HubBox configures its systems to regularly poll the provided URL, ingest the store data, and display eligible stores within the Widget via your configId
.
HubBox overrides the default/checkout/shipping/shipmentCard.isml template in order to include 2 HubBox templates to run the pickup UI.
shipmentCard.isml
in the storefront cartridgelaunch.isml
<fieldset class="hubbox-toggles-block">
<isinclude template="hubbox/launch" />
</fieldset>
HubBox appends to the CheckoutShippingServices
controller in order to pass information from the form input down to the cartridge backend.
HubBox has its own controller for toggling pickup CheckoutShippingServices-HubBox
. The controller is called when HubBox is set or cleared. The two main callbacks are hubBoxPointSelectedCallback
and hubBoxPointUnSelectedCallback
.
Thorough testing on your Sandbox/Development instance is essential before deploying to Production.
int_hubbox_sfra
is active in the correct position in the cartridge path.HubBox Configs
site preferences exist.collectPointId
, collectPointName
, etc.) are present and contain the correct data for the selected location.To access HubBox's UAT guide, visit the Testing Documentation.
HubBoxBaseUrl
and HubBoxMapUrl
in Merchant Tools > Site Preferences > Custom Site Preference Groups > HubBox Configs to the Production URLs provided by HubBox.int_hubbox_sfra
in the cartridge path) is deployed to your Production environment(s).Once installed, configured, and live, the HubBox cartridge provides the pickup point selection UI within your SFRA checkout.
When a customer selects a location the SFCC shipping address is populated with the pickup point's details. The SFCC shipping address is populated with the pickup point's details. Upon order placement, custom attributes are added to the Shipment
object within the order XML, containing details about the chosen location:
<shipment shipment-id="00000001">
<shipping-address>
<first-name>Jane</first-name>
<last-name>Doe</last-name>
<address1>CVS STORE # 10043</address1>
<city>ATLANTA</city>
<postal-code>30303</postal-code>
<state-code>GA</state-code>
<country-code>US</country-code>
<phone>9876543211</phone>
</shipping-address>
<custom-attributes>
<custom-attribute attribute-id="collectPointId">U99960535</custom-attribute>
<custom-attribute attribute-id="collectPointName">CVS STORE # 10043</custom-attribute>
<custom-attribute attribute-id="collectPointNetwork">ups</custom-attribute>
<custom-attribute attribute-id="collectPointType">public</custom-attribute>
</custom-attributes>
</shipment>
This data in the Order XML is crucial for your backend systems (OMS, WMS, ERP) to identify pickup orders and for correct manifesting with the carrier.
See full DPD/UPS Order XML examples in the appendices or provided separately.
UPS Example Order XML DPD Example Order XML<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns="http://www.demandware.com/xml/impex/order/2006-10-31">
<order order-no="00000301">
<order-date>2021-09-17T08:54:19.444Z</order-date>
<created-by>storefront</created-by>
<original-order-no>00000301</original-order-no>
<currency>USD</currency>
<customer-locale>en_US</customer-locale>
<taxation>net</taxation>
<invoice-no>00001501</invoice-no>
<customer>
<customer-name>Jane Doe</customer-name>
<customer-email>janedoe@test.com</customer-email>
<billing-address>
<first-name>Jane</first-name>
<last-name>Doe</last-name>
<address1>123 Main Street</address1>
<city>ATLANTA</city>
<postal-code>30303</postal-code>
<state-code>OTHER</state-code>
<country-code>US</country-code>
<phone>07223223123</phone>
</billing-address>
</customer>
<status>
<order-status>OPEN</order-status>
<shipping-status>NOT_SHIPPED</shipping-status>
<confirmation-status>CONFIRMED</confirmation-status>
<payment-status>NOT_PAID</payment-status>
</status>
<current-order-no>00000301</current-order-no>
<product-lineitems>
<product-lineitem>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
<base-price>38.00</base-price>
<lineitem-text>Gold Stretch Bangle</lineitem-text>
<tax-basis>38.00</tax-basis>
<position>1</position>
<product-id>013742002928M</product-id>
<product-name>Gold Stretch Bangle</product-name>
<quantity unit="">1.0</quantity>
<tax-rate>0.05</tax-rate>
<shipment-id>00001501</shipment-id>
<shipping-lineitem>
<net-price>10.00</net-price>
<tax>0.50</tax>
<gross-price>10.50</gross-price>
<base-price>10.00</base-price>
<lineitem-text>Item Shipping Cost (Surcharge)</lineitem-text>
<tax-basis>10.00</tax-basis>
<quantity unit="">1.0</quantity>
<tax-rate>0.05</tax-rate>
<type>surcharge</type>
</shipping-lineitem>
<gift>false</gift>
</product-lineitem>
</product-lineitems>
<shipping-lineitems>
<shipping-lineitem>
<net-price>5.99</net-price>
<tax>0.30</tax>
<gross-price>6.29</gross-price>
<base-price>5.99</base-price>
<lineitem-text>Shipping</lineitem-text>
<tax-basis>5.99</tax-basis>
<item-id>STANDARD_SHIPPING</item-id>
<shipment-id>00001501</shipment-id>
<tax-rate>0.05</tax-rate>
</shipping-lineitem>
</shipping-lineitems>
<shipments>
<shipment shipment-id="00000001">
<status>
<shipping-status>NOT_SHIPPED</shipping-status>
</status>
<shipping-method>002</shipping-method>
<shipping-address>
<first-name>Jane</first-name>
<last-name>Doe</last-name>
<address1>CVS STORE # 10043</address1>
<city>ATLANTA</city>
<postal-code>30303</postal-code>
<state-code>GA</state-code>
<country-code>US</country-code>
<phone>9876543211</phone>
</shipping-address>
<gift>false</gift>
<totals>
<merchandize-total>
<net-price>148.00</net-price>
<tax>7.40</tax>
<gross-price>155.40</gross-price>
</merchandize-total>
<adjusted-merchandize-total>
<net-price>148.00</net-price>
<tax>7.40</tax>
<gross-price>155.40</gross-price>
</adjusted-merchandize-total>
<shipping-total>
<net-price>11.99</net-price>
<tax>0.60</tax>
<gross-price>12.59</gross-price>
</shipping-total>
<adjusted-shipping-total>
<net-price>11.99</net-price>
<tax>0.60</tax>
<gross-price>12.59</gross-price>
</adjusted-shipping-total>
<shipment-total>
<net-price>159.99</net-price>
<tax>8.00</tax>
<gross-price>167.99</gross-price>
</shipment-total>
</totals>
<custom-attributes>
<custom-attribute attribute-id="collectPointId">U99960535</custom-attribute>
<custom-attribute attribute-id="collectPointName">CVS STORE # 10043</custom-attribute>
<custom-attribute attribute-id="collectPointNetwork">ups</custom-attribute>
<custom-attribute attribute-id="collectPointType">public</custom-attribute>
</custom-attributes>
</shipment>
</shipments>
<totals>
<merchandize-total>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
</merchandize-total>
<adjusted-merchandize-total>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
</adjusted-merchandize-total>
<shipping-total>
<net-price>15.99</net-price>
<tax>0.80</tax>
<gross-price>16.79</gross-price>
</shipping-total>
<adjusted-shipping-total>
<net-price>15.99</net-price>
<tax>0.80</tax>
<gross-price>16.79</gross-price>
</adjusted-shipping-total>
<order-total>
<net-price>53.99</net-price>
<tax>2.70</tax>
<gross-price>56.69</gross-price>
</order-total>
</totals>
<payments>
<payment>
<credit-card>
<card-type>VISA</card-type>
<card-number>XXXX-XXXX-XXXX-1111</card-number>
<card-holder>Jane Doe</card-holder>
<card-token>dscvse6xdkj</card-token>
<expiration-month>2</expiration-month>
<expiration-year>2025</expiration-year>
</credit-card>
<amount>56.69</amount>
<processor-id>BASIC_CREDIT</processor-id>
<transaction-id>00000301</transaction-id>
</payment>
</payments>
<remoteHost>86.147.199.105</remoteHost>
</order>
</orders>
<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns="http://www.demandware.com/xml/impex/order/2006-10-31">
<order order-no="00000301">
<order-date>2021-09-17T08:54:19.444Z</order-date>
<created-by>storefront</created-by>
<original-order-no>00000301</original-order-no>
<currency>GBP</currency>
<customer-locale>en_GB</customer-locale>
<taxation>net</taxation>
<invoice-no>00001501</invoice-no>
<customer>
<customer-name>Jane Doe</customer-name>
<customer-email>janedoe@test.com</customer-email>
<billing-address>
<first-name>Jane</first-name>
<last-name>Doe</last-name>
<address1>123 Test Street</address1>
<city>London</city>
<postal-code>SE1 9RA</postal-code>
<state-code>OTHER</state-code>
<country-code>GB</country-code>
<phone>07223223123</phone>
</billing-address>
</customer>
<status>
<order-status>OPEN</order-status>
<shipping-status>NOT_SHIPPED</shipping-status>
<confirmation-status>CONFIRMED</confirmation-status>
<payment-status>NOT_PAID</payment-status>
</status>
<current-order-no>00000301</current-order-no>
<product-lineitems>
<product-lineitem>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
<base-price>38.00</base-price>
<lineitem-text>Gold Stretch Bangle</lineitem-text>
<tax-basis>38.00</tax-basis>
<position>1</position>
<product-id>013742002928M</product-id>
<product-name>Gold Stretch Bangle</product-name>
<quantity unit="">1.0</quantity>
<tax-rate>0.05</tax-rate>
<shipment-id>00001501</shipment-id>
<shipping-lineitem>
<net-price>10.00</net-price>
<tax>0.50</tax>
<gross-price>10.50</gross-price>
<base-price>10.00</base-price>
<lineitem-text>Item Shipping Cost (Surcharge)</lineitem-text>
<tax-basis>10.00</tax-basis>
<quantity unit="">1.0</quantity>
<tax-rate>0.05</tax-rate>
<type>surcharge</type>
</shipping-lineitem>
<gift>false</gift>
</product-lineitem>
</product-lineitems>
<shipping-lineitems>
<shipping-lineitem>
<net-price>5.99</net-price>
<tax>0.30</tax>
<gross-price>6.29</gross-price>
<base-price>5.99</base-price>
<lineitem-text>Shipping</lineitem-text>
<tax-basis>5.99</tax-basis>
<item-id>STANDARD_SHIPPING</item-id>
<shipment-id>00001501</shipment-id>
<tax-rate>0.05</tax-rate>
</shipping-lineitem>
</shipping-lineitems>
<shipments>
<shipment shipment-id="00001501">
<status>
<shipping-status>NOT_SHIPPED</shipping-status>
</status>
<shipping-method>001</shipping-method>
<shipping-address>
<first-name>Jane</first-name>
<last-name>Doe</last-name>
<address1>Snappy Snaps</address1>
<city>London S2SGB14496</city>
<postal-code>WC2E 9AX</postal-code>
<state-code>OTHER</state-code>
<country-code>GB</country-code>
<phone>07223223123</phone>
</shipping-address>
<gift>false</gift>
<totals>
<merchandize-total>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
</merchandize-total>
<adjusted-merchandize-total>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
</adjusted-merchandize-total>
<shipping-total>
<net-price>15.99</net-price>
<tax>0.80</tax>
<gross-price>16.79</gross-price>
</shipping-total>
<adjusted-shipping-total>
<net-price>15.99</net-price>
<tax>0.80</tax>
<gross-price>16.79</gross-price>
</adjusted-shipping-total>
<shipment-total>
<net-price>53.99</net-price>
<tax>2.70</tax>
<gross-price>56.69</gross-price>
</shipment-total>
</totals>
<custom-attributes>
<custom-attribute attribute-id="collectPointId">GB14496</custom-attribute>
<custom-attribute attribute-id="collectPointName">Snappy Snaps</custom-attribute>
<custom-attribute attribute-id="collectPointNetwork">dpd</custom-attribute>
<custom-attribute attribute-id="collectPointType">public</custom-attribute>
</custom-attributes>
</shipment>
</shipments>
<totals>
<merchandize-total>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
</merchandize-total>
<adjusted-merchandize-total>
<net-price>38.00</net-price>
<tax>1.90</tax>
<gross-price>39.90</gross-price>
</adjusted-merchandize-total>
<shipping-total>
<net-price>15.99</net-price>
<tax>0.80</tax>
<gross-price>16.79</gross-price>
</shipping-total>
<adjusted-shipping-total>
<net-price>15.99</net-price>
<tax>0.80</tax>
<gross-price>16.79</gross-price>
</adjusted-shipping-total>
<order-total>
<net-price>53.99</net-price>
<tax>2.70</tax>
<gross-price>56.69</gross-price>
</order-total>
</totals>
<payments>
<payment>
<credit-card>
<card-type>VISA</card-type>
<card-number>XXXX-XXXX-XXXX-1111</card-number>
<card-holder>Jane Doe</card-holder>
<card-token>dscvse6xdkj</card-token>
<expiration-month>2</expiration-month>
<expiration-year>2025</expiration-year>
</credit-card>
<amount>56.69</amount>
<processor-id>BASIC_CREDIT</processor-id>
<transaction-id>00000301</transaction-id>
</payment>
</payments>
<remoteHost>86.147.199.105</remoteHost>
</order>
</orders>
For issues during installation, configuration, or troubleshooting, please contact the HubBox Client Support or Integrations team at clientsupport@hub-box.com, providing details of your SFCC version, cartridge version, Business Manager settings, and steps to reproduce the issue.