Billing Schedules
Recurring invoices for subscriptions, retainers and payment plans
Each cycle, Enlivy issues the invoice at the agreed price, emails it to your client and charges the saved card. You see what is paid and what is still due.
Set up your first billing scheduleFree account, no card needed. The Billing Schedules pack is €9.99/month, excluding VAT, and you add it in the app.
FLEXIBLE BILLING
Subscriptions, payment plans, or both in one schedule
A billing schedule is one client's recurring billing. You choose its shape.
When your client accepts a proposal for a subscription or a payment plan and chooses how to pay, Enlivy creates the billing schedule at the prices they accepted. You can also set one up yourself, or import a subscription you already run in Stripe.
One schedule can mix shapes: a setup fee, a short intro period, then an open-ended retainer. You set it once.
-
Recurring subscriptions
The same charge repeats on any cadence, weekly to yearly, with no end or until an end date.
-
Fixed payment plans
A set number of installments, each with its own amount and date. Each one is invoiced on its date and charged when a card is saved.
-
Phased and mixed
Step the price up or down across phases, or combine a one-off fee, an intro price and an ongoing subscription.
-
Run it in Enlivy, or keep it in Stripe
Let Enlivy run new billing, or import the subscriptions you already run in Stripe. Enlivy keeps them in sync with Stripe, so nothing has to move.
EACH CYCLE
Each cycle, Enlivy invoices and charges the saved card
Set the schedule once. With the Billing Schedules pack, the same steps repeat every cycle.
Each cycle, Enlivy issues the invoice, numbered and taxed. Where a card is saved, Enlivy charges it through your own Stripe account, so the money goes straight to you.
Enlivy marks the invoice paid once Stripe confirms the payment. Clients who pay by bank transfer stay on the same schedule, and you confirm their payments.
-
Invoiced when due
Every hour, Enlivy checks the active schedules and issues each invoice that is due.
-
The saved card, charged
Enlivy charges the saved card when it issues the invoice, with nothing for the client to do. With the schedule's email notifications on, the client hears about each card charge three days before.
-
Your account, your money
Charges run through your own Stripe account, so the money goes straight to you, never to Enlivy.
-
Missed confirmations caught
Every hour, Enlivy checks Stripe for any card payment confirmation that went missing, so a paid invoice does not stay open.
-
Bank transfers and other payments
For a bank transfer or any other payment, you mark the invoice paid yourself. With the Banking pack, you can also link the bank transaction to it.
Where did that money go?
Payments sit in folders, inboxes and spreadsheets, and nobody can say quickly what a client has paid.
-
What has this client paid?
Without Enlivy: A client has paid you monthly for 8 months. How much in total, and what is still due? You should not have to dig through old records to answer.
With Enlivy: One schedule shows every invoice and payment for the client, with the total paid and what is still due.
-
No view of the whole year
Without Enlivy: You know this month, but what did this supplier cost you over the year? The records exist, spread across the year.
With Enlivy: Each schedule keeps the whole history, so the yearly total is on the schedule itself.
-
Records in three places
Without Enlivy: Invoices in one folder, receipts in another, confirmations in email. Answering "how much did we pay them?" means searching all three.
With Enlivy: Invoices, receipts and payments sit on the schedule they belong to, as one running history.
-
Matching payments by hand
Without Enlivy: Month-end means hours in a spreadsheet, matching payments to invoices and hoping the totals are right.
With Enlivy: Enlivy marks an invoice paid once Stripe confirms the card payment. For a bank transfer, you mark the invoice paid, and you can link the bank transaction to it. The totals stay current without the spreadsheet.
CLIENT SELF-SERVICE
What happens when a client changes their plan
Where you allow it, clients change, pause or cancel their plan in your client portal. Here is how Enlivy bills those changes.
- Existing prices kept
When a client changes plan, the items they already have keep their agreed price, currency and quantity, to the cent. You can raise list prices without changing what existing clients pay.
- The preview matches the charge
The "what will this cost me?" screen uses the same calculation as the charge, at the exchange rates in force at confirmation. The invoice shows the amount the preview showed.
- Proration in one direction
An upgrade charges only the difference for the time left, on one invoice. A downgrade never pays money back. Lines priced in another currency are converted first.
- One package, many currencies
Price the same package per currency, and bill each client in their own. If a rate is missing or out of date, Enlivy stops the charge instead of billing the wrong amount.
- One charge per invoice
Each charge is locked while it runs and carries its own key, so a double click, a repeated request or the hourly billing run cannot charge a client twice.
- When a card is missing or declined
Enlivy does not retry a declined card. Without a usable card, the schedule waits, and after three declined cycles in a row, billing stops. When the client adds a working card, billing resumes and Enlivy charges the unpaid invoices.
What clients can do, set per schedule
Each billing schedule follows the package’s rules or sets its own, so you decide what a client can change in the portal.
- Change plan
Use package default · Allow · Don't allow
- Cancel subscription
Use package default · Allow · Don't allow
- Pause and resume
Use package default · Allow · Don't allow
TRY IT
Change a subscription's terms
This is the real editor for changing package terms, from the Enlivy app. Open the drawer, add or edit a line, pick a proration mode and see the preview update.
CAPABILITIES
What a billing schedule does
Invoices, card charges, statuses and the documents behind each payment.
- One list for every schedule
See all billing schedules in one list: the ones you bill clients on and the ones suppliers bill you on, active and completed. Filter by direction, status, sender or recipient.
- Visible email recipients
See whether email notifications are on and which address receives them. A custom address can replace the client's, and CC addresses stay visible.
- Invoices issued every hour
Enlivy checks every active schedule each hour. When a payment is due, Enlivy issues the invoice, numbered and taxed.
- Card charged without the client
Enlivy charges the saved card when it issues each invoice, with nothing for the client to do. Each charge runs only once, so the same invoice is not charged twice.
- Document linking
Link invoices, receipts or payslips to the payments of any schedule. Enlivy fills in each payment's amounts, taxes and status from the linked document.
- Flexible frequencies
Weekly, every two weeks, monthly, quarterly, every six months or yearly. Open-ended or with an end date. Each phase can run a set number of times before the next one starts.
- Multi-currency billing
Quote in one currency, bill in another. Each cycle, Enlivy converts the invoice at the reference exchange rate for its date, with an optional conversion fee.
- Status management
Each schedule shows its status, including a hold for a missing card, for three declined cycles in a row, or for a pause. Set it to active or cancelled as agreements start and end.
- Reuse and edit
Copy a phase or a payment inside a schedule to set up similar ones faster. Edit active schedules as agreements change.
NOTIFICATION VISIBILITY
See who a schedule will notify
Enlivy emails each cycle's invoice only when the schedule's email notifications are on and your organization has connected a mailbox. The schedule shows the switch, the address that receives the emails and any CC addresses.
How to set up a billing schedule
-
Create your schedule
Choose the direction (money in from a client, or out to a supplier), the type (subscription or payment plan) and how often it bills.
-
Link your documents
Link invoices, receipts or payslips to the schedule. Enlivy reads their amounts, taxes and payment status, so you do not type the payment history again.
-
See each payment land
When an invoice is paid or a receipt is issued, the schedule shows it, so nobody chases statuses in a spreadsheet.
-
See the complete picture
See the total paid, the payment dates, the pending invoices and where the schedule stands, on the schedule itself.
API reference
Billing Schedules from the API
Automate recurring revenue end-to-end. An app-managed billing schedule is run entirely by Enlivy: it generates invoices on the cadence you define, charges the saved payment method, and moves through its own statuses: pending, active, payment method required, payment failed, paused, completed and cancelled. You define the composition once; the engine bills it on schedule.
This reference covers app-managed schedules only. Enlivy also supports Stripe-hosted schedules, where Stripe owns the subscription and runs the billing. Those are managed on Stripe's side, so their creation and modification aren't covered here. You can compose an app-managed schedule two ways: from raw phases (your own recurring line items and cadence) or from a subscription billing package (a reusable template). The examples below cover both, plus listing, editing, reconfiguring, and cancelling.
Query your schedules with pagination, filtering, and full-text search. Filter by status, direction (outbound / inbound), sender, receiver, contract, bank account, or any of the date ranges (starts_at, ends_at, created_at, updated_at). Expand the phases and generated payments inline.
/organizations/<organization_id>/billing-schedules # status: pending | active | payment_method_required | paused | cancelling | completed | cancelled
curl -G 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'status=active' \
--data-urlencode 'direction=outbound' \
--data-urlencode 'include=receiver_user,phases,payments' \
--data-urlencode 'include_meta=navigation' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// status: pending | active | payment_method_required | paused | cancelling | completed | cancelled
const query = new URLSearchParams({
page: "1",
limit: "20",
status: "active",
direction: "outbound",
include: "receiver_user,phases,payments",
include_meta: "navigation",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Retrieve a single schedule with everything attached: its phases and line items, the payments generated so far, the counterparties, and the linked package or contract. Read next_payment_create_at to see when the engine bills next, and total / paid_total for progress.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id> # includes: sender_user, receiver_user, contract, billing_package,
# subscription_term, phases, payments, deleted_by_user
curl -G 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>' \
--data-urlencode 'include=phases,payments,receiver_user,billing_package' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
// includes: sender_user, receiver_user, contract, billing_package,
// subscription_term, phases, payments, deleted_by_user
const query = new URLSearchParams({
include: "phases,payments,receiver_user,billing_package",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());The most direct way to bill: define one or more phases, each with its own cadence and line items. The engine issues an invoice per phase occurrence and charges it. Phases are exclusive to app-managed schedules.
/organizations/<organization_id>/billing-schedules curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"management_type": "app_managed",
"direction": "outbound",
"status": "active",
"organization_sender_user_id": "<org_user_sender_id>",
"organization_receiver_user_id": "<org_user_receiver_id>",
"currency": "EUR",
"payment_method": "stripe_card_payment",
"organization_user_payment_method_id": "<payment_method_id>",
"name_lang_map": {
"en": "Monthly Retainer"
},
"note_lang_map": {
"en": "Includes support and hosting."
},
"is_email_notifications_active": true,
"email_notifications_to": "billing@acme.example",
"customer_can_reconfigure": false,
"customer_can_cancel": true,
"customer_can_pause": false,
"phases": [
{
"frequency": "monthly",
"execute_after": "2026-08-01",
"max_occurrences": 12,
"due_date_type": "custom_days",
"due_date_days": 14,
"order": 0,
"line_items": [
{
"name_lang_map": {
"en": "Retainer"
},
"quantity": 1,
"price": 500,
"organization_tax_class_id": "<tax_class_id>"
},
{
"organization_product_id": "<product_id>",
"quantity": 2,
"price": 49.9
}
]
}
]
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// this reference only covers app_managed
management_type: "app_managed",
// outbound = you bill a customer; inbound = you are billed
direction: "outbound",
// start billing right away
status: "active",
// the biller (you)
organization_sender_user_id: "<org_user_sender_id>",
// the customer (required for outbound)
organization_receiver_user_id: "<org_user_receiver_id>",
currency: "EUR",
// bank_transfer | card_payment | stripe_card_payment | paypal | cash | paid_by_personal_funds
payment_method: "stripe_card_payment",
// saved card to auto-charge (must belong to the receiver)
organization_user_payment_method_id: "<payment_method_id>",
name_lang_map: {
// per-locale maps, not plain strings
en: "Monthly Retainer",
},
note_lang_map: { en: "Includes support and hosting." },
is_email_notifications_active: true,
email_notifications_to: "billing@acme.example",
// customer self-service toggles (what the recipient may do from the portal)
customer_can_reconfigure: false,
customer_can_cancel: true,
customer_can_pause: false,
// totals + dates (total, paid_total, starts_at, ends_at, next_payment_create_at)
// are computed by the engine, do NOT send them.
// phases are valid ONLY for app_managed (stripe_hosted rejects them). Max 20.
phases: [
{
// weekly | biweekly | monthly | yearly
frequency: "monthly",
// first run date for this phase
execute_after: "2026-08-01",
// stop after N invoices (omit for open-ended)
max_occurrences: 12,
// immediate | end_of_month | custom_days
due_date_type: "custom_days",
// required only when due_date_type = custom_days
due_date_days: 14,
order: 0,
line_items: [
{
name_lang_map: {
// required unless organization_product_id is set
en: "Retainer",
},
quantity: 1,
// money: signed decimal in MAJOR units (not cents)
price: 500,
organization_tax_class_id: "<tax_class_id>",
},
{
// pulls name / tax defaults from the product
organization_product_id: "<product_id>",
quantity: 2,
price: 49.9,
},
],
},
],
}),
}).then((response) => response.json());Instead of hand-building phases, materialize the schedule from a reusable subscription billing package. The package owns the composition, you just pick the cadence variant and which group items to include.
/organizations/<organization_id>/billing-schedules/from-billing-package # The package supplies the phases and the line items, so none are sent here.
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/from-billing-package' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_billing_package_id": "<billing_package_id>",
"organization_billing_package_subscription_term_id": "<subscription_term_id>",
"selected_group_items": [
{
"id": "<group_item_id>",
"quantity": 1
},
{
"id": "<other_group_item_id>",
"quantity": 3
}
],
"organization_sender_user_id": "<org_user_sender_id>",
"organization_receiver_user_id": "<org_user_receiver_id>",
"status": "active",
"payment_method": "bank_transfer",
"currency": "EUR",
"start_at": "2026-11-01",
"is_email_notifications_active": true
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// The package supplies the phases and the line items, so none are sent here.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/from-billing-package` , {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// attach a SUBSCRIPTION package, it defines the phases & line items
organization_billing_package_id: "<billing_package_id>",
// optional: pick the cadence variant; omit to use the package default
organization_billing_package_subscription_term_id: "<subscription_term_id>",
// optional: choose which package group items (and quantities) to include
selected_group_items: [
{ id: "<group_item_id>", quantity: 1 },
{ id: "<other_group_item_id>", quantity: 3 },
],
organization_sender_user_id: "<org_user_sender_id>",
organization_receiver_user_id: "<org_user_receiver_id>",
// pending | active
status: "active",
payment_method: "bank_transfer",
currency: "EUR",
start_at: "2026-11-01",
is_email_notifications_active: true,
}),
}).then((response) => response.json());Update metadata (name, notes, notification settings, self-service toggles) and drive the lifecycle by moving status: pause an active schedule, resume a paused one, or set it to cancel. Send only what you want to change.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id> # to change WHAT gets billed on a package-managed schedule,
# use /reconfigure below rather than editing here.
curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"status": "paused",
"note_lang_map": {
"en": "Paused at customer request."
},
"is_email_notifications_active": false,
"customer_can_cancel": true
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
// to change WHAT gets billed on a package-managed schedule,
// use /reconfigure below rather than editing here.
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}` , {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
},
body: JSON.stringify({
// lifecycle: active <-> paused; set "cancelling" to stop at the end of the cycle
status: "paused",
note_lang_map: { en: "Paused at customer request." },
is_email_notifications_active: false,
customer_can_cancel: true,
}),
}).then((response) => response.json());Change what a package-managed schedule bills: swap the package, change the term, adjust selected items and quantities, override prices, or add one-off custom line items. Always preview first: the preview endpoint returns the resulting composition and any proration before a cent is charged.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id>/preview-reconfigure +1# 1. Preview, no changes are applied; returns the new composition + proration
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>/preview-reconfigure' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_billing_package_id": "<billing_package_id>",
"organization_billing_package_subscription_term_id": "<subscription_term_id>",
"selected_group_items": [
{
"id": "<group_item_id>",
"quantity": 2,
"price_override": 39,
"pricing_currency": "EUR"
}
],
"custom_line_items": [
{
"name_lang_map": {
"en": "One-off setup"
},
"quantity": 1,
"price": 150
}
],
"proration_mode": "prorate_next_invoice"
}'
# 2. Apply
curl -X PUT 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>/reconfigure' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"organization_billing_package_id": "<billing_package_id>",
"organization_billing_package_subscription_term_id": "<subscription_term_id>",
"selected_group_items": [
{
"id": "<group_item_id>",
"quantity": 2,
"price_override": 39,
"pricing_currency": "EUR"
}
],
"custom_line_items": [
{
"name_lang_map": {
"en": "One-off setup"
},
"quantity": 1,
"price": 150
}
],
"proration_mode": "prorate_next_invoice"
}'const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
const headers = {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
"Content-Type": "application/json" ,
};
// 1. Preview, no changes are applied; returns the new composition + proration
const result1 = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}/preview-reconfigure` , {
method: "POST",
headers,
body: JSON.stringify({
organization_billing_package_id: "<billing_package_id>",
organization_billing_package_subscription_term_id: "<subscription_term_id>",
selected_group_items: [
// price_override + pricing_currency let you deviate from the package price
{
id: "<group_item_id>",
quantity: 2,
price_override: 39,
pricing_currency: "EUR",
},
],
custom_line_items: [{ name_lang_map: { en: "One-off setup" }, quantity: 1, price: 150 }],
// how the switch is billed: none | prorate_immediately | prorate_next_invoice
// (prorate_immediately requires an active schedule)
proration_mode: "prorate_next_invoice",
}),
}).then((response) => response.json());
// 2. Apply
const result2 = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}/reconfigure` , {
method: "PUT",
headers,
body: JSON.stringify({
organization_billing_package_id: "<billing_package_id>",
organization_billing_package_subscription_term_id: "<subscription_term_id>",
selected_group_items: [
// price_override + pricing_currency let you deviate from the package price
{
id: "<group_item_id>",
quantity: 2,
price_override: 39,
pricing_currency: "EUR",
},
],
custom_line_items: [{ name_lang_map: { en: "One-off setup" }, quantity: 1, price: 150 }],
// how the switch is billed: none | prorate_immediately | prorate_next_invoice
// (prorate_immediately requires an active schedule)
proration_mode: "prorate_next_invoice",
}),
}).then((response) => response.json());Read aggregate recurring-revenue analytics across your schedules: a point-in-time summary (with forward projection) or a history_monthly breakdown, to power MRR dashboards without pulling every schedule yourself.
/organizations/<organization_id>/billing-schedules/analytics/summary # analyticsType: summary | history_monthly
curl -G 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/analytics/summary' \
--data-urlencode 'start_date=2026-01-01T00:00:00Z' \
--data-urlencode 'end_date=2026-12-31T23:59:59Z' \
--data-urlencode 'direction=outbound' \
--data-urlencode 'convert_to_currency=EUR' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const analyticsType = "summary";
// analyticsType: summary | history_monthly
const query = new URLSearchParams({
start_date: "2026-01-01T00:00:00Z",
end_date: "2026-12-31T23:59:59Z",
direction: "outbound",
convert_to_currency: "EUR",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/analytics/${analyticsType}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Soft-delete a schedule. Prefer setting status to cancelling (stops future billing at the end of the cycle) when you want to keep the record; delete when you want it gone. It can be restored later.
/organizations/<organization_id>/billing-schedules/<billing_schedule_id> # soft delete, restore via POST /billing-schedules/restore/{scheduleId}
curl -X DELETE 'https://api.enlivy.com/organizations/<organization_id>/billing-schedules/<billing_schedule_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const billingScheduleId = "<billing_schedule_id>";
// soft delete, restore via POST /billing-schedules/restore/{scheduleId}
const result = await fetch(`${baseUrl}/organizations/${organizationId}/billing-schedules/${billingScheduleId}` , {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Where it fits
Part of these setups
Each page follows one way of selling and shows what your client does, which features you use and what they cost.
- Agencies and studios Core Enlivy issues each installment and each maintenance invoice on its date, and charges the saved card. See the setup
- Course authors Core On every due date, Enlivy creates the invoice and charges the saved card. See the setup
- Monthly billing Core On each billing date, Enlivy creates each client's invoice and charges the saved card. See the setup
- Sales teams Optional Adds renewals. On each due date of a client's billing schedule, Enlivy issues the invoice, emails it and charges the saved card. See the setup
Works together with
- Invoices Issue an invoice and email it to your client. A card payment goes to your own Stripe account and the invoice is marked paid. A bank transfer you mark paid yourself.
- Receipts Record money in and money out, keep the payment file with each receipt, and let Enlivy issue the receipt when you mark an invoice paid with one of the payment methods you set for automatic receipts.
- Payslips Your accountant works out the figures, and you record each amount in Enlivy on its own line, under your country's payroll code. Enlivy checks that the lines match the payslip's totals.
- Users Clients, suppliers, and colleagues share one list in Enlivy. Open anyone's record to see what they owe you or you owe them, their documents, reports, and proposals, as far as your role allows.
- Contracts Write a contract, or let Enlivy draft it from your package's template when a client accepts your proposal. You send it, and your client signs online with an optional email or SMS code.
- Billing Packages Set up what you sell once, with its prices and billing cycles. Your clients order it from a proposal or your website. With the Billing Schedules pack, Enlivy invoices each cycle and charges the saved card.
- Slack Integration Stop checking dashboards to find out what changed. Enlivy brings important moments directly into Slack, from payments and proposals to Helpdesk conversations. Connect once, choose your events and route them to the right channels.
- MCP Connect Claude, ChatGPT, Cursor, or another MCP-compatible assistant to work with your invoices, contracts, and pipeline, within your own permissions.