WhatsApp chat to CSV for Malaysian sellers

Paste the exported chat, press Run, and copy one spreadsheet row per message — timestamps, senders, media and multi-line messages included.

🔒 100% client-side · zero server upload

Malaysian rules & edge cases

A WhatsApp export is plain text. Messages start one per line, but a message body may span several lines: the next header decides where a message ends, and anything between headers belongs to the message before it, newline preserved. The table below is the engine's own output for four real lines:

Exported lineTypeKept message
12/03/2026, 09:41 - Ahmad Faizal: Morning, stock for Shopee is readytextMorning, stock for Shopee is ready
12/03/2026, 09:42 - Mei Ling: <Media omitted>media<Media omitted>
12/03/2026, 09:43 - Ahmad created this groupsystemAhmad created this group
12/03/2026, 09:44 - Tan, Ah Kow: hellotexthello
  • Both phone shapes, day-first. iOS writes [12/03/2026, 09:41:33] Name: text, Android writes 12/03/2026, 09:41 - Name: text. The date is day-first because the export format is Malaysian: 12/03 is 12 March, not 3 December. Timestamps are normalised to YYYY-MM-DD HH:MM (with seconds when the export carries them).
  • Sender is everything before the first ": ". A display name may hold a comma or a bare colon — Tan, Ah Kow: hello keeps the whole name. The first ": " is the split.
  • System lines have no sender, and none is invented. Group creation, an icon or subject change, and an invite-link join arrive with no sender and become system rows with an empty sender. The end-to-end encryption banner becomes its own system row too.
  • Media is a type, never a deletion. <Media omitted>, image, sticker, audio, video, GIF, document and contact-card placeholders become media, with the placeholder text kept in the message column.
  • Deleted and edited messages keep their own type. This message was deleted becomes deleted; a message ending in (edited) becomes edited. Nothing is normalised away.
  • Escaping is exact. A comma, a double quote, a newline or a leading =/+/-/@ forces quoting; embedded quotes are doubled; a leading formula character is prefixed with ' so no cell can run as a spreadsheet formula — that applies to every column, which is why an international sender reads '+60 12-345 6789. That row, escaped: 2026-03-12 09:41,"Tan, Ah Kow","x=""y"", z",text.
  • Refusals are stated, not silent. Empty input, text with no parseable message in the first 50 non-empty lines, and anything over 2 MB each get their own message.

Nothing you type leaves your browser: the page is static JavaScript with no network calls.

Before and after

Before

[12/03/2026, 09:40:10] Messages and calls are end-to-end encrypted. No one outside of this chat can read them.
[12/03/2026, 09:40:12] Ahmad created this group
[12/03/2026, 09:40:55] Ahmad Faizal: Morning, stock for Shopee is ready
[12/03/2026, 09:41:33] +60 12-345 6789: Kopi, roti, "extra spicy", please
[12/03/2026, 09:42:01] Mei Ling: Please confirm the COD order.
Still waiting on the customer.
[12/03/2026, 09:43:10] Mei Ling: <Media omitted>
[12/03/2026, 09:44:02] Ahmad Faizal: Done, thanks

After

timestamp,sender,message,type
2026-03-12 09:40:10,,Messages and calls are end-to-end encrypted. No one outside of this chat can read them.,system
2026-03-12 09:40:12,,Ahmad created this group,system
2026-03-12 09:40:55,Ahmad Faizal,"Morning, stock for Shopee is ready",text
2026-03-12 09:41:33,"'+60 12-345 6789","Kopi, roti, ""extra spicy"", please",text
2026-03-12 09:42:01,Mei Ling,"Please confirm the COD order.
Still waiting on the customer.",text
2026-03-12 09:43:10,Mei Ling,<Media omitted>,media
2026-03-12 09:44:02,Ahmad Faizal,"Done, thanks",text

How it works

  1. Export the chat from WhatsApp: open the chat, tap the name, Export chat, Without media — then open the .txt file and copy its contents.
  2. Paste the text into the Input box and press Run. The Output box holds one CSV row per message; the stats line shows the count, participants, date range, media and system rows.
  3. Copy result, then paste into your spreadsheet — or move to TSV mode and paste the tabs straight into Excel.

FAQ

Why is my phone number shown as a sender instead of a name?

An export keeps the name the export carries. If a participant never saved a display name, or the export was taken before they did, WhatsApp writes their number. The parser keeps that line exactly as it arrived; it does not invent or guess a name for the sender.

What happens to photos, voice notes and stickers?

They become a row typed "media" with the placeholder text (<Media omitted>, audio omitted, sticker omitted and the rest) kept in the message column. The bytes of a photo are not in a .txt file without media, so there is nothing to recover — the row records where they were, and nothing is silently dropped.

Why did a message with a comma come back quoted?

A comma inside a cell would split it into two cells in a spreadsheet, so it is quoted by rule. A double quote inside the message is doubled. A cell that starts with = + - or @ is prefixed with an apostrophe inside quotes, so a pasted chat cannot be executed as a formula. It applies to all four columns: an international sender such as +60 12-345 6789 comes out as '+60 12-345 6789, and a timestamp starts with a digit, so it is untouched.

Will the tool join a message that wraps onto two lines?

Yes. A line that starts no new message belongs to the previous one, with the newline preserved inside that cell. The CSV quoting keeps the two lines inside one field, so the row count stays the message count.

Is my chat uploaded anywhere?

No. The converter is static JavaScript in your browser: open the Network tab and you will see zero requests. A chat export is your customer list and your sales history at the same time, which is exactly why it never leaves the machine.