Billing breaks a softswitch migration: balances, rate plans, the CDR file, and the first invoice. Bill one month of the old call records on the new tariffs, and set those invoices beside the old ones, while the old switch still carries the calls.
A wholesale carrier does this on M4. A hosted-PBX or white-label operator does it on MOR. There is no one-click migration, and no promised number of days. You recreate subscriptions. On M4, DID import from CSV is marked in development, so leave it out of the plan.
The product notes, if you are still choosing, are the VOS3000 alternative, VoipSwitch alternative, and ASTPP alternative pages.
Where the money moves
On 13 October 2026, jackson posted Planning a softswitch migration? Don’t forget the billing side. Export customers, balances, and price lists. Map the CDR file to your rating rules. Run both systems for a billing cycle if you can. Keep the old CDRs for disputes. Test the invoice before you go live.
The invoice shows up after the customers have moved. A 61-second call on the wrong increment doubles a destination.
Sample price, 0.012 per minute:
| Increment 1 | Increment 60 | |
|---|---|---|
| Answered seconds | 61 | 61 |
| Seconds you bill | 61 | 120 |
| Amount | 0.0122 | 0.024 |
MOR prices that CDR file.
What you need on the desk
An admin login, or a reseller login on MOR. Both can run the data import. An accountant with permission to manage DIDs can run the MOR X10 DID CSV.
Export users, devices, CLIs, DIDs, price lists, opening balances, one month of CDRs, and the invoices for that month. Leave the old switch able to export.
Match the CSV column separator and the decimal separator to the files. On MOR they sit under Settings → Setup → Settings → Functionality. A comma in the file and a semicolon in the settings stops the import.
Load MOR in ID order
The CSV matches a tariff or an LCR by number, not by name. Open the tariff, click edit, and take the last number in the address bar. LCR “Retail EU” with ID 2 goes in the file as 2.
Create the tariffs and LCRs first. Then open Settings → Users → Import. MOR keeps device import closed until the users are in, and DID import closed until the devices are in.
- Users. Each row gets a temporary user ID. That ID links your files to each other. MOR assigns its own user ID. Payment type
0is prepaid and1is postpaid. Leave it blank and MOR imports the user as prepaid. A postpaid customer imported as prepaid stops at balance zero. - Devices. Carry the temporary user ID, and add a temporary device ID.
- CLIs. Use the temporary device ID for a device from this import. Use the real device ID if the device was already on MOR.
- DIDs. Carry both temporary IDs so the number stays on that device.
Wait to press Clear temporary information until the CLI file and the DID file are in.
From MOR X10, Add new DID(s) has a second CSV at the bottom of the form. It creates the DID and the DID rates. A Device ID column assigns the number. Required columns are the DID and the provider ID. A simple reseller omits the provider ID. Use this file for the rate columns. Use Settings → Users → Import when the rows still depend on temporary IDs.
Then the rate rows. Prefix and price are required. On MOR the prefix is E.164, with no leading 00 or 011. Connection fee, increment, and minimum time use the defaults when those columns are empty, which is how a 61-second call changes price. Copy them from the old price list. Set Effective From on or before the first day of the shadow month. A rate dated today does not price last month.
Email price files that keep arriving are a separate setup: Process of Automatic Tariff Import.
Subscriptions have no CSV. Create the service, then assign it in the GUI or with the subscription API, one service or several IDs for one user. A flat-rate subscription created through the API covers a full month.
Compare each opening balance with the export. Change it with a manual payment, before anyone dials. A prepaid user at zero cannot place a call.
On M4, add the user and leave the origination point off
M4 has no user, device, and CLI CSV of the MOR kind. Create the user under Settings → Users. Add a connection point. Set Act as Origination Point to yes, and leave Active off. An inactive origination point accepts no calls, so you can check the tariff first.
Import rates under Billing → Tariffs → Import from CSV. Prefix and rate are required. M4 accepts alphanumeric prefixes. Effective From still has to cover the call date, or a later re-rate skips the row. Empty increment and minimum time take the defaults.
Later email price files use the automatic import post above.
M4 DID CSV import is marked in development. Add pilot numbers in DID Inventory.
Import the old month on MOR and price it
CDR import is Settings → Billing → CDR → Import. MOR bills CDRs there that came from another switch.
Save the layout under Billing → CDR → Import → Templates: name, column separator, decimal separator, header lines to skip, date format, and the column map. The next upload with that template skips column assignment.
Map Billed Seconds to talk time. 13/10/2026 14:05:02 and 2026-10-13 14:05:02 need different date formats. The wrong format puts the calls on the wrong day, or fails the row.
MOR assigns each row by:
- Provider. MOR rejects the file if you map a provider ID that is not in the system.
- One user and one device, when the file is a single customer.
- CallerID, checked against CLIs on the device. The CLI file has to be in first.
- Accountcode.
An admin can assign a call to a CLI on a simple reseller’s user. An admin cannot import calls for Reseller PRO users. That reseller runs the import.
MOR prices the matched rows with the reseller, user, and provider tariffs, the same logic as CDR rerating.
MOR drops a second row with the same date, source, and destination. If the old switch billed both, change one of those three fields. Otherwise that call is missing on the new invoice.
Leave disposition and hangup cause empty, and MOR marks billed seconds above zero as ANSWERED with hangup cause 16. It marks billed seconds at zero as FAILED with hangup cause 0. Map the columns when the old invoice includes failed calls.
MOR prices a call to the caller’s own DID at 0, and the new invoice comes out lower.
Check localization first. MOR applies it on import. A rule that strips 00, plus a rule that turns a leading 9 into 349, takes 00972… to 972… on the export and to 34972… on the import. MOR then rates the row as Spain. Fix the rules, then import.
On M4 you save a template at Billing → CDR → Import → Templates: separator, decimal mark, skipped lines, date format, columns. Billed Seconds is answered time, without setup. Duration is setup plus talk. Treat that template as the column map. MOR is the product that bills the imported file.
For calls already on M4, rerating is Billing → CDR → Rerating. Set From, To, the user, and Rerate as Client or Supplier. Update the tariff first. M4 runs the job in the background. Before any traffic moves, price the heavy destinations from the old invoice against the new tariff: prefix, increment, minimum time, connection fee.
Call-row comparisons, once both sides have CDRs, are Your partner’s invoice and your CDRs disagree.
Diff the invoice, then rerate
Generate the shadow-month invoice for the users you imported. Set it beside the old invoice for the same customers. Start with destination totals.
A full CDR file and a zero invoice is an Effective From problem. MOR uses the rate whose Effective From is on or before the call date. With no such rate, the price stays empty. Cover the whole shadow month and run it again.
On MOR the screen is Settings → Billing → CDR → Rerating. Pick the users and the period. MOR recalculates minimum time, increment, and connection fee. You see the original duration. The user sees the rounded duration. Settle that before the trunk moves.
MOR skips a call when a localization rule changed its DID, LCR, or owner device. Check that rule when one prefix comes back empty.
Fix the rate or the increment, rerate, generate the invoice again. Move traffic when you would send that invoice to the customer.
Move one reseller, or one origination point
On MOR, send one reseller’s SIP across. Leave the other resellers on the old switch. On M4, set Active on for one origination point. Leave the others off, or on the old switch.
Keep the old login and stop new calls to it, so a dispute about the previous month still has the source rows. Store the imported CSV with the old invoices. That file is the archive.
One month, on your own CDRs
- Export users, balances, price lists, one month of CDRs, and that month’s invoices. Leave the old switch up.
- Create tariffs and LCRs. Write down the numeric IDs. Set Effective From on or before day one. Fill increment and minimum time.
- MOR: users, devices, CLIs, DIDs. Then subscriptions, in the GUI or by the API. Then opening balances, by manual payment.
- M4: user, inactive origination point, rate CSV. Skip the DID CSV.
- MOR: save the CDR template and import the month. Confirm each row found a user. M4: price the heavy destinations before you set Active on.
- Generate the invoice and diff it. Rerate after a rate or increment fix. Use Your partner’s invoice and your CDRs disagree when you need the call rows.
- Move one reseller or one origination point. Keep the CSV and the old switch.
FAQ
Can I import subscriptions?
MOR has no subscription CSV. Create the service, then assign it in the GUI or with the subscription API. A flat-rate subscription created that way covers a full month.
Do my old user IDs survive?
Those IDs link the files to each other. MOR assigns new ones. Tariff and LCR cells are the IDs MOR already has. Those have to match.
Can M4 take a DID CSV?
M4 DID CSV import is marked in development. The MOR DID CSV, from X10, creates DIDs and DID rates.
Will every CDR row import?
MOR drops a second row with the same date, source, and destination. MOR rejects the file when you map a provider ID that is not in the system. With disposition empty, MOR uses billed seconds to choose ANSWERED or FAILED.
How many days should I plan?
No fixed number of days. Move one reseller or one origination point after that slice matches.
Run the month before you move a trunk
Pick the reseller, or the origination point, whose invoice you trust least.
Hosted PBX and white-label operators open the import on the MOR online demo. Wholesale carriers open tariffs and rerating on the M4 SBC online demo. Each demo is the admin screen. It does not place live calls. Bring a small CSV. If the columns parse and the 61-second destination matches the table, that is the pilot. Move the trunk after the full month matches.
Run one month before you move a trunk
Open the MOR or M4 demo with a small CDR file. Move the trunk after that month's invoice matches.