> For the complete documentation index, see [llms.txt](https://docs.rillet.com/EjmEP4KZ9BVp9j2ho4Mh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rillet.com/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/contracts/set-up-and-track-milestone-based-revenue.md).

# Set Up and Track Milestone-Based Revenue

Milestone-based revenue recognition in **Rillet** lets you recognize revenue as work is completed instead of spreading it over time, which suits implementation projects, professional services, and other milestone-driven contracts. You split a product's price into milestones, add the product to a contract, and enter a completed date for each milestone as it is achieved. The **Milestone Tracking** report then shows every milestone across your contracts and its status.

### Before You Begin

Some of these steps are already covered in other articles. Use this table to see which steps to follow first and which section of this guide comes next.

| **If You Want To**                                    | **Follow These Steps**                                                                                                                                                                                                            | **Then Go To**                                                                                                                                                                              |
| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Create a product that recognizes revenue by milestone | Steps 1 to 7 in [**Create a New Product**](/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/products/create-a-new-product.md), choosing **Milestones** as the **Revenue Pattern** in step 5 and **One-time** under **Pricing** in step 7 | [**Set Up a Milestone Plan on a Product**](#set-up-a-milestone-plan-on-a-product)                                                                                                           |
| Add the milestone product to a contract               | Steps 1 to 12 in [**Add a Contract**](/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/contracts/add-a-contract.md), adding the milestone product in steps 5 to 7                                                                        | [**Set Up Milestones on a Contract**](#set-up-milestones-on-a-contract), then steps 14 to 16 in [**Add a Contract**](/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/contracts/add-a-contract.md) |

### Set Up a Milestone Plan on a Product

Follow these steps to split the product's price into milestones before you create the product:

1. Choose **%** or **$** in the **Milestone plan** section to split the price by percentage or by dollar amount.
2. Enter a name and a value for the first milestone, and check the **Key** that Rillet fills in from the name, since each milestone needs both a name and a key.
3. **(Optional):** Click **Add milestone** for each additional milestone, then enter its name and value.
4. **(Optional):** Select the checkbox under **Expected date offset** and enter a number of days, months, or years to set the milestone's expected date from the line item's start date on each contract.
5. Confirm that the message below the table shows the full 100%, then click **Create Product**.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FR2pQ2tuSaB3m3opPQyjJ%2Fimage.png?alt=media&amp;token=d449427c-8a0a-4224-8207-b43ab37f1d09" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$info;">**Note:**</mark>

Changes to a milestone plan apply only to new contracts, and the order of the milestones is only for display, so you can complete them in any order. The value you enter commits when you leave the field, and the message below the table updates to show how much of 100% is assigned, such as **50% of 100% - 50% missing**. Use the arrows in each row to reorder milestones, the trash icon to remove one, or **Reset milestone plan** to start over.
{% endhint %}

Rillet adds the product to the **Products** list as a one-time product, and the product page shows its **Default milestone plan**.

### Set Up Milestones on a Contract

Complete these steps to set up the milestones before you confirm the contract:

1. Go to the **Revenue** step and edit the names or values in the **Milestone plan** until the total reaches 100%.
2. **(Optional):** Click **Add milestone** for each additional milestone, then enter its name and value.
3. **(Optional):** Enter an **Expected date** for each milestone to place it in the milestone plan, or a **Completed date** for any milestone already achieved, which locks that row and books its revenue when the contract is created.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FZHty2sVtdtwpPmR3TipE%2Fimage.png?alt=media&amp;token=ad8fa39a-5c24-44a1-a81c-3e4d3f7d85ed" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$info;">**Note:**</mark>

The **Expected date** does not book revenue. It only places the milestone in the milestone plan and in the **Milestone Tracking** report.
{% endhint %}

After you confirm the contract, its **Revenue** tab, next to the **Overview** and **Invoices** tabs, lists each milestone with its **Status**, **Expected date**, **Completed date**, **Expected revenue**, and **Completed revenue**, and a footer that totals **Completed**, **Planned**, **Unplanned**, and **Allocated**. When milestones are overdue, a banner such as **2 milestones overdue** appears with a **Review milestones** link.

### Complete a Milestone

Take these steps to record that a milestone was achieved and recognize its revenue:

1. Open the contract and go to its **Revenue** tab
2. Click **Complete** on the milestone's row.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FMM5NUGVIzRHyKHHlMAJ7%2Fimage.png?alt=media&amp;token=c5c183a5-b51c-4560-9a41-d3c988be277c" alt=""><figcaption></figcaption></figure>
3. Enter the **Completed date** in the **Complete milestone** panel, which sets the date Rillet books the revenue.
4. **(Optional):** Add a **Memo**, attach **Evidence** in PDF, CSV, Excel (.xlsx), PNG, or JPEG format, or add **External references**.
5. Review the line that shows the amount and month Rillet will recognize, such as **Recognizes $50.00 in Oct 2026**, then click **Mark complete**.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FOiw5MwSJoVNC21DBjXTW%2Fimage.png?alt=media&amp;token=6a73a8f0-cc57-45b7-97ae-d79064509767" alt=""><figcaption></figcaption></figure>

Rillet books a journal entry on the **Completed date** that moves the milestone amount from **Deferred Revenue** to the product's **Revenue Account**, and the milestone status changes to **Completed**, with **Correct** and **Reverse** replacing the **Complete** button.

### Correct or Reverse a Completed Milestone

Use these steps to change the date of a completed milestone:

1. Click **Correct** on the completed milestone's row to open the **Correct completion** dialog, which shows the completion date and the amount Rillet recognized.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FAiHqSvoKXi6qxasA9bug%2Fimage.png?alt=media&amp;token=b5d20f7a-a685-4016-abb9-c37550813cbd" alt=""><figcaption></figcaption></figure>
2. Enter the new **Completed date**.
3. Click **Save correction**, which becomes available once you change the date, so the revenue is booked on the new date.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FQtOcGEuXiT4KpKfypdF3%2Fimage.png?alt=media&amp;token=6c7e4fed-e0bb-4b1e-8d23-49b5a54a3a2f" alt=""><figcaption></figcaption></figure>

### Reverse a Completed Milestone

Follow these steps to undo the completion of a milestone:

1. Click **Reverse** on the completed milestone's row.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FpZTYnjTuvwQzluItOuu0%2Fimage.png?alt=media&amp;token=d0224767-5f46-4e6e-b3eb-5839c3ccb99c" alt=""><figcaption></figcaption></figure>
2. Select **Clear completion** to confirm.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2Fk1M7t2NiJfB8VWe8UN6z%2Fimage.png?alt=media&amp;token=c35897ef-3e74-456d-a407-09f414dfa949" alt=""><figcaption></figcaption></figure>

Rillet clears the completed date, returns the milestone to **Open**, and recomputes the revenue schedule to remove the amount it had recognized.

### Cancel a Milestone

Perform these steps to cancel a milestone that will not happen and credit its amount:

{% hint style="warning" %} <mark style="color:$warning;">**Warning:**</mark>

Canceling a milestone cannot be reversed. Rillet permanently locks the milestone, and you cannot edit, complete, reopen, or delete it afterward. Other milestones stay editable.
{% endhint %}

1. Click **Mark cancelled** on the milestone's row.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FfrSQ6vXtR77Sjce01JQ4%2Fimage.png?alt=media&amp;token=8f8cc5db-ee0b-4272-9491-db840d58781c" alt=""><figcaption></figcaption></figure>
2. Enter the **Effective date**, which Rillet uses for the milestone, the credit memo, and the journal entry.
3. Select **Mark cancelled** in the **Mark milestone cancelled** dialog to confirm.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FhykaaRhK7k9o5eWANyPE%2Fimage.png?alt=media&amp;token=641f1271-b1e3-41fa-b040-9962cd31aa40" alt=""><figcaption></figcaption></figure>

Rillet creates an unapplied credit memo for the milestone's amount, including applicable taxes, and the **Revenue** tab shows the row as canceled and permanently locked, with a **View credit memo** link and a **Credited (cancelled)** total in the footer.

### Review the Milestone Tracking Report

Follow these steps to open the report and narrow the results to the milestones you want to review:

1. Go to **Reporting** and select **Milestone Tracking** under **Close Reports**.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FxLg9xBbHELdNBf5sjTcI%2Fimage.png?alt=media&amp;token=241cdc1c-3479-43b3-8400-5e253132dd27" alt=""><figcaption></figcaption></figure>
2. Narrow the results with the **Customer**, **Milestone**, **Status**, **Product**, **Value mode**, **Expected date**, and **Completed date** filters.
3. Set the **Monthly revenue** range to choose the months the table shows.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FNsfPQUF37p1erm4yb7nn%2Fimage.png?alt=media&amp;token=6e715bec-dc47-42e1-8aa5-cd481203ebc9" alt=""><figcaption></figcaption></figure>
4. Review the tiles at the top and the table below them.

   <figure><img src="https://612265232-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNpXFVFZpTQck3vIrjmHB%2Fuploads%2FSgNxYVkddkFHoRJA91Z7%2Fimage.png?alt=media&amp;token=275f8286-3344-4034-b555-211d0cc9eff7" alt=""><figcaption></figcaption></figure>

The tiles summarize the milestones that match your filters.

| **Tile**                   | **What It Shows**                                                                |
| -------------------------- | -------------------------------------------------------------------------------- |
| **Total Allocated**        | The total amount assigned to milestones, with the number of milestones achieved. |
| **Credited Allocation**    | The amount removed by canceled milestones.                                       |
| **Recognized to Date**     | The revenue already recognized.                                                  |
| **Remaining Unrecognized** | The amount not yet recognized.                                                   |
| **Overdue**                | Milestones whose expected date has passed or whose contract has ended.           |
| **Undated**                | Milestones with no expected date, which may also be overdue.                     |
| **Past Term, Unachieved**  | Milestones on contracts whose term has ended.                                    |
| **Forecast Next Period**   | The amount expected in the next period, with no journal entry yet.               |

Each milestone has one of these statuses.

| **Status**          | **Meaning**                                                                   |
| ------------------- | ----------------------------------------------------------------------------- |
| **Open**            | The milestone is not completed, canceled, due this period, or overdue.        |
| **Due this period** | The expected date falls in the current month.                                 |
| **Overdue**         | The expected date has passed, or the contract ended without a completed date. |
| **Completed**       | The milestone has a completed date.                                           |
| **Cancelled**       | The milestone was canceled and credited.                                      |

{% hint style="info" %} <mark style="color:$info;">**Note:**</mark>

A milestone can meet more than one condition, so the totals in the **Overdue**, **Undated**, and **Past Term, Unachieved** tiles can overlap and should not be added together. Revenue counts as recognized only from posted journal entries, and forecast amounts appear in italics.
{% endhint %}

The report groups milestones by customer, contract, and product, with one column for each month in the **Monthly revenue** range.

### Frequently Asked Questions (FAQ)

<details>

<summary>Can I use recurring pricing with a milestone product?</summary>

Milestone products use one-time pricing, so Rillet offers only the **One-time** option once you choose **Milestones** as the **Revenue Pattern**.

</details>

<details>

<summary>Does a completed date in the future recognize revenue right away?</summary>

Rillet books the journal entry on the completed date you enter. With a future date, the milestone shows as **Completed** in the **Milestone Tracking** report, but **Recognized to Date** counts the amount only once that date arrives.

</details>

<details>

<summary>What happens to the contract total when I cancel a milestone?</summary>

The canceled milestone's amount is credited, and the contract's **Total Value** in the contracts list decreases by that amount.

</details>

<details>

<summary>Do changes to a product's milestone plan update existing contracts?</summary>

Changes to a milestone plan apply only to new contracts. Existing contracts keep the plan they were created with.

</details>

<details>

<summary>Can I create milestone products from a CSV file or through the API?</summary>

Rillet supports creating milestone products from a CSV file and through the API, and adding milestone products to contracts through the API. To import a CSV file, go to **Accounts Receivable > Products**, click the **three dots** (•••), and select **Import products**, which creates up to 1,000 new products at once and creates none of them if any row has an error.

</details>

### See Also

To learn more about revenue recognition and contracts in **Rillet**, review these articles:

* [**Create a New Product**](/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/products/create-a-new-product.md)
* [**Add a Contract**](/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/contracts/add-a-contract.md)
* [**Managing Contracts**](/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/contracts/managing-contracts.md)
* [**Close Reports**](/EjmEP4KZ9BVp9j2ho4Mh/reporting/close-reports.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.rillet.com/EjmEP4KZ9BVp9j2ho4Mh/accounts-receivable/contracts/set-up-and-track-milestone-based-revenue.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
