---
title: "Weekly sweep: send win-back emails to inactive Basic/Pro orgs (30-90d stale)"
method: POST
path: "/internal/cron/winback"
tags: ["internal"]
---

# Weekly sweep: send win-back emails to inactive Basic/Pro orgs (30-90d stale)

`POST /internal/cron/winback`

Weekly cron targeting paid orgs whose most-recent `api_keys.last_used_at`
is between 30 and 90 days ago.

Audience (audit R15):
  - status='active' (skip canceled / past_due / payment_at_risk)
  - tier IN ('basic', 'pro')  — free-tier excluded: free cooling-off
    is evaluation behavior, not churn, and over-emailing degrades
    sender reputation.
  - max(api_keys.last_used_at) between 30 and 90 days ago.

Upper bound (90d) prevents cold-contacting fully abandoned trials
indefinitely. Frequency cap (30d) in send.py means a user stuck
in the 30-90 band gets at most one win-back every 30 days, not
once per weekly cron fire.

## Headers

- `x-internal-secret` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/goldprice/apis/gold-api.md) · [All operations](https://skmtc.net/goldprice/apis/gold-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/goldprice/gold-api/versions/7885a141754c/schema)
