Loading DHL data…
Overview
By country
By month
Weight & products
Duties
Order details
Monthly cost trend total ex VAT, stacked by row type
Cost components share of total
Top 5 destinations by total cost
Top 10 destinations by cost
All countries click headers to sort
| Country | Parcels | Shipping £ | Duties £ | Total £ | Avg shipping/parcel £ | Avg duties/parcel £ | Avg kg/parcel | Avg order ex VAT £ | Shipping % of order |
|---|
Month-on-month by country total ex VAT per month, with change vs previous month
Monthly spend trend
Monthly breakdown MoM Δ in last column
| Month | Parcels | Shipping £ | Duties £ | Total £ | Avg/parcel £ | MoM Δ | Avg order ex VAT £ | Shipping % of order |
|---|
Parcels by weight band
By product type
Weight band detail
| Weight band | Parcels | Total cost £ | Avg cost £ | £/kg |
|---|
Duties & taxes by month
Top countries by duties paid
| Country | Duty rows | Total duties £ | Avg per row £ |
|---|
Order details one row per shipment · first 500 of 0 matching · DHL duties auto-merged via Shipment #
How to read Net shipping %: (DHL shipping cost − customer paid) ÷ order ex VAT
● Positive % = Skin Cupid loses on shipping (DHL cost exceeds what the customer paid)
● Negative % = Skin Cupid profits on shipping (customer paid more than the DHL cost)
● 0% = breakeven
● Positive % = Skin Cupid loses on shipping (DHL cost exceeds what the customer paid)
● Negative % = Skin Cupid profits on shipping (customer paid more than the DHL cost)
● 0% = breakeven
| Month | Ship Date | Order Ref | Country | City | Weight | DHL £ ex VAT | DHL duties £ | Order ex VAT | Customer paid ship | Net shipping % |
|---|
Loading DPD data…
Overview
By country
By month
By service
Order details
Monthly cost trend total ex VAT
Service mix share of total spend
Top 5 destinations by total cost
Top 10 destinations by cost
All countries
| Country | Parcels | Total £ | Avg/parcel £ | Avg kg | Avg order ex VAT £ | Shipping % of order | % of total |
|---|
Monthly spend trend
Monthly breakdown MoM Δ in last column
| Month | Parcels | Total £ | Avg/parcel £ | MoM Δ | Avg order ex VAT £ | Shipping % of order |
|---|
Parcels by service
Spend by service
Service detail
| Service | Parcels | Total £ | Avg/parcel £ | Avg kg |
|---|
Order details one row per parcel · first 800 of 0 matching
How to read Net shipping %: (DPD cost − customer paid) ÷ order ex VAT
● Positive % = Skin Cupid loses on shipping (DPD cost exceeds what the customer paid)
● Negative % = Skin Cupid profits on shipping (customer paid more than the DPD cost)
● 0% = breakeven
⚠ RTC parcels (returns to warehouse, Sender = "RTC WND") have no Shopify order ref by design.
● Positive % = Skin Cupid loses on shipping (DPD cost exceeds what the customer paid)
● Negative % = Skin Cupid profits on shipping (customer paid more than the DPD cost)
● 0% = breakeven
⚠ RTC parcels (returns to warehouse, Sender = "RTC WND") have no Shopify order ref by design.
| Ship Date | Service | Order Ref | Country | Weight | DPD £ ex VAT | Order ex VAT | Customer paid ship | Net shipping % |
|---|
Loading Royal Mail data…
Overview
By month
By service
By channel
By country
Order details
Monthly cost trend total est. ex VAT, stacked by service
Service mix share of total spend
Top channels by parcel count
Monthly spend trend
Monthly breakdown MoM Δ in last column
| Month | Parcels | Est. Net £ | Est. Gross £ | Avg £/parcel | MoM Δ |
|---|
Parcels by service
Spend by service
Service detail
| Service | Code | Parcels | Est. Net £ | Est. Gross £ | Avg £/parcel |
|---|
Parcels by channel
Channel detail
| Channel | Parcels | Est. Gross £ | Avg £/parcel | % of total |
|---|
How country is determined:
● Tracked 24 / Tracked 48 (TPS / TPN) are UK-only — always shown as UNITED KINGDOM
● International (MP7) — derived from the matched Shopify order's shipping address
● Unknown — international parcels with no Shopify match (e.g. In Store, Unleashed Warehouse Transfer)
● Tracked 24 / Tracked 48 (TPS / TPN) are UK-only — always shown as UNITED KINGDOM
● International (MP7) — derived from the matched Shopify order's shipping address
● Unknown — international parcels with no Shopify match (e.g. In Store, Unleashed Warehouse Transfer)
Top 10 destinations by parcels
International only excludes UK domestic for clarity
| Country | Parcels | Est. Gross £ | Avg £/parcel | % of intl |
|---|
All countries including UK domestic
| Country | Parcels | Est. Gross £ | Avg £/parcel | % of total |
|---|
Order details one row per parcel · first 800 of 0 matching
Cost basis: Royal Mail prices are flat per service/weight band, so we apply the OBA-derived monthly average rate per parcel. Total reconciles to actual OBA spend within ~1-2%.
How to read Net shipping %: (RM cost − customer paid) ÷ order ex VAT
● Positive % = Skin Cupid loses on shipping ● Negative % = Skin Cupid profits on shipping ● 0% = breakeven
⚠ Non-Shopify channels (In Store, Unleashed Warehouse Transfer) have no Shopify order match by design.
How to read Net shipping %: (RM cost − customer paid) ÷ order ex VAT
● Positive % = Skin Cupid loses on shipping ● Negative % = Skin Cupid profits on shipping ● 0% = breakeven
⚠ Non-Shopify channels (In Store, Unleashed Warehouse Transfer) have no Shopify order match by design.
| Despatch Date | Service | Channel | Country | Order Ref | Tracking | RM £ ex VAT | Order ex VAT | Customer paid ship | Net shipping % |
|---|
LCS Cleaning — coming soon
Monthly invoice data from Drive.
Badger Fulfillment — coming soon
Weekly QuickBooks receipts aggregated to monthly.
Ellgia — coming soon
Monthly PDF invoices from Drive.
Stacatruc — coming soon
Ad hoc engineer visit invoices.
EE — coming soon
Monthly broadband billing.
Water Plus — coming soon
Needs MyAccount portal extraction.
EON — coming soon
Manual download flow.
Overall operations cost — coming soon
Combines all suppliers once each module is live.
Loading courier data…
Time horizon:
From
to
Courier rate comparison your rate cards × avg parcel weight per destination
Click to re-pull DHL / DPD / Royal Mail data from Google Sheets
Updating rate cards when new rates arrive (annual contract / renegotiation)
1. Gather the files — collect the latest DHL, DPD and (when available) Royal Mail rate cards in Excel format (same format as the originals — DHL’s GB myDHLi-style workbook, DPD’s per-service tabs workbook).
2. Send to Claude — open a new Claude chat, upload all the XLSX files, and say: "Add these as the new rate card year for the Skin Cupid Ops portal." Claude will extract them into the same JSON structure and produce a patched portal build.
3. Deploy the new build — drop the new index.html into Cloudflare Pages, hard-refresh. The year dropdown above will now offer the new year alongside 2026, so you can A/B compare.
4. (Optional) Add side-by-side year-on-year comparison — once two years of rate cards are live, ask Claude to add a YoY column to the rate comparison table showing the rate change per country.
The current cost (left column) updates whenever you hit Refresh — it reads from Google Sheets where your monthly invoice consolidations land. Only the rate-card prices need this manual swap when contracts change.
1. Gather the files — collect the latest DHL, DPD and (when available) Royal Mail rate cards in Excel format (same format as the originals — DHL’s GB myDHLi-style workbook, DPD’s per-service tabs workbook).
2. Send to Claude — open a new Claude chat, upload all the XLSX files, and say: "Add these as the new rate card year for the Skin Cupid Ops portal." Claude will extract them into the same JSON structure and produce a patched portal build.
3. Deploy the new build — drop the new index.html into Cloudflare Pages, hard-refresh. The year dropdown above will now offer the new year alongside 2026, so you can A/B compare.
4. (Optional) Add side-by-side year-on-year comparison — once two years of rate cards are live, ask Claude to add a YoY column to the rate comparison table showing the rate change per country.
The current cost (left column) updates whenever you hit Refresh — it reads from Google Sheets where your monthly invoice consolidations land. Only the rate-card prices need this manual swap when contracts change.
Duty handling:
USA + Canada — Skin Cupid pays duties (DDP); Europe — IOSS or customer pays. DDP fee applied to DPD prices for USA/CA. DT1 is informational — only relevant where pre-clearance is used.
Current avg £: Shipping cost only — duties paid by Skin Cupid (US/Canada) are excluded so the figure is comparable to rate card prices.
Royal Mail International rate: Shown as actual avg £/parcel from your shipped data (rate card pending). "—" means no RM shipments to that country in this period.
Weight: Avg parcel weight per country; rates rounded up to next weight band.
Transit times: Indicative working days based on each courier’s published guidance — confirm with your account managers for contractual SLAs. DHL varies by destination zone; DPD by chosen service.
Recommendation logic: ★ in the DPD column marks the best-value service (fastest within £2 of the cheapest). The “Cheapest” column only considers options whose transit is within +3 days of the current courier — so a 10-day service won’t be recommended over a 2-day one just on price. DPD options exceeding that band are dimmed.
Current avg £: Shipping cost only — duties paid by Skin Cupid (US/Canada) are excluded so the figure is comparable to rate card prices.
Royal Mail International rate: Shown as actual avg £/parcel from your shipped data (rate card pending). "—" means no RM shipments to that country in this period.
Weight: Avg parcel weight per country; rates rounded up to next weight band.
Transit times: Indicative working days based on each courier’s published guidance — confirm with your account managers for contractual SLAs. DHL varies by destination zone; DPD by chosen service.
Recommendation logic: ★ in the DPD column marks the best-value service (fastest within £2 of the cheapest). The “Cheapest” column only considers options whose transit is within +3 days of the current courier — so a 10-day service won’t be recommended over a 2-day one just on price. DPD options exceeding that band are dimmed.
| Country | Parcels | Avg weight | Current avg £ shipping only |
DHL £ | DPD £ | RM £ | Cheapest | Saving/parcel | Annual saving | Duty |
|---|
— = no rate available (courier doesn’t serve that country, or weight exceeds limit). Rows sorted by annual saving descending. Switching only recommended if saving >£2/parcel and ≥5 parcels in period.
Switch opportunities countries where an alternative is cheaper than current
No switches recommended.
Every country is already on the cheapest viable courier given transit constraints.
| Country ⇅ | Parcels | Currently using | Switch to | Saving/parcel ⇅ | Annual saving ↓ |
|---|
Loading all courier data…
Time horizon:
From
to
Spend by courier monthly trend, stacked
Courier comparison cost per parcel and total
| Courier | Parcels | % of parcels | Total spend £ | % of spend | Avg £/parcel |
|---|
Spend share
Country spend & margin all couriers combined, sortable
Status flags: 🟢 Healthy (shipping <25% of revenue) ·
🟡 Watch (25-40%) ·
🔴 Loss-making (>40%)
Note: Order revenue requires Shopify sync. Royal Mail country requires Shopify match (UK domestic is hardcoded).
Note: Order revenue requires Shopify sync. Royal Mail country requires Shopify match (UK domestic is hardcoded).
| Country | Total parcels | DHL | DPD | RM | Total £ | Avg £/parcel | Order rev £ | Customer paid £ | Shipping % of rev | Status |
|---|
These are real shipments without a matched Shopify order, so revenue and margin can’t be calculated.
Usually means the order ref on the shipment didn’t resolve to a Shopify order (legacy data, B2B orders not in Shopify, or unsynced).
| Country | Total parcels | DHL | DPD | RM | Total £ | Avg £/parcel |
|---|
⚠️ Loss-making destinations countries where shipping cost exceeds 40% of order revenue
Settings
Published Google Sheet CSV. Default is the Skin Cupid DHL Analytics Data sheet.
Published Google Sheet CSV. Default is the DPD Consolidated sheet built by the Apps Script.
Published Google Sheet CSV. Default is the Royal Mail Consolidated sheet built by the Apps Script.
The Cloudflare Worker that proxies to Shopify Admin API. The token never touches the browser.
Shopify order sync cross-reference DHL parcels with Shopify order values
Loading status…
How it works: The portal loops through each month of your courier data (DHL, DPD, Royal Mail), fetches all Shopify orders from your Worker, and caches them in your browser's IndexedDB. Once cached, the portal matches each DHL parcel to its Shopify order to compute average order value and shipping cost as a percentage of order value.
First sync may take 2–5 minutes depending on order volume. After that, only re-sync if data changes.
First sync may take 2–5 minutes depending on order volume. After that, only re-sync if data changes.