diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 3ae693176ef7d1b3cbf7d6350513e9009cb34b84..0bee37c6142268b8687c0cbf75f64c55c5d668ee 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -611,17 +611,19 @@ static int init_stream(grpc_transport *gt, grpc_stream *gs,
   if (!server_data) {
     lock(t);
     s->id = 0;
+    s->outgoing_window = 0;
+    s->incoming_window = 0;
   } else {
     /* already locked */
     s->id = (gpr_uint32)(gpr_uintptr)server_data;
+    s->outgoing_window =
+        t->settings[PEER_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
+    s->incoming_window =
+        t->settings[SENT_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
     t->incoming_stream = s;
     grpc_chttp2_stream_map_add(&t->stream_map, s->id, s);
   }
 
-  s->outgoing_window =
-      t->settings[PEER_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
-  s->incoming_window =
-      t->settings[SENT_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
   s->incoming_deadline = gpr_inf_future;
   grpc_sopb_init(&s->writing_sopb);
   grpc_sopb_init(&s->callback_sopb);
@@ -1017,6 +1019,10 @@ static void maybe_start_some_streams(transport *t) {
     GPR_ASSERT(s->id == 0);
     s->id = t->next_stream_id;
     t->next_stream_id += 2;
+    s->outgoing_window =
+        t->settings[PEER_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
+    s->incoming_window =
+        t->settings[SENT_SETTINGS][GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
     grpc_chttp2_stream_map_add(&t->stream_map, s->id, s);
     stream_list_join(t, s, WRITABLE);
   }