Appearance
Dial 9
The Dial 9 integration imports call detail records (CDRs) from your Dial 9 telephony account and rates them against your client contracts — so calls to/from your clients are accounted for as billable items in OpsMerge.
This is primarily useful for MSPs who provide telephony as part of their service and want it on the same bill as the rest.
What you get
- Daily CDR import — every call from the previous day flows into OpsMerge.
- Rate calculation — calls are rated against the client's contract (per-minute rates, included minute pools, etc.).
- Bill consolidation — rated call charges appear on the client's monthly OpsMerge invoice alongside everything else.
- Per-call audit — every call's CDR is stored and visible if a client disputes.
How import works
Dial 9's primary export is a CSV file per day, dropped on an SFTP server (or available via API). OpsMerge supports both:
- CSV via SFTP (the common case). Configure SFTP credentials; OpsMerge pulls daily.
- API: if you've enabled Dial 9's API access, OpsMerge fetches via REST.
The CSV path is more common because Dial 9's daily CSV is fully fleshed out — every billable field is in it, including cost. The API is useful for live near-realtime ingest (rare among MSPs).
Setup
Via CSV/SFTP
Settings → Integrations → Dial 9 → Connect (CSV mode).
Fields:
- SFTP host, port, username, key/password.
- Path on the server where Dial 9 drops the daily CSV.
- Filename pattern (Dial 9 uses date-stamped filenames; OpsMerge handles variations).
OpsMerge connects daily (default: 02:00 UK time), pulls the previous day's CSV, parses, and stages the CDRs for rating.
Via API
Settings → Integrations → Dial 9 → Connect (API mode).
Fields:
- Dial 9 API base URL.
- API token.
OpsMerge pulls via the Dial 9 API on the same daily schedule (or more frequently if desired).
The CSV schema we use
For MSPs writing custom Dial 9 exports, OpsMerge expects these columns (case-insensitive, exact names from Dial 9's standard export):
Date,Time— when the call started.Number called— destination.Caller— source number / extension.Duration— in seconds.Cost— what Dial 9 itself charged for the call. This is OpsMerge's fast-path for rating (see below).Disposition— answered / no-answer / busy / failed.- A handful of additional metadata columns (recording URL, call ID, etc.) which we store but don't use for rating.
If your Dial 9 export is non-standard, OpsMerge accepts a custom mapping at Settings → Integrations → Dial 9 → CSV mapping.
Rating
When a CDR comes in, OpsMerge rates it:
- Match the call to a client by source or destination number (depending on direction).
- Apply the client's contract for telephony rates.
- Compute the billable amount:
- If the contract uses fixed-rate-per-minute, multiply duration × rate.
- If the contract uses Dial 9's
Costdirectly with a markup, apply markup. - If the contract includes a free-call pool, draw from the pool first.
The fast path is using Dial 9's Cost column with a markup. This is the cheapest to compute, requires no rate-table maintenance, and naturally tracks Dial 9's own pricing changes. Most MSPs use this.
If you do need granular per-destination rates (different rates for UK landline vs UK mobile vs international), set up the rate table in Settings → Integrations → Dial 9 → Rate table.
Synthesised CDR IDs
Dial 9's CSV doesn't include a stable call ID column for all call types. OpsMerge synthesises an ID by hashing the row's (date + time + caller + callee + duration) — stable enough to dedupe re-imports without colliding across actual calls.
How rated calls become billable
Rated calls accumulate against the client's account. At invoice time:
- Monthly call summary line is added to the invoice (e.g. "234 calls, 18h 42m, £37.50").
- Detailed CDR table is optionally attached as a PDF appendix (configurable per-client).
For MSPs who want call detail visible to the client in real-time (not just monthly), the client portal has a Calls tab when Dial 9 is connected — showing the rolling month's calls and accumulated charge.
Manual append-to-invoice
For one-off rating fixes (e.g. a missed call run, or a manual correction), Settings → Integrations → Dial 9 → CDRs → Add to invoice lets you push selected CDRs onto a specific draft invoice manually.
What we learned during initial integration
During live testing of the integration we found a few quirks worth flagging if you're verifying CSV import:
- The actual CSV schema differs slightly from Dial 9's docs — column ordering and names.
- Some calls have no
Cost(free calls, internal extensions); we treat zero correctly rather than skipping. - The fast-path using Dial 9's
Costis what most MSPs want for accurate, low-maintenance rating. - Manual append-to-invoice is still required for occasional corrections; full automation handles 95% but not 100%.
Common patterns
"Charge clients exactly what Dial 9 charges us, with no markup"
Settings → Integrations → Dial 9 → Rating mode → Pass-through. Calls bill at Dial 9's cost, on your invoice.
"Charge a per-minute rate regardless of Dial 9's actual cost"
Settings → Integrations → Dial 9 → Rating mode → Fixed rate. Set the rate; rating ignores Dial 9's Cost column.
"Include 200 minutes/month, charge over"
Set up at the contract level: telephony pool = 200 minutes. Calls draw from the pool; calls over are rated normally.
Common issues
CSV import failed. Check Settings → Integrations → Dial 9 → Activity log. Common causes: SFTP creds rotated and not updated; filename pattern changed (Dial 9 occasionally adjusts the date-stamp format); the CSV was uploaded mid-read.
Some calls aren't being attributed to a client. OpsMerge matches by number (caller for inbound, callee for outbound). If a call's other party isn't in any client's contact list, it lands in the "unattributed" bucket — review and either attribute manually or add the number to the right client.
Rated cost doesn't match Dial 9's invoice. Compare your contract's rating mode against Dial 9's billing terms. Pass-through with no markup should exactly match Dial 9 — if it doesn't, there's likely a timezone offset issue (CDR midnight in Dial 9 vs OpsMerge billing month boundary).
A call appears twice on the invoice. Re-import without proper dedup — should be rare given our synthesised IDs, but possible if Dial 9's CSV contained different timestamps for the same call across two days. Manually delete the duplicate; the audit log captures it.
Disconnect
Settings → Integrations → Dial 9 → Disconnect.
Stops the daily import. Existing rated calls remain on invoices already issued. CDRs imported but not yet on an invoice stay in the system and can be attributed manually or via reconnect.
Next
- Billing & invoices — where rated calls appear
- Contracts — defining telephony rating per client