Business Central Data Migration via RapidStart Services

Type: ERP Integration System: Microsoft Dynamics 365 Business Central (v25/v26) Confidence: 0.88 Sources: 8 Verified: 2026-03-03 Freshness: 2026-03-03

TL;DR

System Profile

Microsoft Dynamics 365 Business Central includes RapidStart Services as a built-in data migration and company configuration tool. It is available in both SaaS (Essentials and Premium editions) and on-premise deployments. RapidStart operates through configuration packages — bundles of table data that can be exported as .rapidstart compressed files or Excel workbooks, modified externally, and re-imported to populate a new company.

The tool consists of three core components: the Configuration Worksheet (organizes tables into areas and groups), Configuration Packages (the data containers exported/imported), and Configuration Templates (default field values applied to imported master data records). For automated multi-tenant provisioning, the Automation API (microsoft/automation namespace) provides REST endpoints to upload, import, and apply RapidStart packages programmatically.

PropertyValue
VendorMicrosoft
SystemDynamics 365 Business Central v25/v26 (2024-2026)
ToolRapidStart Services (Configuration Packages)
Automation APImicrosoft/automation/v2.0/configurationPackages
Editions CoveredEssentials, Premium (SaaS); all on-premise editions
DeploymentCloud (SaaS) + On-Premise
API DocsSet Up Company Configuration Packages
StatusGA (General Availability)

API Surfaces & Capabilities

RapidStart is not a traditional API — it is a data migration framework with multiple access surfaces.

SurfaceProtocolBest ForMax Records/BatchRate LimitReal-time?Bulk?
Configuration Package (UI)In-app (BC client)Interactive setup, Excel-based migrationNo hard limit (~50K practical)N/ANoYes
.rapidstart FileXML compressedReusable package distribution between tenantsNo hard limitN/ANoYes
Excel Export/ImportXLSX via BCManual data entry/editing by consultantsNo hard limitN/ANoYes
Automation API (REST)HTTPS/JSON + octet-streamAutomated tenant provisioning, CI/CDPackage-levelBC API limitsNo (async)Yes
AL Code (Codeunit 8620)In-processExtension-driven package applicationPackage-levelN/ASync or asyncYes
PowerShell (On-Prem)Import-NAVConfigurationPackageFileOn-premise automationPackage-levelN/ASyncYes

Rate Limits & Quotas

Per-Operation Limits

Limit TypeValueApplies ToNotes
Max package file size (Automation API)350 MBAutomation API PATCHBC max request body size
Max entities per OData page20,000Automation API GETFor status polling
Concurrent OData requests5 processing per userAutomation APIQueued requests wait up to 8 min
Operation timeout8 minutesImport/Apply operations504 at 10 minutes
Practical record limit per package~50,000All surfacesPerformance degrades severely above this

Session / Environment Limits

Limit TypeValueWindowNotes
Automation API rate limit6,000 requests per 5-min windowRolling per userShared with all OData API calls
Speed limit (production)600 requests/minutePer userApplies to Automation API calls
Speed limit (sandbox)300 requests/minutePer userLower in sandbox environments
Async task scheduler1 import/apply at a timePer companySubsequent calls fail until previous completes

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
Interactive (BC Client)Manual setup via Configuration Worksheet/Package pagesSession-basedSessionMost common for consultants
OAuth 2.0 Client Credentials (S2S)Automated provisioning, CI/CD pipelines~1hYesRequires Entra ID app; must be in AdminAgents group
OAuth 2.0 Authorization CodeUser-context Automation API callsAccess: 1h, Refresh: until revokedYesFor interactive automation tools
PowerShell (On-Prem)Server-side administrationWindows auth sessionN/AImport-NAVConfigurationPackageFile cmdlet

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START — User needs to migrate data into Business Central
|-- What's the scenario?
|   |-- New company setup (greenfield)
|   |   |-- Data volume < 5,000 records?
|   |   |   |-- YES -> Configuration Package via Excel (simplest)
|   |   |   +-- NO  -> Data volume < 50,000 records?
|   |   |       |-- YES -> Configuration Package (.rapidstart file)
|   |   |       +-- NO  -> XMLport (RapidStart will be too slow)
|   |   +-- Need to replicate setup across multiple companies?
|   |       |-- YES -> Export .rapidstart, apply via Automation API
|   |       +-- NO  -> Single package import via BC client
|   |-- Multi-tenant provisioning (automated)
|   |   |-- Use Automation API workflow:
|   |       POST configurationPackages (create)
|   |       PATCH .../file/.../content (upload .rapidstart)
|   |       POST .../Microsoft.NAV.import (import — async)
|   |       Poll status until importStatus = "Completed"
|   |       POST .../Microsoft.NAV.apply (apply — async)
|   |       Poll status until applyStatus = "Completed"
|   |-- Production company (already live)
|   |   +-- DO NOT use RapidStart -> Use XMLport or API v2.0
|   +-- Legacy ERP migration (NAV, GP, SL, QuickBooks)
|       |-- Supported migration tool available?
|       |   |-- YES -> Use cloud migration tools (not RapidStart)
|       |   +-- NO  -> Export to Excel/CSV, map fields, import via Config Package
|-- Which data?
|   |-- Setup tables -> Configuration Package (designed for this)
|   |-- Master data -> Configuration Package + Configuration Templates
|   |-- Opening balances -> Import journal lines via Config Package, then post
|   +-- Transaction history -> CANNOT import via RapidStart
+-- Error tolerance?
    |-- Zero-loss -> Validate Package before Apply, export backup first
    +-- Best-effort -> Apply with Skip Table Triggers, fix errors post-import

