Skip to main content

Collect Stripe payments on account

Partners can collect an arbitrary patient payment without first creating an invoice or booking. After Stripe confirms the payment, Semble creates an unallocated payment on account for the patient and emits paymentOnAccount.created.

Call createPaymentIntentForPaymentOnAccount, then confirm the returned client secret with Stripe Payment Element. Semble always reuses or creates the patient's Stripe Customer and attaches it to the PaymentIntent.

mutation CreateAccountPayment {
createPaymentIntentForPaymentOnAccount(
patientId: "PATIENT_ID"
amount: 50
date: "2026-09-08"
comment: "Deposit"
metadata: [{ key: "booking_reference", value: "BOOKING-42" }]
) {
paymentIntentId
clientSecret
stripeAccountId
error
}
}

When stripeAccountId is returned, pass it as the connected account when loading Stripe.js. When it is null, load Stripe.js without a connected account because the PaymentIntent belongs to the Semble platform account.

date and comment are optional and are copied to the resulting payment.

Metadata

Metadata uses string key/value entries. Keys are limited to 40 characters, values to 500 characters, and Stripe allows 50 total keys including Semble's reserved metadata. Partner metadata is copied to both the Stripe PaymentIntent and the resulting PaymentOnAccount.metadata.

Semble rejects duplicate keys and keys reserved for payment routing, including source, purpose, practice_id, patient_id, payment_date, comment, storeCardDetails, invoice_id, bookingIds, terminal_id, and terminal_name.

The mutation requires the createPayment right.