WattleDB  /  Pricing  /  How much storage do I need

How much database storage does my data need?

Plans are sold in gigabytes. Your data comes in patients, participants, matters, clients and documents. This page converts one into the other for Australian software teams, practices and firms, sector by sector, using a row size measured on our own production database, and shows the arithmetic so you can check it.

About 1.8 million narrow rows per GiB, and far fewer rows with text in them

A narrow, indexed row costs about 600 bytes all-in, indexes included. We measured that on WattleDB’s own production tables on 21 September 2026. A row that carries text costs about 600 bytes plus one byte per character, so a record with a 1,500-character note is about 2,100 bytes. One GiB is 1,073,741,824 bytes, which holds about 1.8 million of the narrow rows or about 510,000 of the rows with a note.

Two things come off the allowance before your data does. An empty database already uses about 16 MB (15.8 MiB) for PostgreSQL’s catalogue and the extensions we install. And PostgreSQL needs working room for housekeeping, so plan to fill about 80% of the allowance, not all of it. That gives the figure every table on this page uses:

Database allowance, usable figure for planning and object storage per plan
PlanDatabase allowanceUsable for planningObject storage
Free512 MiBabout 394 MiB512 MiB
Hobby1 GiBabout 803 MiB2 GiB
Launch4 GiBabout 3.2 GiB (3,261 MiB)5 GiB
Scale10 GiBabout 8.0 GiB (8,176 MiB)10 GiB

Usable = 80% of the allowance, less the 15.8 MiB an empty database uses. Hobby: 80% of 1,024 MiB is 819.2 MiB, less 15.8 MiB is 803.4 MiB. Allowances are per database and are binary units (1 MiB = 1,048,576 bytes, 1 GiB = 1,073,741,824 bytes); the pricing page writes them as MB and GB. Free is one database per workspace and pauses after seven idle days, so it suits development rather than a live app. Every figure below is typical, and yours will differ with your schema.

Storage is one input. For clinical or participant records, choose the plan for its backups, recovery window and per-person access first. Hobby and Launch can restore the database to any point in the last 7 days and Scale the last 30; Hobby is one person per workspace, while Launch and Scale let you share with up to 5 and 20 people. The pricing page has the detail.

Typical yearly growth, by sector

  • A SaaS booking product with 20,000 users grows by about 1,040 MiB a year, most of it audit rows.
  • A small agency client app grows by about 4.4 MiB a year.
  • An NDIS provider with 150 participants grows by about 54 MiB a year.
  • A 90-bed residential aged-care home grows by about 500 MiB a year.
  • A bookkeeping practice with 300 clients that stores bank transactions grows by about 436 MiB a year.
  • A 10-lawyer firm’s database grows by about 35 MiB a year, and its documents by about 9.2 GiB.
  • A four-GP practice grows by about 305 MiB a year.
  • A 3-dentist practice grows by about 78 MiB a year, after about 118 MiB up front.
  • A four-physio allied-health clinic grows by about 110 MiB a year.

Users, orders and the audit trail that outgrows them

Most SaaS tables are narrow. What fills a SaaS database is usually the event or audit table, because it gains a row every time anyone does anything.

Typical SaaS record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
User accountname, email, role and a few settings; a primary key and a unique index on email600 bytes1.8 million690,0001.4 million5.7 million14 million
Business customername, ABN, address and about 400 characters of notes1,000 bytes1.1 million410,000840,0003.4 million8.6 million
Audit or event rowwho did what and when, with a JSON detail of about 400 characters1,000 bytes1.1 million410,000840,0003.4 million8.6 million
Orderan order row plus three line-item rows, each about 600 bytes2,400 bytes450,000170,000350,0001.4 million3.6 million

Worked example. A booking product with 200 business customers and 20,000 users (about 12 MiB), taking 150,000 bookings a year (about 86 MiB) and writing a million audit events a year (about 950 MiB), grows by about 1,040 MiB a year. That is past Hobby inside the first year. Launch holds about 3 years of it and Scale about 8. The audit trail is about 92% of the growth: keep 12 months of it in the database and archive the rest, and Launch holds more than 25 years at this rate.

