Hi,
We’ve implemented a custom Flow Action that sends data to be handled asynchronously on our side due to the potentially long-running nature of some operations. To manage this, we’ve introduced logic to support delayed responses as follows:
- We use the
action_run_idas an idempotency key. - We return an HTTP
202 Acceptedstatus immediately upon receiving the request and handle the processing asynchronously. - While processing is ongoing, any retry from Shopify Flow receives an HTTP
429 Too Many Requestsresponse, along with the headerRetry-After: 15to indicate Flow should retry after 15 seconds. - Once the processing is complete, we return either
200 OKor a4xxerror, depending on the outcome, to finalize the Flow Action and stop further retries.
According to the Shopify Flow Actions documentation, returning a Retry-After header with a 429 status should control the retry interval. However, based on our testing and logs, it seems that Flow ignores this header - retries occur with increasing intervals regardless of the Retry-After value we return.
We’ve confirmed that our responses do include the Retry-After: 15 header by testing with Postman.
When Shopify Flow retries, the logs show a 429 status, but the retry delay continues to grow.
With 429 HTTP status code and Retry-After: 15 header:
2025-07-22 09:03:43 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: b63199047e046bd08b41c3a545dfbc9086aa1354
2025-07-22 09:03:43 [version 4c7b87465ba5df01952350026a13663f] [info]: Request processing starting b63199047e046bd08b41c3a545dfbc9086aa1354
2025-07-22 09:03:43 [version 4c7b87465ba5df01952350026a13663f] [info]: 202 Accepted b63199047e046bd08b41c3a545dfbc9086aa1354
.... long-running call started
2025-07-22 09:03:43 [version 4c7b87465ba5df01952350026a13663f] [info]: Set state (b63199047e046bd08b41c3a545dfbc9086aa1354): {"status":"RUNNING","createdAt":"2025-07-22T09:03:43.175Z"}
2025-07-22 09:03:48 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: b63199047e046bd08b41c3a545dfbc9086aa1354
2025-07-22 09:03:48 [version 4c7b87465ba5df01952350026a13663f] [info]: 429 Still processing... b63199047e046bd08b41c3a545dfbc9086aa1354
2025-07-22 09:04:22 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: b63199047e046bd08b41c3a545dfbc9086aa1354
2025-07-22 09:04:22 [version 4c7b87465ba5df01952350026a13663f] [info]: 429 Still processing... b63199047e046bd08b41c3a545dfbc9086aa1354
.... long-running call finished
2025-07-22 09:04:53 [version 4c7b87465ba5df01952350026a13663f] [info]: Set state (b63199047e046bd08b41c3a545dfbc9086aa1354): {"status":"FAIL","createdAt":"2025-07-22T09:03:43.175Z","result":"some result","statusCode":400,"updatedAt":"2025-07-22T09:04:53.982Z"}
2025-07-22 09:04:57 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: b63199047e046bd08b41c3a545dfbc9086aa1354
2025-07-22 09:04:57 [version 4c7b87465ba5df01952350026a13663f] [info]: 4xx Bad Request b63199047e046bd08b41c3a545dfbc9086aa1354
as we can see the intervals were:
202 → 429 - 5 sec
429 → 429 - 34 sec
429 → 4xx - 35 sec
With 429 HTTP status code and without Retry-After header:
2025-07-22 12:59:18 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 12:59:18 [version 4c7b87465ba5df01952350026a13663f] [info]: Request processing starting ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 12:59:18 [version 4c7b87465ba5df01952350026a13663f] [info]: 202 Accepted ea328f3e68fe42ff71600bc4680490a07e5d23f5
.... long-running call started
2025-07-22 12:59:18 [version 4c7b87465ba5df01952350026a13663f] [info]: Set state (ea328f3e68fe42ff71600bc4680490a07e5d23f5): {"status":"RUNNING","createdAt":"2025-07-22T12:59:18.559Z"}
2025-07-22 12:59:24 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 12:59:24 [version 4c7b87465ba5df01952350026a13663f] [info]: 429 Still processing... ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 12:59:28 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 12:59:28 [version 4c7b87465ba5df01952350026a13663f] [info]: 429 Still processing... ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 13:00:18 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 13:00:18 [version 4c7b87465ba5df01952350026a13663f] [info]: 429 Still processing... ea328f3e68fe42ff71600bc4680490a07e5d23f5
.... long-running call finished
2025-07-22 13:00:29 [version 4c7b87465ba5df01952350026a13663f] [info]: Set state (ea328f3e68fe42ff71600bc4680490a07e5d23f5): {"status":"FAIL","createdAt":"2025-07-22T12:59:18.559Z","result":"some result","statusCode":400,"updatedAt":"2025-07-22T13:00:29.093Z"}
2025-07-22 13:01:25 [version 4c7b87465ba5df01952350026a13663f] [info]: Action run ID: ea328f3e68fe42ff71600bc4680490a07e5d23f5
2025-07-22 13:01:25 [version 4c7b87465ba5df01952350026a13663f] [info]: 4xx Bad Request ea328f3e68fe42ff71600bc4680490a07e5d23f5
the intervals were:
202 → 429 - 6 sec
429 → 429 - 4 sec
429 → 429 - 50 sec
429 → 4xx - 67 sec
Actual Result:
From the logs, we can see that the retry intervals are increasing over time, even though we are explicitly setting the Retry-After header to 15 seconds in each 429 Too Many Requests response.
Expected Behavior:
We expect Flow to respect the Retry-After header and follow a consistent retry interval as defined. The expected sequence should look like:
202 → 429 - initial retry in 4–6 seconds - we can’t control this
429 → 429 - 15 sec
429 → 429 - 15 sec
429 → 429 - 15 sec
429 → 429 - 15 sec
429 → 4xx - 15 sec, final response based on processing result
Could you please confirm whether Retry-After is currently supported by Flow and whether there are any constraints or known issues that could cause it to be ignored?