Revvly
Docs
Guide

Merge, delete and undo.

How to clean up duplicate clients, remove records created by mistake, roll back a bad import, bring in invoice history from a spreadsheet, and settle invoices that two sources disagree about. Most of these cannot be undone, so each section says what is removed.

01Pick the right tool

Two records for one customer
Merge the duplicate into the one you keep (section 02). Irreversible.
A client that should not exist
Delete the client (section 03). Irreversible, and it removes the invoices too.
A subscription created by mistake
Delete the subscription and choose what happens to its invoices (section 04). For a normal ending, end the subscription instead.
A whole import that went wrong
Roll back the import batch (section 05). This is an API call, not a dashboard button.
Two sources disagree about one invoice
Resolve the discrepancy (section 07).

None of the actions below asks for an admin role. They need you to be signed in to the workspace. Importing invoices from Google Drive or a CSV is covered in Import your invoice history.

02Merge two clients

Where
  1. Clients
  2. Merge clients

Or open the client to remove, use the actions menu and choose Merge. A company record has the same menu item.

The merge is a four-step wizard. Select clients: search for the client to keep (Keep, Target) and the one to remove (Remove, Source). They cannot be the same. Resolve conflicts: pick the value to keep for each field that differs. Review data: see how many subscriptions, contacts, invoices and other records will move, and settle contact and feature flag conflicts. Confirm merge: give a reason (up to 500 characters) and type the removed client’s name exactly. The merge cannot be undone.

The merge wizard
  1. Select clients
    The one to keep and the one to remove.
  2. Resolve conflicts
    Pick the value to keep per differing field.
  3. Review data
    See what moves; settle contact and flag conflicts.
  4. Confirm merge
    Give a reason and type the removed name. Cannot be undone.
Three steps are reversible while you work; the last one is not.
Moved to the kept client
Subscriptions, invoices, contacts, emails, payment reminders, pricing rules, renewal actions, feature flags and their history, contracts, and the lifecycle, version, price override and billing timing history of those subscriptions.
Field conflicts
You choose per field, source or target, for Name, Description, Billing Address, Tax ID, Invoice Prefix, Payment Terms (days), Region, Linked Tenant and Incubator ID. Fields that already match are not listed.
Contact conflicts
Contacts with the same email on both clients. You pick which one to keep and whether to combine their labels. The other is deleted.
Feature flag conflicts
A flag set on both clients. You choose whether it stays on or off.
Carried over when the kept client has none
Invoice prefix, external id and Google Drive folder. The removed client’s invoices keep their numbers.
Not moved
The merge does not move CRM notes, documents or meetings. They go with the removed client, so copy anything you need first.

Learned aliases. After the merge, the removed client’s name is stored as an alias of the one you kept, and any aliases it already had are moved across. Later imports that carry the old name land on the kept client, checked right after external id and invoice prefix. Recording the alias never makes the merge fail.

03Delete a client

Where
  1. Clients
  2. open the client
  3. actions menu
  4. Delete

Give a reason and type the client’s name to confirm. There is no soft delete, and a client with active subscriptions can be deleted. Revvly removes the client’s CRM data first, then its subscriptions and their usage, usage events, expansions, lifecycle events, subscription-level prices and API key scopes, then its invoices, pricing rules, renewal actions, contacts, feature flags, emails, payment reminders and contracts, and finally the client. Pipelines are workspace settings and are not touched. A client created in the master workspace may own a linked workspace; that is cleaned up too, conservatively, so the name can be reused.

Invoices are deleted outright, with no void step. If the client has real billing history, prefer ending its subscriptions.

04Delete a subscription

Where
  1. Subscriptions
  2. open a subscription
  3. actions menu
  4. Delete

To end a live subscription normally, use End subscription in the same menu.

This is for mistakes such as the wrong client or test data. The subscription is removed with its usage counters and events, expansions, renewal actions, subscription-level prices and API key scopes, and its lifecycle events, so it no longer appears in past MRR. Billing-period snapshots and the usage audit trail are kept. The modal asks what to do with Related invoices:

Leave invoices unchanged
The default. The invoices stay as they are.
Void invoices
Marks every invoice of the subscription Cancelled and keeps the record for audit. That includes invoices already paid, so use credit notes where money was collected.
Delete invoices permanently
Removes the invoices and their lines. Use only to correct a mistake.