For the privacy law that applies to SaaS teams and what you still have to do yourself, see Industries: SaaS builders & SMBs.

Many small client databases, where the baseline matters more than the data

An agency usually runs one database per client. Each client’s data is small; the thing to count is how many databases you run.

Typical agency client app record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
Client contactname, email, phone, company and a note of about 200 characters800 bytes1.3 million520,0001.1 million4.3 million11 million
Booking or jobdate, time, status and who it is for600 bytes1.8 million690,0001.4 million5.7 million14 million
Web enquirya form submission with a message of about 1,000 characters1,600 bytes670,000260,000530,0002.1 million5.4 million
Content pagea CMS page or block of about 3,000 characters3,600 bytes300,000110,000230,000950,0002.4 million

Worked example. An agency hosting 12 client apps, each with 2,000 contacts (about 1.5 MiB) and taking 5,000 bookings and 1,000 enquiries a year (about 4.4 MiB a year), will not run out of room on Hobby in any timeframe that matters: each client database has space for decades. What adds up is the baseline. Every database carries its own 16 MB of catalogue and extensions, so 12 client databases use about 190 MiB before any client data. Choose each client’s plan for always-on running, connections and backups, not for storage.

For who the customer of record is and what you pass on to clients, see Industries: Agencies & freelancers.

Participants, shift notes and incidents

Participant and resident profiles are a rounding error. Progress notes are the bulk, because one is written for every shift or every resident on every shift.

Typical NDIS and aged care record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
Participant or resident profiledemographics, contacts, plan and funding details, about 1,400 characters beyond the basics2,000 bytes540,000210,000420,0001.7 million4.3 million
Service booking or rostered shiftwho, when, where, the support item and status600 bytes1.8 million690,0001.4 million5.7 million14 million
Progress note (shift note)a note of about 1,500 characters2,100 bytes510,000200,000400,0001.6 million4.1 million
Incident reportstructured fields plus about 3,000 characters of description3,600 bytes300,000110,000230,000950,0002.4 million
Medication administration entryresident, medicine, time given and who gave it600 bytes1.8 million690,0001.4 million5.7 million14 million

Worked example, NDIS. A provider with 150 participants delivering 400 shifts a week, each with a progress note, plus about 100 incident reports a year, grows by about 54 MiB a year: 20,800 shifts at 600 bytes (about 12 MiB), 20,800 notes at 2,100 bytes (about 42 MiB) and incidents under 1 MiB. On storage alone, Hobby holds it for about 15 years, but choose the plan for recovery and access first.

Worked example, residential aged care. A 90-bed home writing three progress notes per resident per day (98,550 a year, about 197 MiB) and about 16 medication entries per resident per day, since many residents take several regular medicines across several rounds (525,600 a year, about 301 MiB), grows by about 500 MiB a year. On storage alone, Hobby holds under 2 years, Launch about six and a half and Scale about 16.

For the practice and quality standards and what you still have to do yourself, see Industries: NDIS, aged care & community services.

Clients, ledger lines and BAS workpapers

Whether you store transaction lines decides almost everything. A practice tool that holds clients, jobs, time and workpapers is small. Software that keeps every bank line is not.

Typical accounting and bookkeeping record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
Clientname, ABN, addresses, contacts and about 400 characters of notes1,000 bytes1.1 million410,000840,0003.4 million8.6 million
Ledger line or bank transactiondate, amount, account code, GST code and a short description600 bytes1.8 million690,0001.4 million5.7 million14 million
BAS workpaperone quarter’s figures with about 1,000 characters of reviewer notes; attachments are files1,600 bytes670,000260,000530,0002.1 million5.4 million
Time entrya narrative of about 200 characters800 bytes1.3 million520,0001.1 million4.3 million11 million

Worked example. A bookkeeping practice with 300 small-business clients whose bank feeds bring in about 2,500 transactions per client a year stores 750,000 ledger lines a year, about 430 MiB. With 1,200 BAS workpapers (about 2 MiB) and 6,000 time entries (about 5 MiB) it grows by about 436 MiB a year. Hobby holds under 2 years, Launch about seven and a half and Scale about 19. Leave the transaction lines out and the same practice grows by under 7 MiB a year, which fits Hobby for decades.

