Twilio message logs to dashboard
What your SMS actually cost, segment by segment.
Export your message logs from the Twilio Console and drop the CSV here. Price is negative because it is a charge against your balance, so spend is the absolute value of the sum. NumSegments matters more than message count, since a long message bills as several. Failed deliveries are ranked by ErrorCode so a bad carrier route is visible.
Prefer the full explorer? Open the app, or start from the generic dashboard builder.
You are not billed per message, you are billed per segment
The single most common surprise on a Twilio bill is that the message count and the charge do not line up. An SMS segment is 160 GSM-7 characters, or 70 if the message contains a single non-GSM character such as an emoji or a curly apostrophe copied out of a word processor. A 200 character message is two segments. The same message with one emoji in it is three. The NumSegments column records this, and totaling it rather than counting rows is the only way to predict spend.
The Price column is the other thing to get right. Twilio writes it as a negative number, because from the account's point of view it is a debit. Sum it and you get a negative total, which is correct but reads oddly on a chart; take the absolute value and you have spend. Refunds and adjustments, when present, appear as positives, which means the naive sum is actually the right arithmetic even though the sign convention feels backwards.
How to export from Twilio
- Open the Twilio Console Sign in at console.twilio.com and go to Monitor, then Logs, then Messaging. Check the account or subaccount selector at the top, because logs are per account.
- Set the date range Twilio retains message logs for a limited window, so old periods may not be available at all. Export monthly if you want a history you can keep.
- Filter by direction if you want Inbound and outbound behave completely differently in cost and in meaning. Leaving both in is fine here, since Direction becomes a filter chip.
- Export the log as CSV The export control is above the log table. Large ranges are prepared in the background and made available as a download when ready.
- Drop the file here Segments are totaled, spend is shown as a positive, and failed messages are grouped by their error code.
Message logs are not the same as the billing usage records. The two usually agree closely, but for a figure you intend to reconcile against an invoice, use the usage export instead.
Try with sample Twilio data (the same columns, 112 rows, no upload needed).
What the dashboard shows
Every panel below is built from a column that is actually in the export, named the way Twilio names it.
- Spend over time. DateSent as the axis with the absolute value of Price summed, which is the chart finance asks for.
- Segments against messages. Two series. When they diverge, somebody is sending long messages or an emoji has crept into a template.
- Delivery outcomes. delivered, sent, undelivered and failed as a share, with the undelivered rate as the headline number.
- Error codes ranked. 30003 is an unreachable handset, 30005 an unknown destination, 30007 a carrier filter. Each implies a different fix.
- Inbound against outbound. Direction as a group-by, since inbound volume is a proxy for engagement and outbound is a proxy for cost.
- Cost per segment. Spend divided by segments, which drifts as your destination mix changes and is worth watching.
Sid,DateSent,From,To,Direction,Status,NumSegments,Price,PriceUnit,ErrorCode,MessagingServiceSid,Body Length
Twilio log details that catch people out
- Price is negative. A charge is a debit against the account balance, so it is written with a minus. Spend is the absolute value, and a chart plotting the raw column points downward.
- One message can be several segments. 160 characters per segment in GSM-7, 70 if any character forces UCS-2. A single emoji in a template triples the cost of every message that uses it.
- DateSent is RFC 2822. Something like Wed, 08 Apr 2026 14:22:11 +0000, not ISO. Most spreadsheet importers read it as text and refuse to sort it as a date.
- ErrorCode is blank on success. Which is correct, but it means a completeness check will report the column as mostly empty and flag a problem that is not one.
- Status is not delivery confirmation everywhere. Some carriers and some countries do not return delivery receipts, so a message sits at sent rather than progressing to delivered without having failed.
- Body Length is characters, not segments. The relationship between them depends on the encoding, so you cannot derive one from the other without knowing which character set was used.
Total the segments, take the absolute value of Price, and read the error codes rather than the failure count. Most Twilio cost surprises are one of those three things going unnoticed for a month.
Frequently asked questions
Why is my Twilio spend showing as a negative number?
Because Price records the effect on your account balance, and a charge reduces it. Every outbound message therefore carries a small negative value. Sum the column and you get a negative total that is arithmetically correct. Take the absolute value for a spend figure people can read, which is what this page does, while keeping refunds and adjustments as the positives they are.
Why does my message count not match my bill?
Because billing is per segment, not per message. An SMS is 160 characters if every character is in the GSM-7 set, and 70 if even one is not, which includes emoji and the curly apostrophes that word processors insert automatically. A 200 character message is two segments; the same text with one emoji is three. Sum NumSegments to predict cost.
What do error codes 30003, 30005 and 30007 mean?
30003 is an unreachable destination handset, often switched off or out of coverage, and is usually transient. 30005 is an unknown destination, meaning the number does not exist and should be removed from your list. 30007 is carrier filtering, which means the network blocked your content and is a message or sender reputation problem rather than a number problem.
Can I reconcile this against my invoice?
Approximately, not exactly. The message logs and the billing usage records are produced by different systems and can differ at the margins, particularly around period boundaries and for messages whose status resolved after the log was written. For anything you intend to hand to finance, export the usage records instead. Use the message logs for diagnosis and operational monitoring.
How do I handle the RFC 2822 timestamps?
This page parses them on load, including the numeric offset at the end. In a spreadsheet you generally have to split the string or use a date parsing formula, because most importers treat it as text and leave it unsorted. If you are writing your own script, almost every date library handles RFC 2822 natively, so it is only spreadsheets that struggle.
Are the phone numbers in the file safe here?
They stay on your machine. From and To are phone numbers, which are personal data under GDPR and most equivalent regimes, and a message log is a record of who you contacted and when. The file is parsed by JavaScript in the browser tab with no upload, no account and no retention. Closing the tab is the entire deletion process.
Related tools
Total the segments, not the rows
112 messages with realistic multi-segment sends, negative prices, a handful of carrier failures and both directions in one file.
Open the sample Twilio dashboard