Quick Reference

Configuration Package Workflow

StepActionPage/ToolKey SettingNotes
1Define package scopeConfig. Worksheet or Config. Package CardTable + field selectionUse "Get Tables" to auto-add by type
2Add related tablesConfig. Worksheet"Get Related Tables" actionConditional relations not auto-added
3Select fields per tableConfig. Package Fields"Set Included" / "Clear Included"Exclude calculated/system fields
4Create templatesConfiguration TemplatesDefault field valuesAuto-applies defaults to imported records
5Export to ExcelConfig. Package Card"Export to Excel"One worksheet per table in package
6Populate data in ExcelExternal (Excel)Match column headers exactlyDo NOT add/remove/reorder columns
7Import from ExcelConfig. Package Card"Import from Excel"File must originate from BC export
8Validate packageConfig. Package Card"Validate Package" actionCheck for type mismatches, missing relations
9Apply packageConfig. Package Card"Apply Package" actionInserts/updates records into target tables
10Post journalsGeneral/Item/FA JournalsManual postingOpening balances require manual post

Automation API Workflow

StepHTTP MethodEndpointPayloadStatus Field
1. Create packagePOST/configurationPackages{"code":"PKG","packageName":"PKG"}
2. Upload filePATCH/configurationPackages({id})/file('{code}')/contentBinary .rapidstart (octet-stream)
3. ImportPOST/configurationPackages({id})/Microsoft.NAV.importNoneimportStatus
4. Poll importGET/configurationPackages({id})None"Completed" / "InProgress" / "Error"
5. ApplyPOST/configurationPackages({id})/Microsoft.NAV.applyNoneapplyStatus
6. Poll applyGET/configurationPackages({id})None"Completed" / "InProgress" / "Error"

Step-by-Step Integration Guide

1. Create and configure a configuration package

Open the Configuration Package page in Business Central (search for "Configuration Packages"). Create a new package with a code and add the tables you need to migrate. [src1]

// In Business Central client:
// 1. Search for "Configuration Packages"
// 2. Click + New
// 3. Set Code = "MIGRATE01", Package Name = "Initial Data Migration"
// 4. In Lines section, add tables:
//    Table 18 (Customer), Table 23 (Vendor), Table 27 (Item),
//    Table 15 (G/L Account), Table 308 (No. Series)
// 5. For each table, click Fields to select/deselect columns
// 6. Set "Skip Table Triggers" = Yes for legacy data

Verify: In the Config. Package Card, check that "No. of Tables" shows your expected count and "No. of Records" shows 0.

2. Export to Excel and populate data

Export the empty package structure to Excel, populate each worksheet with your migration data, then import back. [src4]

// Export:
// 1. On Config. Package Card, click Actions > Package > "Export to Excel"
// 2. Save the .xlsx file
// 3. Open in Excel — one sheet per table
// 4. Fill in rows (one row per record)
//    IMPORTANT: Do NOT change column headers, order, or add new columns

// Import:
// 1. On Config. Package Card, click Actions > Package > "Import from Excel"
// 2. Select your populated .xlsx file
// 3. Check "No. of Package Records" to confirm import count

Verify: After import, "No. of Records" should match your Excel row counts. "No. of Package Errors" should be 0.

3. Validate the package

Before applying, always validate to catch data type mismatches, missing foreign key references, and constraint violations. [src2]

// 1. On Config. Package Card, click Actions > Functions > "Validate Package"
// 2. Wait for validation to complete
// 3. Check "No. of Package Errors" column
// 4. If errors exist, drill down on the error count
// 5. Common fixes:
//    - Missing lookup values: enable "Create Missing Codes"
//    - Type mismatches: fix in Excel and re-import
//    - Length violations: truncate text fields

Verify: "No. of Package Errors" = 0 for all tables before proceeding to Apply.

