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
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
- Clients
- 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.
- Select clientsThe one to keep and the one to remove.
- Resolve conflictsPick the value to keep per differing field.
- Review dataSee what moves; settle contact and flag conflicts.
- Confirm mergeGive a reason and type the removed name. Cannot be undone.
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
- Clients
- open the client
- actions menu
- 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
- Subscriptions
- open a subscription
- actions menu
- 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:
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.
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
- Finance
- Import
- Transaction Import
- 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:
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
- Finance
- 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.