Tillwell: setup and user guide
What Tillwell does
Tillwell shows the requester's Stripe customer in the Zendesk ticket sidebar (and on user profiles): subscriptions, invoices, payments, failed payments, open disputes and lifetime value. Agents you allow can refund a payment, cancel a subscription at the end of the period or undo that, pause or resume payments, and email an invoice or a receipt. Every action asks for confirmation first and is logged on the ticket as an internal note.
1. Create a restricted key in Stripe
In the Stripe Dashboard: Developers > API keys > Create restricted key. Name it "Tillwell for Zendesk" and set these permissions. Leave everything else at None.
| Stripe permission | Level | Needed for |
|---|---|---|
| Customers | Read | Finding the customer (email lookup, customer id, metadata search) |
| Subscriptions | Read | Subscription list |
| Invoices | Read | Invoice list |
| Charges | Read | Payments, refunded amounts, failed payments, lifetime value |
| Disputes | Read | Dispute alerts |
| Products | Read | Product names on subscriptions |
| Refunds | Write | Refund (only if you allow refunds) |
| Subscriptions | Write | Cancel at period end, Keep subscription, Pause payments, Resume payments (only if you allow subscription changes) |
| Invoices | Write | Email invoice (only if you allow invoice and receipt emails) |
| Charges | Write | Email receipt (only if you allow invoice and receipt emails) |
A read-only key (the six Read rows) gives a fully working sidebar with no actions. If a key is missing a permission, Tillwell shows Stripe's message, which names the permission to add.
Use a live-mode key (rk_live_...) in production. A test-mode key (rk_test_...) works for a
trial run; customers then show "(test mode)" and Open in Stripe goes to your test dashboard.
2. Install and connect
- In the Zendesk Marketplace, open Tillwell and choose Install, then the Standard plan. The 14-day trial starts and Zendesk asks for a card. Billing starts when the trial ends unless you uninstall.
- Paste the key into Stripe restricted key and set Account name. Zendesk stores the key as a secure setting: it is never sent to agents' browsers, and Zendesk only adds it to requests going to api.stripe.com.
- Save. Open any ticket whose requester is a Stripe customer.
3. Settings
- Several Stripe accounts: fill in the key and name for account 2 and 3. Brands for this account takes Zendesk brand ids (Admin Center > Account > Brand management; the id is in the brand's URL). A ticket opens the account that lists its brand, otherwise the account with no brand list, otherwise account 1. Agents can switch accounts in the sidebar.
- Who may take actions:
admin(default),agent(everyone), custom role ids (Admin Center > People > Roles; the id is in the role's URL) orgroup:<id>, separated by commas. Everyone else sees the sidebar read-only. Example:admin, group:360004512345. - Allow refunds, Allow subscription changes, Allow invoice and receipt emails: turn each action type on or off for everyone.
- Largest refund without an admin: in the payment's currency (100 means $100.00 or 100 euros). Admins have no limit. 0 removes the limit.
- User field with the Stripe customer id: the key of a Zendesk user field (Admin Center >
People > User fields) that holds a
cus_...id. Useful when customers write in from a different address than the one in Stripe. - Stripe metadata key with the Zendesk user id: if your signup flow stores the Zendesk user id
or external id in the Stripe customer's metadata (for example
zendesk_user), Tillwell finds the customer by it, using Stripe's customer search.
Matching by email always runs: Tillwell tries every email address on the requester's Zendesk profile (as written and in lowercase, because Stripe's email filter is case-sensitive). When several customers match, the sidebar lists them and agents pick one. Agents can also look up a customer by exact email or customer id.
4. Using it
- Sidebar: the customer, lifetime value (captured payments minus refunds, per currency; "last 100 payments" if they have more), customer since, credit or balance owed, then alerts for open disputes (with the response deadline) and failed payments in the last 90 days, then subscriptions, the latest invoices and payments.
- Refund: on a payment, click Refund. The amount starts at what is left to refund; change it for a partial refund. Pick a reason (Requested by customer, Duplicate payment, Fraudulent, or Other with a note) and click Refund $X. Disputed payments cannot be refunded; respond to the dispute in Stripe.
- Cancel at period end: the customer keeps access until the period ends and is not billed again. Keep subscription undoes it before that date.
- Pause payments: choose whether invoices created while paused are voided (never charged) or held as drafts, and optionally a resume date. Resume payments ends the pause.
- Email invoice: for invoices billed by email (send invoice) that are open or paid.
- Email receipt: Stripe emails a receipt when a payment's receipt address changes, so enter the address to send it to. If it is the address already on the payment, Stripe may not send it again; use Open receipt and put the link in your reply.
- After each action the ticket gets an internal note, for example: "Tillwell (Stripe): Refunded
$49.00 of $49.00 on payment ch_... for Stripe customer cus_... Reason: duplicate payment.
Stripe refund re_..., status succeeded. Done by Maya Lindqvist from this ticket." and a tag:
tillwell_refund,tillwell_cancel,tillwell_cancel_undone,tillwell_pause,tillwell_resume,tillwell_invoice_sentortillwell_receipt_sent. Use the tags in views, triggers and reports. - Actions are available on tickets only. On a new ticket and on user profiles the sidebar is read-only.
5. Data and security
- The key stays in Zendesk's secure settings and travels only in the Authorization header of requests Zendesk's proxy sends to api.stripe.com.
- Tillwell has no server. It keeps nothing after the sidebar closes, has no export, and sends nothing to Great Work. Refunds carry the Zendesk ticket id and agent id in Stripe metadata.
- Uninstalling deletes the stored keys. Also delete the restricted key in Stripe.
6. Troubleshooting
| You see | Do this |
|---|---|
| "Stripe did not accept the API key" | The key was deleted or rolled in Stripe. Paste a new restricted key in the settings |
| "The restricted key cannot do this ... rak_refund_write" | Add the permission Stripe names (here Refunds: Write) to the key in Stripe |
| No customer found | Check the requester's email matches Stripe, use the lookup box, or set up the user field or metadata mapping |
| "Metadata match skipped" | Stripe's customer search is not available for the account or the key lacks Customers: Read. Email matching still runs |
| "Done in Stripe, but the ticket note failed" | The action happened. Paste the text shown as an internal note (closed tickets cannot take new comments) |
| Actions missing | Your role is not in "Who may take actions", the action type is off, or you are on a new ticket or a user profile |
Support: hello@greatwork.company, reply within one business day.