4. Apply the package

Apply inserts/updates records into actual Business Central tables. Always export a backup first. [src2]

// 1. BACKUP: Export current package to .rapidstart file first
// 2. Click Actions > Functions > "Apply Package"
// 3. Confirm the apply action
// 4. Monitor progress — large packages may take several minutes
// 5. Check "No. of Package Errors" after apply completes
// 6. For any errors, drill down and fix inline or re-import

Verify: Navigate to Customer/Vendor/Item List to confirm records were created.

5. Automate via Automation API

For automated provisioning of multiple companies, use the Automation API. [src3]

# Step 1: Create the configuration package record
curl -X POST \
  "https://api.businesscentral.dynamics.com/v2.0/{env}/api/microsoft/automation/v2.0/companies({companyId})/configurationPackages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code":"SETUP01","packageName":"Standard Setup"}'

# Step 2: Upload the .rapidstart file
curl -X PATCH \
  "https://api.businesscentral.dynamics.com/v2.0/{env}/api/microsoft/automation/v2.0/companies({companyId})/configurationPackages({pkgId})/file('SETUP01')/content" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/octet-stream" \
  -H "If-Match: *" \
  --data-binary @setup01.rapidstart

# Step 3-6: Import, poll, apply, poll (see Quick Reference table)

Verify: GET the package status — both importStatus and applyStatus should be "Completed".

Code Examples

AL: Load and apply a RapidStart package from extension code

// Input:  InStream containing a .rapidstart file
// Output: Package imported and applied to current company

procedure ImportAndApplyPackage(PackageStream: InStream)
var
    ConfigPackageImport: Codeunit "Config. Package - Import";
    ConfigPackage: Record "Config. Package";
    ConfigPackageMgt: Codeunit "Config. Package Management";
    TempBlob: Codeunit "Temp Blob";
    OutStream: OutStream;
begin
    TempBlob.CreateOutStream(OutStream);
    CopyStream(OutStream, PackageStream);
    ConfigPackageImport.ImportRapidStartPackageStream(TempBlob);
    if ConfigPackage.FindLast() then begin
        ConfigPackageMgt.ApplyPackage(ConfigPackage, ConfigPackage, true);
        Message('Package %1 applied successfully.', ConfigPackage.Code);
    end;
end;

PowerShell: On-Premise automated package import

# Input:  .rapidstart file path, BC server instance
# Output: Package imported into target company

Import-Module "C:\Program Files\Microsoft Dynamics 365 Business Central\250\Service\NavAdminTool.ps1"

$BCServerInstance = "BC250"
$CompanyName = "CRONUS International Ltd."
$PackageFile = "C:\Migration\setup-package.rapidstart"

Set-NAVServerConfiguration -ServerInstance $BCServerInstance `
    -KeyName ApiServicesEnabled -KeyValue true

Import-NAVConfigurationPackageFile -ServerInstance $BCServerInstance `
    -CompanyName $CompanyName -Path $PackageFile -Force

cURL: Check Automation API package status

# Input:  Valid OAuth 2.0 Bearer token, company ID
# Output: JSON with package import/apply status

curl -s -X GET \
  "https://api.businesscentral.dynamics.com/v2.0/{env}/api/microsoft/automation/v2.0/companies({companyId})/configurationPackages" \
  -H "Authorization: Bearer $TOKEN" \
  | jq '.value[] | {code, packageName, importStatus, applyStatus, numberOfTables, numberOfErrors}'

Data Mapping

Mapping Resolution Priority

PriorityMapping TypeDescriptionExample
1Direct field mappingExplicit mapping on the field itselfSource "CustNo" -> BC "No."
2Related table mappingMapping via primary key in related tableSource "PayTerms30" -> BC "30 DAYS"
3Configuration templateDefault values applied when no mapping existsCountry/Region Code defaults to "US"
4No mappingField imported as-is (must match BC format)Names, addresses (direct copy)

Common Field Mapping Reference

Source (Legacy/Excel)Target (BC Table.Field)TypeTransformGotcha
Customer NumberCustomer."No." (18.1)Code[20]DirectMax 20 chars — truncated silently
Customer NameCustomer.Name (18.2)Text[100]DirectMax 100 chars in BC
Payment TermsCustomer."Payment Terms Code" (18.15)Code[10]LookupMust exist in Payment Terms table or enable "Create Missing Codes"
CurrencyCustomer."Currency Code" (18.26)Code[10]LookupMust exist in Currency table; blank = LCY
Item NumberItem."No." (27.1)Code[20]DirectNo. Series may conflict
Unit PriceItem."Unit Price" (27.18)DecimalDirectDecimal separator must match BC locale
GL Account NoG/L Account."No." (15.1)Code[20]DirectChart of accounts must be set up first

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

