# Show a free-shipping message only to visitors who qualify

> A free-shipping banner that's wrong for most visitors costs you trust. Show each country the delivery terms that apply to it, and test that it helps.

Use cases · Published 2026-10-22

A free-shipping banner is one of the most common things a store puts at the top of its pages. It's also often true for only some of its visitors. If you ship free in the United States but charge for delivery to Germany, a banner that says *Free shipping on every order* makes your German visitors a promise that checkout then breaks.

The fix is to show each country the terms that apply to it: free shipping where you offer it, and plain delivery terms everywhere else. This post covers how to plan those messages, where to put them, and how to check that they help.

## Why one message for everyone backfires

Extra costs at checkout, such as shipping, taxes and fees, are the reason shoppers give most often for abandoning a cart in Baymard Institute's checkout surveys, [as eMarketer reported](https://www.emarketer.com/content/extra-costs-are-the-top-reason-consumers-abandon-online-carts). A banner that promises free shipping to someone who then pays for it turns a small cost into a broken promise.

Showing each country its own terms fixes both sides: visitors who qualify see the offer, and visitors who don't learn what delivery costs before checkout instead of at it.

## Plan your messages first

Before you build anything, write down which countries get which message. Take the wording from your real shipping settings. A rule changes what visitors read, not what they're charged, so the two have to agree.

| Countries | What they read |
| --- | --- |
| United States | Free shipping on orders over $50 |
| Canada | Free shipping across Canada on orders over $75 |
| Germany, Austria | Delivery to {{country}} in 3–5 working days |
| Everywhere else | We ship to {{country}}. Delivery costs are shown before you pay |

Keep the list short. Three or four groups cover most stores, and more than that is hard to keep in step with your shipping rates.

## Build one rule per message

Each row of your list becomes one rule: the countries go under **When visitor matches**, and the message under **Then perform this action**.

- For a group of countries, use **Country Code** with **is one of**, such as `DE, AT`.
- For the last row, use **Country Code** with **is not one of** and every country from the rows above.
- Put `{{country}}` in the text to name each visitor's own country. *Delivery to {{country}} in 3–5 working days* reads *Delivery to Austria in 3–5 working days* for a visitor from Austria ([Dynamic text](https://geoengage.app/docs/rules/dynamic-text)).

Every rule that matches runs, so make sure each visitor matches exactly one. A visitor whose country can't be found matches none, not even the *is not one of* rule, and sees your page as usual, which is the safe default ([Location conditions](https://geoengage.app/docs/rules/conditions#location)).

[Try this rule in the GeoEngage rule builder](https://geoengage.app/try), no account needed.

## Put it where visitors decide

The top of the page is the usual place, but not the only one:

- **Your theme's announcement bar.** If your theme already has one, use **Replace Text** on it instead of adding a second bar. One bar that's right beats two that compete for attention.
- **A sticky bar.** **Sticky Bar** is the lightest of the bars: one line that stays in view.
- **Beside the price.** On product pages, **Insert HTML** after the price or the add-to-cart button puts the delivery terms where the visitor decides to buy.

Use **Pick an element on your site** to click the element you want to change instead of writing a CSS selector ([Actions](https://geoengage.app/docs/rules/actions#change-the-page)).

## Show it once, or on every page

A shipping message is information, not an interruption, so it can stay in view. Choose the action's **Display frequency** ([Timing and frequency](https://geoengage.app/docs/rules/timing#display-frequency)):

- **Until Dismissed** shows it on every page until the visitor closes it.
- **Once Per Session** shows it once a visit, for a lighter touch.

## Test that it helps

Before you trust the new message, test it. Turn on **A/B Testing** for the rule, with one version against nothing: some of the matching visitors see the message, the rest don't, and the result shows which group reached your goal more often ([A/B tests](https://geoengage.app/docs/rules/ab-tests)).

Pick a goal that comes after the message, such as your order confirmation page. On Shopify, where checkout doesn't load your theme, count a click on **Add to cart** instead ([Goals and conversions](https://geoengage.app/docs/analytics/goals)).

GeoEngage waits for at least 100 visits in each group before it compares them, and calls a difference only when it's statistically significant. Decide how long the test runs before you start, and don't stop it the first time one side pulls ahead.

To measure all of your rules together rather than one at a time, use a [holdout group](https://geoengage.app/blog/what-is-a-holdout-group).

## Common questions

### Can it work out each country's shipping cost by itself?

No. Rules don't read your shipping settings: you write each message. When your rates change, update the rules too.

### Can it change prices for each country?

No. A rule changes the words on the page, not prices. Prices for each country are set in your store's own settings, such as Shopify Markets.

### What about visitors using a VPN?

They see the message for the country their VPN puts them in. Your checkout still charges shipping for the address they enter.

### Should I use the visitor's state instead?

Only when it matters, such as an offer for one US state. The state is unknown for more visitors than the country, so a rule on the state reaches fewer people ([When a value is unknown](https://geoengage.app/docs/rules/dynamic-text#when-a-value-is-unknown)).

---

Source: https://geoengage.app/blog/free-shipping-message-by-country
