All posts
Functional5 min read

Managing Service Contracts and Renewals in Odoo Sales

Set up Odoo service contracts with automatic renewal invoicing - tracking contract value, expiry dates, and renewal pipeline to maximize contract retention and recurring revenue.

Service Contracts and Renewals in Odoo#

Service contracts - maintenance agreements, support contracts, software licenses - require ongoing tracking, timely renewal invoicing, and renewal rate reporting. Odoo handles this through the Subscriptions or recurring Sales modules.

Option 1 - Odoo Subscriptions Module#

For true subscription-based contracts:

Apps → Subscriptions → install.

Creates a subscription record with:

  • Recurring Plan: monthly, annual
  • Renewal Date: auto-calculated from start date + plan period
  • MRR: monthly recurring revenue tracking

When the renewal date approaches, Odoo generates the renewal invoice automatically.

Option 2 - Recurring Sales Orders (Without Subscriptions)#

For simpler contract tracking without the full subscriptions module:

Sales → Configuration → Settings → enable Recurring Revenue.

On a sale order:

  • Recurring: Yes
  • Recurrence: Annual (or monthly)
  • Start Date: contract start
  • Next Renewal: auto-calculated

Recurring orders appear in the recurring revenue pipeline view.

Renewal Workflow#

90 days before renewal:

  1. An activity reminder is auto-created for the salesperson
  2. Salesperson contacts the customer to confirm renewal, discuss changes, or upsell
  3. If renewing: confirm the next period's sale order or subscription
  4. If not renewing: mark as lost with reason "contract not renewed"

Renewal Rate Reporting#

Subscriptions → Reporting → MRR Analysis (or Sales Recurring Revenue report):

  • Renewal Rate = (Renewed contracts / Expiring contracts) × 100
  • Track month-by-month renewal rate to spot churn trends
  • Group by salesperson, product, or customer segment

Contract Value Tracking#

Each contract/subscription tracks:

  • Contract Value (ACV): annual contract value
  • MRR: monthly equivalent
  • Remaining Value: months remaining × MRR

Use this to prioritize renewal effort on high-value contracts at risk.

Prorated Invoicing on Mid-Term Changes#

When a customer adds services mid-contract:

  1. Edit the contract/subscription → add the new product
  2. Odoo calculates the prorated charge from today to the contract anniversary
  3. A prorated invoice is generated immediately
  4. The full new amount is included in the next renewal invoice

Integration with CRM#

Link service contracts to CRM opportunities for renewal:

  1. Contract expiry triggers a new CRM opportunity: "Renewal - [Customer] - [Contract]"
  2. Assign to the account manager
  3. Track the renewal opportunity through the normal pipeline
  4. Won = contract renewed; Lost = churned

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free