For the rules that apply to tax practitioners and where we are not the right fit, see Industries: Accounting & bookkeeping.

Patients, appointments, clinical notes and results

A patient’s demographics are one row. Their history is many: every appointment, note, prescription and result adds to it, so a practice’s database grows with its consults rather than its patient count.

Typical health software record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
Patient demographicsname, date of birth, address, contacts, Medicare number and emergency contact, about 800 characters1,400 bytes770,000290,000600,0002.4 million6.1 million
Appointmentpatient, practitioner, time, type and status600 bytes1.8 million690,0001.4 million5.7 million14 million
Clinical note or encountera note of about 2,000 characters2,600 bytes410,000160,000320,0001.3 million3.3 million
Prescriptionmedicine, strength, dose and about 200 characters of directions800 bytes1.3 million520,0001.1 million4.3 million11 million
Resultone report with about 1,500 characters of text2,100 bytes510,000200,000400,0001.6 million4.1 million
Correspondence recordsender, date, type and storage path; the scanned letter itself is a file800 bytes1.3 million520,0001.1 million4.3 million11 million
Access-log rowwho opened which record, and when600 bytes1.8 million690,0001.4 million5.7 million14 million

Worked example, general practice. A four-GP practice with 8,000 patients (about 11 MiB), each GP seeing 30 patients a day for 230 days, writes 27,600 appointments and 27,600 clinical notes a year, plus 15,000 prescriptions, 20,000 results and 15,000 pieces of incoming correspondence. If the app logs record access, as clinical apps usually do, assume about 10 access-log rows per consult: 276,000 a year, about 158 MiB, which is more than the notes themselves. All told the practice grows by about 305 MiB a year. On storage alone, Hobby holds about two and a half years, Launch about 11 and Scale about 27; choose the plan for recovery and access first. The scanned letters are files, not rows: at two pages of about 250 KiB each, 15,000 letters are about 7.2 GiB a year of object storage, so even Scale’s 10 GiB bucket holds less than a year and a half.

Dental

Dental software adds a tooth chart per patient and treatment plans, on top of the patient, appointment and note rows above. X-rays are files, not rows: see files.

Typical dental record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
Tooth chart32 narrow rows, one per tooth, each about 600 bytes19,200 bytes56,00022,00044,000180,000450,000
Treatment plana plan row plus five item rows, each about 600 bytes3,600 bytes300,000110,000230,000950,0002.4 million

Worked example, dental. A 3-dentist practice with 6,000 patients stores their demographics (about 8 MiB) and a tooth chart each (about 110 MiB) up front, then adds about 78 MiB a year: 8,280 appointments (12 a dentist a day for 230 days), each with a clinical note and about 10 access-log rows, and 1,500 treatment plans. The first year comes to about 196 MiB. On storage alone, Hobby holds about 9 years; choose the plan for recovery and access first. The X-rays go in object storage. With patients recalled about every 18 months (4,000 a year) and two bitewings each, exported as JPEGs of about 300 KiB, that is about 2.3 GiB a year: more than Hobby’s 2 GiB bucket, about two years of Launch’s 5 GiB and about four years of Scale’s 10 GiB. Keep the imaging archive itself in your imaging system and use the bucket for working copies.

Allied health

Physiotherapy, psychology, podiatry and similar practices use the patient and appointment rows above, with a session note per consult and programmes for some patients.

Typical allied health record sizes, records per GiB and records that fit in each plan’s usable database storage
RecordTypical sizePer GiBFreeHobbyLaunchScale
Session note (SOAP)a note of about 1,500 characters2,100 bytes510,000200,000400,0001.6 million4.1 million
Exercise or home programmea programme row plus five exercise rows, each about 600 bytes3,600 bytes300,000110,000230,000950,0002.4 million

Worked example, allied health. A four-physio clinic with 3,000 patients (about 4 MiB), running 12,880 sessions a year (14 per physio a day for 230 days), each with a session note and about 10 access-log rows, and writing 1,000 home programmes a year grows by about 110 MiB a year. On storage alone, Hobby holds about 7 years and Launch about 29; choose the plan for recovery and access first.

