Thank you very much for this post, explains the CLV clearly. Nevertheless, I think the at the definitions at beginning of the article are **not 100% accurate**:

Frequency represents the number of repeat purchases the customer has made. This means that it’s one less than the total number of purchases.

In the source code of the library here, it is expressed as “customers’ purchases” not “customers’ repeated purchases”. It’s minor difference anyway, in your case you assume each user made one purchase less. However, I think the recency definitions is the one needs to be checked.

Recency represents the age of the customer when they made their most recent purchases. This is equal to the duration between a customer’s first purchase and their latest purchase.

Well, again in the library’s source code, the recency is defined as the vector of customers’ purchases (denoted t_x in literature). And if I check the Peter S. Fader’s paper here, tx is defined as follows:

.. his “recency” (when his last transaction occurred) and “frequency” (how many transactions he made in a specified time period). The notation used to represent this information is (X = x, tx, T), where x is the number of transactions observed in the time period (0, T] and tx (0 < tx ≤ T) is the time of the last transaction.

I.e. the recency should be the time since the beginning of the period till the customer’s last purchase.