---
title: "Record an outcome the customer reported"
method: POST
path: "/sends/{id}/outcomes"
tags: ["Tracking & events"]
---

# Record an outcome the customer reported

`POST /sends/{id}/outcomes`

## Request

- Base URL: `https://gtmswag.com/api/v1`
- URL: `https://gtmswag.com/api/v1/sends/{id}/outcomes`
- Auth: HTTP bearer

Only for a reply or meeting the customer explicitly reports; never infer one from delivery or a link open. Deduplicated on `source` + `externalEventId`: the same pair with different details returns 409 IDEMPOTENCY_CONFLICT. Without `externalEventId` every call records a new report.

## Path parameters

- `id` string, required

## Request body

- object
  - `outcome` 'none' | 'replied' | 'meeting_booked' | 'meeting_held', required: Customer-reported result; never infer from delivery.
  - `externalEventId` string: Source event ID for deduplication with the same source.
  - `source` string: Source for externalEventId deduplication.
  - `occurredAt` string, date-time: Outcome time as ISO 8601 with timezone; defaults to now.

## Response `200`

Success: `{"data": Tracking}`.

- TrackingResponse: The success body: `{"data": Tracking}`.
  - `data` Tracking, required: A privacy-minimized status snapshot of one gift.
    - `sendId` string, required
    - `campaignId` string, nullable, required
    - `status` 'awaiting_address' | 'queued' | 'in_production' | 'shipped' | 'delivered' | 'cancelled', required
    - `outcome` 'none' | 'replied' | 'meeting_booked' | 'meeting_held', required
    - `mode` 'test' | 'live', required

## Other responses

- `400`: Bad request: `VALIDATION_ERROR`, `INVALID_JSON`. Each example says when.
- `401`: Not authenticated: `AUTH_REQUIRED`. no credentials, or an OAuth token on a route that only takes workspace keys; the key is malformed, unknown or revoked.
- `404`: Not found: `NOT_FOUND`. Each example says when.
- `409`: Conflict: `IDEMPOTENCY_CONFLICT`. Each example says when.
- `413`: Request too large: `INVALID_REQUEST`. the body exceeds 1 MiB.
- `415`: Unsupported media type: `INVALID_REQUEST`. a write with a body that is not `Content-Type: application/json` (a key request with no body needs no Content-Type).
- `429`: Too many requests: `RATE_LIMIT`. more than 240 requests in the current minute for this workspace (REST and MCP share the limit); wait `retryAfterMs`.
- `default`: Any other refusal or failure, such as 403 CSRF (a cross-origin `Origin` header), 403 HTTPS_REQUIRED or 500 INTERNAL_ERROR, with what to do next.

---

[API](https://skmtc.dev/gtmswag/apis/gtm-swag-api.md) · [All operations](https://skmtc.dev/gtmswag/apis/gtm-swag-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gtmswag/apis/gtm-swag-api/revisions/9ff86fa99afe?raw)
