Feature · CSV import
Import your habit history from any CSV.
Habit Pocket imports any CSV with one date column and one column per thing you track. The file is read in your browser: the delimiter is sniffed, the date format is worked out from the whole column rather than one cell, and every other column is classified as numbers, durations, times of day, yes/no or text. You map each column to a new or existing habit and see exactly how many values will be written before anything is sent. A 28-row sleep export from Garmin Connect becomes 252 values across 13 habits, with its 8 empty days left empty rather than filled with zeros. Import is free on every plan and lives in the web app; the values sync to the iPhone afterwards.
5 habits free, forever. No credit card. Your data stays private.
Last updated September 2026 · every number on this page came from running my own Garmin export through the importer · By Bohdan Stefaniuk
A real export
One sleep file from Garmin, and what the importer makes of it.
28 rows, 14 columns, downloaded from Garmin Connect and not touched afterwards. This is the mapping screen reading it — the counts, the samples and the detected types are what the parser reports for this file, not an illustration of them.
Import from CSV
Sleep.csv · 28 rows · comma-separated
Dates
2026-07-19 → 2026-08-08 · 252 values ready
Columns
- Sleep score — A number
Score
numbers · 70, 70, 81
- Resting heart rate — A number
Resting Heart Rate
numbers · 60, 62, 62
- Body Battery — A number
Body Battery
numbers · 81, 43, 64
- Pulse Ox — A number
Pulse Ox
numbers · 95.75, 95.93, 95.86
- Respiration — A number
Respiration
numbers · 16.92, 18.35, 17.95
- Skin temp change — A number
Skin Temp Change
numbers · '-0.5°, '-0.8°, '+0.5°
- HRV — A number
HRV Status
numbers · 48, 44, 46
- Sleep quality — Pick from a list
Quality
text · Fair, Good, Poor
- Sleep — A number (h)
Duration
durations · 9h 7min, 6h 56min, 6h 59min
- Sleep need — A number (h)
Sleep Need
durations · 7h 30min, 7h 10min, 7h 10min
- Bedtime — Time of day
Bedtime
times of day · 12:32 AM, 11:39 PM, 2:05 AM
- Wake time — Time of day
Wake Time
times of day · 10:24 AM, 6:57 AM, 9:41 AM
- Sleep alignment — Pick from a list
Sleep Alignment
text · Behind, Aligned, Ahead
Before importing
Keep what’s already loggedDays whose value already matches the file are left untouched either way, so importing the same file twice changes nothing.
A rendering of the importer’s mapping screen, built from the parser’s own output for Sleep.csv.
Four things in that file would break a naive importer, and all four are ordinary. The date column is not called “Date” — Garmin heads it Sleep Score 4 Weeks, so a name match finds nothing and the column has to be recognised by what it holds. Sleep length is written 9h 7min, which reads as the number 9 to anything that parses digits from the left. Skin temperature is written ’-0.5°, with the apostrophe Excel adds to stop a spreadsheet mangling it. And 8 of the 28 days are nothing but --, because the watch was off the wrist.
What comes out is 252 values across 13 habits between 2026-07-19 and 2026-08-08, with 0 cells unreadable. The empty days stay empty. Bedtime and wake time become real clock times rather than text, so the candle chart can read them. Quality becomes a four-option habit — Fair, Good, Poor, Excellent — taken from the distinct values in the column.
Worth saying plainly: this particular mapping creates thirteen habits, two of them times of day and two of them pick-from-a-list, so it needs Pro. The import itself is free on every plan, and importing into habits you already have is free. The paywall is checked before anything is written rather than half-way through.
Column by column
What it reads
Every date format, and every shape a cell can take.
Nothing here needs configuring. The point of listing it is that you can check your own file against it before you bother exporting one.
Date formats
The last three are the reason this is a list and not a sentence. 08/09/2026 is the 9th of August in one country and the 8th of September in the next, and a column where every day happens to be twelve or under can be read either way from end to end. When that happens the screen says so and shows what the first date resolves to under each reading, rather than picking one and hoping.
Cell values
Numbers
→ A numeric habit
7095.7511,8077,572 kg'-0.5°Thousands separators, comma decimals, a trailing unit, a leading currency symbol and the apostrophe Excel adds to force text are all stripped. A minus sign survives, and so does a zero.
Durations
→ A numeric habit, in minutes or hours
9h 7min7h30m45 min2 hoursYou choose the unit, because "9h 7min" is either 547 or 9.12 and guessing is a 60x error. If the habit already has h as its unit, hours is picked for you.
Times of day
→ A time-of-day habit
11:39 PM23:0523:05:00730A bare 7:30 is read as half past seven, never as a seven-and-a-half-hour duration. A duration needs its h or min suffix to be read as one.
Yes / no
→ A yes/no habit
yesy1x✓doneskiprestSkip and rest mark a deliberate rest day, which pauses a streak instead of breaking it. An explicit "no" is stored as an empty day, because that is what a missed day already is.
Text
→ A pick-from-a-list habit
FairGoodPoorExcellentThe distinct values in the column become the options, in the order they first appear. Up to 50 of them.
Nothing
→ An empty day
--—-n/anull(empty)A gap is a gap. None of these ever becomes a zero, because a zero would count as a logged day and quietly change what your charts say.
A column is classified by what all of its non-blank cells can be, not most of them. A column where 95% of the values parse as numbers and the rest say “Fair” is a text column that happens to contain numbers, and importing it as a number would quietly drop the other 5%.
How it behaves
Four rules, and none of them are clever.
An importer is only worth trusting if you can predict what it will do to a file you cannot fully remember the contents of. These are the rules that decide.
Nothing is uploaded until you say so
The file is read in your browser. The parsing, the date detection and the preview all happen on your machine, and the only thing that ever reaches the server is the list of values you approved on the confirm screen. The file itself is never sent anywhere.
A date format has to explain every value
Formats are tested against the whole column, not one cell, and any format that fails a single value is discarded. If more than one still fits, the column is genuinely ambiguous, and you are asked rather than guessed at. That is the difference between a year of data on the right days and a year of data a month out.
Nothing is mapped without you
Only columns whose header already matches one of your habits are pre-selected. Everything else starts on "Don’t import", so the importer can never quietly invent habits you did not ask for. The confirm screen counts, per column, how many values will be written, how many cells are empty, and how many it could not read.
Importing the same file twice changes nothing
Days whose stored value already matches the file are detected and left alone, so nothing is written and nothing is synced. For days that genuinely differ, you choose once for the whole import: keep what is already logged, or replace it.
The first of those is the one I would check in any other app before uploading a year of my own life to it. Habit Pocket never shares your habits with anyone, and the importer keeps that promise the boring way: the file is parsed on your machine, and only the values you approved are sent.
How to import
Five steps, about two minutes.
Most of it is checking rather than typing. The screen is doing the work; you are confirming it read your file the way you would have.
- 1
Export a CSV
From Garmin Connect, Fitbit, another habit app, or your own spreadsheet. In Excel or Numbers, File → Export or Save As → CSV. One row per day, one column per thing you track.
- 2
Open Settings → Data
In the web app, under "Bring data in". Choose the file or drop it on the box.
- 3
Check the dates
The most date-like column is picked for you and its format is worked out from the whole column. Both are dropdowns, so you can correct either one, and the screen shows what the first date resolves to.
- 4
Map the columns
Each column shows what it holds and a few real cells from your file. Send it to an existing habit, create a new one, or leave it out. Durations ask one extra question: minutes or hours.
- 5
Read the summary, then import
Per column: values ready, cells that were empty, and anything unreadable with examples of what it choked on. Press Import and the values land in the grid, then sync to the iPhone app.
Honest limits
What this does not do.
Five things worth knowing before you export anything, because finding them out afterwards is worse.
- Web only. The importer lives in the web app at app.habitpocket.io, not in the iPhone app. Values sync to the phone once they land, so this is where you go to bring a history in, not where you will do it every day.
- CSV, not spreadsheets. A .csv, .tsv or plain text file, up to 5 MB and 20,000 rows. An .xlsx or .numbers file has to be exported as CSV first, which is one menu item in either app. Commas, semicolons, tabs and pipes are all detected.
- This is a file import, not an integration. There is no direct Garmin, Oura, Whoop or Fitbit connection. You export the file, and you import it, which means it is a thing you do rather than a thing that happens. On iPhone, Apple Health auto-fill is the automatic half of this.
- One date column, no future days. A file has a single date column, so a long-format export with a "metric name" column has to be pivoted first. Days after today are counted and refused rather than written, and a pick-from-a-list habit holds 50 options.
- Free, until the habits it creates are not. The import itself costs nothing on any plan. Creating new time-of-day or pick-from-a-list habits needs Pro, and free accounts hold five habits in total, so a wide export like the Garmin one below wants Pro. Importing into habits you already have is free.
Why it matters
The history is the reason people stay somewhere they have stopped liking.
Switching tracker usually means starting at zero, and starting at zero is why most people do not switch.
It also decides whether the app is any use in its first month. Habit Pocket’s charts overlay any habit on any other — caffeine against bedtime, steps against weight, resting heart rate against the weeks you actually slept — and those comparisons say nothing at all until there are months of both numbers behind them. Typing your way to that takes a season. Importing it takes a couple of minutes.
That is the whole argument for this feature. The sleep export on this page turns into three weeks of bedtimes, wake times, sleep scores and HRV on the day you arrive, sat in the same grid as the rows you fill in by hand, with the same streaks and the same correlation charts over all of them. Run the same export again next month and only the new days are written.
And it goes both ways. Everything in Habit Pocket exports to CSV or JSON in one click, free, on every plan. An importer this thorough is not much of a favour if the door only opens inward.
FAQ
CSV import — common questions
Any file with one date column and one column per habit, up to 5 MB and 20,000 rows. Commas, semicolons, tabs and pipes are all detected, and so is the byte-order mark Excel and Garmin prepend. Leading title or section lines — the "Garmin Connect" or "Body" rows that exports open with — are skipped, and the real header row is found by width. In practice that covers Garmin Connect, Fitbit, Apple Health exports run through a converter, other habit apps, and the spreadsheet you have been keeping yourself.
The most date-like column is picked automatically, and then seven formats are tested against every value in it: YYYY-MM-DD, YYYY/MM/DD, Mon D YYYY, D Mon YYYY, MM/DD/YYYY, DD/MM/YYYY and DD.MM.YYYY. A format that fails a single value is discarded, so a format explaining 90% of the column is treated as a coincidence rather than an answer. When two survive — which is what 08/09/2026 means, since both readings are valid — the screen says so and asks you to choose, with the first date resolved under each. Guessing there would file a year of data a month out, silently.
Yes, as a file. Export the CSV from Garmin Connect, Fitbit or Oura and import it; there is no direct connection to any of them, so this is a thing you do rather than a thing that happens. The awkward parts of those exports are handled: Garmin writes missing days as --, sleep length as "9h 7min", bedtime as "12:32 AM" and skin temperature as ’-0.5°, and each of those lands as a number, a duration, a real clock time or a deliberate gap. On iPhone, Apple Health auto-fill is the automatic half of the same job.
They stay empty. An empty cell, --, ---, an em dash, n/a, na, null and nil are all read as "no data", never as zero, because a zero is a logged day and would quietly change what your charts and averages say. The confirm screen counts them per column so you can see how much of the file is gaps before you commit — in the Garmin sleep export used on this page, 8 of its 28 days are entirely blank and none of them becomes a row.
Only if you ask it to. You choose once for the whole import: keep what is already logged, or replace it. Either way, days whose stored value already matches the file are detected and left untouched, so nothing is written and nothing syncs — importing the same file twice is a no-op. Within one file, if the same habit and day appear twice, the first is used and the rest are counted and reported.
No. The file is parsed in your browser, and the preview you correct is computed there too. What reaches the server is the list of values you approved on the confirm screen — the same writes you would have made by typing — and never the file. Your habit log is the most personal data this app holds, so nothing about it should leave your machine before you have seen exactly what is going.
The import itself is free on every plan. What can cost money is what it creates: new time-of-day and pick-from-a-list habits are Pro features, and free accounts hold five habits in total, so a wide export that creates thirteen habits at once needs Pro at $3.99 a month, $29.99 a year or $49.99 once. Importing into habits you already have is free. It runs in the web app rather than on the phone, and the values sync to the iPhone once they land.
Five habits. Thirty days.
See what shows up.
No credit card. Pick five habits. Come back in a month.