Habit Tracker
Made for people building routines.
List your habits and how often you want to do each, log each day, and see your current streak, days hit this month and best run for every habit. The summary carries a chart that redraws itself as you type.
- Tabs
- 3
- Columns
- 17
- Fill themselves in
- 17
£7one payment, yours to keep
- Opens in Excel, Google Sheets and Numbers
- Delivered straight away
- No macros, nothing to install
- Change it free before you buy
Payment is handled by Stripe. Your card details go to them and never to us. Sales are final, which is why every tab, column and calculation is shown on this page first.
Everything inside, before you pay
This is the whole design: every tab, every column and how each calculated one is worked out. White cells are yours to fill in; the shaded ones work themselves out and are locked so a formula cannot be overwritten by accident. There is room for 2,530 rows.
Habits
| Column | Type | Worked out as |
|---|---|---|
| Habit | text | |
| Category | choice (list) | |
| Target Days Per Week | number | |
| Started | date | |
| Current Streak | number | IF(ISBLANK([habit]), "", IF(COUNTIFS([Daily Log!habit], [habit], [Daily Log!date], TODAY(), [Daily Log!done], "No")>0, 0, MAX(SUMIFS([Daily Log!run_length], [Daily Log!habit], [habit], [Daily Log!date], TODAY()), SUMIFS([Daily Log!run_length], [Daily Log!habit], [habit], [Daily Log!date], TODAY()-1)))) |
| Best Run | number | IF(ISBLANK([habit]), "", IFERROR(SUMIFS([Daily Log!run_length], [Daily Log!habit], [habit], [Daily Log!is_top], 1)/COUNTIFS([Daily Log!habit], [habit], [Daily Log!is_top], 1), 0)) |
| Days Hit This Month | number | IF(ISBLANK([habit]), "", COUNTIFS([Daily Log!habit], [habit], [Daily Log!done], "Yes", [Daily Log!date], ">="&DATE(YEAR(TODAY()), MONTH(TODAY()), 1), [Daily Log!date], "<="&TODAY())) |
| Target So Far This Month | number | IF(OR(ISBLANK([habit]), ISBLANK([target_per_week])), "", ROUND([target_per_week]*DAY(TODAY())/7, 0)) |
| On Track | text | IF(OR(ISBLANK([habit]), ISBLANK([target_per_week])), "", IF(COUNTIFS([Daily Log!habit], [habit], [Daily Log!done], "Yes", [Daily Log!date], ">="&DATE(YEAR(TODAY()), MONTH(TODAY()), 1), [Daily Log!date], "<="&TODAY())>=ROUND([target_per_week]*DAY(TODAY())/7, 0), "Yes", "Behind")) |
Daily Log
| Column | Type | Worked out as |
|---|---|---|
| Date | date | |
| Habit | choice (from Habits › habit) | |
| Done | choice (list) | |
| Notes | text | |
| Run Start | number | IF(OR(ISBLANK([date]), ISBLANK([habit])), "", IF(AND([done]="Yes", COUNTIFS([Daily Log!habit], [habit], [Daily Log!date], [date]-1, [Daily Log!done], "Yes")=0), 1, 0)) |
| Run No | number | IF(OR(ISBLANK([date]), ISBLANK([habit])), "", IF([done]="Yes", COUNTIFS([Daily Log!habit], [habit], [Daily Log!run_start], 1, [Daily Log!date], "<="&[date]), "")) |
| Streak On This Day | number | IF(OR(ISBLANK([date]), ISBLANK([habit])), "", IF([done]="Yes", COUNTIFS([Daily Log!habit], [habit], [Daily Log!run_no], [run_no], [Daily Log!date], "<="&[date]), 0)) |
| Best Day Flag | number | IF(OR(ISBLANK([date]), ISBLANK([habit])), "", IF(COUNTIFS([Daily Log!habit], [habit], [Daily Log!run_length], ">"&[run_length])=0, 1, 0)) |
Summary
| Measure | Worked out as |
|---|---|
| Habits tracked | COUNTA([Habits!habit]) |
| Days hit this month, all habits | COUNTIFS([Daily Log!done], "Yes", [Daily Log!date], ">="&DATE(YEAR(TODAY()), MONTH(TODAY()), 1), [Daily Log!date], "<="&TODAY()) |
| Days missed this month, all habits | COUNTIFS([Daily Log!done], "No", [Daily Log!date], ">="&DATE(YEAR(TODAY()), MONTH(TODAY()), 1), [Daily Log!date], "<="&TODAY()) |
| Hit rate this month | IFERROR(COUNTIFS([Daily Log!done], "Yes", [Daily Log!date], ">="&DATE(YEAR(TODAY()), MONTH(TODAY()), 1), [Daily Log!date], "<="&TODAY())/COUNTIFS([Daily Log!done], "<>", [Daily Log!date], ">="&DATE(YEAR(TODAY()), MONTH(TODAY()), 1), [Daily Log!date], "<="&TODAY()), 0) |
| Longest current streak | MAX([Habits!current_streak]) |
| Best run on any habit | MAX([Habits!best]) |
| Habits on track this month | COUNTIF([Habits!on_track], "Yes") |
| Habits behind this month | COUNTIF([Habits!on_track], "Behind") |






