Turn a CSV subtitle file into a WebVTT (.vtt) subtitle file directly in your browser—no installs needed.
A caption CSV is not a generic spreadsheet — it's a timed-text table whose columns hold the start time, end time, and text of each subtitle cue, usually with a header row. WebVTT (.vtt) is the format that turns that table into something a browser can actually play: it's the only caption format the HTML5 <track> element parses natively. This converter reads your rows, rewrites the timing into WebVTT's grammar, and hands back a valid .vtt file — the conversion runs entirely in your browser.
The converter reads columns by position, not by name — the first three fields of every row are treated as start time, end time, and caption text, in that order. That is more forgiving than tools that demand exact column headers like "Timecode In / Timecode Out / Subtitle," but it means the column order matters and a header row is only skipped when it announces itself.
| Column | Position | What it holds |
|---|---|---|
| Start time | 1st field | When the cue appears — a timecode like 00:00:01,500 or 00:00:01.500 |
| End time | 2nd field | When the cue disappears — the same timecode style |
| Caption text | 3rd field onward | The words shown on screen; wrap it in double quotes if it contains commas |
| Header row | Optional first line | Skipped automatically only when it contains the word start (any case) |
Rows with fewer than three fields are skipped, and start/end times must be colon timecodes — hh:mm:ss,ms, hh:mm:ss.ms, or mm:ss.ms. Bare decimal seconds such as 1.5 are not read as a time, so keep the columns in timecode form. A plain data spreadsheet with no timing columns has nothing to map onto cues and won't produce a caption file.
| Property | Value |
|---|---|
| Standard | W3C Timed Text Working Group — "WebVTT: The Web Video Text Tracks Format" |
| Status | Candidate Recommendation Draft (May 2026); originally proposed in 2010 as "WebSRT" |
| File signature | Every file begins with a WEBVTT line |
| Timestamp style | hh:mm:ss.ttt — a period (full stop) before the three-digit milliseconds |
| Native browser support | The only caption format the HTML5 <track> element parses natively (Chrome, Firefox, Edge, Safari) |
| Styling & layout | Cue settings (line, position, align, size) plus CSS STYLE blocks |
| Best for | HTML5 <video> embeds, HLS/DASH streaming captions, web players |
start so it's skipped; write times as timecodes like 00:00:01,500 or 00:00:01.500, not bare seconds.The conversion is a deterministic re-formatting of the timestamps you already have — the cue count and timing match your spreadsheet exactly; only the surrounding syntax changes to fit WebVTT.
| In your CSV | In the generated VTT | What changed |
|---|---|---|
| (top of file) | A WEBVTT signature line |
WebVTT's required header is added |
00:00:01,500 (comma ms) |
00:00:01.500 |
Comma before the milliseconds becomes a period |
start 00:00:01,500, end 00:00:04,000 |
00:00:01.500 --> 00:00:04.000 |
Two columns collapse into one cue-timing line with --> |
"Hello, world" (quoted text) |
Hello, world |
Quotes are stripped; the comma inside the text is preserved |
Three, in a fixed order: start time, end time, then caption text, one row per cue. The converter reads by position, so the columns must be in that sequence — it does not look for specific header names. An optional header row on the first line is skipped only if it contains the word start (for example start,end,text); if your header uses other words like Begin,End,Caption, either rename the first column to include "start" or drop the header entirely so it isn't mistaken for a cue.
Use colon timecodes: 00:00:01,500 (hours:minutes:seconds and milliseconds) works, and so does 00:00:01.500 or the shorter mm:ss.ms form like 01:30.250. A comma or a period before the milliseconds is accepted on the way in. Plain decimal seconds such as 1.5 or 90.25 are not recognized as a time and will produce an empty cue, so keep the columns in timecode form. Whatever you type, the WebVTT output always uses a period before the milliseconds, per the W3C spec.
It has to be caption data. This is a timed-text converter, not a generic tabular tool: each row has to represent a subtitle cue with a start time, an end time, and text. A contacts list, a sales export, or any table without timing columns has nothing to map onto WebVTT cues, so it can't produce a valid .vtt. If you only want to reshape arbitrary data, that's a different kind of conversion entirely.
Because the HTML5 <track> element — the standard way to attach captions to a <video> tag — parses WebVTT and nothing else. Point a <track src="captions.srt"> at an SRT file and the browser simply ignores it; there is no fallback. VTT also carries things SRT can't: cue settings for on-screen positioning, CSS STYLE blocks, chapter and metadata tracks. For a YouTube or Vimeo upload or a desktop player like VLC, SRT is still the safer default, which is why CSV to SRT exists alongside this converter.
Yes. In our testing, a CSV whose first column was headed start and whose cues used 00:00:01,500-style timecodes converted to WebVTT with a WEBVTT line at the top and every timestamp's comma rewritten to a period (00:00:01.500) — the cue count and the start/end times matched the spreadsheet exactly. Both the header line and the period milliseconds are mandatory in the W3C WebVTT format, so the file loads in any compliant <track> element without further editing.
Wrap the text field in double quotes: 00:00:01,500,00:00:04,000,"Well, hello there". The parser treats a quoted field as one value and preserves the comma inside it (use "" for a literal double quote). If you leave commas unquoted, the extra fragments past the third column are rejoined with a comma and a space, which usually still reads fine but can subtly change spacing — quoting is the reliable way to keep the line intact.
Yes — VTT to CSV reverses the trip, exporting each cue as a start,end,text row you can open in Excel, Google Sheets, or Numbers. That round-trip is how most caption CSVs are made in the first place: teams pull a subtitle file into a spreadsheet to translate or bulk-edit the text, then convert the finished CSV back to VTT or SRT.
No. A CSV carries only timing and text, so the output is a set of correctly-timed cues with WebVTT's default placement — the converter doesn't invent positions, colors, or fonts you didn't specify. WebVTT can hold cue settings (line, position, align, size) and CSS STYLE blocks, but you add those afterward in a text editor once the cues exist. If you need heavily styled captions instead, CSV to ASS targets a format built for on-screen styling.
No. This is a client-side converter: your caption table is parsed and rewritten entirely in your browser. There's no queue, no sign-up, and no watermark — which is also why it's instant even for a feature-length script with thousands of cues. If you have several formats to juggle, the CSV converter hub lists every target this tool can write.