Beeminder Forum

Gmail Labeler script

Hi folks!

Beeminder’s got to switch its Gmail integration to look at labels, instead of arbitrary searches. (Lots of details available here:

Nearly all searches can be turned into labels through filters at Gmail. Go to Gmail, type the search in the box, but instead of hitting enter, click the little down arrow. Click “Create Filter”, and now you’ve got a label automatically assigned when email comes in!

However, not all searches work–for instance, older_than. Some folks may find it slick to filter on “in:inbox older_than:1d”. Gmail won’t create a filter for that, but there’s a pretty good workaround.

Google has a thing called Google Apps Script. It’s Javascripty, and runs on their servers, and has all the authentication rigamarole worked out. They can be set to run automatically, or manually–it’s really quite slick.

I had committed to writing a Google Apps Script if anyone needed it for the Gmail transition here at the end of 2019, and someone did need it. Before writing one, though, I did a search, and found a great, well-documented example! It uses a config file, and runs every 10 minutes.

Here’s my config. You can use it and its instructions to set something up for yourself.

//Adam's sample configuration for "Gmail Filter by Search Query",

//This example will add the already-created label "Stagnant" to any threads in my inbox that are older than 1 day,
//and adds the already-created label "Stale" to any threads that are older than 3 days.  It does this every ten minutes!
//Then, Beeminder can pick up those labels.

//As of 2020, Beeminder's Gmail integration looks at labels and can't do arbitrary searches.  Most searches can be
//turned into a filter in Gmail that applies a label, but a few can't, like "older_than:".  This example
//uses an open source script to have Google search your email every ten minutes and apply labels.

//To set this up yourself, go to and follow the directions.
//You can base your configuration off this one.

//As of December 30th, 2019, there's a small error in the source's Company label example.
//I've corrected it and hopefully it will be updated soon.

//If you get Invalid argument: label, you probably need to create the label first!
//You can do this in Gmail or via GmailApp.createLabel("labelname");

    queries: [
      ["in:inbox older_than:1d ",  function (thread) {
      ["in:inbox older_than:3d", function (thread) {
    notify: {
      // The email the script runs under--change it to your email.
        email: "",
        subject: "Filter Summary",
        body: "%c emails processed in the past 7 days.",

Let me know what you think!