You want your best customers to get something the general public does not — a same-day courier, a named express service, a shipping tier you do not want appearing on every anonymous first order. Shopify will not do this natively, because nothing in Shopify's shipping configuration knows who the buyer is.
This is a two-app recipe, and it needs two apps for a real reason rather than a marketing one: the tag is written in one place and read in a completely different one.
Why Shopify can't do this alone
Shipping profiles vary rates by product and destination. That is the whole axis. A profile cannot ask "has this person ordered before", because at the moment Shopify assembles the rate list it is reasoning about a cart and an address, not a relationship.
The two usual workarounds both miss:
- A free-shipping discount code. The express option is still visible to everyone; you have only made it cheaper for whoever has the code, and codes travel.
- A customer-account-gated storefront. That changes what someone browsing your theme sees. Checkout is not your theme, and a fast-checkout button skips it entirely.
Step 1 — let a rule own the tag
Tagging VIPs by hand works exactly until the first month you forget. The tag then describes what was true when someone last audited the customer list, which is the worst kind of data to make an automatic decision on.
In Rules2Tag, the VIP definition is a sentence:
When a customer's lifetime spend is over $2,000 → add the tag
vip.
Two things about this rule matter more than the threshold you pick:
- Backfill it. A tagging rule that only runs going forward leaves every existing VIP untagged, and they are precisely the customers most likely to notice. Run the rule across your existing customers once so it starts from the truth.
- Make it self-correcting. Write the removal alongside the addition, so a customer who no longer qualifies loses the tag without anyone remembering to check. A tag that only ever gets added eventually describes everyone.
Step 2 — let the checkout read it
Now the checkout side, in Ruleproof:
Hide the shipping option Express — except when the customer is tagged
vip.
Written as an exception rather than as two rules, because that is the shape that stays correct: express is hidden by default and one named group gets it back. If you write it the other way round — show express to VIPs — you have said nothing about what everyone else sees, and everyone else is most of your traffic.
Customer tags are read at checkout from a field this app keeps in sync, so the tag must be on the account before the customer reaches checkout. In practice that is automatic: the tagging rule ran when their previous order was placed, days or weeks ago.
The join, and the one thing that can go wrong
The two halves meet at a string — the tag vip. Nothing enforces that the tagging rule writes the same string the checkout rule reads. Spell it wrong in one place and the recipe fails silently and in the safe direction: express is hidden from everybody, including the VIPs, and nobody complains because no customer knows to expect an option they cannot see.
So test the join specifically, not each half:
- Preview the checkout rule against a shopper with the tag. Express should appear.
- Preview it against a shopper without it. Express should not.
- After publishing, look at one real VIP order and confirm the tag was on the account.
Ruleproof's preview runs the compiled rule against a test shopper without touching a real order, so step 1 and step 2 take about a minute between them.
A guest checkout has no tag, and that is fine
Customer tags belong to customer accounts. A guest has neither, so a guest sees the ordinary shipping options. Design around this rather than fighting it: the VIP who wants VIP treatment signs in, which is the same deal every loyalty programme makes.
What each app is doing
| Where it runs | What it decides | |
|---|---|---|
| Rules2Tag | On your store, after an order | Who is a VIP, continuously |
| Ruleproof | Inside Shopify's checkout | What a VIP sees, in the moment |
Neither app can do the other's job, which is why this is a recipe rather than a feature. Tagging needs the Admin API and the whole customer history; the checkout decision has to happen inside checkout in milliseconds with no lookups available to it.
Both have a free plan, so you can build the whole thing and watch it work before deciding it is worth paying for.