E-Mail retention policies in Gmail
· Updated: · 4 min readOne of the features I miss most with my personal mail accounts is the ability to use some kind of retention policies applied to bulk messages.
While originally a compliance feature in Microsoft Exchange or the Enterprise Plans of Google Workspace, retention policies are also very useful in automatically decluttering your mailbox after a set time:
- To delete messages with order receipts after a number of years;
- To automatically delete newsletters after a few weeks or months; or
- To automatically move read messages to your archives after a few days or weeks
Unfortunately, no such feature is available in the former free G Suite tier or Gmail, and no add-in has been published in the Marketplace that would allow one to achieve this in Google’s free products.
Google Scripts to the rescue#
Luckily, with the Google Script environment, one can rather easily build such a functionality and integrate it into Gmail.
After the n-th time being frustrated with the lack of this feature, and inspired by Gmail Automation: 5 Useful Google Scripts to Automate Your Gmail, I wrote some code that
- lets you define any number of policies that either delete or archive a message threads after a number of days have passed since the last message sent/received in that thread; and
- lets you apply these through filters or manually to message threads
Building your E-Mail retention policy automation#
With the Gist published here, you can implement this for your Gmail / Google Mail accounts as well:
- Go to Google Scripts and create a blank project (make sure you are logged into your Google account);

- paste the code (below) (and modify the policies as needed);
/****
* This Script will apply different e-mail policies according to a defined set of labels
* Actions:
* - Delete: will delete (move) the message thread to the trash (unless starred)
* - Archive: will move the thread to the archive
*
* New policies: To add a new policy, add a new entry in the "policies" map
*
* When executing the action, the corresponding label will be removed. This will speed up the
* processing of messages considerably (otherwise, the messages would be reprocessed on every run).
* Starred messages will not be deleted.
*
* By setting a timed trigger, you can execute the script in regular intervals (e.g. every 30 minutes)
* Create a filter that will apply a specific label automatically to the filtered mail and
* your mailbox will unclutter itself automatically.
*
* Inspired/adapted from https://www.maketecheasier.com/google-scripts-to-automate-gmail/
*/
function applyEmailPolicy() {
var policies = {
// Archive Policies
monthArchive: {
label: "Archive After 30 Days",
days: 30,
action: "archive",
},
weekArchive: { label: "Archive After 1 Week", days: 7, action: "archive" },
biWeeklyArchive: {
label: "Archive After 2 Weeks",
days: 14,
action: "archive",
},
// Delete Policiess
monthDelete: { label: "Delete After 30 Days", days: 30, action: "delete" },
yearDelete: { label: "Delete After 1 Year", days: 365, action: "delete" },
decadeDelete: {
label: "Delete After 10 Years",
days: 3650,
action: "delete",
},
};
for (var policyKey in policies) {
var policy = policies[policyKey];
Logger.log("Applying E-Mail Policy '" + policy["label"] + "'");
var label = GmailApp.getUserLabelByName(policy["label"]);
if (label == null) {
GmailApp.createLabel(policy["label"]);
} else {
var delayDays = policy["days"];
var maxDate = new Date();
maxDate.setDate(maxDate.getDate() - delayDays);
var threads = label.getThreads();
for (var i = 0; i < threads.length; i++) {
if (threads[i].getLastMessageDate() < maxDate) {
switch (policy["action"]) {
case "delete":
if (!threads[i].hasStarredMessages()) {
Logger.log(
"Deleting Thread '" +
threads[i].getFirstMessageSubject() +
"'"
);
threads[i].removeLabel(label);
threads[i].moveToTrash();
} else {
Logger.log(
"Skipping Thread '" +
threads[i].getFirstMessageSubject() +
"'"
);
}
break;
case "archive":
Logger.log(
"Archiving Thread '" + threads[i].getFirstMessageSubject() + "'"
);
threads[i].removeLabel(label);
threads[i].moveToArchive();
break;
}
}
}
}
}
}
-
run the script manually and Gmail will
- ask you for the permissions needed to work properly (it grants your script read/write access to your mailbox which is needed to move / delete the messages); and
- will create the labels for each policy you defined (which is needed if you want to apply them to messages afterwards)
- set a trigger (Resources -> Current Project’s Triggers -> Add one now) to run it at the preferred interval; and
- create filters in Gmail/Google Mail that set policies when specific messages arrive
Once you’ve labeled a number of messages, you can manually run the script again and check the logs to see if the messages are found and moved to the trash or the archive.
Caveats#
- Please note that threads with starred messages will not be deleted by this script – starring them is an easy way to ensure important messages are not deleted accidentially;
-
If you label messages / threads older than thirty days with a
delete
policy, they will immediately be deleted upon execution of the script – there’s no way to retrieve them afterwards, so be careful when applying adelete
policy in bulk!; -
The
archive
policy will move them from the inbox to the Archive;
Credits#
Inspired and adapted from Gmail Automation: 5 Useful Google Scripts to Automate Your Gmail
Comments.
No comments. Be the first to add one!
Add a comment.