Skip to content

Instantly share code, notes, and snippets.

@elado
Last active October 25, 2025 11:06
Show Gist options
  • Save elado/69fa611d84305dea4b38801880743928 to your computer and use it in GitHub Desktop.
Save elado/69fa611d84305dea4b38801880743928 to your computer and use it in GitHub Desktop.
American Express / Amex - Add all offers to card at once (bookmarklet)

American Express - Add all offers to card at once

If you own an AMEX card, you can add a bunch of offers to the card in this link: https://global.americanexpress.com/offers/eligible

There are many offers, and they change all the time. Instead of clicking "Add to card" repeatedly, I created this bookmarklet.

In Chrome, add a new bookmark (right click on bookmarks bar -> "Add Page...") with the following URL:

javascript:btns=[...document.querySelectorAll('button')].filter(b => /add to list/i.test(b.title) || b.dataset.testid=="merchantOfferListAddButton");c=()=>{ b = btns.shift(); if (!b) return console.log('Added all!'); b.scrollIntoView(); b.click(); setTimeout(c, Math.random() * 300) };c();

Last updated: 10/11/25

Just run the bookmark while on the offers page, and watch the magic happens!

javascript:btns=[...document.querySelectorAll('button')].filter(b => /add to list/i.test(b.title) || b.dataset.testid=="merchantOfferListAddButton");c=()=>{ b = btns.shift(); if (!b) return console.log('Added all!'); b.scrollIntoView(); b.click(); setTimeout(c, Math.random() * 300) };c();
@HairyMilkshakes
Copy link

Not working as of 7/20 - they changed the layout.

@arthurlockman
Copy link

javascript:btns=[...document.querySelectorAll('button')].filter(b => b.title === 'Add to Card');c=()=>{ b = btns.pop(); if (!b) return console.log('added all!'); b.click(); setTimeout(c, Math.random() * 1500 + 300) };c();

This works as of Jul 21, 2025.

@samwathegreat
Copy link

javascript:btns=[...document.querySelectorAll('button')].filter(b => b.title === 'Add to Card');c=()=>{ b = btns.pop(); if (!b) return console.log('added all!'); b.click(); setTimeout(c, Math.random() * 1500 + 300) };c();

This works as of Jul 21, 2025.

THANK YOU. I noticed that my old bookmark quit working and your modified version works perfectly.

@stevewilber
Copy link

stevewilber commented Sep 4, 2025

Here's an update that fixes the script for me as of Sept 4, 2025 (the button title is now lower case):

javascript:btns=[...document.querySelectorAll('button')].filter(b => b.title === 'add to card');c=()=>{ b = btns.pop(); if (!b) return console.log('added all!'); b.click(); setTimeout(c, Math.random() * 100) };c();

@allenwan
Copy link

allenwan commented Sep 16, 2025

Here's an update that worked for me as of 16SEP2025. It changed to an icon instead of text, so we're targeting something new.

javascript:btns=[...document.querySelectorAll('button[data-testid="merchantOfferListAddButton"]')];c = () => {b = btns.pop();if (!b) return console.log('added all!');b.click();setTimeout(c, Math.random() * 1500 + 300);};c();

The behavior is also different: it no longer auto-scrolls as it clicks the button so don't be alarmed if nothing happens when you run it.

@feiyax
Copy link

feiyax commented Oct 1, 2025

As of today, the button's title is add to list card. it works for me after changing it to that:

const buttons = document.querySelectorAll('button[title="add to list card"]'); 
// Loop through each button 
buttons.forEach((button, index) => { 
  setTimeout(() => { button.click(); }, index * 3000); 
});

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