Projecting Upcoming Credit Card Payments

The Tiller team has not built any of the solutions referenced in this thread. I’d recommend exploring the Show & Tell sections here in the Community though, maybe someone built something and shared that I"m not aware of yet.

1 Like

I was doing this a few months ago when I was paying all of my bills from my checking account. Unfortunately (for this thread), I made a change when I found out that several of my credit card providers would allow automated payments from their high interest savings accounts. (e.g. Citi Bank has a high interest savings account, I have my CC set to automatically pull the entire balance of the CC on the due date for that savings)
Right now I’m in the process of modifying my workflow to accommodate this. I’ll need to monitor the ongoing balance of multiple CC accounts vs. the accounts that pay them. Their are also minimum balances in some of the payment accounts I need to watch.

1 Like

Good morning. I read your message on tracking recurring expenses and am interested to see if you have developed it further. I would like to have something like this as a part of a dashboard that my wife can easily view what needs to be paid each month (she manages the payments, I manage the budget using Tiller). I would like to then export the dashboard to her at the first of every month to give her an “at a glance” view of what needs to be paid, is it set for autopay or not, which account the payment is coming out of, etc. Hopefully this makes sense.

Also, forgot to mention that I use excel.

Hello! I have developed out the process , but unfortunately it is only in Google Sheets. I do not have a subscription to Excel, and am not sure if the same design patterns I’m using would work in that environment.

If you would like to check out the solution that I’ve worked out, though, you can find it below:

3 Likes

Thanks for the reply. I will check it out.

Dal Ladymon

1-972-467-9059

Was there ever a solution found for tiller to pull in upcoming credit card statement balance amounts?

No. I think the best bet is to use the Credit Card Settings sheet referenced above. It basically figures out your statement balances via transactions.

1 Like

I got close to figuring out this issue with a google apps script!!! Automating the process of extracting data from Gmail email statements into Google Sheets can indeed be streamlined using Google Apps Script, which is a powerful and free tool that integrates well with Gmail and Google Sheets. It can also be set to send the data in automatically. If anybody can complete this, I think it would bring alot of value to everyone. Use chatgpt or other AI to help solve! This script got close to solving it:

function parseEmailAndUpdateSheet() {
var query = ‘subject:“Your AutoPay Payment Reminder”’;
var threads = GmailApp.search(query);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘CCSTATE’);
var dataRange = sheet.getDataRange();
var existingData = dataRange.getValues();

threads.forEach(function(thread) {
var messages = thread.getMessages();
messages.forEach(function(message) {
var body = message.getPlainBody(); // Gets the plain body of the email

var accountMatch = /ACCOUNT ENDING:\s*(\d+)/.exec(body);
var amountMatch = /Payment Amount:\s*$([\d,]+.\d{2})/.exec(body);
var dateMatch = /Will Process on:\s*(\w{3},\s\w{3}\s\d{1,2},\s\d{4})/.exec(body);

if (accountMatch && amountMatch && dateMatch) {
var account = accountMatch[1];
var amount = amountMatch[1].replace(/,/g, ‘’);
var date = formatDate(dateMatch[1]);

if (!isDuplicate(existingData, account, amount, date)) {
var nextRow = sheet.getLastRow() + 1;
sheet.appendRow([account, parseFloat(amount), date]);
}
} else {
Logger.log('No match found or partial match found in message: ’ + message.getSubject());
}
});
});
}

function isDuplicate(data, account, amount, date) {
for (var i = 1; i < data.length; i++) {
if (data[i][0] == account && data[i][1] == amount && data[i][2] == date) {
return true;
}
}
return false;
}

function formatDate(dateStr) {
var parts = dateStr.split(', ‘);
var dateParts = parts[1].trim().split(’ ');
var month = getMonthNumber(dateParts[0]);
var day = parseInt(dateParts[1], 10); // Parse the day as an integer
var year = parts[2]; // Use the third part which should be the year

// Attempt to create a JavaScript Date object
var date = new Date(year, month - 1, day); // Month is 0-indexed in JavaScript Date
if (!isNaN(date.getTime())) {
// If the date object is valid, format to a string that Sheets will recognize as a date
return Utilities.formatDate(date, Session.getScriptTimeZone(), “M/d/yyyy”);
} else {
// Log an error if the date is not valid
Logger.log('Invalid date found: ’ + dateStr);
return ‘’;
}
}

function getMonthNumber(monthAbbr) {
var months = {
‘Jan’: ‘1’, ‘Feb’: ‘2’, ‘Mar’: ‘3’, ‘Apr’: ‘4’, ‘May’: ‘5’, ‘Jun’: ‘6’,
‘Jul’: ‘7’, ‘Aug’: ‘8’, ‘Sep’: ‘9’, ‘Oct’: ‘10’, ‘Nov’: ‘11’, ‘Dec’: ‘12’
};
return months[monthAbbr];
}