> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/help-center/help-topics/no-data/webhooks-background-delivery-stopping/whoop-webhook-v2-and-byoc-config.md).

# Why does WHOOP only deliver data on manual pull?

If WHOOP data arrives only on manual pull but not automatically, the issue is the WHOOP webhook setup: the webhook URL, its version, or the certificate on your subdomain, not your own endpoint.

If WHOOP data arrives only on manual pull but not automatically, the issue is the **webhook setup for your WHOOP app**, not your own endpoint. WHOOP sends updates to the webhook URL on your WHOOP app, and that URL must be on your subdomain with a live certificate.

{% stepper %}
{% step %}
Set the webhook URL to your dedicated Terra WHOOP hooks endpoint, in the form `https://<your-subdomain>/hooks/whoop/push`.
{% endstep %}

{% step %}
Set the webhook version to **V2**. WHOOP no longer publishes V1 webhooks.
{% endstep %}

{% step %}
Enable all scopes.
{% endstep %}

{% step %}
Check that the SSL certificate for your subdomain is issued. Until the validation CNAME is in your DNS and the certificate is live, WHOOP has no valid endpoint to deliver to. See [certificate troubleshooting](https://docs.tryterra.co/help-center/help-topics/something-else/custom-subdomains-ssl-and-security/cname-validation-ssl-issuance-troubleshooting).
{% endstep %}
{% endstepper %}

If the webhook URL is unset, or the certificate isn't live, no ongoing updates reach Terra after the initial pull. Fixing either one doesn't need users to reconnect.

Each Terra data type reads these WHOOP scopes, on top of `read:profile` and `offline`, which every connection needs:

| Data type | WHOOP scopes                                                 |
| --------- | ------------------------------------------------------------ |
| Activity  | `read:workout`                                               |
| Body      | `read:body_measurement`                                      |
| Sleep     | `read:sleep`, `read:recovery`                                |
| Daily     | `read:cycles`, `read:recovery`, `read:workout`, `read:sleep` |

Without `offline`, WHOOP issues no refresh token. If a scope is missing from a user's grant, requests for the data types that need it fail with a provider permission error while the others keep working. A grant only covers the scopes the user approved when connecting, so a user who connected without a scope needs to reconnect once.

For users with no data yet, [request their historical data](https://docs.tryterra.co/health-and-fitness-api/managing-user-health-data/requesting-historical-data) to pull history.

See the [WHOOP setup docs](https://docs.tryterra.co/health-and-fitness-api/whoop) and [WHOOP's webhook docs](https://developer.whoop.com/docs/developing/webhooks/) for the full configuration.