For health privacy obligations, what WattleDB provides and where we are not the right fit, see Industries: Health software.

Files: scans, PDFs, photos and X-rays

Every database comes with a private S3-compatible bucket. Files are measured differently from rows, and the object storage quota is a hard limit: once the bucket is full, new uploads are refused. There is no 80% rule here, but there is a catch that uses space you cannot see.

Deleted and replaced files still count for 30 days. A bucket keeps older versions of deleted and overwritten files for a 30-day recovery window, and those versions sit inside your quota. A file you delete keeps using space until its 30 days are up. A 3 MiB photo replaced every day keeps about 30 older copies, around 90 MiB, at any one time. If your app overwrites or deletes files often, allow for that churn.

Typical file sizes and how many fit per GiB and in each plan’s object storage
FileTypical sizePer GiBFree 512 MiBHobby 2 GiBLaunch 5 GiBScale 10 GiB
Invoice PDFgenerated by software, one or two pages60 KiB17,0008,70035,00087,000170,000
Scanned pageone A4 page in colour at 200 dpi, as PDF250 KiB4,2002,1008,40021,00042,000
Contract PDFabout 20 pages, created digitally rather than scanned400 KiB2,6001,3005,20013,00026,000
Intraoral dental X-rayone bitewing or periapical image exported as a JPEG300 KiB3,5001,7007,00017,00035,000
Phone photo12-megapixel JPEG3 MiB3401706801,7003,400
Panoramic dental X-ray (OPG)exported as an image file5 MiB2001004101,0002,000
CT study (DICOM)about 400 slices at about half a MiB each200 MiB52102551

Counts assume nothing has been deleted or replaced in the last 30 days. Per GiB = 1,073,741,824 bytes divided by the file size, rounded; whole studies are rounded down.

Know what the bucket is for. It is served from Sydney, with a cross-state copy in Melbourne that we restore from. That copy holds current versions only and is not an endpoint you can reach, so it guards against losing Sydney rather than against deleting a file. Object storage is outside the SLA. The backups and point-in-time recovery on our plans cover your PostgreSQL database, not the bucket. Use the bucket for uploads, working copies, generated exports and previews, and keep your own master copy of anything you cannot re-create. Imaging archives in particular, CT studies above all, outgrow these allowances quickly.

The method, so you can check it or redo it for your schema

  • The measurement. On 21 September 2026 we measured WattleDB’s own production tables: a narrow, indexed row costs about 600 bytes all-in, including its share of the table’s indexes and PostgreSQL’s per-row overhead.
  • Rows with text. We add one byte per character of text on top of the 600. That is close for plain English. Characters outside basic Latin take two to four bytes each in UTF-8. PostgreSQL compresses long values once a row passes about 2 KB, and we do not count that saving, so long English notes usually land smaller than our figures, not larger.
  • Records made of several rows (an order with line items, a tooth chart, a treatment plan) are counted as the sum of their rows at about 600 bytes each.
  • What counts toward the plan. The database allowance counts the database’s own size as PostgreSQL reports it with pg_database_size: tables, indexes, and large values PostgreSQL compresses and stores out of line. Write-ahead logs and backups are not counted. The object storage allowance counts every file in the bucket, including older versions kept for the 30-day recovery window.
  • The baseline. An empty database uses about 16 MB (16,537,267 bytes, or 15.8 MiB, when measured on 8 September 2026) for PostgreSQL’s catalogue and the extensions we install. It counts toward the allowance, so we take it off first. See the FAQ for the breakdown.
  • The 80% rule. PostgreSQL does not overwrite a row in place. An update or delete leaves the old version behind until vacuum clears it for reuse, so a busy table always carries some dead space. Leave roughly a fifth of the allowance free for that housekeeping. Usable = 80% of the allowance less the baseline.
  • The arithmetic. Records per GiB = 1,073,741,824 bytes divided by the record size. Records per plan = the plan’s usable bytes divided by the record size. Years of room = usable space, less what you store up front, divided by what you add each year. Everything is rounded to two significant figures and labelled typical, because it is.

