ERP migration
Field-level mapping, validation, and rollback between Triumph and Epicor Prophet 21. We move data and schema; workflows are rebuilt natively in Epicor Prophet 21.
Triumph
Source
Epicor Prophet 21
Destination
Compatibility
14 of 17
objects map 1:1 between Triumph and Epicor Prophet 21.
Complexity
CModerate
Timeline
8-12 weeks
Overview
Moving from Triumph ERP to Epicor ERP (Kinetic) is a step up from an Australian SMB accounting platform into a manufacturing-grade ERP with a multi-level Company/Site/Plant/Warehouse hierarchy, full part master with revisions and methods, and a BPM-driven business logic layer. Triumph has no public API, so source extraction runs through the report writer plus a Triumph-support-assisted database export. Epicor's destination side uses REST v2 endpoints (introduced widely from Kinetic 2022.1), Epicor Service Connect for orchestrated multi-object loads, and direct DMT (Data Management Tool) imports for high-volume tables like Customer, Vendor, Part, and Part Transaction history. We resolve the chart of accounts mapping into Epicor GLAccount segments before any transactional load, pre-create Company and Site records so that CustID, VendorID, and PartNum keys land in the correct organizational scope, and we set up the BAQ reconciliation queries that compare Triumph aging and inventory balances against Epicor at cutover.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Triumph object lands in Epicor Prophet 21, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Triumph
Customer (Debtors module)
Epicor Prophet 21
Customer (Erp.Customer)
1:1Triumph Debtors records map to Epicor Erp.Customer rows scoped to the destination Company. CustID becomes the Epicor customer key (typically maintained as the Triumph customer code where format allows, or remapped per Epicor numbering conventions if Triumph codes exceed Epicor field lengths). Customer billing address loads to BillToAddr1/2/3/City/State/Zip; shipping addresses split into ShipTo records as separate Erp.ShipTo rows. Payment terms reference Erp.Terms pre-created during reference data load. We load via DMT Customer template or POST to /v2/Erp.BO.CustomerSvc/Customers.
Triumph
Supplier (Creditors module)
Epicor Prophet 21
Vendor (Erp.Vendor)
1:1Triumph Creditors map to Epicor Erp.Vendor rows. VendorID carries the Triumph supplier code where Epicor field length allows. Where a third party exists in both Triumph Debtors and Creditors, Epicor allows linking via the Customer-Supplier relationship table (Erp.CustomerVendor), so both Customer and Vendor records are loaded with the link row connecting them. Payment terms reference Erp.Terms; remittance addresses and 1099/withholding tax flags load to vendor-specific fields. Loaded via DMT Vendor template.
Triumph
General Ledger Account
Epicor Prophet 21
GL Account (Erp.GLAccount)
1:1Triumph GL account codes map to Epicor Erp.GLAccount rows under the destination Company's Chart of Accounts (COAID). Triumph's flat account number maps to Epicor's segmented account structure (Natural Account + Cost Center + Division + custom segments) per the customer's Epicor implementation. Account type (Asset, Liability, Equity, Income, Expense) maps to the corresponding Epicor account class. We require the Epicor COA structure designed and approved before this load, because account segmentation is a one-time design decision that affects all transactional history.
Triumph
Open Customer Invoice
Epicor Prophet 21
AR Invoice (Erp.InvcHead + Erp.InvcDtl)
1:1Triumph open AR invoices load into Erp.InvcHead (header) and Erp.InvcDtl (line items) as Posted invoices (OpenInvoice=true, Posted=true). InvoiceNum preserves the original Triumph invoice number. Line GL distribution (Erp.InvcTax, Erp.InvcDtlTax) requires the COA mapping completed first. Open invoices load via DMT AR Invoice template, which handles the posted-state metadata that the REST endpoint does not expose directly. Original invoice date carries to InvoiceDate; due date to DueDate.
Triumph
Open Supplier Invoice
Epicor Prophet 21
AP Invoice (Erp.APInvHed + Erp.APInvDtl)
1:1Triumph open AP invoices load into Erp.APInvHed and Erp.APInvDtl as Posted, Open. InvoiceNum carries the supplier's invoice reference; InvoiceRef carries the Epicor internal reference. The GL expense distribution per line references Erp.GLAccount entries from the COA load. Tax detail loads into Erp.APInvTax. We use DMT APInvoice template for the bulk load and validate Vendor AP aging in Epicor matches the Triumph creditors aging at cutover.
Triumph
Customer Payment / Receipt
Epicor Prophet 21
Cash Receipt (Erp.CashHead + Erp.CashDtl)
1:manyTriumph customer receipts split into Erp.CashHead (cash receipt header with bank account, amount, date) and Erp.CashDtl (allocation lines tying the cash to specific InvoiceNum values). Where a single Triumph receipt was applied across multiple invoices, we preserve each allocation as a separate Erp.CashDtl row rather than collapsing. Bank account reference points at Erp.BankAcct rows pre-created during reference data load. Payment method maps to Erp.PaymentMethod records.
Triumph
Supplier Payment (incl. EFT batch)
Epicor Prophet 21
AP Payment (Erp.CheckHed + Erp.CheckDtl)
1:manyTriumph supplier payments and Electronic Funds Payment runs split into Erp.CheckHed (payment header per supplier) and Erp.CheckDtl (allocation to specific AP invoices). EFT batch IDs from Triumph migrate as a UD field on Erp.CheckHed because Epicor's native payment batch model is structured differently. CheckNum, CheckDate, BankAcctID, and PaymentMethod all map per Epicor's standard AP payment schema. Validation requires matching Vendor open balance in Epicor against Triumph at cutover.
Triumph
Product / Inventory Item
Epicor Prophet 21
Part (Erp.Part)
1:1Triumph Inventory items map to Erp.Part rows scoped to the destination Company. PartNum takes the Triumph item code (subject to Epicor's 50-character limit and naming rule constraints). Class (Erp.ProdGrup) and Product Group references resolve against pre-loaded reference data. Stock-on-hand at cutover loads into Erp.PartBin keyed by Plant, Warehouse, and Bin. We require Plant, Warehouse, and Bin records pre-created in Epicor before stock import. Loaded via DMT Part template plus PartBin balance template.
Triumph
Service Item
Epicor Prophet 21
Part (Erp.Part with TrackInventory=false)
1:1Triumph service items map to Erp.Part rows with TrackInventory=false and NonStock=true. These appear in Sales Order line entry and AR Invoice line entry but do not carry stock balances or generate Part Transaction history. Sales unit of measure and Purchasing UOM still apply, and GL revenue and COGS accounts must be set on the Part record so that sales of the service post to the correct GL natural accounts. Loaded via the standard DMT Part template with the TrackInventory flag set false.
Triumph
Quotation / Sales Quote
Epicor Prophet 21
Quote (Erp.QuoteHed + Erp.QuoteDtl)
1:1Triumph customer quotes migrate to Erp.QuoteHed records with quote status mapped to Epicor's quote lifecycle (Open, Quoted, Won, Lost). Quote lines load to Erp.QuoteDtl with Part reference, quantity, unit price, and unit of measure. Quote-to-Order conversion history preserves via the OrderNum reference back to the originating Erp.OrderHed if the Triumph quote was already converted to an order at migration time. Loaded via DMT Quote template.
Triumph
Sales Order
Epicor Prophet 21
Sales Order (Erp.OrderHed + Erp.OrderDtl + Erp.OrderRel)
1:1Triumph sales orders map to Erp.OrderHed (header) plus Erp.OrderDtl (line items) plus Erp.OrderRel (release schedules for partial-shipment or scheduled-delivery orders). Order status maps from Triumph's order state to Epicor's OpenOrder, Shipped, Invoiced, Closed lifecycle. Customer PO number, ShipTo reference, and salesperson all carry over. We use DMT Sales Order template for the bulk load and reconcile open-order value in Epicor against Triumph at cutover.
Triumph
Purchase Order
Epicor Prophet 21
Purchase Order (Erp.POHeader + Erp.PODetail + Erp.PORel)
1:1Triumph purchase orders map to Erp.POHeader + Erp.PODetail + Erp.PORel. PONum carries the Triumph PO reference. Each line carries Part reference, quantity, unit cost, and expected receipt date. Release records (Erp.PORel) handle multi-delivery POs and tie to specific Plant/Warehouse/Bin for the inbound receipt. PO status maps to Epicor's Open, Closed, Voided states. Approval status loads to the ApproveDate field for already-approved POs. Loaded via DMT PO template.
Triumph
Stock Movement
Epicor Prophet 21
Part Transaction (Erp.PartTran)
1:1Triumph inventory transactions (receipts, issues, adjustments) map to Erp.PartTran rows with TranType codes (PUR-STK for purchase receipts, STK-CUS for customer shipments, STK-MTL for material issues, ADJ-CST for cost adjustments). Each row carries Part, Plant, Warehouse, Bin, Quantity, UnitCost, TranDate. Where the originating Triumph document was not in migration scope, we use TranType=ADJ-QTY with a Reference field flagging the legacy source. We require the Part, Plant, Warehouse, Bin, and Cost Set records all pre-loaded before this transactional load.
Triumph
Bank Account
Epicor Prophet 21
Bank Account (Erp.BankAcct)
1:1Triumph Bank Reconciliation accounts map to Erp.BankAcct rows. BankAcctID, BankAccount (the actual account number), BSBNumber (loaded into the routing-equivalent field), Currency, and GLAccount reference all carry over. We pre-create Erp.BankAcct during reference data load because every cash receipt and AP payment carries a BankAcctID lookup that must resolve at insert time.
Triumph
Bank Transaction
Epicor Prophet 21
Bank Transaction (Erp.BankTran)
1:1Triumph bank transactions map to Erp.BankTran rows. Each transaction carries BankAcctID, TranDate, Amount, Description, and TranType. Reconciled transactions tie to the corresponding AR cash receipt (CashHeadNum) or AP payment (CheckHedNum) via the BankTran link, preserving reconciliation history. Statement reference numbers from Triumph map to the StatementRef field for audit traceability against historical bank statements.
Triumph
User / Operator
Epicor Prophet 21
User (Ice.UserFile + Erp.EmpBasic)
1:manyTriumph operators split into two Epicor objects: Ice.UserFile (Epicor login identity with username, password reset link, role assignments) and Erp.EmpBasic (employee record carrying salesperson code, default warehouse, default plant). For users who are also salespeople in Triumph, both records load with the SalesPerCode linking them. Passwords do not migrate; users receive an Epicor password reset link at cutover. Triumph operator codes preserve in a UD field for audit traceability.
Triumph
Tax Code (GST)
Epicor Prophet 21
Tax Type + Tax Rate (Erp.TaxType + Erp.TaxRate)
1:1Triumph GST codes map to Erp.TaxType rows with associated Erp.TaxRate rows carrying the percentage and effective dates. Australian GST (10%), GST-free, Input-Taxed, and Export tax types all map to corresponding Epicor TaxType records pre-loaded during reference data setup. Tax liability accounts (GST Collected, GST Paid) link via the COA mapping. We require the Australian tax configuration loaded before any AR or AP transactional data because invoice-line tax details cannot resolve without a valid TaxType reference.
| Triumph | Epicor Prophet 21 | Compatibility | |
|---|---|---|---|
| Customer (Debtors module) | Customer (Erp.Customer)1:1 | Fully supported | |
| Supplier (Creditors module) | Vendor (Erp.Vendor)1:1 | Fully supported | |
| General Ledger Account | GL Account (Erp.GLAccount)1:1 | Fully supported | |
| Open Customer Invoice | AR Invoice (Erp.InvcHead + Erp.InvcDtl)1:1 | Fully supported | |
| Open Supplier Invoice | AP Invoice (Erp.APInvHed + Erp.APInvDtl)1:1 | Fully supported | |
| Customer Payment / Receipt | Cash Receipt (Erp.CashHead + Erp.CashDtl)1:many | Fully supported | |
| Supplier Payment (incl. EFT batch) | AP Payment (Erp.CheckHed + Erp.CheckDtl)1:many | Fully supported | |
| Product / Inventory Item | Part (Erp.Part)1:1 | Fully supported | |
| Service Item | Part (Erp.Part with TrackInventory=false)1:1 | Fully supported | |
| Quotation / Sales Quote | Quote (Erp.QuoteHed + Erp.QuoteDtl)1:1 | Fully supported | |
| Sales Order | Sales Order (Erp.OrderHed + Erp.OrderDtl + Erp.OrderRel)1:1 | Fully supported | |
| Purchase Order | Purchase Order (Erp.POHeader + Erp.PODetail + Erp.PORel)1:1 | Fully supported | |
| Stock Movement | Part Transaction (Erp.PartTran)1:1 | Fully supported | |
| Bank Account | Bank Account (Erp.BankAcct)1:1 | Fully supported | |
| Bank Transaction | Bank Transaction (Erp.BankTran)1:1 | Fully supported | |
| User / Operator | User (Ice.UserFile + Erp.EmpBasic)1:many | Fully supported | |
| Tax Code (GST) | Tax Type + Tax Rate (Erp.TaxType + Erp.TaxRate)1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Triumph gotchas
Catalog website is wrong — triumphmotorcycles.com
Module-based architecture means data lives in module-specific tables
On-premise vs cloud deployment changes the extraction path
Australian supplier integrations are tenant-specific configuration
Epicor Prophet 21 gotchas
Third-party bolt-on integrations complicate migration scope
Dirty data without standardized processes compounds migration risk
SDK customizations and BPMs may not survive platform upgrades
Report-based export only for non-technical users
Per-user pricing model requires accurate user count before migration planning
Pair-specific challenges
Migration approach
Triumph extract scoping and Epicor target design intake
We catalogue every active Triumph module (Base Pack plus Job Costing, Service Manager, POS, Asset Register, Inventory add-ons) and confirm Triumph support engagement for any database-level extract work. In parallel, we collect the Epicor target design from the customer's Epicor implementation team: Company structure, Site/Plant hierarchy, Warehouse/Bin layout, Chart of Accounts segmentation, customer numbering rules, vendor numbering rules, Part naming convention, and tax configuration. The output of this step is a signed scoping document that locks both source extract scope and target design before any technical work starts.
Epicor reference data load
Reference data loads first: Company setup, Sites, Plants, Warehouses, Bins, Currencies, Countries, Erp.GLAccount (the full COA), Erp.Terms (payment terms), Erp.PaymentMethod, Erp.TaxType and Erp.TaxRate (Australian GST set), Erp.BankAcct, Erp.ProdGrup (product groups), Erp.ProductGroup, salesperson codes, and territory codes. We use a combination of DMT templates and direct REST v2 POSTs depending on object. Each reference table is validated by sample query and customer accounting sign-off before the next layer loads on top of it.
Customer, Vendor, and Part master load
Master data loads next. Customer records via DMT Customer template or POST /v2/Erp.BO.CustomerSvc/Customers, with ShipTo records as a follow-on load. Vendor records via DMT Vendor template, with the Customer-Vendor link table populated where applicable. Part master via DMT Part template, with TrackInventory flag set per stocked-vs-service designation and GL account links validated against the COA load. We run row-count validation against the Triumph extract counts and run a sample of 50-100 random records through the Epicor UI to confirm correct rendering before transactional load begins.
Stock balances and Part Transaction history
Stock-on-hand at cutover loads to Erp.PartBin keyed by Plant, Warehouse, and Bin via DMT PartBin balance template. Historical Part Transaction history (Erp.PartTran) loads with the correct TranType codes (PUR-STK, STK-CUS, STK-MTL, ADJ-QTY, ADJ-CST). Where the originating Triumph document is not in migration scope, we use TranType=ADJ-QTY with a Reference field tagging the legacy source. Final Part inventory value in Epicor must reconcile to the Triumph inventory value at cutover; we build a BAQ to compute Epicor inventory value by Plant for the reconciliation check.
Open AR, open AP, and open Sales/Purchase Orders
Open transactional data loads in dependency order. Open AR invoices via DMT AR Invoice template (Erp.InvcHead + Erp.InvcDtl as Posted, Open). Open AP invoices via DMT APInvoice template (Erp.APInvHed + Erp.APInvDtl). Open sales orders via DMT Sales Order template (Erp.OrderHed + Erp.OrderDtl + Erp.OrderRel). Open purchase orders via DMT PO template (Erp.POHeader + Erp.PODetail + Erp.PORel). Customer payments load to Erp.CashHead + Erp.CashDtl, supplier payments to Erp.CheckHed + Erp.CheckDtl, with allocations preserved as separate detail rows. We run AR and AP aging reconciliation immediately after this step against the Triumph aging baseline.
BAQ-driven reconciliation and UAT
Reconciliation uses purpose-built BAQs (Business Activity Queries) in Epicor that compare migrated balances against the Triumph extracts: Customer aging summary BAQ, Vendor aging summary BAQ, Part inventory value by Plant BAQ, Bank account balance BAQ, GL trial balance BAQ. The customer's accounting team runs UAT against 30-50 standard workflows (raise AR invoice, apply cash receipt, raise AP invoice, run payment proposal, run MRP if Manufacturing is in scope, post journal). Defects are triaged into pre-cutover (must fix) and post-cutover (acceptable workaround) categories with the customer's go-live committee.
Cutover delta load and go-live support
Cutover runs a final delta extract from Triumph covering any records created or modified since the initial extract. Delta loads into Epicor through the same DMT and REST paths as the main load. The customer issues a freeze notice on the Triumph instance with a defined cutover window (typically a weekend or holiday). Post-cutover, we provide two weeks of reconciliation support covering any aging mismatch, inventory variance, or bank reconciliation question raised by the accounting team. We do not provide ongoing Epicor admin support, BPM development, BAQ authoring, or user training as part of standard migration scope.
Platform deep dives
Triumph
Source
Strengths
Weaknesses
Epicor Prophet 21
Destination
Strengths
Weaknesses
Complexity grading
Moderate ERP migration. 4 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Triumph and Epicor Prophet 21.
Object compatibility
4 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Triumph: Not publicly documented.
Data volume sensitivity
Triumph doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Triumph to Epicor Prophet 21 migration scoping. Not seeing yours? Book a call.
Walk through your Triumph to Epicor Prophet 21 migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Triumph
Other ways to arrive at Epicor Prophet 21
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.