Run it

Open

Once Leaseclock takes payments, its team runs the business from the admin at leaseclock.com/admin. Customers, payments, plans and emails are records there, like leases, and every change has a preview, an undo and a line in its history. The same Verbs run from the API, from npx leaseclock and from your team's agent.

Your team signs in to the admin with its own Leaseclock accounts. Scripts use a key created in the admin under Settings → API keys, read from LEASECLOCK_TOKEN, and pick a customer with the Workspace header or --workspace.

Customers

Every workspace is a customer, with its plan and where its billing stands. Past due and Canceled have tabs of their own, so the customers who need a look are one click away.

Terminal
curl "https://leaseclock.com/api/subscriptions?status=past_due" \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN"

A card fails

When a renewal payment fails, Stripe retries the card over the next two weeks, and Leaseclock emails the workspace's owner a link to update it, from Leaseclock's own address. The payment reads Past due, with the date of the next retry. The workspace keeps working while Stripe retries, and its owner sees a Past due banner in the app with the same link. If the last retry fails, the plan ends and the workspace turns read-only, with every record kept, until someone pays.

Once Harbor Point Homes updates its card, retry it now instead of waiting for Stripe's next attempt:

Terminal
curl -X POST https://leaseclock.com/api/subscriptions/harbor-point-homes/retry \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

Refund a payment

Refund opens its preview first: the amount, the card it goes back to and the status the payment is left in. Confirm it, and Stripe returns the money, the payment reads Refunded, and the owner gets a receipt for the refund. Pass an amount to refund part of a payment.

Terminal
curl -X POST https://leaseclock.com/api/payments/linden-row-lettings-2026-10-09/refund \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

A GET on the same URL returns the preview and moves nothing. Stripe covers refunds from the customer's side.

Change a customer's plan

With a second Offer, a customer moves between plans from its billing portal, and your team moves it from its page in the admin. Here Leaseclock adds a Team plan for larger property managers:

Offer/team.mdx
---
name: Leaseclock Team
price: { amount: 79, currency: USD, unit: month }
limits: { Unit: 1000 }
personas: Property manager, Leasing coordinator
status: Live
---

The preview names both plans, the new price and what Stripe prorates, and the next invoice carries the difference.

Terminal
curl -X POST https://leaseclock.com/api/subscriptions/northgate-rentals/changePlan \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "offer": "team" }'

Answer a support request

Priya writes in: a lease she renewed shows the wrong date. View as customer on Northgate Rentals' page opens its app with its records, under a band that says whose screen it is. Anything your team changes there lands in the record's history under your team member's name, so Priya sees who changed what.

Terminal
curl https://leaseclock.com/api/leases/4b/history \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN" \
  -H "Workspace: northgate-rentals"

The history shows every renewal of 4B with who ran it and from where, and Undo on the newest puts the date back.

Emails your product sends

Leaseclock sends every email from its own domain, hello@leaseclock.com, in its theme. Sign-in links, invitations, receipts, failed-card notices and refund receipts come with every product. A Verb with emails: adds its own, like Lease's 60-day reminder in Verbs. npx saas.dev domain add publishes the domain's SPF and DKIM records with its DNS record, so the mail lands in inboxes. Rewrite an email's words, or turn one off, from the Emails screen.

Each email sent is a record, so a question about a missing message has an answer:

Terminal
curl "https://leaseclock.com/api/emails?to=dana.whitfield@example.com" \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN" \
  -H "Workspace: northgate-rentals"

Close a customer

Cancel plan shows what changes before anything changes: the plan ends on its renewal date, nothing more is charged, and the workspace stays readable with every record. The owner exports everything in one call, and reopening the plan brings the workspace back as it was.

Terminal
curl -X POST https://leaseclock.com/api/subscriptions/northgate-rentals/cancel \
  -H "Authorization: Bearer $LEASECLOCK_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"

What the admin holds

Beside your own Nouns, every product has these, with the same lists, pages, API, CLI and MCP tools:

NounWhat it isVerbs
WorkspaceOne customer, with its people and records
MemberA person in a workspace, with a role
SubscriptionA workspace's plan in Striperetry, changePlan, cancel
PaymentOne charge in Striperefund
InvoiceWhat Stripe billed, with its PDF
EmailOne message the product sent or has scheduled
Changelog entryWhat changed in a push customers can see

Your team's agent

Your team's agent connects to the same MCP server and runs the same Verbs, with the same previews. A morning's work is one sentence:

Ask your agent
Find every past-due subscription and draft a note to each owner.

Contents