SuiteMigration Admin Toolkit Free · Source Available

Bulk-delete NetSuite records, without the one-off scripts.

A free Suitelet + Map/Reduce utility that clears sandbox and test data by subsidiary, record type, date, and External ID, with a preview before anything is removed, and a job you can walk away from.

Standard SuiteScript modules
No external calls
Runs in your account
Admin Toolkit · Delete Records Sandbox
Subsidiary United States : Florida
Record Type Invoices
External ID Populated only
Date Filter Created · last 30 days
Deleting Invoices 176 / 248

22

record types

5,000

unit reduce budget

1

subsidiary per job

0

third-party code

The problem

Every dry run leaves something behind.

A migration sandbox fills up fast: a few thousand test invoices, a stack of Trial Balance journal entries, a customer list nobody recognizes. You have options for clearing it: a Mass Delete saved search, a free script bundle, a browser extension, an afternoon on a throwaway SuiteScript. What none of them hand you is the cleanup itself. You still build the search, work out what has to go first, and stay with it while it runs. Every dry run, every client.

Option Scales to thousands?Filters built in?Deletes in order?
Built into NetSuite

Delete one at a time in the UI

No multi-select on most record types.

Mass Delete via a saved search

One search per pass.

partial saved search manual
Do it yourself

A one-off SuiteScript

Rebuilt for the next account.

only coded only coded
Free tools available

Techfino MassRecordDeletion

You build the saved search first.

saved search manual

NetSuite for Consultants

A third-party Chrome extension, not from Oracle. Deletes a record at a time in your browser tab.

partial search based reports failures

SuiteMigration Admin Toolkit

Four dropdowns, then confirm.

Most of them can delete records. The difference is how much you build first. Ask for "every invoice created in the last 30 days for this one subsidiary, but leave the blank External IDs alone". Four dropdowns here. A saved search and a running order everywhere else.

Two more are worth a look if they fit your case. Tavasca advertises a free Suitelet that gates deletion behind a saved-search naming convention and shows a count before you submit. NetSuite Utils lists a transaction tree of dependent records that you can mass-delete from. Neither documents a cleanup scoped to one subsidiary across entities and transactions in a single job.

Third-party capabilities above are as each tool documents them, not independently tested. Sources: Techfino, NetSuite for Consultants, NetSuite Utils, Tavasca.

It's free, and the source is yours to read. Grab it and clear your next sandbox in one job.

How it targets

Four filters, combined with AND

Each condition narrows the set, so only records meeting every selected filter are targeted. Deleting a parent record also clears the children that depend on it, so the final count can come out higher than the match count.

Subsidiary

Every deletion is scoped to a single, active subsidiary, so a cleanup stays inside the entity you picked. Always required, and one subsidiary per job.

Record Type

Pick one type, like Customers, Invoices or Journal Entries, or a built-in group: All Entities, All Transactions, or All Records.

External ID

Target by whether records have an External ID: all, only populated, only blanks, or specifically the ones a SuiteMigration push created.

Date Filter

By creation date (any type) or transaction date (transactions), inclusive endpoints, with a format hint matching your account's date preference.

Worked example

"Delete invoices created in the last 30 days for one subsidiary, but keep the ones with a blank External ID."

Subsidiary

The one to clean up

Record Type

Invoices

External ID

Populated only

Date Filter

Created · last 30 days

Coverage

22 record types, one at a time or in bulk

Delete a single type, or clear several at once with a built-in group. The alternatives work a saved search at a time; one job here spans entities and transactions.

All Entities

Customers, Vendors, Employees, Items (all six subtypes), and Projects.

All Transactions

17 transaction types: invoices, payments, credits, bills, checks, deposits, POs, journal entries and more.

All Records

Everything above, for a full test-data wipe of one subsidiary in a single job.

Match exactly what SuiteMigration created

Three targets aren't standard NetSuite record types at all. They're Checks or Journal Entries identified purely by a SuiteMigration-generated External ID pattern. So you can clear exactly what a push created without touching a single manually entered record in the same subsidiary.

Cash Expenses

Stored as a Check, identified by an External ID ending

__cex_chk

Transfers

Stored as a Journal Entry, identified by an External ID ending

__trf_jrn

Trial Balance JEs

Journal Entries whose External ID contains

sm_net · sm_rebuild · sm_manual

Want the exact script IDs, deployment settings, and a troubleshooting table?

Under the hood

Built around NetSuite's governance limits

A plain delete loop spends its governance budget and halts halfway, with no clean way to resume. That limit is what the toolkit is built around.

Runs as a background Map/Reduce job

Deletion happens in the Reduce phase, where NetSuite grants a fresh 5,000-unit governance allowance to every invocation, the same model NetSuite uses for its own large-scale processing. That's what lets it work through tens of thousands of records in one job instead of stopping partway.

