CSV Import
Bring your existing data in. Upload a spreadsheet and GenMB checks it, then loads the rows straight into your app - so you start with real records instead of an empty screen.
How It Works
If you already keep customers, products, or contacts in a spreadsheet, you do not have to retype them. CSV Import adds an "Import" button to the relevant list in your app. Your users (or you) pick a CSV or Excel file, and the wizard walks through the rest.
Ask in chat to add it
Upload the spreadsheet
Review and fix
Import
Preview Before You Commit
Nothing is saved until you confirm. The preview checks each row against your app's fields and points out exactly what needs fixing: a required field left blank, a date in an odd format, a number that is actually text. Fix the spreadsheet, re-upload, and only good rows go in. If a row still fails when you import, it is reported back to you instead of silently dropped.
Update Instead of Duplicate
Re-uploading an updated spreadsheet should not create duplicates. Choose a column that uniquely identifies a record, like email, and matching rows are updated in place while genuinely new rows are added. This makes CSV Import safe to run again whenever your spreadsheet changes.
Limits
- Large files are imported in batches of up to 500 rows at a time, with a progress bar.
- Your spreadsheet's columns need to line up with the fields your app already has.
- Imports respect the standard write rate limit (30 writes per minute per app).
- Available on all plans, including Free.
Starting from scratch with a file and want GenMB to build the whole app around it? See Business Data Ingest. CSV Import is for loading more rows into an app you already have.
For Developers
CSV Import is exposed to generated app code as window.genmb.import. The usual entry point is open(), which launches the self-contained wizard modal (file parse, column mapping, dry-run, and batched commit are all handled inside it):
window.genmb.import.open({
tableName: 'contacts',
schema: [
{ name: 'firstName', type: 'String', required: true, label: 'First name' },
{ name: 'lastName', type: 'String' },
{ name: 'email', type: 'String', required: true },
],
uniqueKey: 'email', // matching rows are updated instead of duplicated
onComplete: ({ inserted, updated, errors }) => {
// refresh your list view
},
})For a custom UI you can drive the two steps directly. Dry-run validates without writing; commit writes up to 500 rows per call (chunk client-side for larger files):
const { valid, errors } = await window.genmb.import.dryRun(
'contacts', rows, schema, 'email',
)
const { inserted, updated, errors: commitErrors } =
await window.genmb.import.commit('contacts', rows, schema, 'email')Data safety
- Table names are coerced through a safe-identifier guard before any SQL runs.
- Inserts use parameterized SQL (asyncpg
$1, $2, ...). No string interpolation of user data. - The signed-in end-user is resolved from the session cookie; if the target table has a
userIdcolumn, it is stamped on every row. - Imports go through DataConnect against your app's own tables, subject to the standard 30 writes / minute / app rate limit.
FAQs
What is CSV Import?▾
How does "update instead of duplicate" work?▾
What if my spreadsheet does not match my app?▾
Does it remember who uploaded each row?▾
Ready to build?
Create your first app for free, no credit card required.