Skip to main content
Sales targets let you set per-location sales goals across three metrics and track progress in real time from both the Charlie admin and Shopify POS.
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:
MetricDescriptionValue type
Gross salesTotal sales revenue for the periodMoney
Average order value (AOV)Average revenue per orderMoney
Units per transaction (UPT)Average items per orderDecimal

Period types

PeriodLength
Day1 day
Week7 days
Month1 calendar month from the start date
Year1 calendar year from the start date
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:
StatusWhen
UpcomingPeriod hasn’t started yet
In progressPeriod is active and hasn’t ended
AchievedPeriod ended and the target was met
Not achievedPeriod ended and the target wasn’t met

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:
FieldDescription
LocationThe location this target applies to
MetricGross sales, AOV, or UPT
Period typeDay, Week, Month, or Year
Period startThe date the period begins (YYYY-MM-DD)
Target valueThe goal value in your store currency (or decimal for UPT)
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.
ColumnRequiredDescription
location_idYesShopify location GID (gid://shopify/Location/...)
location_nameNoFor your reference, ignored on import
metricYesGROSS_SALES, AOV, or UPT
period_typeYesDAY, WEEK, MONTH, or YEAR
period_startYesISO date YYYY-MM-DD
period_endNoComputed automatically if omitted
target_valueYesPositive number in major units (e.g. 80000.50)
currencyNo3-letter ISO currency code, defaults to your store currency
3

Upload and validate

Click Import targets and upload your CSV. The wizard walks you through three steps:
  1. Upload — pick the CSV file
  2. Validate — row-by-row error report. Fix any errors in your spreadsheet and re-upload before proceeding
  3. 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
If no target is set for the current period for a given metric, the card shows a “No target set” empty state with a link back to the admin.

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

For each target:
  1. Charlie queries Shopify orders for the target’s location and period via the Admin API.
  2. Aggregates the orders into a currentValue per metric:
    • Gross sales — sum of order totals across the period
    • AOV — gross sales / order count
    • UPT — total line item quantity / order count
  3. progressPct = currentValue / targetValue × 100.
  4. Status is recomputed on every page load from the current date and the period dates.
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).

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

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.
Check:
  1. Is there a target for the current period (today’s date falls within periodStart and periodEnd) at the active POS location?
  2. Did the metafield sync run after creating the target? Edits flow to the shop metafield $app:sales_targets.data automatically.
  3. Is the POS device online to fetch the latest metafield?
Common causes:
  • location_id is not the full Shopify GID (gid://shopify/Location/123)
  • metric is lowercase or contains typos (must be GROSS_SALES, AOV, or UPT)
  • period_start is not in YYYY-MM-DD format
  • target_value includes a currency symbol — use plain numbers like 80000.50

Location capacity

Daily order limits per location

Analytics

Historical sales and fulfillment metrics
Last modified on May 22, 2026