跳至主要内容

Storefronts and marketplaces

Stop a price going live below what it costs you

A promotion is keyed in, a sheet is dragged one row too far, a currency is assumed, and a price goes live under cost plus the platform's cut. Nobody notices until the payout arrives. No storefront will stop this for you: price is a plain field, and the platform's fee is something you learn afterwards, from the transaction. So the floor has to be computed on your side, stored next to the product, and checked against what is actually live.

Triggers
Two
Runs
Nightly
Stack
4 tools
Durable execution
Not required

The flow

The top track computes a floor the moment a price is proposed. The bottom track reads what is actually live and compares. Two triggers, because a bad price arrives both ways: typed in, and left behind by a campaign that ended.

Data

A price is proposed

Sheets · Airtable

Orchestration

Pull cost and model the fee

n8n · Make

Data

Store the floor

Sheets · Airtable

Orchestration

Every night

n8n 排程

Platform

Read the live prices

Shopify Admin API

Orchestration

Below the floor?

n8n IF

Notify

Flag it to whoever sets price

Slack · WhatsApp

Orchestration

Leave the price alone

Step by step

  1. 01

    A price is proposed

    Sheets · Airtable

    Someone writes a new price into the pricing sheet. Catching it here is cheaper than catching it live, but it is not enough on its own — prices also change through campaigns and bulk edits that never pass through this sheet.

  2. 02

    Pull cost and model the fee

    n8n · Make

    Landed cost from the product record, then the platform's cut modelled from its published schedule: commission band, payment charge, any campaign levy. The fee is modelled rather than observed, because the real figure only exists after a sale.

  3. 03

    Store the floor

    Sheets · Airtable

    Write the computed floor beside the product, with the cost and fee assumptions that produced it. Six months later the useful column is not the floor but the assumption — that is what tells you whether a breach is a mispricing or a stale cost.

  4. 04

    Every night

    n8n 排程

    The check runs on a timer because the storefront gives you no hook that stands in front of a price before it publishes. Nightly is the honest cadence: it catches a bad price after a day, not after a payout.

  5. 05

    Read the live prices

    Shopify Admin API

    Read what customers can actually see, not what the sheet believes. Include discounted and campaign prices — the sheet price passing the floor while the campaign price sits under it is the common failure, not the rare one.

  6. 06

    Below the floor?

    n8n IF

    Compare the live figure against the stored floor. Set a tolerance you can defend: a few cents under on a clearance line is a rounding artefact, the same gap on your best seller is a decision somebody should have made deliberately.

  7. 07

    Flag it to whoever sets price

    Slack · WhatsApp

    Name the SKU, the live price, the floor, and the assumption behind the floor. Deliberately reverting the price automatically is the wrong default — a loss leader is a real strategy, and a workflow that silently undoes one destroys more than the mispricing would.

What the platform will not allow

Two of these explain why the floor must be computed rather than read. The other two set how fast you can act once it is breached.

  • Cost lives on the inventory item, and reading it is a permission, not a given: Shopify notes that "the user must have 'View product costs' permission granted in order to access this field once product granular permissions are enabled". An integration without it computes a floor of zero and passes everything.

    Shopify Admin GraphQL API — InventoryItem
  • The platform's actual cut arrives after the sale, on the transaction — and Shopify's own note on that field is that fees are "Only present for Shopify Payments transactions". A pre-publish floor therefore has to be built from the published fee schedule, not from what the platform charged you.

    Shopify Admin GraphQL API — OrderTransaction
  • productVariantsBulkUpdate "Updates multiple product variants for a single product in one operation" — one product per call, not one catalogue. If a breach turns out to affect a whole range, the correction is one call per product, and that is what sets how long the fix takes.

    Shopify Admin GraphQL API — productVariantsBulkUpdate
  • Both the nightly read and any correction are metered by calculated query cost rather than request count: 100 points per second on standard plans, 200 on Advanced, 1,000 on Plus, and "A single query may not exceed a cost of 1,000 points, regardless of plan limits." A sweep that pulls every variant in one query fails on cost before it fails on volume.

    Shopify — API rate limits

When this is not worth building

Three cases where the upkeep costs more than the occasional bad price.

  • Your margins are wide enough that no plausible typo goes under cost. The flow exists for the narrow band where a discount and a fee together cross the line; without that band it is a nightly job that always says no.

  • You do not know your landed cost per SKU. A floor computed from a guessed cost is worse than no floor — it produces a number people trust, and the first time it is wrong in the forgiving direction they stop reading the alerts.

  • Prices are set by one person who also owns the margin. The check adds a second opinion to a decision that already had one, and the alert lands back on the same desk it came from.

Related reading

联络我们

这些流程,你真正应该做哪一条?

我们每星期都在为香港的运营团队跑这些流程。告诉我们哪个环节正在耗你的时间,我们会告诉你自动化划不划得来。

开始对谈