A concurrency guard

Only one deletion job runs at a time per account, so two admins can't accidentally kick off overlapping deletes in the same environment.

Live progress, per record type

Watch a progress bar instead of guessing whether a tab is still working. Group deletes run in dependency order, payments before invoices, with a deleted/failed breakdown at the end.

Handles what breaks a hand-rolled script

Two NetSuite-specific problems a saved search or a hand-rolled script leaves you to solve yourself. The toolkit takes care of both.

Customer trees, deepest-first

Deleting a Customer walks its sub-customers and grandchildren and removes them deepest-first, clears the linked contact records, and drops the vendor, employee, and subsidiary relationships that would otherwise block the delete outright, so the number actually removed can exceed the top-level count.

Items in a single pass

Items are matched across all six subtypes in one run: Inventory, Non-Inventory, Service, Assembly, Kit, and Group. There is no separate pass per item type.

Safety

Safety as the default, not an afterthought

This performs permanent, irreversible deletions, so it's built to make that hard to do by accident.

Preview before you commit

Every deletion shows the criteria it will run with, including subsidiary, type, date range and External ID, before you can confirm. You are approving that scope, not a list of record IDs.

An explicit confirmation step

You read the summary and click through a dedicated Confirm Deletion dialog. There is no single-click delete.

Locked-in selections

Once a filter value is picked, that dropdown becomes read-only, so a stray keystroke can't quietly widen a deletion you already scoped down.

A traceable audit trail

Every job start, summary, and individual delete failure is written to NetSuite's own script execution log, so there is a record of what ran and what failed.

None of that changes the fundamental fact: once records are deleted, they're gone. Test in a Sandbox account before you point this anywhere near Production. It's the one thing that actually matters.

Not sure where to start? Leave your details and we'll help you deploy it.

Use cases

Where it comes in handy

The migration workflow is what drove us to build it, but it covers a wider range than that.

In a migration project

  • Clear a sandbox after a dry run, before the next push
  • Remove only the records a specific push created, by External ID
  • Clean up Trial Balance push JEs without touching manual ones
  • Recover from a partial import by deleting one subsidiary/date slice

General admin work

  • Reset a sandbox before handing it back to a client or team
  • Bulk-remove test data from any integration or import project
  • Clear a training or demo environment after a session
  • Wipe a subsidiary's test data in one job via All Records

Precision & scale

  • Restrict a cleanup to one subsidiary in a multi-subsidiary account
  • Separate integration-created records from manual ones, clear one side
  • Preview a filter combination to count matches before deleting
  • Delete thousands of records in one background job

For consultants: the license covers use on behalf of your clients, so you can bring the same repeatable cleanup to every engagement instead of rewriting a delete script each time. It's free for your own org and your clients'. It just can't be resold, re-hosted, or rebranded as your own product.

Fit

When to use something else

It was built for one job, clearing test data out of a subsidiary again and again without writing a script. Outside that, something else in the table will serve you better.

Your targeting needs more than four filters

Subsidiary, record type, date and External ID cover most cleanups. A saved search can express conditions those four cannot. Techfino's tool and Tavasca's Suitelet both run off a saved search, so use one of those when your criteria are more specific.

You can't deploy SuiteScript

Installing means uploading two files and creating the script records, so you need administrator rights and about fifteen minutes. NetSuite for Consultants is a browser extension and puts nothing in the account.

The record type isn't one of the 22

It handles 22 record types, plus three External ID patterns, not every record NetSuite lets you delete. Custom records and anything else need a saved search or a script.

You need to cross subsidiaries, or run two jobs at once

Each job covers one subsidiary, and only one job runs per account at a time. Clearing three subsidiaries means three runs, one after the other.

You want to pick rows, or stop mid-run

Once you confirm, the job finishes. You cannot exclude individual rows or stop it partway. NetSuite for Consultants lets you do both.

Your policy requires an OSI licence

You can read the code and change it for your own and your clients' accounts, but the licence does not let you redistribute or re-host it. That makes it source available, not open source.

Getting started

Manual by design, in about 15 minutes

There's no code to write, but it does assume you're comfortable deploying SuiteScript. The deployment guide has the exact IDs, settings, screenshots, and a troubleshooting table.

01

Upload two files

Add the Suitelet and Map/Reduce scripts to the same NetSuite File Cabinet folder.

02

Create the script records

Create the Map/Reduce script with the required ID and its seven Free-Form Text parameters, then the Suitelet.

03

Deploy and open

Deploy both, open the Suitelet URL, and you're ready to scope your first cleanup.

Get the toolkit

Free, source available, yours today

Grab it on GitHub, no sign-up, no wall. Prefer a hand deploying it, or a heads-up when we add new tools to the Toolkit? Leave your details and we'll help you get set up. Either way, it's free.