Contract·Intermediate·10 min·Updated 2026-10-13
Indexing renewals without code: the Renew flow we should have built first
Applying a published index to renewals in Revenue Cloud, starting from the native asset-button flow. The flow, the renewal term that produced twelve years, and what the flow cannot do on its own.
How claims are labelled
Scroll the diagram sideways
An amendment is a new transaction read against current asset state, not an edit of the old one. That is why the asset state periods matter: they are what lets the system say what the customer held on the day the change takes effect, and therefore what the billing delta should be.
Revenue Cloud can carry an uplift rate on an asset, and the native renewal copies it onto the quote line. Terrain What is left is to put the right rate, at the right moment, on the right products. That is the whole job.
First version: a separate button, and a bad idea
We first built a “Prepare renewal” button on the contract: it read the index, set the rate on the assets, and the user then launched the native renewal.
The team never used it. Users click Renew, not a preparatory button. The right place for an automation is the button they already use — not one more button next to it. Recommandé
Start from the native asset-button flow
The Amend, Renew, Cancel and Swap buttons on assets are not hard-coded. They launch a flow, selected in the Revenue Cloud settings. By default that is a managed flow: not editable, not retrievable. Terrain
You clone it from the template Salesforce provides, and extend it. The price is worth knowing before you start: you become the owner of the flow, and you stop receiving the improvements Salesforce makes to the standard one. To be re-read at every release. Recommandé, with eyes open.
- 1Amend, Renew, Cancel. These buttons are not hard-coded: they launch a flow, and that flow can be replaced.
- 2The renewal term and its unit. Without them the native renewal refuses the asset.
- 3One asset per product held, with its lifecycle dates. This is the inventory everything else reads from.
Screenshot of a Revenue Cloud demo org, Winter ’27. Sample data, no customer.
What the flow does
On the Renew action, after the term screen:
- It reads the account’s index. The account carries a reference to an index, and published values are stored by month.
- It takes the latest published value and computes the rate. The index being stored
as a coefficient — 1.0158 — the rate is
(coefficient − 1) × 100, so 1.58%. - It shows a second screen. With the rate and one question: “Apply this uplift to the renewal?” Yes is pre-selected: we want the uplift to be the rule and the exception to require a gesture. Recommandé
- It sets the rate on the assets of indexed products only. A checkbox on the product says whether its renewal follows the index or list price.
- It launches the native renewal. Which copies the rate onto the quote lines.
The rep can still correct the rate by hand on the quote, to apply a negotiated figure for instance. The automation proposes; it does not lock.
The flow that renewed for twelve years
The native renewal refuses any asset without a renewal term: “All assets in a request must have values for RenewalTermUnit and RenewalTerm.” Both fields exist on the asset only, and nothing fills them. Terrain
So we added a before-save flow on the asset, deriving the term from the lifecycle dates. First version: the term in months, so 12 months for an annual subscription.
The renewal came out over twelve years. The engine reads the renewal term in the unit of the line’s selling model: 12 on an annual model means twelve years. Terrain
Fix: a whole number of years is written in years, otherwise in months. Plus a correction pass over the assets already filled wrongly — otherwise the first renewal of the year goes out over a decade.
What the flow cannot do on its own
The rate was on the line. The renewed price did not move. It even came out at list price, with no bundle discount and included components charged.
That is not the flow. It is the pricing procedure, which excluded renewal lines from several groups and rewrote their price at the end of the calculation. That is the subject of Renewal at list price. Without that fix, the flow sets a rate nobody applies.
Which is the most useful lesson of the exercise: a renewal automation is tested against an amount, not against a field. Checking that the rate was set proves nothing.
The small traps of a cloned flow
- A broken field in the clone. A Get Records was storing a related product field, which a Get Records cannot do. The field became an unresolvable reference and the version could no longer be activated. We store the product id and let the decision read the field through it. Terrain
- The saved version is not necessarily the active one. A failed save creates a more recent invalid draft. A retrieve pulls the latest version, not the active one, and that is what would ship. Terrain
- A flow deployed to production arrives as a draft. It has to be activated by hand, and the Revenue Cloud settings have to be checked to make sure they point at the clone, not at the managed flow.
- 1The quantity held today, after every amendment.
- 2The monthly recurring revenue carried by this one asset.
- 3The history: every amendment leaves a point on the curve.
Screenshot of a Revenue Cloud demo org, Winter ’27. Sample data, no customer.
What it costs
- A flow to maintain. In place of the standard one, to be re-read at every release.
- An index data model: The index per account, and its published values by month.
- A business decision: Latest published value, or the value of the anniversary month? We took the latest published, editable by hand. Recommandé
Salesforce components
Select one to open its detail.
What this is based on
- The native renewal copying the asset uplift onto the quote line is observed in production, not found in the documentation.
- Reading the renewal term in the unit of the selling model is observed on annual models. Verify for other frequencies.
- The flow selection in Revenue Cloud settings was not exposed in metadata on our org: it is set by hand in every environment, and it is easy to forget.
- Observed on an org running Summer ’26 / Winter ’27.