ErrorMeaningCauseResolution
"XX is not a valid option"Invalid option/enum valueText value instead of integerUse integer value from field metadata
"The field value is too long"Field length exceededSource data exceeds BC field max lengthTruncate data before import
Duplicate table/field nameXML serialization conflictSpecial char removal creates name collisionsRename conflicting fields before export
"The record already exists"Primary key conflictRecord with same key already existsUse "Delete Table Records Before Processing" or update
Validation sequence errorsUnexpected validation failuresFields validated in wrong orderUncheck "Validate Field" on problematic fields
HTTP 400 on API import/applyAsync task still runningPrevious operation not completedPoll status until "Completed" before next step
"Need pre-consent"Missing admin groupEntra ID app not in AdminAgents groupAdd app to AdminAgents group in Partner Center

Failure Points in Production

Anti-Patterns

Wrong: Using RapidStart for ongoing production data loads

// BAD — RapidStart locks out all users during import
// Using configuration packages for weekly data loads in a live company
// Users can't log in, apply takes hours for large datasets, no rollback

Correct: Use XMLport or API v2.0 for production data operations

// GOOD — Use the right tool for production data
// XMLport: bulk, scheduled, runs via Job Queue, non-blocking
// API v2.0: real-time individual records, rate limited but non-blocking

Wrong: Importing all Excel columns including unused blanks

// BAD — All columns including blanks overwrites existing data
// Export 50 columns, fill only 10, leave 40 blank
// Result: 40 fields on every record are now blank/zero

Correct: Select only needed fields before export

// GOOD — Minimize field selection before export
// 1. Open Config. Package Fields, click "Clear Included"
// 2. Select ONLY the fields you will populate
// 3. THEN export to Excel — only selected fields are affected

Wrong: Skipping validation and applying directly

// BAD — Apply without validate
// 500 records fail with cryptic errors, some partially applied
// Hours spent fixing data inconsistencies

Correct: Always validate before applying

// GOOD — Validate first, fix errors, then apply
// 1. Validate Package  2. Review errors  3. Fix in Excel
// 4. Re-import and re-validate until 0 errors
// 5. Export backup .rapidstart  6. THEN Apply Package

Common Pitfalls

Diagnostic Commands

# Check all configuration packages and their status
curl -s -X GET \
  "https://api.businesscentral.dynamics.com/v2.0/{env}/api/microsoft/automation/v2.0/companies({companyId})/configurationPackages" \
  -H "Authorization: Bearer $TOKEN" \
  | jq '.value[] | {code, packageName, importStatus, applyStatus, numberOfErrors}'

# Check specific package status
curl -s -X GET \
  "https://api.businesscentral.dynamics.com/v2.0/{env}/api/microsoft/automation/v2.0/companies({companyId})/configurationPackages({pkgId})" \
  -H "Authorization: Bearer $TOKEN" \
  | jq '{importStatus, applyStatus, importError, applyError}'

# Test authentication (list companies)
curl -s -X GET \
  "https://api.businesscentral.dynamics.com/v2.0/{env}/api/microsoft/automation/v2.0/companies" \
  -H "Authorization: Bearer $TOKEN" \
  | jq '.value[] | {id, name, displayName}'

# PowerShell (on-premise): Check API settings
# Get-NAVServerConfiguration -ServerInstance BC250 | Where-Object { $_.Key -like "*Api*" }

Version History & Compatibility

BC VersionRelease DateStatusRapidStart ChangesNotes
v26 (2025 Wave 1)2025-04CurrentAutomation API v2.0 improvementsLatest recommended
v25 (2024 Wave 2)2024-10SupportedSecurity groups replace user groupsAdminAgents group required
v24 (2024 Wave 1)2024-04SupportedPerformance improvements
v22 (2023 Wave 1)2023-04EOL 2025-10Minimum for Automation API v2.0
v16 (2020 Wave 1)2020-04EOLConfig. XML Exchange codeunit addedKey for AL-based package loading
v13 (2018)2018-10EOLCodeunit 8620 refactored for InStreamBreaking change for existing AL code

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Setting up a new company for the first timeCompany already in production with active usersXMLport or API v2.0
Migrating master data during go-liveMigrating transaction history or posted entriesJournal imports for opening balances
Replicating setup across multiple companiesOngoing scheduled data synchronizationAPI v2.0 webhooks + scheduled jobs
Automated tenant provisioning via Automation APIReal-time record-level integrationAPI v2.0 OData endpoints
Data volume under ~50,000 records per tableData volume over 50,000 records per tableCustom XMLport
Legacy ERP migration (no direct tool exists)Migrating from NAV, GP, SL, QuickBooksBuilt-in cloud migration tools

Important Caveats

Related Units