{"id":1129,"date":"2021-11-04T10:43:37","date_gmt":"2021-11-04T14:43:37","guid":{"rendered":"https:\/\/ca.gpen.com\/loyalty-rewards\/"},"modified":"2026-09-21T16:19:07","modified_gmt":"2026-09-21T20:19:07","slug":"loyalty-rewards","status":"publish","type":"page","link":"https:\/\/ca.gpen.com\/fr\/loyalty-rewards\/","title":{"rendered":"Loyalty Rewards"},"content":{"rendered":"<p><div class=\"yotpo-widget-instance\" data-yotpo-instance-id=\"1044704\"><\/div><br \/>\n    <section class=\"gpen-redeem is-waiting\" id=\"gpen-redeem\" data-rest=\"https:\/\/ca.gpen.com\/fr\/wp-json\/gpen\/v1\/yotpo\/redeem\" data-nonce=\"3cf2ebcad6\" data-cart=\"https:\/\/ca.gpen.com\/fr\/cart\/\" data-shop=\"https:\/\/ca.gpen.com\/fr\/shop\/\" data-logged-in=\"0\">\n      <div class=\"gpen-redeem__head\">\n        <h2 class=\"gpen-redeem__title\">Comment utiliser vos points<\/h2>\n        <p class=\"gpen-redeem__sub\">100 points \u00e9quivalent \u00e0 environ 14 $ CA<\/p>\n        <p class=\"gpen-redeem__text\">Choisissez une r\u00e9compense ci-dessous et le code de r\u00e9duction est appliqu\u00e9 imm\u00e9diatement \u00e0 votre panier. Vous pouvez aussi copier le code et le coller \u00e0 la caisse. Les codes de r\u00e9compense de fid\u00e9lit\u00e9 ne peuvent pas \u00eatre combin\u00e9s avec d\u2019autres codes de r\u00e9duction.<\/p>\n                  <p class=\"gpen-redeem__balance\"><a class=\"gpen-redeem__login\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a> pour voir vos points et \u00e9changer vos r\u00e9compenses.<\/p>\n              <\/div>\n            <ul class=\"gpen-redeem__grid\">\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136701\" data-points=\"100\" data-variable=\"10\">\n            <span class=\"gpen-redeem__name\">Cash discount - any amount<\/span>\n                        <label class=\"gpen-redeem__cost\">Points \u00e0 utiliser <input type=\"number\" class=\"gpen-redeem__pts\" min=\"100\" step=\"10\" value=\"100\" inputmode=\"numeric\" style=\"width:90px\"><\/label>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136691\" data-points=\"100\">\n            <span class=\"gpen-redeem__name\">$10 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 14 $ CA\">environ 14 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">100 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136693\" data-points=\"200\">\n            <span class=\"gpen-redeem__name\">$20 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 28 $ CA\">environ 28 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">200 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136695\" data-points=\"400\">\n            <span class=\"gpen-redeem__name\">$40 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 56 $ CA\">environ 56 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">400 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136696\" data-points=\"600\">\n            <span class=\"gpen-redeem__name\">$60 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 84 $ CA\">environ 84 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">600 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136697\" data-points=\"800\">\n            <span class=\"gpen-redeem__name\">$80 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 112 $ CA\">environ 112 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">800 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136698\" data-points=\"1000\">\n            <span class=\"gpen-redeem__name\">$100 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 140 $ CA\">environ 140 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">1&nbsp;000 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136699\" data-points=\"1500\">\n            <span class=\"gpen-redeem__name\">$150 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 210 $ CA\">environ 210 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">1&nbsp;500 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n                  <li class=\"gpen-redeem__tile\" data-option=\"1136700\" data-points=\"2000\">\n            <span class=\"gpen-redeem__name\">$200 Off<\/span>\n                          <span class=\"gpen-redeem__cad\" data-cad=\"environ 280 $ CA\">environ 280 $ CA de rabais<\/span>\n                        <span class=\"gpen-redeem__cost\">2&nbsp;000 points<\/span>\n                          <a class=\"gpen-redeem__btn\" href=\"https:\/\/ca.gpen.com\/fr\/my-account\/\">Connexion<\/a>\n                      <\/li>\n              <\/ul>\n            <div class=\"gpen-redeem__result\" data-result hidden><\/div>\n      <div class=\"gpen-redeem__codes\" data-codes hidden>\n        <h3 class=\"gpen-redeem__codes-title\">Vos codes de r\u00e9compense<\/h3>\n        <ul data-codes-list>\n                  <\/ul>\n        <p class=\"gpen-redeem__text\">Collez un code dans la case du coupon \u00e0 la caisse. Chaque code fonctionne une seule fois.<\/p>\n      <\/div>\n    <\/section>\n    <style>\n      .yotpo-coupons-redemption-widget{display:none!important}\n      .gpen-redeem.is-waiting{display:none}.gpen-redeem{max-width:1100px;margin:0 auto;padding:24px 16px;text-align:center;font-family:inherit}\n      .gpen-redeem__title{font-size:26px;line-height:1.15;margin:0 0 8px}\n      .gpen-redeem__sub{margin:0 0 12px;font-weight:600}\n      .gpen-redeem__text{margin:0 auto 14px;max-width:640px;color:#444;font-size:14px;line-height:1.5}\n      .gpen-redeem__balance{font-size:16px;margin:0 0 20px}\n      .gpen-redeem__balance strong{color:#c8a400}\n      .gpen-redeem__login{text-decoration:underline}\n      .gpen-redeem__grid{list-style:none;margin:0 auto 20px;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:10px;max-width:900px}\n      .gpen-redeem__tile{border:1px solid #ddd;border-radius:8px;padding:14px 10px 12px;display:flex;flex-direction:column;align-items:center;gap:4px;background:#fff}\n      .gpen-redeem__name{font-weight:700;font-size:18px}\n      .gpen-redeem__cost{font-size:13px;color:#666;margin-bottom:6px}\n      .gpen-redeem__cad{font-size:13px;font-weight:600;color:#333}\n      .gpen-redeem__btn{display:inline-block;background:#111;color:#fff;border:0;border-radius:4px;padding:8px 18px;font-size:13px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;cursor:pointer;text-decoration:none}\n      .gpen-redeem a.gpen-redeem__btn,.gpen-redeem a.gpen-redeem__btn:hover{text-decoration:none;color:#fff}\n      .gpen-redeem__btn:disabled{background:#c9c9c9;cursor:not-allowed}\n      .gpen-redeem__btn.is-busy{opacity:.6;pointer-events:none}\n      .gpen-redeem__result{max-width:640px;margin:0 auto 20px;padding:14px 16px;border-radius:8px;background:#f2f9f2;border:1px solid #bfe3bf;font-size:15px;line-height:1.5}\n      .gpen-redeem__result.is-error{background:#fff3f3;border-color:#f0bcbc}\n      .gpen-redeem__result code,.gpen-redeem__codes code{font-size:17px;font-weight:700;letter-spacing:.06em;background:#fff;padding:2px 8px;border-radius:4px;border:1px dashed #999}\n      .gpen-redeem__result a{font-weight:700;text-decoration:underline}\n      .gpen-redeem__codes{max-width:640px;margin:0 auto}\n      .gpen-redeem__codes-title{font-size:18px;margin:10px 0 8px}\n      .gpen-redeem__codes ul{list-style:none;padding:0;margin:0 0 8px}\n      .gpen-redeem__codes li{padding:6px 0;display:flex;justify-content:center;gap:12px;align-items:center}\n      @media (min-width:768px){.gpen-redeem{padding:40px 16px}.gpen-redeem__grid{grid-template-columns:repeat(4,1fr)}.gpen-redeem__title{font-size:30px}}\n    <\/style>\n    <script>\n    (function () {\n      var box = document.getElementById('gpen-redeem'); if (!box) return;\n      var T = {\"ask\":\"\u00c9changer %1$s points contre %2$s?\",\"askv\":\"\u00c9changer %1$s points contre %2$s de rabais?\",\"busy\":\"\u00c9change en cours\u2026\",\"btn\":\"\u00c9changer\",\"err\":\"Une erreur est survenue. Veuillez r\u00e9essayer.\",\"done\":\"Vous avez \u00e9chang\u00e9 %1$s. Votre code est %2$s.\",\"code\":\"Votre code est %s.\",\"added\":\"Il a \u00e9t\u00e9 appliqu\u00e9 \u00e0 votre panier.\",\"links\":\"%1$sVoir le panier%2$s ou %3$scontinuer vos achats%4$s.\",\"link\":\"%1$sVoir le panier%2$s.\",\"paste\":\"Collez-le dans la case Code de r\u00e9duction au paiement.\",\"free\":\"%s gratuit\",\"pct\":\"%s % de rabais\",\"off\":\"%s de rabais\",\"locale\":\"fr_CA\"}, M = {\"r\":1.4,\"ts\":\"\u00a0\",\"fmt\":\"environ %s $ CA\"};\n      function f(t) { var a = [].slice.call(arguments, 1), i = 0; return t.replace(\/%(\\d)\\$s|%s\/g, function (m, n) { return n ? a[n - 1] : a[i++]; }); }\n      function money(usd) { return M.fmt.replace('%s', String(Math.round(usd * M.r)).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, M.ts)); }\n      \/\/ Take the place of the module's own redeem section once the module has rendered (it lists Shopify rewards).\n      \/\/ QA 2026-10-02: the box was painted under the H1 and then moved down as each Yotpo block rendered (CLS 0.76 on\n      \/\/ phones). It stays hidden until it is in its final place (or 8 s, if the module never renders), and the observer stops.\n      var placed = false, mo;\n      box.classList.add('is-waiting');\n      function reveal() { box.classList.remove('is-waiting'); if (mo) mo.disconnect(); }\n      function place() {\n        if (placed) return;\n        var w = document.querySelector('.yotpo-coupons-redemption-widget');\n        if (w && w.parentNode) { placed = true; w.parentNode.insertBefore(box, w); reveal(); }\n      }\n      place();\n      if (!placed) { mo = new MutationObserver(place); mo.observe(document.body, { childList: true, subtree: true }); setTimeout(function () { placed = true; reveal(); }, 8000); }\n      var result = box.querySelector('[data-result]');\n      function show(msg, err) { result.innerHTML = msg; result.hidden = false; result.classList.toggle('is-error', !!err); result.scrollIntoView({ block: 'nearest', behavior: 'smooth' }); }\n      function refreshButtons(balance) {\n        box.querySelectorAll('.gpen-redeem__tile').forEach(function (t) {\n          var b = t.querySelector('button'); if (b) b.disabled = balance < parseInt(t.getAttribute('data-points'), 10);\n        });\n        var el = box.querySelector('[data-balance]'); if (el) el.textContent = balance.toLocaleString();\n      }\n      function renderCodes(codes) {\n        var wrap = box.querySelector('[data-codes]'), list = box.querySelector('[data-codes-list]');\n        if (!codes || !codes.length) { wrap.hidden = true; return; }\n        list.innerHTML = codes.map(function (c) { return '<li><code>' + c.code + '<\/code> <span>' + (c.product ? f(T.free, c.product) : c.type === 'percent' ? f(T.pct, c.amount) : f(T.off, money(c.amount))) + '<\/span><\/li>'; }).join('');\n        wrap.hidden = false;\n      }\n      box.addEventListener('click', function (e) {\n        var b = e.target.closest('button.gpen-redeem__btn'); if (!b || b.disabled) return;\n        var tile = b.closest('.gpen-redeem__tile'), name = tile.querySelector('.gpen-redeem__name').textContent, pts = tile.getAttribute('data-points');\n        var cad = tile.querySelector('[data-cad]'); if (cad) name += ' (' + f(T.off, cad.getAttribute('data-cad')) + ')';\n        if (!window.confirm(f(T.ask, pts, name))) return;\n        b.classList.add('is-busy'); b.textContent = T.busy;\n        fetch(box.getAttribute('data-rest'), { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': box.getAttribute('data-nonce') }, body: JSON.stringify({ option_id: parseInt(tile.getAttribute('data-option'), 10), locale: T.locale }) })\n          .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })\n          .then(function (res) {\n            b.classList.remove('is-busy'); b.textContent = T.btn;\n            if (!res.ok) { show(res.j.error || T.err, true); return; }\n            var j = res.j;\n            if (j.customer) refreshButtons(j.customer.balance);\n            renderCodes(j.codes);\n            var msg = f(T.done, '<strong>' + name + '<\/strong>', '<code>' + j.code + '<\/code>') + ' ';\n            msg += j.applied ? T.added + ' ' + f(T.links, '<a href=\"' + box.getAttribute('data-cart') + '\">', '<\/a>', '<a href=\"' + box.getAttribute('data-shop') + '\">', '<\/a>') : T.paste;\n            show(msg, false);\n          })\n          .catch(function () { b.classList.remove('is-busy'); b.textContent = T.btn; show(T.err, true); });\n      });\n    })();\n    <\/script>\n        <script>\n    (function () {\n      \/\/ \"Points at checkout\" tile (config apps.yotpo_loyalty.redeem_variable): handled here, before the generic handler.\n      var box = document.getElementById('gpen-redeem'); if (!box) return;\n      var T = {\"ask\":\"\u00c9changer %1$s points contre %2$s?\",\"askv\":\"\u00c9changer %1$s points contre %2$s de rabais?\",\"busy\":\"\u00c9change en cours\u2026\",\"btn\":\"\u00c9changer\",\"err\":\"Une erreur est survenue. Veuillez r\u00e9essayer.\",\"done\":\"Vous avez \u00e9chang\u00e9 %1$s. Votre code est %2$s.\",\"code\":\"Votre code est %s.\",\"added\":\"Il a \u00e9t\u00e9 appliqu\u00e9 \u00e0 votre panier.\",\"links\":\"%1$sVoir le panier%2$s ou %3$scontinuer vos achats%4$s.\",\"link\":\"%1$sVoir le panier%2$s.\",\"paste\":\"Collez-le dans la case Code de r\u00e9duction au paiement.\",\"free\":\"%s gratuit\",\"pct\":\"%s % de rabais\",\"off\":\"%s de rabais\",\"locale\":\"fr_CA\"}, M = {\"r\":1.4,\"ts\":\"\u00a0\",\"fmt\":\"environ %s $ CA\"};\n      function f(t) { var a = [].slice.call(arguments, 1), i = 0; return t.replace(\/%(\\d)\\$s|%s\/g, function (m, n) { return n ? a[n - 1] : a[i++]; }); }\n      function money(usd) { return M.fmt.replace('%s', String(Math.round(usd * M.r)).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, M.ts)); }\n      var result = box.querySelector('[data-result]');\n      function show(msg, err) { result.innerHTML = msg; result.hidden = false; result.classList.toggle('is-error', !!err); result.scrollIntoView({ block: 'nearest', behavior: 'smooth' }); }\n      box.addEventListener('click', function (e) {\n        var b = e.target.closest('button.gpen-redeem__btn'), tile = b && b.closest('.gpen-redeem__tile[data-variable]');\n        if (!tile || b.disabled) return;\n        e.stopImmediatePropagation();\n        var ppd = parseInt(tile.getAttribute('data-variable'), 10) || 10, inp = tile.querySelector('.gpen-redeem__pts');\n        var pts = Math.floor((parseInt(inp.value, 10) || 0) \/ ppd) * ppd;\n        if (!window.confirm(f(T.askv, pts, money(pts \/ ppd)))) return;\n        b.classList.add('is-busy'); b.textContent = T.busy;\n        fetch(box.getAttribute('data-rest'), { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': box.getAttribute('data-nonce') }, body: JSON.stringify({ option_id: parseInt(tile.getAttribute('data-option'), 10), points: pts, locale: T.locale }) })\n          .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })\n          .then(function (res) {\n            b.classList.remove('is-busy'); b.textContent = T.btn;\n            if (!res.ok) { show(res.j.error || T.err, true); return; }\n            var j = res.j, el = box.querySelector('[data-balance]');\n            if (j.customer && el) el.textContent = j.customer.balance.toLocaleString();\n            show(f(T.code, '<code>' + j.code + '<\/code>') + ' ' + (j.applied ? T.added + ' ' + f(T.link, '<a href=\"' + box.getAttribute('data-cart') + '\">', '<\/a>') : T.paste), false);\n          })\n          .catch(function () { b.classList.remove('is-busy'); b.textContent = T.btn; show(T.err, true); });\n      }, true);\n    })();\n    <\/script>\n    <\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1129","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/pages\/1129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/comments?post=1129"}],"version-history":[{"count":4,"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/pages\/1129\/revisions"}],"predecessor-version":[{"id":5875,"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/pages\/1129\/revisions\/5875"}],"wp:attachment":[{"href":"https:\/\/ca.gpen.com\/fr\/wp-json\/wp\/v2\/media?parent=1129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}