Sales targets are a measurement and motivation tool. They don’t affect order routing or fulfillment constraints.
What you can track
Three metrics, configurable per location and period:Period types
The period end date is computed automatically from the start date and the period type.
Target status
Charlie computes the status of each target based on its current value, target value, and period dates:Setting up targets
Single target
1
Open Sales targets
Go to Charlie → Settings → Sales targets.
2
Create a target
Click Add target and fill in the form:
3
Save
Save the target. It appears immediately in the targets table with its computed status.
Bulk import via CSV
For setting many targets at once across locations and periods.1
Download the template
On the Sales targets page, click Download template. The template pre-fills a row for each of your locations so you can fill in the metric and target value without looking up IDs.
2
Fill in the CSV
Edit the template in your spreadsheet of choice.
3
Upload and validate
Click Import targets and upload your CSV. The wizard walks you through three steps:
- Upload — pick the CSV file
- Validate — row-by-row error report. Fix any errors in your spreadsheet and re-upload before proceeding
- Confirm — review the parsed targets, then apply
Export current targets
Click Export on the Sales targets page to download all current targets as CSV. Useful for backup, review, or making bulk edits before re-importing.Tracking from Shopify POS
The POS Sales targets tile lets your retail team see how they are tracking against the day’s goals without leaving POS.The tile
The tile appears on the POS smart grid for the active location and shows a quick on-track summary (e.g. “2 / 3 on track”). Tap the tile to open the modal.The modal
The modal shows one card per metric (Gross sales, AOV, UPT):- Current value for the active period at the current POS location
- Target value as configured in admin
- Progress percentage of current vs target
- Status badge (Upcoming, In progress, Achieved, or Not achieved)
- Period dates the target applies to
Include pending payments
By default, the POS tile and modal exclude orders that are still pending payment — a pending sale only counts toward your actuals once it’s paid. To include them, turn on Include pending payments in the modal.- The toggle sits just below the period selector in the modal
- It affects all three metrics (Gross sales, AOV, and UPT), since adding orders shifts the averages too
- Each till remembers its own setting, the same way it remembers the selected period
- The tile’s on-track summary updates to match within a few seconds
Offline behavior
The POS extension caches the last known values per device so the tile and modal still work without a connection. The cache refreshes every time the modal opens online.The POS tile queries up to 5,000 orders per period for performance. If a period exceeds this volume, totals are approximate and a console warning is logged.
Languages
The POS tile and modal are translated into English and French out of the box. POS picks the language based on the device’s POS language setting.How values are computed
Sales targets track your local pickup and retail (POS) orders at the location — other order types aren’t counted. Charlie computes progress separately on each surface, from the data each one has available:- In the admin dashboard, actuals come from Charlie’s fulfillment analytics, aggregated per location over the target’s period and windowed on when each order was fulfilled. This data has no payment-status dimension, so pending-payment orders always count here.
- On the POS tile, actuals are computed live from the Shopify Orders API for the current POS location, windowed on each order’s creation time, and exclude pending-payment orders by default.
- Gross sales — total order revenue across the period
- AOV — gross sales / order count
- UPT — total item quantity / order count
progressPct = currentValue / targetValue × 100. Status is recomputed from the current date and the period dates on every load.
Money values (Gross sales, AOV) are stored in cents internally and displayed in your store currency. UPT is stored as a raw decimal (e.g.
2.5 units per transaction).Admin and POS totals can differ, and that’s expected — the two surfaces use different data sources, windowing, and payment-status handling, as described above. Turn on Include pending payments on POS to bring its numbers in line with the admin dashboard.
Best practices
Start with one metric per location
Pick the most actionable metric per location (often gross sales for stores) before layering AOV and UPT.
Use the template for bulk setup
Download the CSV template before bulk import — it’s pre-filled with your location IDs so you don’t have to look them up.
Re-export before big changes
Export current targets before making sweeping edits so you can roll back via re-import if needed.
Refresh during shifts
Encourage retail staff to open the POS modal at key shift times — totals refresh on every open.
Troubleshooting
POS tile shows old values
POS tile shows old values
The POS extension caches the last known values per device. If you just edited a target in admin, open the modal once to trigger a refresh. The next render of the tile will reflect the new values.
POS tile shows no targets
POS tile shows no targets
Check:
- Is there a target for the current period (today’s date falls within
periodStartandperiodEnd) at the active POS location? - Did the metafield sync run after creating the target? Edits flow to the shop metafield
$app:sales_targets.dataautomatically. - Is the POS device online to fetch the latest metafield?
CSV import fails validation
CSV import fails validation
Common causes:
location_idis not the full Shopify GID (gid://shopify/Location/123)metricis lowercase or contains typos (must beGROSS_SALES,AOV, orUPT)period_startis not inYYYY-MM-DDformattarget_valueincludes a currency symbol — use plain numbers like80000.50
Related
Location capacity
Daily order limits per location
Analytics
Historical sales and fulfillment metrics