Revenue recognition: policy, point in time vs over time, and revenue runs
Each set of books carries an effective-dated revenue policy (framework, method, possession trigger, cost and brokerage treatments, judgement areas) chosen by the CA; a revenue run is the period close that computes every booking's and member offer's progress under it, recognises the catch-up revenue, cost of sales and brokerage, and posts the journals.
Revenue recognition: policy, point in time vs over time, and revenue runs
Revenue recognition is the accounting question "when has this sale been earned?". For a developer the answer is either when the buyer gets control of the flat (point in time) or gradually as it is built (over time), under rules that differ between Ind AS 115 and the ICAI Guidance Note. In NirmaanOne every one of those judgements is a setting on the promoter's books, the revenue policy, and a revenue run is the period close that applies the policy to every booking and member offer and posts the result.
How it works in NirmaanOne
The revenue policy
Each set of books has at least one policy row; a new set starts with the default row dated its books begin date. The tab Revenue policy on the books (the View permission on Revenue Recognition to see it; the Approve permission to change it) lists the rows with In force, Upcoming or Locked badges. The row in force on a date is the latest one dated on or before it, so a change is made with New policy from a date, never by rewriting history: a row that a posted run has used is Locked ("A posted revenue run has used this policy, so it stays as it is. To change the policy, add a new one from a later date."), and the last row can never be deleted. Demands issued, commissions approved and runs with a period end on or after the date follow the new row.
The settings, with their defaults:
- Framework: Ind AS 115 (default; listed companies and companies with net worth of ₹250 crore or more), AS (Guidance Note 2012) (firms, LLPs and smaller companies) or Revenue on billing (no deferral: every demand is revenue when issued; a run recognises nothing for bookings or offers and only moves costs into inventory).
- Method: Point in time (default), Over time (stages achieved) or Over time (cost incurred); Progress measured per Tower (default) or Project.
- Point in time: Recognise on Possession offered, Possession handed over (default), Deemed handed over with Days after the offer (default 15), or Conveyance registered; toggle Occupation certificate required (default on).
- Over time: under the Guidance Note the three thresholds Cost incurred at least (%) 25, Area sold at least (%) 25 and Realised per contract at least (%) 10; toggle Count land and development rights in the cost measure (off).
- Costs: Costs into inventory Periodic, Cost of sales shared by By area, Rehab costs (rent, corpus, shifting, PAP) Capitalise, Borrowing costs Capitalise, Onerous contracts Provide (default) or Flag only, and the toggle Completed units to their own inventory (on) (see Cost of sales).
- Brokerage and cancellation: Brokerage and other costs of obtaining a contract Capitalise, with Expense directly when possession is within (months) 12 (see Contract acquisition costs); Cancelling after revenue is recognised Not allowed (default) or Sales return.
- Judgement areas: Significant financing component (off) and Rehab units as revenue (non-cash consideration) (off).
Two of them, the method and the trigger, are resolved in three levels. The organization can set a default for every project on the Projects card under Settings > Organization, section Revenue recognition (Revenue method and Recognise revenue on, "Books' revenue policy" unless set). A project can override both under Accounting on its Settings tab ("Override for this project only, e.g. a commercial tower sold over time."); the hint under each field names the value in force and where it comes from, for example "Blank = Point in time (the promoter's books policy)." With nothing set on the project or the organization, this policy decides.
Point in time: the possession trigger and the OC
A booking's progress is 0% until the trigger date and 100% from then on. The dates are recorded on the booking's Possession card (Offer possession, Hand over, Register conveyance); under Deemed handed over the control date is the earlier of the actual handover and the offer date plus the policy's days. With Occupation certificate required the tower's OC date (else the project's) must be on or before the trigger date, otherwise the line notes "No occupation certificate on or before the trigger date"; the office cannot even offer possession without an OC ("Record the occupation certificate on the tower or the project first"). A booking still waiting shows "Waiting for: possession handed over" (or the trigger chosen); a cancelled one "Cancelled". Handover also sets the unit Sold, and once a run has recognised a booking its possession dates are locked ("Revenue on this booking is already recognised; its possession dates stay as posted").
A member offer under point in time follows the bookings on its allotted units: 100% only when every one has passed the trigger (see Rehab units as non-cash consideration).
Over time: stages or cost
- Stages achieved: progress = the plan share of the construction stages achieved by the period end ÷ the total share of the bucket × 100, to four decimals. The bucket is the tower's own stages when it has any with a share, else the project-wide stages. The line notes "N of M stages achieved", or "No construction stages with a share".
- Cost incurred: progress = construction cost incurred ÷ the construction budget in force (both plus land when the toggle is on), capped between 0 and 100; the tower's budget when progress is per tower and it has one. The line notes "cost incurred <amount> of <budget>" (plain figures); without a budget the subject is left out with "<project>: the cost method needs a cost budget (Project > Settings > Budget cost)".
Guidance Note thresholds
Under AS (Guidance Note 2012) with an over-time method a project earns nothing until both project gates pass, tested each run: cost incurred as a share of the project-wide construction budget at least the policy's percent (no budget: "Guidance Note: a cost budget is needed to test the cost-incurred threshold"; below it: "Guidance Note: cost incurred N% is below M%"), and the area of units with active bookings as a share of the saleable area, on the project's chargeable area for buyers, at least the policy's percent ("Guidance Note: area sold N% is below M%"). Each booking must also have received at least the policy's percent of its price ("Guidance Note: realised <amount> is below N% of the price"). The percentages in these notes carry two decimals ("below 25.00%"). A gated line stays at 0%. Project performance shows Guidance Note thresholds met, or the reason they are not.
The revenue run
Accounting, Revenue Recognition, New revenue run (the Create permission) takes a Period end (default the last day of the previous month) and prepares a Draft numbered RR-<financial year>-<serial>. One Draft per books; the period end cannot be before the last posted run's, and a fiscal year must cover it. The draft computes, for every booking on a project of the books' promoter and every member offer on those projects, a line with Progress, Price, Revenue to date, This run, Billed, Liability, Asset, Cost of sales and Brokerage. A subject gets a line only when it has a with-the-unit price, deferred billing, a line on an earlier posted run, or capitalised brokerage; a subject with none of these is simply not listed. A subject the run cannot compute (for example, the cost method without a budget) is listed under Left out with its reason.
Every figure is a cumulative catch-up: revenue to date = price × progress ÷ 100 per charge, rounded half-up to the paise; this run = revenue to date − revenue to date on the subject's line in the latest posted run. Recompute (the Create permission) rebuilds the draft; Delete draft removes it (the Delete permission). Post run (the Approve permission) recomputes once more and posts journals dated on the period end, one per project and kind, in this order: "development rights received", "financing component", "costs moved to inventory", "revenue recognised", "cost of sales", "expected losses provided", "brokerage released", "completed units", each with the narration "Revenue run <no>: <kind> to <date> (<project>)". The run becomes Posted and its policy Locked. Reverse (the Approve permission; only the latest posted run of the books) mirrors every journal on a reversal date and marks the run Reversed; the next run starts again from the run before it.
The seeded workflow rule "Monthly revenue run (system)", off by default, drafts a run on the 1st of each month at 09:00 and tells finance; posting stays manual.
Expected losses (onerous contracts)
When a line's cost total exceeds its price the booking is an onerous contract. The run lists it in the warning "Expected loss: the cost share exceeds the price on <booking> (cost ₹X against ₹Y, provision to date ₹Z)". With Onerous contracts at Provide the run provides the part of the loss not yet through the profit and loss: provision to date = min(loss, loss − (cost to date − revenue to date), never below 0); the change since the last posted line is posted as "expected losses provided", Dr Expected Loss on Onerous Contracts (5410) / Cr Provision for Onerous Contracts (2640), and unwinds as the loss flows through revenue and cost of sales. With Flag only the alert ends "The policy only flags it: the CA books the provision by hand."
Cancelling a recognised booking
With Cancelling after revenue is recognised at Not allowed, the cancellation wizard blocks: "Revenue on this booking is recognised and the revenue policy does not allow cancelling it; the CA can switch the policy to a sales return". Under Sales return the booking can be cancelled and the next run takes it to 0% ("Cancelled"), reversing its revenue, cost of sales and financing component and releasing the rest of its brokerage.
Why
Indian GAAP and Ind AS both forbid booking a flat's price as income the day the buyer signs; the money sits as a contract liability until the developer has performed. Which framework applies, and whether performance is measured at handover or by progress, depends on the entity and its CA's judgement, so NirmaanOne keeps every choice as an effective-dated setting per set of books and makes the run's arithmetic and journals follow it. Runs chain and lock so that the books can always be re-read under the policy that produced them.
Example
Sea Breeze Developers LLP (books "Sea Breeze Developers LLP") keeps the default policy: Ind AS 115, Point in time, Recognise on Possession handed over, Occupation certificate required. Booking BK-2026-27-00007, unit A-1203 in Tower A, transaction price ₹1,29,50,000.00.
Point in time. Every monthly run from September 2026 lists the booking at 0% with the note "Waiting for: possession handed over"; the demands issued meanwhile sit in the contract liability. Tower A's OC is recorded with OC date 5 December 2028; the office presses Offer possession (15 December 2028) and Hand over (20 January 2029). Run RR-2028-29-00010 to 31 January 2029 shows the line at 100% "since 20 Jan 2029", This run ₹1,29,50,000.00, and posts the "revenue recognised", "cost of sales" and "brokerage released" journals for the project (worked in Contract liability, Cost of sales and Contract acquisition costs). Without the OC recorded first, the office could not have offered possession at all.
Over time (stages achieved), per tower. Suppose the CA had instead added a policy from 1 April 2026 with that method. Tower A's stages and shares: Plinth 15, 5th slab 25, 10th slab 25, Terrace 20, Finishing 15 (total 100). Plinth was achieved on 10 November 2026, the 5th slab on 8 March 2027 and the 10th slab on 12 May 2027. Of the price, ₹1,28,00,000.00 (unit price, floor rise, PLC and parking) is mapped to Sale Revenue - Units and ₹1,50,000.00 (club membership) to Other Charges Recovered - Buyers. Demands for 25% (₹32,37,500.00) have been issued by 30 November 2026 and for 50% (₹64,75,000.00) by 31 March 2027.
| Run | Stages done | Progress | Revenue to date | This run | Billed | Liability | Asset |
|---|---|---|---|---|---|---|---|
| RR-2026-27-00008, 30 Nov 2026 | 1 of 5 (15 ÷ 100) | 15.0000% | ₹1,29,50,000.00 × 15 ÷ 100 = ₹19,42,500.00 | ₹19,42,500.00 | ₹32,37,500.00 | ₹12,95,000.00 | ₹0.00 |
| RR-2026-27-00012, 31 Mar 2027 | 2 of 5 (40 ÷ 100) | 40.0000% | ₹51,80,000.00 | ₹32,37,500.00 | ₹64,75,000.00 | ₹12,95,000.00 | ₹0.00 |
| RR-2027-28-00002, 31 May 2027 | 3 of 5 (65 ÷ 100) | 65.0000% | ₹84,17,500.00 | ₹32,37,500.00 | ₹64,75,000.00 | ₹0.00 | ₹19,42,500.00 |
The runs from December to February and in April change nothing for this booking. The March journal credits Sale Revenue - Units ₹32,00,000.00 and Other Charges Recovered - Buyers ₹37,500.00 (each charge at 25 more points of progress), and debits Contract Liability - Sale of Units ₹32,37,500.00. The May journal credits the revenue ledgers ₹32,37,500.00 in all and, because only ₹64,75,000.00 has been billed, debits the liability by its remaining ₹12,95,000.00 and Contract Asset - Unbilled Revenue by ₹19,42,500.00. The demand for the 10th slab, ₹32,37,500.00, issued on 2 July 2027, credits the liability again; the run to 31 July 2027 then moves ₹19,42,500.00 out of the asset against the liability, leaving ₹12,95,000.00 billed ahead of revenue.
Guidance Note. Under AS (Guidance Note 2012) with the same stages, the March 2027 run first tests the project: construction cost incurred ₹10,00,00,000.00 against the ₹42,00,00,000.00 budget is 23.81%, below 25, so every line on the project stays at 0% with "Guidance Note: cost incurred 23.81% is below 25.00%". Once the cost passes 25% and 25% of the saleable area is under active bookings, a booking that has received only ₹9,00,000.00 of its ₹1,29,50,000.00 (6.95%) is still held with "Guidance Note: realised 900000.00 is below 10.00% of the price".
Expected loss. Under the same stages policy, shop G-03 in Tower A is booked on 20 March 2027 (BK-2026-27-00012) for ₹78,00,000.00, but its cost share is ₹85,00,000.00, a loss of ₹7,00,000.00. Its first line, in the March run at 40% progress, takes ₹34,00,000.00 of cost against ₹31,20,000.00 of revenue, ₹2,80,000.00 of the loss, so the provision to date is min(₹7,00,000.00, ₹7,00,000.00 − ₹2,80,000.00) = ₹4,20,000.00: Dr Expected Loss on Onerous Contracts ₹4,20,000.00 / Cr Provision for Onerous Contracts ₹4,20,000.00, and the alert reads "Expected loss: the cost share exceeds the price on BK-2026-27-00012 (cost 85,00,000.00 against 78,00,000.00, provision to date 4,20,000.00). The unrecognised loss is provided by this run (Dr 5410 / Cr 2640)." At 65% the provision falls to ₹2,45,000.00 (the run posts the ₹1,75,000.00 release the other way), and at 100% it is nil.
Where you see it
- Revenue policy: every setting above, New policy from a date, the In force / Upcoming / Locked badges.
- Revenue runs: New revenue run, Period end, the run numbers and Schedule automatic revenue runs.
- Revenue run: the lines, their Progress notes, Left out, the expected-loss alert, Recompute, Post run, Reverse, Delete draft.
- Contract balances, Remaining obligation and Project performance: the disclosures built from posted runs.
- Project settings: Revenue method, Recognise revenue on, OC date; Organization: the organization-wide default; Structure: the tower's OC date.
- Booking overview: the Possession card.
- Construction stages: the shares and achieved dates the stage method reads; Budget Cost for the cost method.
- Cancel booking: the recognised-revenue blocker.
- Workflow rules: "Monthly revenue run (system)".
Related
- Contract liability, contract asset and the transaction price
- Cost of sales, cost budgets and inventory transfer
- Contract acquisition costs (capitalised brokerage)
- Significant financing component
- Rehab units as non-cash consideration
- Construction stages and share buckets
- Effective-dated rules
- Booking cancellation, forfeiture and refund
- Promoter entity
Related
- Revenue policyScreen
The CA's effective-dated choices on how the books recognise sale revenue and the costs that go with it: framework, method, possession trigger, OC rule, cost treatments and judgement areas.
- Revenue runsScreen
The revenue runs (period closes) of the chosen books, the dialog that prepares a new draft run, and the scheduled rules that draft runs automatically.
- Revenue runScreen
One period close: what each booking and member offer recognises, the journals and cost moves it posts, the subjects it left out, and the actions to recompute, post, reverse or delete it.
- Contract balancesScreen
The Ind AS 115 contract-balances disclosure per project over a period: contract liability, contract asset and contract acquisition costs rolled forward from the ledger, with the revenue recognised in the period and how much of it came out of the opening liability.
- Remaining obligationScreen
The Ind AS 115 disclosure of revenue still to come from what is already booked: each live booking and member offer's price less what the posted revenue runs have recognised, per project, banded by the financial year of the project's expected possession.
- Project performanceScreen
Revenue, cost of sales and margin per project for a period and to date, the booked price and how much of it is recognised, the cost budget against cost incurred and cost to complete, progress by stages and by cost, revenue by month, and the flags the CA needs to act on.
- Budget CostScreen
The project's (or a tower's) estimated total cost, effective-dated, that cost of sales shares across the saleable units and the cost method of over-time revenue recognition measures progress against.
- Construction StagesScreen
Plan the project's construction stages (plinth, slabs, possession…) with their shares and dates, record commencement and completion, and keep the certificates and photos for each stage.
- Edit projectScreen
Change a project's facts on one page: basics, site address, land survey details and expected possession, and, on a redevelopment, the development agreement date and the fair value of the development rights. The settings the project inherits from the organization live on its Settings tab.
- StructureScreen
Build and maintain a project's towers (wings), floors and units, generate them in bulk, and see every unit's status and designation at a glance.
- Booking overviewScreen
A booking's home page: the applicant and unit, parking, dates, money summary, termsheet status and possession, with the buttons to edit the booking, see its history, jump to the opportunity or cancel it.
- Cancel bookingScreen
The four-step wizard that cancels a booking: it shows the demands and receipts that will be reversed, suggests the forfeiture and charges from the rule in force, sets the refund and posts everything in one go, releasing the unit and parking and marking the opportunity lost.
- RulesScreen
Every automation rule in your organization, system and custom, with filters, the switch that turns each rule on or off, and shortcuts to edit, test, clone, see the run history of or delete a rule.
- VoucherScreen
One voucher with its lines and bill allocations, its reversal links, its history, and the actions to post, reverse, cancel or delete it.
- Contract liability, contract asset and the transaction priceConcept
A booking's transaction price is the sum of its charges treated "With the unit"; while revenue is deferred, demands for those charges are credited to a contract liability (billed ahead of revenue), a revenue run debits it as revenue is recognised, and revenue recognised ahead of billing sits in the contract asset.
- Cost of sales, cost budgets and inventory transferConcept
Each revenue run moves the period's construction, rehab and borrowing cost from the expense ledgers into work-in-progress and land inventory, then charges every booking a share of the project's cost (its budget, else the cost inventoried so far) in step with its revenue progress, so revenue and its cost land in the same period.
- Contract acquisition costs (capitalised brokerage)Concept
Under a revenue policy that capitalises the costs of obtaining a contract, an approved channel-partner commission is parked in Contract Acquisition Costs instead of brokerage expense and released to expense by each revenue run in step with the booking's revenue; possession expected within the practical-expedient months expenses it at once.
- Significant financing componentConcept
An Ind AS 115 judgement: when buyers pay well ahead of possession the developer is effectively borrowing from them, so each revenue run accrues notional interest on every cleared receipt at the policy's rate, books it as interest expense against the contract liability, and adds it to the unit's price so it is recognised as revenue with the unit.
- Rehab units as non-cash considerationConcept
In a redevelopment the flats handed to society members are the price paid for the development rights; with the policy toggle on, the fair value of those rights is booked as land against a contract liability on the agreement date, and each member's offer earns its entitled-area share of that value as revenue when its allotted units are handed over.
- Construction stages and share bucketsConcept
A project's construction stages (plinth, slabs, possession) each carry a share of a 100% bucket, one bucket for the project-wide stages and one per tower; completing a stage dates the installments waiting on it and moves the revenue progress.
- Effective-dated rulesConcept
Rules that change over time (the RERA escrow share, TDS on sales, booking cancellation forfeiture, the revenue policy and cost budgets) are kept as dated rows; the row in force on a date is the latest one starting on or before it, so old documents keep the figures they were made with.
- Booking cancellation, forfeiture and refundConcept
Cancelling a booking reverses its demands with credit notes, posts the forfeiture and any charges against the buyer's ledger by the rule in force, creates the refund as a pending payout for the credit that is left, and frees the unit and parking; with nothing billed or received it only frees them.
- Promoter entityConcept
The company developing a project; every project must name one, and its books and bank accounts are where the project's demands, receipts and payouts are posted.