How do I build a revenue recognition model for annual contracts in Causal?

Hi All,

I want to transfer my revenue recognition model from Sheets to Causal and would like to hear thoughts from the community on best practices.


  • Our revenue is comprised of one year subscriptions recognized monthly by product.
  • We have over 1000 rows of contracts, which we then convert to a monthly revenue stream.
  • Today, I transfer the monthly recognition from Google Sheets to Causal. However, I believe there’s an opportunity to import our contract list into causal directly and perform the calculations there

Here’s an example of how our google sheet is set up today - the ‘monthly recognition’ variable is broken out by product type in a different sheet and uploaded into Causal


  1. Is Causal the best fit for this? Or am I using the wrong tool for the job? (Just because I ‘can’ doesn’t mean I should…)
  2. If this is a good fit for Causal, do you have any recommendations on how to set this up?
    a. I care about recognition on the ‘edges’ many of our contracts span 13 months. Example - Contract starts on 1/15/22 → revenue should be recognized Jan to Jan not Jan to Dec.
    b. In other words, 15 days of revenue should be recognized in Jan 2022 and Jan 2023.
  3. Does anyone have a template they can share with a similar setup? Happy to start there!

I think this potentially a good use case for cohort modeling, but I haven’t dug into that feature enough to decide one way or the other.

Thanks all.

Hey @Chris_Williams,

Thanks for your question - Causal is absolutely a great fit for your use case!

I have set up a public template here which you can clone and use for this purpose. See my guidance below:

For your use case the best approach is to set up a daily model, creating a Contract Category where each Contract is a category item below it. Each Contract has a Product category item mapped to it as well as three variables; Total Subscription, Sub Start Date and Sub End Date. Your Data table should look something like this:

Now with the data in this structure, you can create a formula like the below which will recognise revenue in each period between the two input dates.

This is the advantage of using a daily model, Causal can recognise the difference in days and precisely calculate the revenue per day per contract.

(Note that soon we will be releasing a feature where you won’t have to create a separate model for this and you can do the calc in a monthly model but for now this is the best way)

You can also then group this variable by Product if you wanted to look at the revenue earned by product.


Now you can create a linked model where you can import the variables from the first model and start doing the monthly calculations necessary for working capital.

Total Invoicing will be

Cash Invoiced for Deferred Revenue and Accounts Receivable will be the same as the above Total Invoicing variable.

Revenue Recognition will be linked to the variable we created in the first model and Causal will automatically aggregate up the days into months for us!

The only thing remaining is Cash Received in the Account Receivable which will be down to your assumptions - for this template I created a Payment Delay in Months variable which I applied to the Total Invoicing Variable to calculate when the cash will be received.

The rest of the variables in the template are checks to make sure that the working capital calcs are working correctly.

Hopefully this helps, please let me know if you have any further questions :slight_smile:

Thanks so much!

I’m still digging into the work capital calcs, but the revenue recognition model works well for me. The only issue so far is my model is running slowly. Any tips on how I can improve performance?

Everytime I change a category name or similar, the model has to reload which can take awhile.

~1200 contracts means quite a few categories. There may be a better way for me to do this, but I’m happy with things for now. This will be a HUGE time saver for me…goodbye spreadsheet.

This is useful - thanks.

Do you have an eta for the new feature you are developing for this? Deciding if better to wait or follow this method!

This will be at least 3-6 months away, so I’d say go ahead with Sanjeev’s method for now :slight_smile: