
Revenue Recognition Accounting
- 70 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Implement ASC 606 / IFRS 15 revenue recognition for subscriptions, bundles, and multi-element arrangements with deferred revenue tracking.
About
Applies ASC 606 / IFRS 15 revenue recognition across subscriptions, bundles, and multi-element arrangements with deferred revenue and journal entries. A developer uses it to produce compliant recognized-revenue accounting for commerce.
- ASC 606 / IFRS 15 recognition for subscriptions and bundles
- Deferred revenue tracking with journal entries
Revenue Recognition Accounting by the numbers
- 70 all-time installs (skills.sh)
- Ranked #554 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill revenue-recognition-accountingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 70 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Implement ASC 606 / IFRS 15 revenue recognition for subscriptions, bundles, and multi-element arrangements with deferred revenue tracking.
Files
Revenue Recognition Accounting (ASC 606 / IFRS 15)
Overview
Revenue recognition determines when you can record revenue in your financial statements. Under ASC 606 (US GAAP) and IFRS 15, revenue is recognized when — or as — performance obligations are satisfied, not simply when cash is received. This matters enormously for subscriptions (revenue earned monthly even if billed annually), gift cards (revenue earned only on redemption), and bundled products (where a warranty component must be deferred).
Getting revenue recognition right protects you from audit findings, builds investor trust, and ensures your financial statements accurately reflect business performance.
This skill guides you through the practical setup of revenue recognition using your accounting system, platform integrations, and relevant apps.
When to Use This Skill
- When you sell subscription products (monthly boxes, replenishment subscriptions, memberships)
- When you sell bundled offers (product + warranty + service in one SKU)
- When you issue gift cards, store credit, or prepaid plans
- When you recognize revenue from third-party marketplaces (Amazon, eBay)
- When preparing GAAP or IFRS financials for investors, auditors, or a financing round
- When building a data pipeline that automatically posts revenue recognition journal entries
- When you need to separate recognized revenue from cash receipts in your financial model
Core Instructions
Step 1: Identify which revenue types require special treatment
Most standard ecommerce product sales (order placed → shipped → delivered) are straightforward: recognize revenue at delivery. The complexity arises with these arrangements:
| Revenue Type | Recognition Rule | Common Mistake |
|---|---|---|
| Physical product (single sale) | Recognize at delivery (when control transfers to customer) | Recognizing at order placement instead of delivery |
| Subscription (annual or multi-month) | Recognize ratably over the subscription period | Recognizing full annual payment in month 1 |
| Gift cards | Recognize at redemption; handle unredeemed breakage separately | Recognizing at sale |
| Extended warranty | Recognize ratably over the warranty period | Recognizing 100% at product shipment |
| Bundle (product + service) | Allocate price across components; recognize each independently | Recognizing 100% at shipment of physical component |
| Buy Now Pay Later | Recognize at delivery (BNPL provider pays you immediately; installment risk is theirs) | No special treatment needed; straightforward |
| Marketplace sales (as principal) | Recognize gross revenue; record fees as cost of revenue | Net revenue recognition (agent treatment) when you control inventory |
| Marketplace sales (as agent) | Recognize only your net commission | Gross revenue recognition when you do not control inventory |
Step 2: Set up your accounting system for proper revenue recognition
The right tool depends on your business complexity and accounting system:
---
For subscription businesses
Shopify (subscription apps): 1. Use Recharge or Skio for subscription management on Shopify — both apps create orders in Shopify for each billing cycle 2. Connect Shopify to Xero via A2X or to QuickBooks via Finaloop 3. In Xero, revenue from subscription orders is recognized when the order is created (each billing cycle) — for monthly subscriptions billed monthly, this is correct 4. For annual subscriptions: You need to spread the payment across 12 months. In Xero:
- Create the invoice when the subscription starts (e.g., $120 annual)
- Post the full $120 to a Deferred Revenue liability account
- Each month, create a recurring journal entry: DR Deferred Revenue $10 / CR Subscription Revenue $10
- Use Xero's Repeating Transactions feature to automate this
QuickBooks Online approach for annual subscriptions: 1. When annual payment received: create an invoice for $120, post to "Deferred Revenue" (liability account) 2. Create a recurring journal entry (monthly): DR Deferred Revenue $10 / CR Subscription Revenue $10 3. QuickBooks recurring transactions: + New → Journal Entry → Make recurring
Dedicated revenue recognition tools:
- Younium or Chargebee (if using subscription billing): Both have built-in revenue recognition that automatically defers and releases subscription revenue on the correct schedule; export to accounting system
- Recurly + Sage Intacct: For larger subscription businesses; Recurly handles billing, Sage Intacct handles automated GAAP-compliant revenue recognition
---
For gift cards
Shopify: 1. When a gift card is purchased, Shopify records it as a sale in the platform — but for accounting purposes, this is a liability (deferred revenue), not revenue 2. In your accounting system: post gift card sales to Gift Card Liability (liability account), not revenue 3. When a gift card is redeemed (applied to an order): transfer from Gift Card Liability to Revenue 4. Breakage: For gift cards that are never redeemed, recognize the expected breakage amount as revenue either:
- Proportionally as cards are redeemed (preferred if you can estimate breakage reliably), OR
- When redemption is considered remote (typically after 3–5 years of inactivity)
5. Practical setup in QuickBooks/Xero: Create a "Gift Card Liability" account; when the accounting integration posts a gift card sale, manually reclassify it to the liability account; when redeemed, reclassify to revenue
A2X for Shopify: A2X allows you to configure how different Shopify transaction types post to your accounting system — set gift card sales to post to a deferred revenue account and gift card redemptions to post to a revenue account.
---
For product bundles with warranties
Manual approach (most common for small-to-mid-size merchants):
1. Determine the standalone selling price (SSP) of each component:
- Product SSP: What you would sell it for without the bundle
- Warranty SSP: What you would charge for the warranty alone (or estimate using cost-plus-margin)
2. Allocate the bundle price proportionally:
Example: Bundle = $150 (product + 1-year warranty)
Product SSP: $130, Warranty SSP: $30, Total SSP: $160
Product allocation: $150 × ($130/$160) = $121.88
Warranty allocation: $150 × ($30/$160) = $28.123. Post journal entries:
- At payment receipt: DR Cash $150 / CR Deferred Revenue $150
- At shipment: DR Deferred Revenue $121.88 / CR Product Revenue $121.88
- Monthly (over 12 months): DR Deferred Revenue $2.34 / CR Warranty Revenue $2.34
4. In QuickBooks/Xero: Create a Deferred Revenue – Warranty liability account for the warranty component; set up a recurring journal entry to release $2.34/month per warranty sold
---
Step 3: Handle the physical product timing issue
The most common revenue recognition error for ecommerce: recognizing revenue at order placement instead of delivery.
Under ASC 606: For physical goods, revenue is recognized when the customer obtains control — typically at delivery, not at checkout.
Practical impact:
- Orders placed December 30 but delivered January 3 should be recognized in January, not December
- If you have many orders in transit at period-end (year-end or quarter-end), this creates a timing difference
How to handle in practice:
For most merchants with short transit times (1–3 days), the difference between order date and delivery date is immaterial and auditors typically accept recognition at shipment. However, if you have:
- Long transit times (>7 days)
- Significant holiday rush shipping in late December
- GAAP audited financials
...then you need to accrue for in-transit revenue: 1. At period-end, pull a list of all shipped but undelivered orders (from your shipping carrier or ShipStation) 2. Calculate their total value 3. Record a journal entry: DR Revenue / CR Deferred Revenue – In Transit (for the in-transit amount) 4. Reverse the entry on the first day of the next period
Step 4: Set up deferred revenue tracking
Maintain a running deferred revenue balance to verify your accounting is correct.
Monthly deferred revenue reconciliation (in a spreadsheet):
Opening Deferred Revenue Balance
+ New deferrals this month (gift cards sold + subscription annual billings + warranty components)
- Revenue released this month (gift card redemptions + monthly subscription recognition + warranty releases)
- Refunds/cancellations
= Closing Deferred Revenue Balance
Should equal: Deferred Revenue balance on your balance sheetIf the calculated balance does not match your balance sheet, there is a missing journal entry.
Review checklist each month:
- [ ] All gift card sales posted to liability account (not revenue)
- [ ] Monthly subscription revenue recognition journal entries posted
- [ ] Warranty component deferrals released for the month
- [ ] In-transit accrual reversed from prior month; new in-transit accrual posted
- [ ] Deferred revenue reconciliation ties to balance sheet
Step 5: Principal vs. agent determination for marketplace revenue
If you sell through Amazon, eBay, or other marketplaces, determine whether you are a principal or an agent:
You are a principal if:
- You control the inventory before it is transferred to the customer (i.e., Amazon FBA inventory is yours)
- You bear inventory risk (unsold items are your problem)
- You set the selling price
→ Recognize gross revenue (full selling price); record Amazon fees as cost of revenue
You are an agent if:
- A third party controls the inventory
- The marketplace sets the price or has primary pricing authority
- You earn a commission only
→ Recognize only your net commission
Most Amazon FBA sellers are principals and should recognize gross revenue. If you are unsure, consult your accountant.
Best Practices
- Automate deferred revenue releases — build recurring journal entries in QuickBooks or Xero for all subscription and warranty revenue recognition; monthly manual entries will be missed eventually
- Maintain a contract obligation register — for any bundle or subscription with multiple performance obligations, maintain a spreadsheet tracking the allocated price, recognition schedule, and amount remaining
- Separate revenue accounts by obligation type — use distinct GL accounts for product revenue, subscription revenue, warranty revenue, and gift card redemptions; simplifies disclosure and audit support
- Reconcile deferred revenue to cash receipts monthly — the ending deferred revenue balance should reconcile to cash received less revenue recognized; any gap indicates missing journal entries
- Document your SSP methodology — auditors will ask how you determined standalone selling prices; use observable market prices where available and document the approach for every bundle type
- Apply a variable consideration constraint for returns — based on historical return rates by category, reduce recognized revenue at delivery by expected returns; record a refund liability for the expected return amount
Common Pitfalls
| Problem | Solution |
|---|---|
| Revenue recognized at checkout instead of delivery | For physical goods, recognize when the carrier marks the shipment as delivered; post a deferred revenue entry at order placement and recognize at the delivery trigger event |
| Full bundle price recognized at shipment | Split the bundle price across performance obligations using SSPs; defer the warranty/service component and release ratably over the service period |
| Gift card revenue recognized at sale | Gift card revenue is a deferred liability until redemption; post to a liability account at sale; recognize at redemption |
| Subscription prorations done by calendar month instead of by day | Mid-month subscription starts should be recognized pro-rata by exact days, not calendar month; a subscription started on the 15th of a 30-day month recognizes 16/30 of the monthly fee in month 1 |
| Not reassessing variable consideration (returns) each period | Return rates change over time; re-estimate expected returns monthly and record a catch-up adjustment in the current period |
| Recording Amazon payout net of fees as revenue | If you are a principal on Amazon, record the full selling price as gross revenue and Amazon's fees as cost of revenue/selling expenses separately |
Related Skills
- @financial-reporting-dashboard
- @financial-analytics-dashboard
- @cash-flow-forecasting
- @marketplace-fee-reconciliation
{
"context": "Tests whether the agent correctly allocates a bundled transaction price using relative SSPs, applies point-in-time vs. over-time recognition for each obligation type, uses Decimal arithmetic, produces correct double-entry journal entries with obligation-type-separated accounts, and uses the prescribed SQL schema structure.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Relative SSP allocation",
"max_score": 10,
"description": "Allocates the $600 transaction price across obligations using relative standalone selling prices (hardware: $350, install: $100, monitoring: $200; total SSP $650), not equal split or raw prices"
},
{
"name": "Last-obligation rounding",
"max_score": 8,
"description": "The last obligation receives the remainder of the transaction price (transaction_price minus sum of others) rather than an independently rounded proportion, ensuring amounts sum exactly to $600"
},
{
"name": "Decimal arithmetic",
"max_score": 8,
"description": "Python monetary calculations use the `decimal.Decimal` type (not float), and cent-precision is maintained with `.quantize(Decimal('0.01'))` or equivalent"
},
{
"name": "Hardware point-in-time at delivery",
"max_score": 8,
"description": "Hardware/product obligation is recognized as point_in_time at delivery_confirmed trigger (March 1, 2026), NOT at cash receipt or order placement"
},
{
"name": "Installation point-in-time at completion",
"max_score": 8,
"description": "Installation obligation is recognized as point_in_time at installation_complete trigger (March 5, 2026)"
},
{
"name": "Monitoring over-time day-based",
"max_score": 10,
"description": "Monitoring/support obligation is recognized over_time using day-based straight-line pro-rating (days in period / total days of contract), not calendar-month approximation"
},
{
"name": "Separate GL accounts by type",
"max_score": 8,
"description": "Journal entries and/or schema use distinct account names or codes for product revenue, installation/service revenue, and warranty/subscription/monitoring revenue — not a single combined 'Revenue' account"
},
{
"name": "DR Cash CR Deferred at receipt",
"max_score": 8,
"description": "Initial cash receipt journal entry debits Cash (or Accounts Receivable) and credits Deferred Revenue — NOT directly crediting Revenue"
},
{
"name": "DR Deferred CR Revenue at recognition",
"max_score": 8,
"description": "Each recognition event debits the appropriate Deferred Revenue account and credits the corresponding Revenue account"
},
{
"name": "performance_obligations schema",
"max_score": 8,
"description": "schema.sql includes a performance_obligations table with at minimum: recognition_method column with a CHECK constraint limiting values to 'point_in_time' and 'over_time', standalone_ssp and allocated_price as NUMERIC columns"
},
{
"name": "revenue_recognition_entries schema",
"max_score": 8,
"description": "schema.sql includes a revenue_recognition_entries table with at minimum: obligation_id FK, accounting_date, amount_recognized, cumulative_recognized, remaining_deferred columns"
},
{
"name": "Correct allocated amounts shown",
"max_score": 8,
"description": "Journal entries show dollar amounts derived from the SSP allocation (hardware ≈ $323.08, installation ≈ $92.31, monitoring ≈ $184.61 — or equivalent correct rounding) rather than the raw standalone prices"
}
]
}
Home Security System Bundle: Revenue Recognition Implementation
Problem/Feature Description
SmartGuard Inc. sells a home security system bundle that combines a hardware kit, a professional installation visit, and a 24-month monitoring and support contract — all sold together under a single SKU for a flat price of $600. The finance team has flagged an audit risk: the company has historically recorded all $600 as product revenue at the time of shipment, but the auditors are pushing back. The CFO needs a correct revenue recognition implementation before the next quarterly close.
The company prices each component separately when sold on its own: the hardware kit lists for $350, the installation service for $100, and the 24-month monitoring contract for $200. The finance team wants a Python module and a set of sample journal entries that demonstrate the correct revenue recognition treatment for a single order that ships on March 1, 2026, with installation completed on March 5, 2026, and a monitoring contract that runs from March 5, 2026 through March 4, 2028.
Output Specification
Produce the following files:
revenue_recognition.py— A Python module containing:- A function to allocate the $600 transaction price across the three performance obligations using their standalone selling prices
- A function to compute how much revenue to recognize from this order in a given reporting period (date range)
- All monetary amounts must be handled precisely to avoid rounding artifacts
journal_entries.md— A markdown document showing the correct double-entry journal entries for:- The initial cash receipt on the order date (February 28, 2026)
- Recognition of each obligation as it is satisfied during March 2026
- One sample monthly monitoring recognition entry for April 2026
schema.sql— SQL DDL for the tables needed to persist this order's obligations and recognition entries in a database
The journal entries should use separate revenue and deferred revenue line items for each obligation type. Show dollar amounts calculated from the actual allocation, not placeholders.
{
"context": "Tests whether the agent correctly applies variable consideration constraints for returns, proportional breakage recognition for gift cards (not at sale), and net commission recognition for marketplace/agent transactions — with correct accounting rationale for each treatment.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Gift card revenue at redemption",
"max_score": 10,
"description": "Gift card proceeds (TXN002) are NOT recognized as revenue at the time of sale — the function records them to a deferred revenue liability, and revenue is only recognized upon redemption"
},
{
"name": "Proportional breakage recognition",
"max_score": 10,
"description": "Gift card breakage is recognized proportionally as redemptions occur (e.g., recognizing 8% breakage pro-rated to the redeemed amount), NOT deferred until a remote-likelihood threshold"
},
{
"name": "Breakage not at sale",
"max_score": 8,
"description": "No revenue (including breakage) is recorded in recognize_gift_card_redemption when called with zero redemptions — breakage accrues only alongside actual redemptions"
},
{
"name": "Variable consideration constraint",
"max_score": 12,
"description": "Direct sale recognition applies a variable consideration constraint: recognized revenue is reduced by the expected return amount (sale_amount × return_rate) and a refund_liability is recorded for that amount — not reversing revenue after the fact"
},
{
"name": "Expected value method",
"max_score": 8,
"description": "The refund/return estimate uses a portfolio-level expected value approach (applying a rate to the transaction amount), not a transaction-by-transaction most-likely-amount approach"
},
{
"name": "Agent net commission only",
"max_score": 12,
"description": "recognize_marketplace_transaction returns only the commission amount (gross × commission_rate = $30 for TXN004), NOT the gross transaction amount ($200)"
},
{
"name": "Principal control rationale",
"max_score": 8,
"description": "accounting_memo.md explains that Bellwether is an agent for marketplace transactions because it does NOT control the inventory before transfer to the customer"
},
{
"name": "Gift card memo rationale",
"max_score": 8,
"description": "accounting_memo.md explains that gift card proceeds must be deferred because the performance obligation (redemption) has not yet been satisfied at the time of sale"
},
{
"name": "Variable consideration memo rationale",
"max_score": 8,
"description": "accounting_memo.md explains that variable consideration (return rate) must be estimated and constrained from day one, rather than reversing revenue after returns occur"
},
{
"name": "Correct sample output",
"max_score": 8,
"description": "sample_calculations.py produces output showing: direct sales TXN001 recognized revenue < $500 (approximately $440 after 12% return reserve), marketplace TXN004 recognized revenue = $30, and no revenue recognized for TXN002 (gift card issuance)"
},
{
"name": "Decimal arithmetic",
"max_score": 8,
"description": "Monetary calculations in revenue_policy.py use the `decimal.Decimal` type (not float) for all monetary arithmetic"
}
]
}
Marketplace Revenue Audit: Gift Cards, Returns, and Third-Party Sellers
Problem/Feature Description
Bellwether Commerce operates an online retail platform with three distinct revenue streams that are currently all being recorded the same way — as gross revenue at the time of transaction. An external auditor has flagged this as a material misstatement risk ahead of a Series B financing round. The three streams are:
1. Direct sales — Bellwether sells its own inventory directly to customers. Products have a 30-day return window, and historical data shows a 12% return rate on direct sales. Currently, 100% of revenue is recognized at the time of sale with no return reserve.
2. Gift card sales — Bellwether sells gift cards that customers can redeem later. Historical data shows that 8% of gift card balances are never redeemed. Currently, all gift card proceeds are recorded as revenue at the time of sale.
3. Marketplace sales — Bellwether facilitates sales for third-party sellers, charging a 15% commission. Bellwether never takes possession of the inventory; the seller ships directly to the buyer. Currently, the full transaction amount (not just the 15%) is recorded as Bellwether's revenue.
The CFO has asked for a Python module that correctly models the revenue recognition policy for each stream, and a memo explaining the accounting rationale for each treatment.
Output Specification
Produce the following files:
revenue_policy.py— Python module containing functions for:recognize_direct_sale(sale_amount, return_rate)— returns (recognized_revenue, refund_liability) applying a variable consideration constraintrecognize_gift_card_redemption(face_value, amount_redeemed, breakage_rate, total_redeemed_to_date, total_issued)— returns revenue to recognize at redemption including proportional breakagerecognize_marketplace_transaction(gross_transaction_amount, commission_rate)— returns Bellwether's revenue (net commission only)
sample_calculations.py— Script using the above functions with the sample data below, printing the computed revenue amounts for each stream
accounting_memo.md— A short memo (bullet points acceptable) explaining: why each stream is treated differently, what was wrong with the previous treatment, and what the correct accounting basis is for each
Input Files
The following sample transaction data is provided. Extract it before beginning.
=============== FILE: inputs/transactions.csv =============== transaction_id,stream,gross_amount,notes TXN001,direct_sale,500.00,standard product sale TXN002,gift_card_sale,100.00,card issued; not yet redeemed TXN003,gift_card_redemption,80.00,customer redeems $80 of a $100 card TXN004,marketplace,200.00,third-party seller; Bellwether earns 15% commission TXN005,direct_sale,300.00,standard product sale
{
"context": "Tests whether the agent correctly implements day-based straight-line proration for subscription revenue recognition (not calendar-month approximation), maintains a proper deferred revenue roll-forward schedule with cash/recognized/ending-balance columns, uses Decimal arithmetic for monetary precision, and produces results.txt showing actual computed numbers.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Exact-day proration",
"max_score": 15,
"description": "Revenue recognition per period is computed as (days of subscription active in period / total days in subscription month) × monthly_fee — using the actual number of calendar days in each month, not a fixed 28, 30, or 31"
},
{
"name": "Partial first month handled",
"max_score": 10,
"description": "Subscribers starting mid-month (e.g., Carol starting Feb 10) receive partial revenue in that first month based on days remaining, not the full $30"
},
{
"name": "Decimal arithmetic used",
"max_score": 8,
"description": "Monetary calculations use the `decimal.Decimal` type (not float) to avoid floating-point rounding errors"
},
{
"name": "Roll-forward structure",
"max_score": 12,
"description": "Monthly summary table includes at minimum: new deferred revenue (cash received that month), revenue released/recognized, and ending deferred balance"
},
{
"name": "Ending balance is cumulative",
"max_score": 10,
"description": "The ending deferred balance for each month equals the prior month's ending balance plus cash received minus revenue recognized (running cumulative, not just the period net)"
},
{
"name": "Subscription classified over_time",
"max_score": 8,
"description": "Subscription periods are treated as over-time obligations (ratably recognized), not recognized in full at the start of the billing period"
},
{
"name": "Per-subscriber breakdown",
"max_score": 8,
"description": "Output shows recognized and deferred amounts broken down per subscriber (not just aggregate totals)"
},
{
"name": "results.txt present",
"max_score": 10,
"description": "A results.txt file exists containing the actual printed output of the script with numeric values (not empty, not placeholder text)"
},
{
"name": "March proration correct for Eve",
"max_score": 10,
"description": "Eve (subscription start 2026-03-05) has a partial March recognition of approximately $27.10 (27/31 × $30) rather than the full $30, demonstrating exact-day logic for the same month the script is run"
},
{
"name": "No float monetary arithmetic",
"max_score": 9,
"description": "Does NOT use Python float arithmetic (e.g., 30.0 * days / total_days) for final monetary amounts — uses Decimal or integer cent arithmetic throughout"
}
]
}
Subscription Box Revenue Recognition: Monthly Close Report
Problem/Feature Description
FreshCrate is a monthly subscription box service charging $30/month. Subscribers can start at any point during the month, and their billing date does not align to the first of the month. The accounting team is preparing its February and March 2026 monthly close, and needs a revenue recognition report that correctly attributes revenue to the period in which boxes are delivered — which means handling partial months at the start and end of each subscription.
A recent internal audit found that the previous system was computing partial-period revenue using a simplified calendar approximation, causing small errors that accumulated to a material amount over the subscriber base. The CFO wants a correct proration methodology and a deferred revenue roll-forward that reconciles ending balances to cash collected.
The finance team has provided a sample subscriber dataset (below) and wants a Python script that, for a given reporting month, computes the recognized and deferred revenue for each subscriber, plus a summary roll-forward table.
Output Specification
Produce the following files:
recognition_engine.py— Python script that:- Reads the subscriber data from the inline CSV below
- For each subscriber, computes the revenue recognized in February 2026 (2026-02-01 to 2026-02-28) and March 2026 (2026-03-01 to 2026-03-31)
- Outputs a per-subscriber table and a monthly deferred revenue roll-forward summary for each month
- Run it and print the results to stdout
results.txt— The actual printed output from running the script
The output should show how much of each subscriber's $30/month is recognized vs. deferred in each period.
Input Files
The following subscriber data is provided. Extract it before beginning.
=============== FILE: inputs/subscribers.csv =============== subscriber_id,name,subscription_start,monthly_fee,status SUB001,Alice,2026-01-15,30.00,active SUB002,Bob,2026-02-01,30.00,active SUB003,Carol,2026-02-10,30.00,active SUB004,Dave,2026-02-20,30.00,active SUB005,Eve,2026-03-05,30.00,active SUB006,Frank,2026-01-28,30.00,active
{
"name": "finsi/revenue-recognition-accounting",
"version": "0.1.0",
"summary": "Implement ASC 606 / IFRS 15 revenue recognition for subscriptions, bundles, and multi-element arrangements with deferred revenue tracking and journal entries",
"skills": {
"revenue-recognition-accounting": {
"path": "SKILL.md"
}
}
}