Stripe
Let hires look up customers, invoices and payments, see who owes what, check the balance and payouts, and draft and send invoices and payment links in Stripe.
Explore 15 actions and their permissionsExact inputs, sign-in scopes, access limits and approval rules.
With Stripe, a hire can:
- find customers,
- list invoices by status (draft, unpaid, overdue, paid, void), customer and date, and read one in full,
- see who owes what and how late (current, 1–30, 31–60, 61–90 and over 90 days),
- list payments (succeeded, failed, refunded, disputed) and read one,
- check the balance (available and pending) and payouts to your bank,
- draft an invoice, finalise it (so it has a number and a payment page), send it, make a payment link, and mark an invoice paid when the customer paid outside Stripe.
A hire can also refund a payment, but only with a person's approval, every time: it asks in the thread with the payment and the amount, and when the approver says yes, Roster makes exactly that refund, once (more). Nobody can turn that asking off. For refunds, set Charges and Refunds to Write on the restricted key; at Read, Stripe refuses them.
Hires never pay out, charge a card or cancel anything in Stripe. Those stay with people.
1. Make a restricted key in Stripe
A restricted key can do only what you allow, so it's the safest way to connect.
- Open API keys in your Stripe dashboard (the form in Roster links there too) and click Create restricted key.
- Name it
Roster. - Set these permissions and leave everything else at None:
| Permission | Read only hires | Hires that also draft and send |
|---|---|---|
| Customers | Read | Read |
| Invoices | Read | Write |
| Charges and Refunds | Read | Read |
| PaymentIntents | Read | Read |
| Balance | Read | Read |
| Payouts | Read | Read |
| Payment Links | Read | Write |
| Products and Prices | None | Write (for payment links) |
| Events | Read | Read |
| Webhook Endpoints | Write | Write |
To let approved refunds through, set Charges and Refunds to Write instead. Webhook Endpoints lets Roster set up its own webhook, so Stripe tells it of changes at once; leave it at None if you'd rather not, and Roster asks Stripe instead.
- Click Create key and copy it. It starts with
rk_live_(orrk_test_in test mode). Roster tells you at once if what you paste isn't a secret or restricted key (a publishablepk_key won't do).
A key made in test mode only sees test data, which is a good way to try it first.
2. Connect it in Roster
- Open Integrations → Tools → Add a tool, search for Stripe and choose it.
- Paste the Restricted API key and click Connect.
Roster checks the key with Stripe and the connection shows Connected as your Stripe account (with Test mode for a test key). If Stripe refuses the key, or it's missing a permission Roster needs to check it (Balance: Read), Roster says which and saves nothing.
With Webhook Endpoints: Write on the key, Roster then adds its own webhook in Stripe, for the events hires watch, and keeps its signing secret. There's nothing to paste.
3. Give hires access
On the hire's Tools tab, click Give access on Stripe:
- Read only: it can look up customers, invoices, payments, the balance and payouts. It can't change anything.
- Read and write: it can also draft, finalise and send invoices, make payment links, and mark invoices paid outside Stripe, and ask to refund a payment (each refund waits for approval).
Drafting and sending are separate. A draft stays in Stripe until someone finalises or sends it, so a hire can prepare invoices for you to check first. Finalising gives the invoice its number and a payment page to share, without emailing anyone.
Hires refer to invoices by their number, like BAYT-0042 (drafts don't have one yet, so they use
the id), and to customers by name or email.
Watching Stripe
A hire's responsibility can watch Stripe: it's woken when an invoice is paid, fails, falls overdue, is sent or voided, when a payment succeeds, fails, is refunded or disputed, and when a payout arrives or fails. Checking costs nothing when nothing happened.
Hear of changes at once (optional)
When the key has Webhook Endpoints: Write, Roster sets this up itself when you connect, and removes its webhook from Stripe when you remove the connection. Otherwise Roster asks Stripe what changed each time a hire checks. To have Stripe tell Roster the moment something happens without giving the key that permission, add the webhook by hand:
- In Stripe, open Developers → Webhooks and click Add endpoint.
- Endpoint URL: the webhook address Roster shows on the Stripe connection.
- Select these events:
invoice.paid,invoice.payment_failed,invoice.overdue,invoice.finalized,invoice.sent,invoice.voided,invoice.marked_uncollectible,charge.succeeded,charge.failed,charge.refunded,charge.dispute.created,payout.paidandpayout.failed. - Click Add endpoint, then Reveal the signing secret (it starts with
whsec_) and paste it as the connection's Webhook signing secret in Roster.
Roster only keeps deliveries signed with that secret.
Things to know
- Part-payments outside Stripe: Stripe can only mark the whole amount paid. For a part-payment, the hire tells you instead.
- Notes: Stripe invoices have no comment history, so hires keep notes in the conversation.
If something goes wrong
- "Doesn't have the required permissions": the key is missing one of the permissions above. Edit the key in Stripe and add it.
- "Didn't accept the connection's credential": the key was deleted or rolled. Make a new one and paste it on the connection.
- Nothing found that you can see in Stripe: check the key is from the same mode (live or test) and the same Stripe account.
Tools and permissions reference
This reference is built from the same definitions Roster uses to connect Stripe and give hires access. It updates with each release.
Authentication and requested permissions
The account or app you connect sets the outer limit. Each hire's access can narrow it further. Connecting a tool gives it to no hire until you give access on that hire's Tools tab.
API key or access token
In Stripe: Developers → API keys → Create restricted key. Give it only what hires need (see the guide). A secret key works too, but a restricted one is safer.
When making a key, use these permissions from the connection guide:
- Customers: Read
- Invoices: Write (Read for read-only hires)
- Charges and Refunds: Read (Write to allow approved refunds)
- PaymentIntents: Read
- Balance: Read
- Payouts: Read
- Payment Links: Write
- Products and Prices: Write
- Events: Read
- Webhook Endpoints: Write (so Roster can set up its own webhook)
Connection fields
| Field | What to provide |
|---|---|
Restricted API keytokenRequired · sealed secret | In Stripe: Developers → API keys → Create restricted key. Give it only what hires need (see the guide). A secret key works too, but a restricted one is safer. |
Webhook signing secretwebhookSecretOptional · sealed secret | Optional. To hear of changes the moment they happen: in Stripe, add a webhook endpoint with the address Roster shows on this connection, then paste its signing secret (whsec_…). Without it, Roster asks Stripe for changes instead. |
Per-hire limits
Read-only hires receive only actions that read. Read-and-write access also allows actions that change things, where the connection itself permits them. An empty resource allowlist usually means everything the connected account can reach; each field below explains its meaning.
No additional fields.
Actions
15 actions: 9 only read and 6 change something. A read action may still need approval when your workspace or hire is set to ask. A locked approval requirement always applies.
15 of 15 actions. Open an action for its arguments and full input schema.
list_customersRead only
Customers in Stripe, optionally matching words in their name or an email address.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
searchOptional | string | words in the name, or an email address |
limitOptional | integer | See input schema below.Default: 30 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"search": {
"description": "words in the name, or an email address",
"type": "string"
},
"limit": {
"default": 30,
"type": "integer",
"minimum": 1,
"maximum": 100
}
}
}list_invoicesRead only
Invoices, newest first, filtered by status (draft, unpaid, overdue, paid, void), customer, invoice date and words in the number or memo.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
statusOptional | "any" | "draft" | "unpaid" | "overdue" | "paid" | "void" | unpaid: sent and not fully paid; overdue: unpaid and past its due dateDefault: "any" |
customerOptional | string | a customer's name or id |
fromOptional | string | invoice date on or after, yyyy-mm-dd |
toOptional | string | invoice date on or before, yyyy-mm-dd |
searchOptional | string | words in the invoice number or reference |
limitOptional | integer | See input schema below.Default: 30 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"status": {
"default": "any",
"description": "unpaid: sent and not fully paid; overdue: unpaid and past its due date",
"type": "string",
"enum": [
"any",
"draft",
"unpaid",
"overdue",
"paid",
"void"
]
},
"customer": {
"description": "a customer's name or id",
"type": "string"
},
"from": {
"description": "invoice date on or after, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to": {
"description": "invoice date on or before, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"search": {
"description": "words in the invoice number or reference",
"type": "string"
},
"limit": {
"default": 30,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}get_invoiceRead only
One invoice in full: customer, dates, lines, totals, what's paid and owed, and its payment page.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. ACME-0042, or its id (in_…) |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. ACME-0042, or its id (in_…)"
}
},
"required": [
"invoice"
]
}receivables_summaryRead only
Who owes what and how late: open invoices totalled by age (current, 1-30, 31-60, 61-90, over 90 days) and the customers most overdue.
Approval: Uses your workspace and hire approval settings.
This action takes no arguments.
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}list_paymentsRead only
Card and other payments (charges), newest first: succeeded, pending or failed, with refunds and disputes. Optionally one customer's, or from a date.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
customerOptional | string | a customer's name, email or id |
fromOptional | string | invoice date on or after, yyyy-mm-dd |
toOptional | string | invoice date on or before, yyyy-mm-dd |
limitOptional | integer | See input schema below.Default: 30 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"customer": {
"description": "a customer's name, email or id",
"type": "string"
},
"from": {
"description": "invoice date on or after, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to": {
"description": "invoice date on or before, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"limit": {
"default": 30,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}get_paymentRead only
One payment by its id: a charge (ch_…) or a payment intent (pi_…), with its status and receipt.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
paymentRequired | string | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"payment": {
"type": "string",
"pattern": "^(ch|py|pi)_\\w+$"
}
},
"required": [
"payment"
]
}get_balanceRead only
The Stripe balance: what's available to pay out and what's still pending, per currency.
Approval: Uses your workspace and hire approval settings.
This action takes no arguments.
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}list_payoutsRead only
Payouts from Stripe to the bank, newest first, with when each arrives and whether it failed.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
statusOptional | "any" | "pending" | "in_transit" | "paid" | "failed" | "canceled" | See input schema below.Default: "any" |
limitOptional | integer | See input schema below.Default: 20 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"status": {
"default": "any",
"type": "string",
"enum": [
"any",
"pending",
"in_transit",
"paid",
"failed",
"canceled"
]
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
}
}
}list_payment_linksRead only
Payment links made in Stripe, with their addresses and whether each still takes payments.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
activeOptional | boolean | only active (true) or deactivated (false) links |
limitOptional | integer | See input schema below.Default: 20 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"active": {
"description": "only active (true) or deactivated (false) links",
"type": "boolean"
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
}
}
}create_draft_invoiceRead and write
Create a draft invoice for a customer, to be paid by bank transfer or on Stripe's payment page. Nothing is sent and nothing is charged: it stays a draft until someone finalises or sends it.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
customerRequired | string | the customer's name, email or id |
linesRequired | object[] | See input schema below. |
currencyOptional | string | default: the customer's currency |
due_dateOptional | string | when it's due, yyyy-mm-dd |
days_until_dueOptional | integer | instead of due_date; default 30 |
memoOptional | string | the memo shown on the invoice |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"customer": {
"type": "string",
"minLength": 1,
"description": "the customer's name, email or id"
},
"lines": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"description": "what was sold, as it should read on the invoice"
},
"quantity": {
"default": 1,
"type": "number",
"exclusiveMinimum": 0
},
"rate": {
"type": "number",
"minimum": 0,
"description": "price per unit, before tax"
},
"item": {
"description": "a product or service id or code from the accounting system",
"type": "string"
},
"account": {
"description": "an income account code, where the system needs one",
"type": "string"
}
},
"required": [
"description",
"rate"
]
}
},
"currency": {
"description": "default: the customer's currency",
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"due_date": {
"description": "when it's due, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"days_until_due": {
"description": "instead of due_date; default 30",
"type": "integer",
"minimum": 0,
"maximum": 365
},
"memo": {
"description": "the memo shown on the invoice",
"type": "string",
"maxLength": 5000
}
},
"required": [
"customer",
"lines"
]
}finalize_invoiceRead and write
Finalise a draft invoice: it gets its number and a payment page to share, and can no longer be edited. Nothing is emailed and the customer isn't charged.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. ACME-0042, or its id (in_…) |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. ACME-0042, or its id (in_…)"
}
},
"required": [
"invoice"
]
}send_invoiceRead and write
Email an invoice to the customer from Stripe, finalising it first if it's a draft. Only for invoices paid by the customer (not charged automatically).
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. ACME-0042, or its id (in_…) |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. ACME-0042, or its id (in_…)"
}
},
"required": [
"invoice"
]
}create_payment_linkRead and write
Make a payment link: a Stripe page anyone with the address can pay, for the lines given. Nothing is sent: share the address yourself.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
linesRequired | object[] | See input schema below. |
currencyRequired | string | See input schema below. |
purposeOptional | string | what it's for, kept on the link for people to see |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"lines": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"description": "what was sold, as it should read on the invoice"
},
"quantity": {
"default": 1,
"type": "number",
"exclusiveMinimum": 0
},
"rate": {
"type": "number",
"minimum": 0,
"description": "price per unit, before tax"
}
},
"required": [
"description",
"rate"
]
}
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"purpose": {
"description": "what it's for, kept on the link for people to see",
"type": "string",
"maxLength": 200
}
},
"required": [
"lines",
"currency"
]
}record_paymentRead and write
Mark an open invoice as paid outside Stripe (by bank transfer or cash), for the whole amount owed. Stripe doesn't record part-payments made outside it.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number or id |
amountRequired | number | See input schema below. |
dateOptional | string | when it was paid; default today |
referenceOptional | string | the bank or cheque reference |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number or id"
},
"amount": {
"type": "number",
"exclusiveMinimum": 0
},
"date": {
"description": "when it was paid; default today",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"reference": {
"description": "the bank or cheque reference",
"type": "string",
"maxLength": 100
}
},
"required": [
"invoice",
"amount"
]
}refund_paymentRead and writeApproval required · locked
Refund a payment to the customer's card or account, in full or in part. Money moving always waits for a person's approval: Roster asks in the thread and makes exactly this refund, once, when they approve. Give the amount with its currency for a part refund; leave both out to refund whatever is left.
Approval: Always asks for approval. This requirement cannot be turned off.
| Argument | Type | Details |
|---|---|---|
paymentRequired | string | See input schema below. |
amountOptional | number | how much to refund, e.g. 120.50 |
currencyOptional | string | the payment's currency, e.g. USD; needed with amount |
reasonOptional | "duplicate" | "fraudulent" | "requested_by_customer" | See input schema below. |
noteOptional | string | why, kept on the refund in Stripe |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"payment": {
"type": "string",
"pattern": "^(ch|py|pi)_\\w+$"
},
"amount": {
"description": "how much to refund, e.g. 120.50",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 10000000
},
"currency": {
"description": "the payment's currency, e.g. USD; needed with amount",
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"reason": {
"type": "string",
"enum": [
"duplicate",
"fraudulent",
"requested_by_customer"
]
},
"note": {
"description": "why, kept on the refund in Stripe",
"type": "string",
"maxLength": 500
}
},
"required": [
"payment"
]
}Watches and incoming events
- This integration supports a responsibility that watches for changes. The guide above explains what it checks and how to limit it.
- Incoming webhooks are supported. Roster can register the connection's callback with the service.
Limits and troubleshooting
- Permission errors: check both the connected account's rights and the hire's resource and read/write limits.
- Expired or revoked access: reconnect or replace the key on the connection.
- Rate limits and unavailable services can interrupt work. The hire's timecard records the outcome.
- The action schema describes accepted inputs. It does not grant additional access or bypass approvals.