---
title: "Resend activation outreach"
method: POST
path: "/v1/members/{membership_id}/resend"
tags: ["members"]
---

# Resend activation outreach

`POST /v1/members/{membership_id}/resend`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/members/{membership_id}/resend`
- Auth: HTTP bearer

Re-enqueue activation outreach for a pending (or active) member.

Idempotent: if a ``pending`` or ``sent`` row already exists for a channel,
no duplicate is created (the outbox idempotency backstop applies). Deactivated
members are rejected, because a removed member cannot receive an activation nudge.

Once-ever: the welcome is one hello per membership across BOTH channels, not one per
channel. Whichever lane says it first spends the claim (the DM lane before it posts, the
email lane once the provider accepts), so a member whose claim is already spent gets nothing
on either channel. This refuses with ``skipped_reason="member_already_welcomed"`` rather than
minting a row the drainer would terminally skip moments later.

Nothing is minted until somebody in the workspace has given Patricia a task in chat, so an
empty ``channels`` can carry ``skipped_reason="workspace_has_not_used_patricia"``. The workspace
outreach setting plays no part: it allows or stops marketing email only.

Attempt-bounded: a member whose welcome DM has already failed its allowance is refused with
``skipped_reason="welcome_dm_attempts_exhausted"`` rather than queueing another attempt the
platform has already refused three times.

A created ``email`` row is delivered by its own background task. A created DM row (``slack_dm``
or ``teams_dm``) is NOT: it is picked up by the paced welcome DM drainer, so "created" here means queued for
delivery within the next few minutes, not sent.

Returns the channels for which new outreach rows were created. Empty channels means the
workspace has not used Patricia yet, the member has already been welcomed (see
``skipped_reason`` for both), or the applicable channel already had a pending/sent row.

## Path parameters

- `membership_id` string, uuid, required

## Headers

- `X-Tenant-Id` string, nullable

## Response `200`

Successful Response

- ResendResponse: POST /members/{id}/resend response: channels enqueued this call. ``skipped_reason`` is set when nothing was enqueued for a knowable reason: nobody in the workspace has given Patricia a task in chat yet (``"workspace_has_not_used_patricia"``), the member is a guest, their one hello is already spent, or the DM has already failed its attempt allowance (``"welcome_dm_attempts_exhausted"``). ``None`` with empty ``channels`` means every channel was already outreached.
  - `channels` string[], required
  - `skipped_reason` string, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/0dfb44495ea1?raw)
