How Are Packs (and Bundles) Specified in Token of Trust?
Keywords: pack quantity, volumeInMl, volume per unit, total volume, pack pricing, product sync, Shopify integration, API product updates
Summary
Pack products in Token of Trust HQ are specified using full pack-scaled amounts, not per-unit values. This applies to both volume (volumeInMl) and pricing fields (wholesalePrice, wholesaleCost, msrp, retailPrice).
The Rule
| Field | How to Specify | Example (10-pack of 6ml bottles) |
|---|---|---|
volumeInMl |
Total pack volume | 60 (not 6) |
packQuantity |
Number of units in pack | 10 |
retailPrice |
Total pack retail price | 99.99 (not 9.99) |
wholesalePrice |
Total pack wholesale price | 50.00 (not 5.00) |
wholesaleCost |
Total pack wholesale cost | 40.00 (not 4.00) |
msrp |
Total pack MSRP | 119.99 (not 11.99) |
Why This Matters
When you see a product in HQ with:
volumeInMl: 60packQuantity: 10
This means the total pack volume is 60ml (10 units × 6ml each). The system stores the aggregate value, not the per-unit value.
Integration Behavior
All Integrations Send Full Pack Amounts
Product sync from all integrations (Shopify, BigCommerce, WooCommerce, CSV uploads, API) should specify the full pack-scaled amounts:
- Shopify Product Sync: The
volume_in_mlmetaobject field should contain the total pack volume - API
/productendpoint: Send total pack volume in thevolumeInMlfield - CSV Product Uploads: Specify total pack volume in the Volume column
No Automatic Division or Multiplication
The system does not automatically:
- Divide values by
packQuantitywhen storing products - Multiply values by
packQuantitywhen displaying products
Values are stored and displayed exactly as received.
When Per-Unit Calculation Happens
Per-unit calculations only occur during tax calculations (in ExciseTaxService.node.js), not during product storage or display. During tax calculation for pack products:
- Prices are divided by
packQuantityto get per-unit pricing for tax assessment - Quantities are multiplied by
packQuantityto get total unit count
This is internal calculation logic and does not affect how products are stored or displayed in HQ.
Common Mistakes
Incorrect: Specifying Per-Unit Volume
{
"sku": "10-PACK-6ML",
"volumeInMl": 6,
"packQuantity": 10
}
This incorrectly suggests the total pack volume is only 6ml.
Correct: Specifying Full Pack Volume
{
"sku": "10-PACK-6ML",
"volumeInMl": 60,
"packQuantity": 10
}
This correctly indicates 60ml total (10 units × 6ml each).
Troubleshooting
"Why does HQ show a smaller volume than expected for my pack?"
If HQ displays what appears to be per-unit volume for a pack product, check:
- The source data: Verify what value was sent to the
/productAPI or configured in your integration - Shopify metaobject: Check the
volume_in_mlfield in the Shopify metaobject - it should contain the total pack volume - CSV upload: Verify the Volume column contains total pack volume, not per-unit
The issue is at the data entry point, not in HQ's display logic.
Related Code References
- Product API endpoint:
modules/product/api/product-api-routes.node.js - Product storage:
services/ExciseTaxService/ExciseTaxProductService.js - HQ display:
website/hq/pages/exciseTax/Products.vue - Shopify webhook handler:
shopify-app/server/productWebhookRoutes.js - Tax calculation (where per-unit math occurs):
services/ExciseTaxService/ExciseTaxService.node.js:562-612
Last updated: December 2025
Investigation reference: Pack volume and pricing specification analysis