diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index 8404b914353f59339070f662081c95aec772c589..6bdba1cd2a5f125e6c7a2a0b8dbd6560bd0bc353 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -378,9 +378,15 @@ void client_send_response(struct client *client, const char *oknobye,
 struct event_passthrough *
 client_command_create_finish_event(struct client_command_context *cmd)
 {
+	uint64_t bytes_in = i_stream_get_absolute_offset(cmd->client->input) -
+			    cmd->stats.bytes_in;
+	uint64_t bytes_out = cmd->client->output->offset - cmd->stats.bytes_out;
+
 	struct event_passthrough *e =
 		event_create_passthrough(cmd->event)->
-		set_name("managesieve_command_finished");
+		set_name("managesieve_command_finished")->
+		add_int("net_in_bytes", bytes_in)->
+		add_int("net_out_bytes", bytes_out);
 	return e;
 }
 
@@ -683,6 +689,8 @@ static bool client_handle_input(struct client_command_context *cmd)
 		i_assert(!client->disconnected);
 
 		event_add_str(cmd->event, "cmd_name", t_str_ucase(cmd->name));
+		cmd->stats.bytes_in = i_stream_get_absolute_offset(client->input);
+		cmd->stats.bytes_out = client->output->offset;
 		client_handle_input(cmd);
 	}
 
diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h
index f674aa61820237f888fec3d03dd1a845a549e75d..a4032419a90cd40d4dec1bd5deb173531bd4757b 100644
--- a/src/managesieve/managesieve-client.h
+++ b/src/managesieve/managesieve-client.h
@@ -21,6 +21,10 @@ struct client_command_context {
 	   client sent them. */
 	const char *args;
 
+	struct {
+		uint64_t bytes_in;
+		uint64_t bytes_out;
+	} stats;
 	command_func_t *func;
 	void *context;