---
type: table
title: payment_attempts
description: Every charge or refund attempt against an order, successful or not — the audit trail money leaves behind.
tags: [table]
database: main
timestamp: {{DATE}}
---
<!-- ✂ docujoint template sample — replace with your own content, then delete this comment. -->
# payment_attempts

## Purpose
Written by [Payments Service](</Services/Payments Service.md>) for every
provider call — including declines, which never create an
[orders](</Data/main/Tables/orders.md>) row but must still be auditable
(see [Declined Payment Path](</Flows/Order Placement/Declined Payment Path.md>)).

## Columns
| Column | Type | Nullable | Purpose |
|--------|------|----------|---------|
| id | uuid | no | Primary key |
| order_id | uuid | yes | Set once an order exists; null for declined first attempts |
| kind | text | no | `charge` or `refund` |
| outcome | text | no | `succeeded`, `declined`, `failed` |
| provider_ref | text | yes | Stripe object id for reconciliation |
| attempted_at | timestamptz | no | When the provider was called |

## Open questions
