Minimum Wage by Location in Google Sheets (2027 Rates)
If your locations live in a spreadsheet, the minimum wage for each one can too. Here are two ways: a free import with no account, and a custom function that looks up each row.
1. Free: import every increase for 2027
Put this in cell A1 of an empty sheet. It loads every state, city and county minimum wage change scheduled for 2027, with the old rate, the new rate, the tipped cash wage and the official source for each:
=IMPORTDATA("https://bankday.dev/minimum-wage-2027.csv")
For every jurisdiction's rate today and its next change, import https://bankday.dev/minimum-wage.csv instead. Both files update when we add a newly announced rate, and Sheets refreshes them about once an hour.
2. One cell per location: the MINWAGE function
Get a free API key, open Extensions → Apps Script, paste this, then add your key under Project Settings → Script properties as BANKDAY_KEY:
/**
* The minimum wage that governs at a place on a date.
* @param {string} state Two letter state code, e.g. "WA"
* @param {string} city Optional city, or a county such as "King County"
* @param {Date} date Optional date, today if empty
* @customfunction
*/
function MINWAGE(state, city, date) {
var p = { state: state, date: date ? ymd_(date) : "" };
if (city && /\scounty$/i.test(city)) p.county = city.replace(/\s+county$/i, "");
else if (city) p.city = city;
return answer_(minwage_(p));
}
/**
* The minimum wage at a street address on a date (Business plan).
* @customfunction
*/
function MINWAGE_ADDRESS(address, date) {
return answer_(minwage_({ address: address, date: date ? ymd_(date) : "" }));
}
// A number only when it's certain. If a local rate applies or might apply, the cell explains why instead.
function answer_(r) {
if (r.local_rates) return r.local_rates.message;
if (r.minimum_wage === null || r.may_apply.length) return r.warnings.join(" ");
return r.minimum_wage;
}
function minwage_(params) {
var qs = Object.keys(params).map(function (k) { return k + "=" + encodeURIComponent(params[k]); }).join("&");
var url = "/v1/minimum-wage?" + qs, cache = CacheService.getScriptCache(), hit = cache.get(url);
if (hit) return JSON.parse(hit);
var res = UrlFetchApp.fetch("https://bankday.dev" + url, {
headers: { Authorization: "Bearer " + PropertiesService.getScriptProperties().getProperty("BANKDAY_KEY") },
muteHttpExceptions: true,
});
var body = JSON.parse(res.getContentText());
if (res.getResponseCode() !== 200) throw new Error(body.error ? body.error.message : "Bankday error " + res.getResponseCode());
cache.put(url, res.getContentText(), 21600); // rates change a few times a year; save your quota
return body;
}
function ymd_(d) {
return typeof d === "string" ? d : Utilities.formatDate(d, Session.getScriptTimeZone(), "yyyy-MM-dd");
}
Then, with the state in column A, the city in column B and the date in C1:
=MINWAGE(A2, B2, $C$1)
=MINWAGE("WA", "Seattle", DATE(2027, 1, 1))
=MINWAGE_ADDRESS("600 4th Ave, Seattle, WA", DATE(2027, 1, 1))
What each plan returns
- Free: state and federal rates. Where a city or county rate applies or might apply, the cell says so instead of showing a figure that could be too low.
- Developer ($19 a month): city and county rates by name, as in the first two examples.
- Business ($99 a month): street addresses, which settles unincorporated areas and towns that opted out of a county rate.
A sentence in a cell instead of a number means the location isn't specific enough (a county where only unincorporated areas have their own rate, or Oregon without a county) or the rate needs a paid plan. The first three months of any plan are half price with the code LAUNCH50. Every answer is one request, and repeats come from the cache for six hours, so a sheet of a few hundred locations stays well inside the free tier.
See also: every minimum wage increase in 2027 · look up any address · the minimum wage API · business days in Google Sheets
Get a free API key
1,000 requests/month free. No credit card. Your key appears instantly.