Kroger Auto Coupon Clipper

Because clicking 200 coupons manually is how you waste a perfectly good Saturday morning

Note: I usually scan this as I'm running out the door to get the latest coupons added.

No more hassle of scanning QR codes at the grocery store!

Drag the blue button below into your bookmarks bar. That's the whole install process.
🎫 Kroger Coupon Clipper

How to Use

  1. Go to Kroger's coupon page (make sure you're logged in)
  2. Click the bookmarklet you just installed
  3. Watch it work - it'll scroll, load everything, then start clipping
  4. Get an alert when it's done

Press F12 and check the Console tab if you want to see live progress. Not required, just satisfying to watch.

How to drag bookmarklet

Click image to view full size

What It Actually Does

The script runs in three phases:

  1. Preload - Scrolls to the bottom, hits End key, clicks "Load More" buttons until all coupons appear (60 second timeout)
  2. Find - Locates every "Clip" button while ignoring "Unclip" buttons (already clipped coupons)
  3. Clip - Clicks each button with a 1 second delay between clicks to avoid triggering rate limits

The delays are intentional - Kroger's site doesn't like rapid-fire clicks and will sometimes fail silently without them.

If Drag-and-Drop Doesn't Work (click to expand)

Some browsers make bookmarklet installation annoying. Here's the manual method:

  1. Right-click your bookmarks bar → "Add page" or "Add bookmark"
  2. Name it whatever you want (I use "Kroger Coupons")
  3. Copy the code below and paste it into the URL field
  4. Save it
javascript:(function(){console.log("🎫 Starting Auto Coupon Clipper...");let clipped=0;const delay=ms=>new Promise(r=>setTimeout(r,ms));const log=msg=>console.log(`[Clipper] ${msg}`);async function preloadAll(){log("📦 Preloading all coupons...");let prev=0,stable=0;const start=Date.now();while(Date.now()-start<60000){const count=document.querySelectorAll(`[data-testid*="CouponCard-"]`).length;log(`📊 Coupons loaded: ${count}`);if(count===prev){stable++;if(stable>=3)break;}else stable=0;prev=count;window.scrollTo({top:document.documentElement.scrollHeight,behavior:"instant"});const endEvent=new KeyboardEvent("keydown",{key:"End",keyCode:35,bubbles:true});document.dispatchEvent(endEvent);const loadMore=document.querySelector(`[data-testid*="load-more"], [data-testid*="LoadMore"]`)||[...document.querySelectorAll("button")].find(b=>b.textContent.toLowerCase().includes("load more"));if(loadMore&&!loadMore.disabled)loadMore.click();await delay(2000);}log(`✅ Preloaded ${document.querySelectorAll(`[data-testid*="CouponCard-"]`).length} coupons`);window.scrollTo({top:0,behavior:"smooth"});await delay(1000);}async function clipAll(){const selectors=[`[data-testid*="CouponActionButton"]:not([aria-label*="Unclip"])`,`button[aria-label*="Clip"]:not([aria-label*="Unclip"])`];const buttons=[];selectors.forEach(sel=>{try{document.querySelectorAll(sel).forEach(btn=>{const label=(btn.getAttribute("aria-label")||"").toLowerCase();const text=btn.textContent.trim().toLowerCase();if((label.includes("clip")&&!label.includes("unclip"))||(text.includes("clip")&&!text.includes("unclip")))buttons.push(btn);});}catch(e){}});const unique=[...new Set(buttons)];log(`🔍 Found ${unique.length} clippable coupons`);for(const btn of unique){try{const card=btn.closest(`[data-testid*="CouponCard-"]`);const title=card?.querySelector(`[data-testid*="CouponTitle-"], .CouponCard-heading`)?.textContent.trim()||"Unknown";log(`🎫 Clipping: ${title}`);btn.scrollIntoView({behavior:"smooth",block:"center"});await delay(300);btn.click();await delay(1000);clipped++;log(`✅ Clipped: ${title} (${clipped} total)`);}catch(e){log(`❌ Error clipping: ${e.message}`);}}}async function run(){await preloadAll();await clipAll();log(`🎉 Complete! Clipped ${clipped} coupons total`);alert(`🎫 Coupon Clipper Complete!\n\nClipped ${clipped} coupons total.\n\nCheck the browser console for detailed logs.`);}run();})();

Why This Exists

Kroger's digital coupon system is great until you realize there are 200+ coupons and you have to click each one individually. This script takes about 3-4 minutes to clip everything instead of 20+ minutes of mindless clicking. Time is money, and all that.