05Roll back an import batch

Every transaction import, subscription import and Google Drive commit is recorded as a batch, and everything it creates is stamped with the batch id. Rolling back is available only through the GraphQL API as rollbackImportBatch(batchId). The dashboard has no screen for it and does not display the batch id; the id is returned as importBatchId in the result of the import call.

Deleted
The clients, subscriptions and invoices that batch created, with their lifecycle events and their version, price override and billing timing history.
Never touched
Anything that existed before, or that the batch only matched or extended. A created client is removed only if it has no other subscriptions or invoices by then.
Put back
A pre-existing invoice the batch linked to a subscription it created is unlinked, so it returns to the Unmatched tab.
Repeat
A batch can be rolled back once. A second call is refused.
Result
Counts for invoices deleted and unlinked, subscriptions, clients, lifecycle events and history records.

Contacts and companies imports are different: the CRM import page keeps a batch history, and opening a batch offers Revert batch in the dashboard.

06Import invoice lines from a spreadsheet

Where
  1. Finance
  2. Import
  3. Transaction Import
  4. Start Import

The same hub is under Settings, Import. No feature flag is needed.

Use it when you have invoice-level rows. It creates clients that are missing, creates or extends subscriptions from the billing periods, and creates the invoices with their payment status and dates. The wizard has six steps:

1. Upload File
CSV, XLS or XLSX, up to 10 MB.
2. Map Columns
The columns are read by AI and suggested; a banner says whether AI or the built-in rules did it. Client Name, Amount and Invoice Date are required. Optional: Contact Email, Invoice Number, Currency, Due Date, Expected Payment Date, Payment Date, Payment Status, Period Start and End Date, Description, Notes, Region. A switch identifies clients by invoice prefix instead of name.
3. Preview
Per-row validation: missing values, bad amounts, bad dates and a negative amount warning.
4. Analysis
Clients to create and to update, potential duplicates, active versus expired subscriptions, and the billing periods inferred. Blocking issues must be fixed; warnings must be reviewed or dismissed. Export CSV saves the issue list.
5. Plan
Optionally apply one bundle or set of modules to every subscription. Skip it and the product is matched per row.
6. Complete
Counts imported and failed, with the error for each failed row, and how many existing invoices were marked paid from their payment date.

Period inference. A row with no period end gets a period (monthly, quarterly or yearly) read from its description by AI, for example “Annual maintenance” or “Q1 service fee”, with keyword rules as the fallback. Repeated descriptions are cached.

Product inference. Without a bundle or modules on the row or in the Plan step, each subscription is matched to your catalog: first a stored answer, then a learned rule, then AI. If nothing fits it is marked unmatched for you to assign.

Settling invoices already in Revvly. When a row names an invoice Revvly already holds, such as one imported from a PDF or a client folder without a payment date, and carries a Payment Date, the import records the payment on that invoice. A part payment books only what is missing, and importing the same file again records nothing twice. A row marked Paid with no payment date leaves the invoice unpaid. Invoice files from client folders in Google Drive, and email attachments marked Invoice, go through the Google Drive import review instead.

What it learns. The import reads two memories. Client aliases come from merges and from corrections made in the Google Drive review queue. Product rules are saved when a reviewer there moves an invoice to another product, keyed on the normalised description, so the same wording matches next time without AI. A one-time answer, or a save that leaves the product unchanged, writes no rule. Rows are processed oldest period first, so the result does not depend on how the file is sorted. Undo with section 05.

07Review invoice discrepancies

Where
  1. Finance
  2. Discrepancies

The tab badge counts pending items.

When the same invoice number arrives from a second source, such as a spreadsheet import or a Drive re-sync, Revvly does not overwrite it. It compares number, subscription, client, amount, currency, invoice date, due date, expected payment date, payment terms, type and notes, and records a discrepancy. Payment status and payment date are ignored.

Single
Open a row to see both sides. Conflicting fields have a choice per field, defaulting to Source 1, which is the PDF for Drive invoices. Resolve writes only the chosen values for the conflicting fields.
Bulk
Accept All PDF Values resolves every pending discrepancy with Source 1. The API also accepts Source 2. It applies to all pending items at once, so clear any you want to decide by hand first.
Failures
In a bulk run, a discrepancy whose invoice is gone or has no applicable field is reported and left pending.