---
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

## Changes

- **2026-08-18** `b7c4b36e1fa1` — 1 warning, 3 info
  - removed the optional property `detail` from the response with the `422` status
  - added the required property `details` to the response with the `422` status
  - added the required property `error` to the response with the `422` status
  - added the required property `message` to the response with the `422` status

[Change history](https://skmtc.dev/goldprice/apis/gold-api/changes/internal/cron/winback/post.md)

---

[API](https://skmtc.dev/goldprice/apis/gold-api.md) · [All operations](https://skmtc.dev/goldprice/apis/gold-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/goldprice/gold-api/revisions/d2bb7eac068b/schema)
