Weekly ShipStation shipping performance digest
Every Monday morning, get a Slack summary of last week's shipping spend, carrier performance, and cost outliers from ShipStation.
Every Monday at 9am in my local timezone, run a cron workflow that generates a written weekly shipping performance digest for the ops team and posts it as a single Slack message using the Slack Bot integration (so the message comes from a shared bot, not a personal account).
Pull last week's data from ShipStation. Use List Labels with a date range filter covering the previous Monday through Sunday. Also call List Carriers once so you can map raw carrier_id values to friendly carrier names (UPS, USPS, FedEx, DHL, etc.) in the digest. ShipStation money fields like shipment_cost are returned as objects shaped { amount, currency }, so unwrap amount before summing or averaging. Paginate List Labels until you have every label in the window.
Aggregate the labels by carrier. For each carrier, compute: total labels purchased, total spend (sum of shipment_cost.amount), and average cost per shipment. Then pull the prior week with the same logic and compute week-over-week percentage change in total spend, average cost per shipment, and label volume for each carrier.
In the digest, also call out: (1) the single most expensive shipment of the week (carrier, service, cost, destination if available); (2) the carrier with the best (lowest) average cost per shipment that week; and (3) any carrier where average cost per shipment spiked sharply versus the prior week, or where volume dropped sharply. Use roughly a 20% change as the default threshold but apply judgment based on volume so we don't flag noise from a carrier that only had two shipments.
Format the output as a readable Slack message using Slack mrkdwn (single asterisks for bold, no double asterisks, plain bullet lists). Structure it as: a short headline with the date range and total weekly spend, then a per-carrier breakdown table-style block, then the callouts at the bottom. Keep it scannable in under one screen height. Post to #shipping-ops by default and let me change the channel during setup.
If the window had zero labels, still post the digest with a one-line note that there was no shipping activity last week instead of sending an empty report.
Additional information
What does this prompt do?
- Pulls last week's purchased shipping labels from ShipStation and groups them by carrier.
- Compares total spend, label count, and average cost per shipment across UPS, USPS, FedEx, DHL, and any other connected carrier.
- Flags week over week swings: spend jumps, average cost spikes, and sharp volume drops.
- Calls out the single most expensive shipment of the week and the carrier with the best cost per shipment.
- Posts the whole digest as one Slack message every Monday at 9am so ops gets an actionable read without opening ShipStation.
What do I need to use this?
- A ShipStation account with at least one carrier connected and shipments purchased through it.
- A Slack workspace where the bot can post and the name of the channel you want the digest delivered to.
- An ops or leadership channel that should own shipping cost decisions (e.g. #shipping-ops, #operations, or a leadership DM).
How can I customize it?
- Change the schedule or post time, for example a daily morning recap or a monthly executive summary.
- Swap the destination from a channel to a direct message, or send to multiple channels.
- Narrow the carriers compared, or tell the agent to split the report by domestic vs international.
- Adjust what counts as a spike or drop, for example flag anything above a 15 percent change instead of the default.
Frequently asked questions
Do I need a paid ShipStation plan to use this?
Can I run this for a different period than weekly?
How do I change which Slack channel it posts to?
Will it work if I only ship with one carrier?
What if a week has zero shipments?
Stop logging into ShipStation to read off the weekly numbers.
Connect ShipStation and Slack once, and Geni posts a fresh shipping performance digest every Monday at 9am.