Skip to content

Instantly share code, notes, and snippets.

@chrisgrabinski
Last active January 16, 2023 20:04
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save chrisgrabinski/db99b2ac12641fbf3b8e to your computer and use it in GitHub Desktop.
Save chrisgrabinski/db99b2ac12641fbf3b8e to your computer and use it in GitHub Desktop.
(Shopify) Automatically change a shop's currency based on the customer's geolocation
// Dependencies
// - https://github.com/carolineschnapp/currencies
// Don't change currency if Cookie has been already set
if (Currency.cookie.read() == null) {
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'GET',
dataType: 'jsonp',
success: function(location) {
if (location.country_code == 'TH') { // Default shop currency
$('[name=currencies][value=THB]').attr('checked', 'checked');
} else if (location.country_code == 'JP') { // Secondary currency
$('[name=currencies][value=JPY]').attr('checked', 'checked');
} else { // Fallback currency
$('[name=currencies][value=USD]').attr('checked', 'checked');
}
// Let the scripts in 'currencies.liquid' handle the rest
$('[name=currencies]').change();
}
} );
}
// Based upon code by Ben Klinger (www.studiove.com)
// Source: https://ecommerce.shopify.com/c/shopify-discussion/t/auto-change-currency-based-on-location-tutorial-179134
@Drewberrysteph
Copy link

Solved it with a little configuration and without API keys.
Check my script below.

https://gist.github.com/Drewberrysteph/e7f44d23d714617134ad7250d9149b06

@xcrpo
Copy link

xcrpo commented Feb 17, 2021

@kwibis The above script doesn't redirect the user. It updates the currency if the visitor is from the allowed countries, else set to the default currency i.e., 'GBP'.

Here is the updated script using ipgeolocation.io API as suggested by @Drewberrysteph.

<script src="https://cdn.jsdelivr.net/npm/ip-geolocation-api-jquery-sdk@1.1.0/ipgeolocation.min.js"></script>
<script>
  function setCookie(key, value, expiry) {
    var expires = new Date();
    expires.setTime(expires.getTime() + (expiry * 24 * 60 * 60 * 1000));
    document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/';
  }

  function setLocalCurrency(response) {

    if (response) {
      setCookie('cart_currency', response.currency.code, '1');
    }
  }

  _ipgeolocation.makeAsyncCallsToAPI(false);
  _ipgeolocation.enableSessionStorage(true);
  _ipgeolocation.setFields("currency");
  _ipgeolocation.getGeolocation(setLocalCurrency, "YOUR_API_KEY");
</script>

@hammadCodes
Copy link

@kwibis The above script doesn't redirect the user. It updates the currency if the visitor is from the allowed countries, else set to the default currency i.e., 'GBP'.

Here is the updated script using ipgeolocation.io API as suggested by @Drewberrysteph.

<script src="https://cdn.jsdelivr.net/npm/ip-geolocation-api-jquery-sdk@1.1.0/ipgeolocation.min.js"></script>
<script>
  function setCookie(key, value, expiry) {
    var expires = new Date();
    expires.setTime(expires.getTime() + (expiry * 24 * 60 * 60 * 1000));
    document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/';
  }

  function setLocalCurrency(response) {

    if (response) {
      setCookie('cart_currency', response.currency.code, '1');
    }
  }

  _ipgeolocation.makeAsyncCallsToAPI(false);
  _ipgeolocation.enableSessionStorage(true);
  _ipgeolocation.setFields("currency");
  _ipgeolocation.getGeolocation(setLocalCurrency, "YOUR_API_KEY");
</script>

Can it be somehow modified for location based content. I am trying this but not getting what i want

@kwibis
Copy link

kwibis commented Feb 25, 2021

@usmanbinliaqat thanks a lot! this seems to be working. One problem, it only works after the first page view. Any chance this can be fixed? Or does that mean, page reload?

@leeban17
Copy link

leeban17 commented Apr 5, 2021

@kwibis The above script doesn't redirect the user. It updates the currency if the visitor is from the allowed countries, else set to the default currency i.e., 'GBP'.

Here is the updated script using ipgeolocation.io API as suggested by @Drewberrysteph.

<script src="https://cdn.jsdelivr.net/npm/ip-geolocation-api-jquery-sdk@1.1.0/ipgeolocation.min.js"></script>
<script>
  function setCookie(key, value, expiry) {
    var expires = new Date();
    expires.setTime(expires.getTime() + (expiry * 24 * 60 * 60 * 1000));
    document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/';
  }

  function setLocalCurrency(response) {

    if (response) {
      setCookie('cart_currency', response.currency.code, '1');
    }
  }

  _ipgeolocation.makeAsyncCallsToAPI(false);
  _ipgeolocation.enableSessionStorage(true);
  _ipgeolocation.setFields("currency");
  _ipgeolocation.getGeolocation(setLocalCurrency, "YOUR_API_KEY");
</script>

Thanks for that. Seems though that it only works second time. The first time you go to a link it will not change currency. If you refresh, then it will. Is there any way to fix this? Thanks!

@kwibis
Copy link

kwibis commented Mar 1, 2022

@leeban17 your code has been working great! Any idea on how to work with the new currency selector from shopify?

@mingfengwan
Copy link

@leeban17 your code has been working great! Any idea on how to work with the new currency selector from Shopify?

I built a free auto currency and location app that works with the new currency & region selector of Shopify themes. It's inspired by discussions here with all code optimized for performance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment