JMeter result files are only useful when the tools that read them know which fields each row contains. The SaveService settings control the CSV columns written to a .jtl file, so dashboards, CI checks, and comparison scripts can read the same result layout on every runner.
SaveService properties can live in jmeter.properties, user.properties, or an extra property file loaded for one run. A small run-specific file keeps the column policy close to the test job without editing the shared JMeter installation, which is easier to review in CI and safer for workstations that run different projects.
A dashboard-compatible CSV needs timing, label, response, success, byte, thread-count, and assertion-failure fields. Keep the field-name header enabled when the file will be parsed outside JMeter; headerless CSV files require the reader to already know the same SaveService property set.
jmeter.save.saveservice.output_format=csv jmeter.save.saveservice.print_field_names=true jmeter.save.saveservice.timestamp_format=ms jmeter.save.saveservice.time=true jmeter.save.saveservice.label=true jmeter.save.saveservice.response_code=true jmeter.save.saveservice.response_message=true jmeter.save.saveservice.thread_name=true jmeter.save.saveservice.data_type=true jmeter.save.saveservice.successful=true jmeter.save.saveservice.assertion_results_failure_message=true jmeter.save.saveservice.bytes=true jmeter.save.saveservice.sent_bytes=true jmeter.save.saveservice.thread_counts=true jmeter.save.saveservice.url=true jmeter.save.saveservice.latency=true jmeter.save.saveservice.idle_time=true jmeter.save.saveservice.connect_time=true
The property names use successful and thread_counts even though the CSV header prints success, grpThreads, and allThreads.
$ jmeter -n -t checkout-smoke.jmx -l checkout-smoke.jtl -q jtl-columns.properties -e -o checkout-dashboard Creating summariser <summary> Created the tree successfully using checkout-smoke.jmx Starting standalone test @ 2026 Jun 30 02:01:01 GMT Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445 ##### snipped ##### summary = 3 in 00:00:00 = 7.1/s Avg: 132 Min: 0 Max: 396 Err: 0 (0.00%) Tidying up ... ... end of run
-q loads the extra property file for this run. -e and -o prove that the saved CSV can also feed the JMeter dashboard generator.
Related: How to override JMeter properties from the command line
Related: How to generate an HTML dashboard report in JMeter
$ cat checkout-smoke.jtl timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect 1782784861315,396,checkout-load,200,OK,Thread Group 1-1,text,true,,27,0,1,1,null,0,0,0 1782784861713,1,checkout-load,200,OK,Thread Group 1-1,text,true,,27,0,1,1,null,0,0,0 1782784861714,0,checkout-load,200,OK,Thread Group 1-1,text,true,,27,0,1,1,null,0,0,0
The first line should contain the exact field names needed by the dashboard, parser, or CI gate. Remove optional fields such as URL only when downstream tools do not depend on them.
Tool: Comma-Separated Values (CSV) Converter
$ ls checkout-dashboard content index.html sbadmin2-1.0.7 statistics.json