{"id":293723,"date":"2026-08-13T16:40:28","date_gmt":"2026-08-13T08:40:28","guid":{"rendered":"https:\/\/www.mimingmart.com\/loyalty-convert-2\/"},"modified":"2026-08-13T16:40:28","modified_gmt":"2026-08-13T08:40:28","slug":"loyalty-convert-2","status":"publish","type":"page","link":"https:\/\/www.mimingmart.com\/en\/loyalty-convert-2\/","title":{"rendered":"Rewards Exchange"},"content":{"rendered":"<div class=\"mmmlc\" data-api=\"https:\/\/www.mimingmart.com\/en\/wp-json\/mmm-loyalty\/v1\" data-login=\"https:\/\/www.mimingmart.com\/wp-login.php\">\n  <div class=\"mmmlc-card\">\n    <h2 class=\"mmmlc-title\">Rewards Exchange<\/h2>\n    <p class=\"mmmlc-sub\">Exchange Go Clean Stamps and M Points \u00b7 1 Stamp = 1 M Point = HK$30 \u00b7 Two exchanges per month<\/p>\n\n    <div class=\"mmmlc-loggedout\" hidden>\n      <p class=\"mmmlc-note\">Please <a class=\"mmmlc-login\" href=\"#\">log in<\/a> to view and use the rewards exchange.<\/p>\n    <\/div>\n\n    <div class=\"mmmlc-body\" hidden>\n      <div class=\"mmmlc-balances\">\n        <div class=\"mmmlc-tile\">\n          <span class=\"mmmlc-tile-label\">Go Clean Stamps<\/span>\n          <span class=\"mmmlc-tile-val\" data-bal=\"stamps\">\u2026<\/span>\n          <span class=\"mmmlc-tile-hkd\" data-hkd=\"stamps\"><\/span>\n        <\/div>\n        <div class=\"mmmlc-tile\">\n          <span class=\"mmmlc-tile-label\">M Points<\/span>\n          <span class=\"mmmlc-tile-val\" data-bal=\"points\">\u2026<\/span>\n          <span class=\"mmmlc-tile-hkd\" data-hkd=\"points\"><\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"mmmlc-main\">\n        <div class=\"mmmlc-dir\" role=\"tablist\">\n          <button type=\"button\" class=\"mmmlc-dir-btn is-active\" data-dir=\"stamps_to_points\">Go Clean Stamps \u2192 M Points<\/button>\n          <button type=\"button\" class=\"mmmlc-dir-btn\" data-dir=\"points_to_stamps\">M Points \u2192 Go Clean Stamps<\/button>\n        <\/div>\n        <label class=\"mmmlc-field\">\n          <span class=\"mmmlc-field-label\">\u8f49\u63db\u6578\u91cf<\/span>\n          <span class=\"mmmlc-amt\">\n            <input type=\"text\" class=\"mmmlc-input\" inputmode=\"numeric\" pattern=\"[0-9]*\" placeholder=\"0\" aria-label=\"\u8f49\u63db\u6578\u91cf\">\n            <button type=\"button\" class=\"mmmlc-max\">\u5168\u90e8<\/button>\n          <\/span>\n        <\/label>\n        <p class=\"mmmlc-preview\"><span class=\"mmmlc-from\">0 Go Clean Stamps<\/span> \u2192 <span class=\"mmmlc-to\">0 M Points<\/span><\/p>\n        <button type=\"button\" class=\"mmmlc-next\">\u7e7c\u7e8c<\/button>\n      <\/div>\n\n      <div class=\"mmmlc-review\" hidden>\n        <p class=\"mmmlc-review-head\">Please confirm this exchange<\/p>\n        <p class=\"mmmlc-review-action\"><\/p>\n        <table class=\"mmmlc-review-tbl\">\n          <tr><th><\/th><th>Now<\/th><th>After<\/th><\/tr>\n          <tr><td>Go Clean Stamps<\/td><td data-rev=\"stamps_before\"><\/td><td data-rev=\"stamps_after\"><\/td><\/tr>\n          <tr><td>M Points<\/td><td data-rev=\"points_before\"><\/td><td data-rev=\"points_after\"><\/td><\/tr>\n        <\/table>\n        <p class=\"mmmlc-warn\">\u26a0\ufe0f This exchange cannot be undone, and only two exchanges are allowed each month. Exchanged rewards keep their original expiry date.<\/p>\n        <div class=\"mmmlc-review-btns\">\n          <button type=\"button\" class=\"mmmlc-back\">Cancel<\/button>\n          <button type=\"button\" class=\"mmmlc-submit\">Confirm exchange<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <p class=\"mmmlc-msg\" role=\"status\" aria-live=\"polite\"><\/p>\n  <\/div>\n\n  <section class=\"mmmlc-terms\">\n    <h3 class=\"mmmlc-terms-title\">Terms & Conditions<\/h3>\n    <ul class=\"mmmlc-terms-list\">\n      <li>Two exchanges may be made each calendar month.<\/li>\n      <li>Exchanged M Points \/ Stamps keep their original expiry date.<\/li>\n      <li>You must have an online store account, and its email address and mobile number must exactly match your in-store member record, before Points and Stamps can be exchanged.<\/li>\n      <li>Accounts are matched to in-store members by the registered email address, so please register and sign in with the same email you use in store.<\/li>\n    <\/ul>\n  <\/section>\n<\/div>\n\n<style>\n.mmmlc{font-family:inherit;color:#2b2b2b}\n.mmmlc-card{max-width:460px;margin:0 auto;background:#fff;border:1px solid #ece6e4;border-radius:18px;padding:1.6rem 1.5rem;box-shadow:0 6px 24px rgba(60,40,40,.06)}\n.mmmlc-title{font-size:1.35rem;margin:0 0 .3rem;font-weight:700;letter-spacing:.01em}\n.mmmlc-sub{font-size:.8rem;color:#8a807d;margin:0 0 1.3rem;line-height:1.5}\n.mmmlc-balances{display:flex;gap:.75rem;margin-bottom:1.4rem}\n.mmmlc-tile{flex:1;border:1px solid #efe9e7;border-radius:14px;padding:.95rem .8rem;background:#faf7f6;text-align:center}\n.mmmlc-tile-label{display:block;font-size:.74rem;color:#9a8f8b;margin-bottom:.4rem}\n.mmmlc-tile-val{display:block;font-size:1.7rem;font-weight:700;line-height:1;color:#7a4b4b}\n.mmmlc-tile-hkd{display:block;font-size:.72rem;color:#b0a39e;margin-top:.3rem}\n.mmmlc-dir{display:flex;gap:.35rem;background:#f3eeed;border-radius:11px;padding:.25rem;margin-bottom:1.1rem}\n.mmmlc-dir-btn{flex:1;border:0;background:transparent;border-radius:9px;padding:.55rem .3rem;font-size:.82rem;cursor:pointer;color:#8a807d}\n.mmmlc-dir-btn.is-active{background:#fff;color:#3a2f2d;font-weight:600;box-shadow:0 1px 4px rgba(0,0,0,.08)}\n.mmmlc-field{display:block;margin-bottom:1rem}\n.mmmlc-field-label{display:block;font-size:.8rem;color:#7a716e;margin-bottom:.4rem}\n.mmmlc-amt{display:flex;gap:.5rem}\n.mmmlc-input{flex:1;border:1px solid #e2dad7;border-radius:11px;padding:.7rem .9rem;font-size:1.15rem;color:#2b2b2b}\n.mmmlc-input:focus{outline:none;border-color:#c89a9a;box-shadow:0 0 0 3px rgba(200,154,154,.18)}\n.mmmlc-max{border:1px solid #e2dad7;background:#fff;border-radius:11px;padding:0 1.1rem;cursor:pointer;font-size:.82rem;color:#7a4b4b}\n.mmmlc-preview{text-align:center;font-size:1rem;color:#4a403d;margin:.2rem 0 1.1rem}\n.mmmlc-preview span{font-weight:700;color:#7a4b4b}\n.mmmlc-next,.mmmlc-submit{width:100%;border:0;border-radius:12px;padding:.85rem;background:#7a4b4b;color:#fff;font-size:1rem;font-weight:600;cursor:pointer}\n.mmmlc-next:disabled,.mmmlc-submit:disabled{opacity:.45;cursor:not-allowed}\n.mmmlc-review-head{font-size:1rem;font-weight:700;margin:.2rem 0 .8rem;text-align:center}\n.mmmlc-review-action{text-align:center;font-size:1.05rem;color:#7a4b4b;font-weight:700;margin:.2rem 0 1rem}\n.mmmlc-review-tbl{width:100%;border-collapse:collapse;font-size:.9rem;margin-bottom:.9rem}\n.mmmlc-review-tbl th{font-weight:600;color:#9a8f8b;font-size:.78rem;padding:.35rem;text-align:right}\n.mmmlc-review-tbl th:first-child{text-align:left}\n.mmmlc-review-tbl td{padding:.4rem .35rem;text-align:right;border-top:1px solid #f0eae8}\n.mmmlc-review-tbl td:first-child{text-align:left;color:#7a716e}\n.mmmlc-warn{font-size:.82rem;color:#b5602b;background:#fdf3ec;border-radius:9px;padding:.6rem .8rem;margin:0 0 1rem;text-align:center}\n.mmmlc-review-btns{display:flex;gap:.6rem}\n.mmmlc-back{flex:1;border:1px solid #e2dad7;background:#fff;border-radius:12px;padding:.85rem;font-size:.95rem;cursor:pointer;color:#7a716e}\n.mmmlc-submit{flex:2}\n.mmmlc-msg{text-align:center;font-size:.85rem;margin:.9rem 0 0;min-height:1.1rem;color:#7a716e}\n.mmmlc-msg.is-err{color:#c0392b}.mmmlc-msg.is-ok{color:#1e7e34}\n.mmmlc-note{text-align:center;color:#7a716e}\n.mmmlc-tile.is-unlinked .mmmlc-tile-val{color:#b0a39e;font-size:1rem;font-weight:600}\n.mmmlc-terms{max-width:460px;margin:1rem auto 0;background:#faf7f6;border:1px solid #efe9e7;border-radius:14px;padding:1.05rem 1.2rem}\n.mmmlc-terms-title{font-size:.82rem;font-weight:700;color:#7a4b4b;margin:0 0 .55rem;letter-spacing:.02em}\n.mmmlc-terms-list{margin:0;padding-left:1.1rem;list-style:disc}\n.mmmlc-terms-list li{font-size:.78rem;line-height:1.7;color:#8a807d;margin:0 0 .35rem}\n.mmmlc-terms-list li:last-child{margin-bottom:0}\n<\/style>\n\n<script>\n(function(){\n  var root=document.querySelector('.mmmlc[data-api]'); if(!root||root.dataset.init)return; root.dataset.init=1;\n  var api=root.dataset.api.replace(\/\\\/$\/,''), loginUrl=root.dataset.login, HKD=30, nonce='';\n  var dir='stamps_to_points', st={points:0,stamps:null,hub_status:'unreachable',quota_left:0,convert_limit:2,convert_enabled:false};\n  var $=function(s){return root.querySelector(s)}, $$=function(s){return root.querySelectorAll(s)};\n  var msg=$('.mmmlc-msg'), bodyEl=$('.mmmlc-body'), outEl=$('.mmmlc-loggedout');\n  var mainEl=$('.mmmlc-main'), reviewEl=$('.mmmlc-review'), nextBtn=$('.mmmlc-next'), submitBtn=$('.mmmlc-submit');\n  var input=$('.mmmlc-input'), L={stamps:'Go Clean Stamps',points:'M Points'};\n  $('.mmmlc-login').href=loginUrl;\n\n  function srcKey(){return dir==='stamps_to_points'?'stamps':'points'}\n  function dstKey(){return dir==='stamps_to_points'?'points':'stamps'}\n  function num(v){return v==null?0:v}\n  function hkd(n){return 'HK$'+(n*HKD).toLocaleString()}\n  function setMsg(t,c){msg.textContent=t||'';msg.className='mmmlc-msg'+(c?' '+c:'')}\n\n  function renderBalances(){\n    var sT=$$('.mmmlc-tile')[0];\n    if(st.stamps==null){sT.classList.add('is-unlinked');$('[data-bal=stamps]').textContent='Not linked';$('[data-hkd=stamps]').textContent='';}\n    else{sT.classList.remove('is-unlinked');$('[data-bal=stamps]').textContent=st.stamps;$('[data-hkd=stamps]').textContent='\u2248 '+hkd(st.stamps);}\n    $('[data-bal=points]').textContent=st.points;$('[data-hkd=points]').textContent='\u2248 '+hkd(st.points);\n  }\n  function renderPreview(){var n=parseInt(input.value,10)||0;$('.mmmlc-from').textContent=n+' '+L[srcKey()];$('.mmmlc-to').textContent=n+' '+L[dstKey()];}\n  \/\/ silent: keep whatever message is on screen (e.g. \u8f49\u63db\u6210\u529f) and only re-gate the button,\n  \/\/ otherwise the post-convert refresh overwrites the success line with the quota notice.\n  function gateUi(silent){\n    var s=st.hub_status;\n    nextBtn.disabled = s!=='ok' || st.quota_left<=0;\n    if(silent) return;\n    if(s==='no_member_code')        setMsg('This online account is not yet linked to your in-store membership. Please make sure the email address and mobile number on your online account exactly match your in-store member record.','is-err');\n    else if(s==='no_stamp_history') setMsg('This member has no Go Clean Stamp history yet, so no exchange can be made.','is-err');\n    else if(s==='unavailable')      setMsg('Your Go Clean Stamp balance cannot be updated right now. Please try again later.','is-err');\n    else if(s==='unreachable')      setMsg('Your Go Clean Stamp balance cannot be read right now. Please try again later.','is-err');\n    else if(st.quota_left<=0)       setMsg('You have used both exchanges for this month. Please try again next month.','is-err');\n    else if(!st.convert_enabled)    setMsg('The exchange feature is coming soon.');\n    else setMsg('You have '+st.quota_left+' exchange(s) left this month.');\n  }\n\n  $$('.mmmlc-dir-btn').forEach(function(b){b.addEventListener('click',function(){$$('.mmmlc-dir-btn').forEach(function(x){x.classList.remove('is-active')});b.classList.add('is-active');dir=b.dataset.dir;renderPreview();});});\n  input.addEventListener('input',function(){input.value=input.value.replace(\/[^0-9]\/g,'');renderPreview();});\n  $('.mmmlc-max').addEventListener('click',function(){var s=st[srcKey()];if(s!=null){input.value=s;renderPreview();}});\n\n  function showReview(){\n    var n=parseInt(input.value,10)||0;\n    if(n<=0){setMsg('Please enter a valid amount.','is-err');return;}\n    var s=st[srcKey()];if(s!=null&&n>s){setMsg('Insufficient balance.','is-err');return;}\n    setMsg('');\n    $('.mmmlc-review-action').textContent=n+' '+L[srcKey()]+' \u2192 '+n+' '+L[dstKey()];\n    var sb=num(st.stamps),pb=num(st.points),d=(dir==='stamps_to_points'?1:-1);\n    $('[data-rev=stamps_before]').textContent=st.stamps==null?'\u2014':sb;\n    $('[data-rev=points_before]').textContent=pb;\n    $('[data-rev=stamps_after]').textContent=st.stamps==null?'\u2014':(sb-d*n);\n    $('[data-rev=points_after]').textContent=(pb+d*n);\n    mainEl.hidden=true;reviewEl.hidden=false;\n  }\n  function backToMain(){reviewEl.hidden=true;mainEl.hidden=false;setMsg('');}\n  nextBtn.addEventListener('click',showReview);\n  $('.mmmlc-back').addEventListener('click',backToMain);\n\n  submitBtn.addEventListener('click',function(){\n    var n=parseInt(input.value,10)||0; submitBtn.disabled=true; setMsg('Processing\u2026');\n    fetch(api+'\/me\/convert',{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application\/json','X-MMM-Nonce':nonce},\n      body:JSON.stringify({direction:dir,amount:n})})\n      .then(function(r){return r.json().then(function(j){return{ok:r.ok,j:j}})})\n      .then(function(res){\n        if(res.ok){backToMain();setMsg('Exchange completed.','is-ok');load(true);}\n        else{setMsg(res.j&&res.j.message?res.j.message:'The exchange is unavailable right now.','is-err');backToMain();}\n      })\n      .catch(function(){setMsg('Network error. Please try again later.','is-err');backToMain();})\n      .finally(function(){submitBtn.disabled=false});\n  });\n\n  function load(silent){\n    fetch(api+'\/me\/balances',{credentials:'same-origin',headers:{'Accept':'application\/json'}})\n      .then(function(r){return r.json()})\n      .then(function(j){\n        if(!j||!j.logged_in){outEl.hidden=false;bodyEl.hidden=true;return;}\n        outEl.hidden=true;bodyEl.hidden=false;\n        st=j;HKD=j.hkd_per||30;nonce=j.nonce||'';renderBalances();renderPreview();gateUi(silent);\n      })\n      .catch(function(){outEl.hidden=true;bodyEl.hidden=false;setMsg('Could not load your balances.','is-err');});\n  }\n  load();\n})();\n<\/script>\n\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":""},"page-categories":[],"class_list":["post-293723","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/pages\/293723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/comments?post=293723"}],"version-history":[{"count":0,"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/pages\/293723\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/media?parent=293723"}],"wp:term":[{"taxonomy":"page-categories","embeddable":true,"href":"https:\/\/www.mimingmart.com\/en\/wp-json\/wp\/v2\/page-categories?post=293723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}