Where these figures will be wrong for you. A table with many indexes, or with a full-text or trigram index over long text, costs more per row. So do wide rows with dozens of columns. A large JSON document in each row adds roughly its own size, less whatever PostgreSQL’s compression saves. An embedding from a 1,536-dimension model is about 6 KB on its own, before its vector index. Files stored inside the database instead of in the bucket count at their full size against the database allowance.

Want your own number? Send a sample schema, or the output of pg_dump --schema-only, with rough row counts to support@wattledb.com.au. We will measure it and tell you which plan fits. If you already have the data in PostgreSQL, SELECT pg_size_pretty(pg_database_size(current_database())); gives you the same figure we count.

Scale is the largest plan you can buy online. If one database needs more than Scale’s usable figure, email support@wattledb.com.au with your estimate before you sign up, and we will tell you plainly whether we can host it.

Storage sizing, answered

How much database storage do I need?
Count the records you will keep, multiply each kind by its typical size, and add a year of growth. A narrow, indexed row costs about 600 bytes all-in on WattleDB’s own production tables, and a row that carries text costs about 600 bytes plus one byte per character. Then plan to fill about 80% of the plan’s allowance, less the 15.8 MiB (about 16 MB) an empty database already uses: about 394 MiB on Free, 803 MiB on Hobby, 3.2 GiB on Launch and 8.0 GiB on Scale.
How many rows fit in 1 GB of PostgreSQL?
About 1.8 million narrow, indexed rows of about 600 bytes each, indexes included: 1,073,741,824 bytes divided by 600. A row with a 1,500-character note is about 2,100 bytes, so about 510,000 of those fit in a GiB.
How many patient records fit in a GB?
About 770,000 patient demographic records of about 1,400 bytes each fit in a GiB. Demographics are rarely what fills a health database, though. Appointments, clinical notes, results and access-log rows do. A four-GP practice with 8,000 patients grows by about 305 MiB a year, so on storage alone Hobby holds about two and a half years of it and Launch about 11.
What counts toward my WattleDB database storage allowance?
The database’s own size as PostgreSQL reports it with pg_database_size: tables, indexes, and large values PostgreSQL compresses and stores out of line. Write-ahead logs and backups are not counted. An empty database uses about 16 MB for PostgreSQL’s catalogue and the extensions WattleDB installs, and that does count.
How much storage does a dental practice need?
A 3-dentist practice with 6,000 patients uses about 118 MiB up front for patient details and a tooth chart each, then adds about 78 MiB a year for appointments, clinical notes, access-log rows and treatment plans. On storage alone, Hobby’s usable 803 MiB holds about 9 years. X-rays go in object storage: with patients recalled about every 18 months and two bitewing JPEGs of about 300 KiB each, that is about 2.3 GiB a year, so Launch’s 5 GiB bucket holds about two years and Scale’s 10 GiB about four.
Why plan to use only about 80% of the allowance?
PostgreSQL does not overwrite a row in place. An update or delete leaves the old version behind until vacuum clears it for reuse, so a busy table always carries some dead space. Leaving roughly a fifth of the allowance free gives that housekeeping room to work.
Do deleted files count toward WattleDB object storage?
Yes, for 30 days. Deleted and overwritten files are kept as older versions for a 30-day recovery window, and those versions count toward the bucket’s quota. The quota is a hard limit: once the bucket is full, new uploads are refused. A 3 MiB photo replaced every day keeps about 30 older copies, around 90 MiB, at any one time.
What if my estimate is bigger than the Scale plan?
Scale, with 10 GiB of database storage and 10 GiB of object storage per database, is the largest plan you can buy online. If one database needs more than Scale’s usable figure, email support@wattledb.com.au with your estimate before you sign up, and we will tell you plainly whether we can host it. Data that splits naturally, such as one database per client, can run as several databases on one workspace.
Can WattleDB estimate the storage for my schema?
Yes. Send a sample schema, or the output of pg_dump --schema-only, with rough row counts to support@wattledb.com.au. We will measure it and tell you which plan fits.

Start small, measure, then choose

Load a sample of your real data into a free database and read its size back with pg_database_size. It is the same figure we count, and no card is required.

Create a free database →