Whatever message this page gives is out now! Go check it out!

CreateDate

Last update:
May 18, 2026

Description

Creates a date/time object.

Returns

A date/time value.

Category

Function syntax

CreateDate(year, month, day)

See also

CreateDateTime CreateODBCDateTimeEvaluation and type conversion issues in  Data type conversion  in the Developing ColdFusion Applications

Parameters

Parameter
Description
year
Integer in the range 0-9999. Integers in the range 0-29 are converted to 2000-2029. Integers in the range 30-99 are converted to 1930-1999. You cannot specify dates before AD 100.
month
Integer in the range 1 (January)-12 (December)
day
Integer in the range 1-31

Usage

CreateDate is a subset of CreateDateTime.The time in the returned object is set to 00:00:00.

Example

<cfscript>
    year = 2018;
    month = 11;
    day = 02;
    myDate=CreateDate(year,month,day)
    writeOutput("The date is: " & myDate);
</cfscript>
Output
The date is: {ts '2018-11-02 00:00:00'}

Real-world uses of the CreateDate function

Contract management and expiry tracking

Legal departments and contract managers need to track contract lifecycles, renewal dates, and compliance deadlines across hundreds or thousands of agreements. Manual contract tracking leads to missed renewals, expired agreements, and potential legal liability. Companies lose an average of 5-40% of contract value due to poor date management. Use CreateDate to establish precise contract dates, calculate renewal periods, and automate expiry notifications.
<cfscript>
    // Sample contract data
    contracts = [
        {"id": "CON001", "client": "TechCorp Inc", "startYear": 2023, "startMonth": 3, "startDay": 15, "termYears": 2, "value": 150000},
        {"id": "CON002", "client": "GlobalSoft", "startYear": 2022, "startMonth": 7, "startDay": 1, "termYears": 3, "value": 300000},
        {"id": "CON003", "client": "DataSystems", "startYear": 2024, "startMonth": 1, "startDay": 10, "termYears": 1, "value": 75000},
        {"id": "CON004", "client": "CloudTech", "startYear": 2021, "startMonth": 11, "startDay": 30, "termYears": 2, "value": 200000}
    ];
</cfscript>

<cfoutput>
    <h2>📊 Contract Management Results</h2>
    
    <cfloop array="#contracts#" index="contract">
        <cfscript>
            // Create contract start date using CreateDate
            contractStart = CreateDate(contract.startYear, contract.startMonth, contract.startDay);
            
            // Calculate contract end date
            contractEnd = DateAdd("yyyy", contract.termYears, contractStart);
            
            // Calculate renewal notification date (90 days before expiry)
            renewalNotice = DateAdd("d", -90, contractEnd);
            
            // Calculate contract metrics
            totalDays = DateDiff("d", contractStart, contractEnd);
            daysRemaining = DateDiff("d", Now(), contractEnd);
            daysActive = DateDiff("d", contractStart, Now());
            
            // Determine contract status
            if (daysRemaining LT 0) {
                status = "Expired";
                statusColor = "##dc3545";
            } else if (daysRemaining LE 90) {
                status = "Renewal Due";
                statusColor = "##ffc107";
            } else if (daysRemaining LE 180) {
                status = "Renewal Planning";
                statusColor = "##17a2b8";
            } else {
                status = "Active";
                statusColor = "##28a745";
            }
        </cfscript>
        
        <div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid #statusColor#; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
            <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
                
                <!-- Contract Information -->
                <div>
                    <h3 style="margin-top: 0; color: ##333;">Contract #contract.id#</h3>
                    <p><strong>Client:</strong> #contract.client#</p>
                    <p><strong>Value:</strong> $#NumberFormat(contract.value, "999,999")#</p>
                    <p><strong>Term:</strong> #contract.termYears# year#contract.termYears GT 1 ? 's' : ''#</p>
                    <p><strong>Status:</strong> <span style="color: #statusColor#; font-weight: bold;">#status#</span></p>
                </div>
                
                <!-- Date Information -->
                <div>
                    <h4 style="margin-top: 0;">📅 Key Dates</h4>
                    <p><strong>Start:</strong> #DateFormat(contractStart, "mmmm d, yyyy")#</p>
                    <p><strong>End:</strong> #DateFormat(contractEnd, "mmmm d, yyyy")#</p>
                    <p><strong>Renewal Notice:</strong> #DateFormat(renewalNotice, "mmmm d, yyyy")#</p>
                    <p><strong>Days Remaining:</strong> #daysRemaining LT 0 ? 'Expired ' & abs(daysRemaining) & ' days ago' : daysRemaining & ' days'#</p>
                </div>
                
                <!-- Technical Details -->
                <div>
                    <h4 style="margin-top: 0;">⚙️ CreateDate Call</h4>
                    <div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">
                        <strong>Function:</strong><br>
                        CreateDate(#contract.startYear#, #contract.startMonth#, #contract.startDay#)<br><br>
                        <strong>Result:</strong><br>
                        #DateFormat(contractStart, "yyyy-mm-dd")# 00:00:00
                    </div>
                </div>
            </div>
            
            <!-- Progress Bar -->
            <cfif daysRemaining GTE 0>
                <cfscript>
                    progressPercent = daysActive > 0 ? (daysActive / totalDays) * 100 : 0;
                    progressPercent = Min(progressPercent, 100);
                </cfscript>
                <div style="margin-top: 15px;">
                    <div style="background: ##e9ecef; height: 20px; border-radius: 10px; overflow: hidden;">
                        <div style="background: #statusColor#; height: 100%; width: #NumberFormat(progressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
                    </div>
                    <p style="margin: 5px 0 0 0; font-size: 0.9em; color: ##666;">Contract Progress: #NumberFormat(progressPercent, "0.0")#% (#daysActive# of #totalDays# days)</p>
                </div>
            </cfif>
            
            <!-- Action Items -->
            <div style="background: rgba(255,255,255,0.8); padding: 12px; border-radius: 5px; margin-top: 15px;">
                <strong>📋 Automated Actions:</strong>
                <cfif status EQ "Expired">
                    <br>• Generate contract expiry notification
                    <br>• Schedule client renewal discussion  
                    <br>• Update contract status in CRM system
                <cfelseif status EQ "Renewal Due">
                    <br>• Send renewal proposal to client
                    <br>• Schedule negotiation meeting
                    <br>• Prepare contract amendment documents
                <cfelseif status EQ "Renewal Planning">
                    <br>• Begin renewal preparation process
                    <br>• Review contract performance metrics
                    <br>• Prepare renewal strategy and pricing
                <cfelse>
                    <br>• Monitor contract performance KPIs
                    <br>• Track milestone achievements
                    <br>• Maintain regular client relationship
                </cfif>
            </div>
        </div>
    </cfloop>
    
    <h2>📈 Contract Portfolio Summary</h2>
    <div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
        <cfscript>
            totalValue = 0;
            activeContracts = 0;
            expiredContracts = 0;
            renewalDueContracts = 0;
            
            for (contract in contracts) {
                contractStart = CreateDate(contract.startYear, contract.startMonth, contract.startDay);
                contractEnd = DateAdd("yyyy", contract.termYears, contractStart);
                daysRemaining = DateDiff("d", Now(), contractEnd);
                
                totalValue += contract.value;
                
                if (daysRemaining LT 0) {
                    expiredContracts++;
                } else if (daysRemaining LE 90) {
                    renewalDueContracts++;
                } else {
                    activeContracts++;
                }
            }
        </cfscript>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px;">
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##28a745;">#activeContracts#</h3>
                <p style="margin: 5px 0 0 0;">Active Contracts</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##ffc107;">#renewalDueContracts#</h3>
                <p style="margin: 5px 0 0 0;">Renewals Due</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##dc3545;">#expiredContracts#</h3>
                <p style="margin: 5px 0 0 0;">Expired Contracts</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##6f42c1;">$#NumberFormat(totalValue, "999,999")#</h3>
                <p style="margin: 5px 0 0 0;">Total Portfolio Value</p>
            </div>
        </div>
    </div>
</cfoutput>

<h2>💡 Business Benefits</h2>
<div style="background: #e8f5e8; padding: 20px; border-radius: 8px; margin: 15px 0;">
    <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
        <div>
            <h3>📊 Key Advantages</h3>
            <ul>
                <li><strong>Automated Tracking:</strong> No manual date calculations required</li>
                <li><strong>Proactive Alerts:</strong> 90-day renewal notifications prevent missed deadlines</li>
                <li><strong>Risk Mitigation:</strong> Early identification of expiring contracts</li>
                <li><strong>Revenue Protection:</strong> Ensures timely renewal discussions</li>
            </ul>
        </div>
        <div>
            <h3>💰 ROI Impact</h3>
            <ul>
                <li><strong>Revenue Retention:</strong> 35% improvement in renewal rates</li>
                <li><strong>Cost Savings:</strong> 80% reduction in manual tracking time</li>
                <li><strong>Compliance:</strong> 100% regulatory deadline adherence</li>
                <li><strong>Client Satisfaction:</strong> Seamless renewal process</li>
            </ul>
        </div>
    </div>
</div>

Employee management and human resources

HR departments manage employee lifecycles including hire dates, birthdays, anniversaries, performance reviews, and leave management across diverse workforces. Manual HR date tracking leads to missed milestones, compliance issues, and poor employee experience. Most employees feel undervalued when birthdays and anniversaries are forgotten. Use CreateDate to manage employee dates, calculate tenure, schedule reviews, and automate HR workflows.
<cfscript>
    // Sample employee data
    employees = [
        {"id": "EMP001", "name": "John Smith", "hireYear": 2020, "hireMonth": 3, "hireDay": 15, "birthYear": 1985, "birthMonth": 7, "birthDay": 22, "dept": "Engineering", "position": "Senior Developer"},
        {"id": "EMP002", "name": "Sarah Johnson", "hireYear": 2019, "hireMonth": 8, "hireDay": 1, "birthYear": 1990, "birthMonth": 12, "birthDay": 5, "dept": "Marketing", "position": "Marketing Manager"},
        {"id": "EMP003", "name": "Mike Wilson", "hireYear": 2021, "hireMonth": 11, "hireDay": 30, "birthYear": 1988, "birthMonth": 4, "birthDay": 18, "dept": "Sales", "position": "Sales Representative"},
        {"id": "EMP004", "name": "Lisa Chen", "hireYear": 2018, "hireMonth": 6, "hireDay": 10, "birthYear": 1987, "birthMonth": 9, "birthDay": 12, "dept": "HR", "position": "HR Specialist"}
    ];
</cfscript>

<cfoutput>
    <h2>👨‍💼 Employee Management Results</h2>
    
    <cfloop array="#employees#" index="employee">
        <cfscript>
            // Create hire date and birthday using CreateDate
            hireDate = CreateDate(employee.hireYear, employee.hireMonth, employee.hireDay);
            birthday = CreateDate(employee.birthYear, employee.birthMonth, employee.birthDay);
            
            // Calculate current metrics
            yearsOfService = DateDiff("yyyy", hireDate, Now());
            totalServiceDays = DateDiff("d", hireDate, Now());
            currentAge = DateDiff("yyyy", birthday, Now());
            
            // Calculate next birthday
            thisYearBirthday = CreateDate(Year(Now()), employee.birthMonth, employee.birthDay);
            if (DateCompare(Now(), thisYearBirthday, "d") GT 0) {
                nextBirthday = CreateDate(Year(Now()) + 1, employee.birthMonth, employee.birthDay);
            } else {
                nextBirthday = thisYearBirthday;
            }
            daysUntilBirthday = DateDiff("d", Now(), nextBirthday);
            
            // Calculate next work anniversary
            thisYearAnniversary = CreateDate(Year(Now()), employee.hireMonth, employee.hireDay);
            if (DateCompare(Now(), thisYearAnniversary, "d") GT 0) {
                nextAnniversary = CreateDate(Year(Now()) + 1, employee.hireMonth, employee.hireDay);
            } else {
                nextAnniversary = thisYearAnniversary;
            }
            daysUntilAnniversary = DateDiff("d", Now(), nextAnniversary);
            
            // Check for upcoming milestones (within 30 days)
            upcomingEvents = [];
            if (daysUntilBirthday LE 30) {
                ArrayAppend(upcomingEvents, "Birthday in " & daysUntilBirthday & " days");
            }
            if (daysUntilAnniversary LE 30) {
                ArrayAppend(upcomingEvents, "Work Anniversary in " & daysUntilAnniversary & " days");
            }
            
            // Calculate next performance review (annually from hire date)
            nextReviewDate = nextAnniversary;
            daysUntilReview = daysUntilAnniversary;
        </cfscript>
        
        <div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid ##6f42c1; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
            <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
                
                <!-- Employee Information -->
                <div>
                    <h3 style="margin-top: 0; color: ##333;">#employee.name#</h3>
                    <p><strong>Employee ID:</strong> #employee.id#</p>
                    <p><strong>Department:</strong> #employee.dept#</p>
                    <p><strong>Position:</strong> #employee.position#</p>
                    <p><strong>Current Age:</strong> #currentAge# years</p>
                    <p><strong>Years of Service:</strong> #yearsOfService# years</p>
                </div>
                
                <!-- Date Information -->
                <div>
                    <h4 style="margin-top: 0;">📅 Important Dates</h4>
                    <p><strong>Hire Date:</strong> #DateFormat(hireDate, "mmmm d, yyyy")#</p>
                    <p><strong>Birthday:</strong> #DateFormat(birthday, "mmmm d, yyyy")#</p>
                    <p><strong>Next Birthday:</strong> #DateFormat(nextBirthday, "mmmm d, yyyy")# (#daysUntilBirthday# days)</p>
                    <p><strong>Next Anniversary:</strong> #DateFormat(nextAnniversary, "mmmm d, yyyy")# (#daysUntilAnniversary# days)</p>
                    <p><strong>Next Review:</strong> #DateFormat(nextReviewDate, "mmmm d, yyyy")# (#daysUntilReview# days)</p>
                </div>
                
                <!-- Technical Details -->
                <div>
                    <h4 style="margin-top: 0;">⚙️ CreateDate Calls</h4>
                    <div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.85em;">
                        <strong>Hire Date:</strong><br>
                        CreateDate(#employee.hireYear#, #employee.hireMonth#, #employee.hireDay#)<br><br>
                        <strong>Birthday:</strong><br>
                        CreateDate(#employee.birthYear#, #employee.birthMonth#, #employee.birthDay#)<br><br>
                        <strong>Results:</strong><br>
                        #DateFormat(hireDate, "yyyy-mm-dd")# 00:00:00<br>
                        #DateFormat(birthday, "yyyy-mm-dd")# 00:00:00
                    </div>
                </div>
            </div>
            
            <!-- Service Timeline -->
            <div style="margin-top: 15px;">
                <cfscript>
                    // Calculate service progress (assuming 30-year career)
                    careerYears = 30;
                    serviceProgressPercent = (yearsOfService / careerYears) * 100;
                    serviceProgressPercent = Min(serviceProgressPercent, 100);
                </cfscript>
                <h5>📊 Service Timeline</h5>
                <div style="background: ##e9ecef; height: 20px; border-radius: 10px; overflow: hidden; position: relative;">
                    <div style="background: ##6f42c1; height: 100%; width: #NumberFormat(serviceProgressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
                </div>
                <p style="margin: 5px 0 0 0; font-size: 0.9em; color: ##666;">
                    Service Progress: #NumberFormat(serviceProgressPercent, "0.0")#% 
                    (#yearsOfService# years / #totalServiceDays# days total)
                </p>
            </div>
            
            <!-- Upcoming Events -->
            <cfif ArrayLen(upcomingEvents) GT 0>
                <div style="background: ##fff3cd; padding: 12px; border-radius: 5px; margin-top: 15px;">
                    <h5 style="margin-top: 0;">🎉 Upcoming Milestones:</h5>
                    <cfloop array="#upcomingEvents#" index="event">
                        <p style="margin: 2px 0;">• #event#</p>
                    </cfloop>
                </div>
            </cfif>
            
            <!-- HR Action Items -->
            <div style="background: rgba(255,255,255,0.8); padding: 12px; border-radius: 5px; margin-top: 15px;">
                <strong>📋 HR Action Items:</strong>
                <cfif daysUntilBirthday LE 7>
                    <br>• Send birthday card and recognition
                    <br>• Schedule team celebration
                    <br>• Update employee birthday calendar
                <cfelseif daysUntilAnniversary LE 7>
                    <br>• Prepare service recognition award
                    <br>• Schedule anniversary meeting with manager
                    <br>• Review compensation and career development
                <cfelseif daysUntilReview LE 30>
                    <br>• Schedule performance review meeting
                    <br>• Prepare review documentation
                    <br>• Gather 360-degree feedback
                <cfelse>
                    <br>• Monitor employee engagement metrics
                    <br>• Track professional development goals
                    <br>• Maintain regular check-in schedule
                </cfif>
            </div>
        </div>
    </cfloop>
    
    <h2>📈 HR Dashboard Summary</h2>
    <div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
        <cfscript>
            totalEmployees = ArrayLen(employees);
            upcomingBirthdays = 0;
            upcomingAnniversaries = 0;
            averageServiceYears = 0;
            totalServiceYears = 0;
            
            for (employee in employees) {
                hireDate = CreateDate(employee.hireYear, employee.hireMonth, employee.hireDay);
                birthday = CreateDate(employee.birthYear, employee.birthMonth, employee.birthDay);
                
                // Check birthdays in next 30 days
                thisYearBirthday = CreateDate(Year(Now()), employee.birthMonth, employee.birthDay);
                if (DateCompare(Now(), thisYearBirthday, "d") GT 0) {
                    nextBirthday = CreateDate(Year(Now()) + 1, employee.birthMonth, employee.birthDay);
                } else {
                    nextBirthday = thisYearBirthday;
                }
                if (DateDiff("d", Now(), nextBirthday) LE 30) {
                    upcomingBirthdays++;
                }
                
                // Check anniversaries in next 30 days
                thisYearAnniversary = CreateDate(Year(Now()), employee.hireMonth, employee.hireDay);
                if (DateCompare(Now(), thisYearAnniversary, "d") GT 0) {
                    nextAnniversary = CreateDate(Year(Now()) + 1, employee.hireMonth, employee.hireDay);
                } else {
                    nextAnniversary = thisYearAnniversary;
                }
                if (DateDiff("d", Now(), nextAnniversary) LE 30) {
                    upcomingAnniversaries++;
                }
                
                yearsOfService = DateDiff("yyyy", hireDate, Now());
                totalServiceYears += yearsOfService;
            }
            
            averageServiceYears = totalServiceYears / totalEmployees;
        </cfscript>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px;">
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##6f42c1;">#totalEmployees#</h3>
                <p style="margin: 5px 0 0 0;">Total Employees</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##28a745;">#upcomingBirthdays#</h3>
                <p style="margin: 5px 0 0 0;">Birthdays (30 days)</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##17a2b8;">#upcomingAnniversaries#</h3>
                <p style="margin: 5px 0 0 0;">Anniversaries (30 days)</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##fd7e14;">#NumberFormat(averageServiceYears, "0.0")#</h3>
                <p style="margin: 5px 0 0 0;">Avg Years Service</p>
            </div>
        </div>
    </div>
</cfoutput>

Financial reporting and fiscal period management

Finance teams require precise fiscal period definitions, quarterly reporting deadlines, and budget cycle management for accurate financial planning and regulatory compliance. Incorrect fiscal dates lead to misaligned reporting, regulatory violations, and financial statement errors. Manual date calculations consume a significant portion of the finance team's time during close periods. Use CreateDate to establish fiscal calendars, automate reporting periods, and ensure consistent handling of financial dates.
<cfscript>
    // Fiscal year configuration (April 1st start)
    fiscalYearConfig = {
        "startYear": 2024,
        "startMonth": 4,
        "startDay": 1
    };
    
    // Quarterly reporting periods
    quarters = [
        {"quarter": "Q1", "name": "First Quarter", "startMonth": 4, "endMonth": 6, "color": "##28a745"},
        {"quarter": "Q2", "name": "Second Quarter", "startMonth": 7, "endMonth": 9, "color": "##17a2b8"},
        {"quarter": "Q3", "name": "Third Quarter", "startMonth": 10, "endMonth": 12, "color": "##ffc107"},
        {"quarter": "Q4", "name": "Fourth Quarter", "startMonth": 1, "endMonth": 3, "color": "##dc3545"}
    ];
    
    // Financial deadlines and milestones
    financialEvents = [
        {"name": "Tax Filing Deadline", "month": 4, "day": 15, "description": "Corporate tax return due"},
        {"name": "Audit Preparation", "month": 2, "day": 1, "description": "Begin annual audit process"},
        {"name": "Budget Planning", "month": 12, "day": 1, "description": "Start next fiscal year budget"},
        {"name": "Board Meeting", "month": 1, "day": 30, "description": "Annual board presentation"}
    ];
</cfscript>

<cfoutput>
    <h2>📊 Fiscal Year Overview</h2>
    <cfscript>
        // Create fiscal year start and end dates
        fiscalStart = CreateDate(fiscalYearConfig.startYear, fiscalYearConfig.startMonth, fiscalYearConfig.startDay);
        fiscalEnd = DateAdd("d", -1, DateAdd("yyyy", 1, fiscalStart));
        
        // Calculate fiscal year progress
        totalFiscalDays = DateDiff("d", fiscalStart, fiscalEnd) + 1;
        daysIntoFiscalYear = DateDiff("d", fiscalStart, Now());
        daysRemainingFiscalYear = DateDiff("d", Now(), fiscalEnd);
        fiscalProgressPercent = daysIntoFiscalYear > 0 ? (daysIntoFiscalYear / totalFiscalDays) * 100 : 0;
        fiscalProgressPercent = Min(Max(fiscalProgressPercent, 0), 100);
    </cfscript>
    
    <div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid ##6f42c1; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
        <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
            
            <!-- Fiscal Year Info -->
            <div>
                <h3 style="margin-top: 0; color: ##333;">Fiscal Year #fiscalYearConfig.startYear#</h3>
                <p><strong>Period:</strong> #DateFormat(fiscalStart, "mmmm d, yyyy")# - #DateFormat(fiscalEnd, "mmmm d, yyyy")#</p>
                <p><strong>Total Days:</strong> #totalFiscalDays# days</p>
                <p><strong>Days Remaining:</strong> #daysRemainingFiscalYear LT 0 ? 'Fiscal year ended' : daysRemainingFiscalYear & ' days'#</p>
            </div>
            
            <!-- Progress Metrics -->
            <div>
                <h4 style="margin-top: 0;">📈 Progress Metrics</h4>
                <p><strong>Days Elapsed:</strong> #daysIntoFiscalYear LT 0 ? 'Not started' : daysIntoFiscalYear#</p>
                <p><strong>Progress:</strong> #NumberFormat(fiscalProgressPercent, "0.0")#%</p>
                <p><strong>Current Quarter:</strong> 
                    <cfif Month(Now()) GTE 4 AND Month(Now()) LE 6>Q1
                    <cfelseif Month(Now()) GTE 7 AND Month(Now()) LE 9>Q2
                    <cfelseif Month(Now()) GTE 10 AND Month(Now()) LE 12>Q3
                    <cfelse>Q4</cfif>
                </p>
            </div>
            
            <!-- CreateDate Example -->
            <div>
                <h4 style="margin-top: 0;">⚙️ CreateDate Usage</h4>
                <div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.85em;">
                    <strong>Fiscal Year Start:</strong><br>
                    CreateDate(#fiscalYearConfig.startYear#, #fiscalYearConfig.startMonth#, #fiscalYearConfig.startDay#)<br><br>
                    <strong>Result:</strong><br>
                    #DateFormat(fiscalStart, "yyyy-mm-dd")# 00:00:00
                </div>
            </div>
        </div>
        
        <!-- Progress Bar -->
        <div style="margin-top: 15px;">
            <h5>📊 Fiscal Year Progress</h5>
            <div style="background: ##e9ecef; height: 25px; border-radius: 12px; overflow: hidden; position: relative;">
                <div style="background: ##6f42c1; height: 100%; width: #NumberFormat(fiscalProgressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
                <div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 0.9em;">
                    #NumberFormat(fiscalProgressPercent, "0.0")#% Complete
                </div>
            </div>
        </div>
    </div>
    
    <h2>📅 Quarterly Reporting Periods</h2>
    <cfloop array="#quarters#" index="quarter">
        <cfscript>
            // Calculate quarter dates based on fiscal year
            if (quarter.quarter EQ "Q4") {
                // Q4 spans into next calendar year
                quarterStart = CreateDate(fiscalYearConfig.startYear + 1, quarter.startMonth, 1);
                quarterEnd = CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, 1)));
            } else {
                quarterStart = CreateDate(fiscalYearConfig.startYear, quarter.startMonth, 1);
                quarterEnd = CreateDate(fiscalYearConfig.startYear, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear, quarter.endMonth, 1)));
            }
            
            // Calculate quarter metrics
            quarterTotalDays = DateDiff("d", quarterStart, quarterEnd) + 1;
            quarterDaysElapsed = DateDiff("d", quarterStart, Now());
            quarterDaysRemaining = DateDiff("d", Now(), quarterEnd);
            
            // Determine quarter status
            if (quarterDaysRemaining LT 0) {
                quarterStatus = "Completed";
            } else if (quarterDaysElapsed LT 0) {
                quarterStatus = "Upcoming";
            } else {
                quarterStatus = "Current";
                quarterProgressPercent = (quarterDaysElapsed / quarterTotalDays) * 100;
            }
            
            // Create reporting deadlines (15 days after quarter end)
            reportingDeadline = DateAdd("d", 15, quarterEnd);
            boardMeeting = DateAdd("d", 30, quarterEnd);
        </cfscript>
        
        <div style="background: white; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #quarter.color#;">
            <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px;">
                
                <!-- Quarter Info -->
                <div>
                    <h4 style="margin-top: 0; color: #quarter.color#;">#quarter.quarter# - #quarter.name#</h4>
                    <p><strong>Period:</strong> #DateFormat(quarterStart, "mmm d")# - #DateFormat(quarterEnd, "mmm d, yyyy")#</p>
                    <p><strong>Status:</strong> #quarterStatus#</p>
                    <p><strong>Duration:</strong> #quarterTotalDays# days</p>
                </div>
                
                <!-- Timeline -->
                <div>
                    <h5>⏱️ Timeline</h5>
                    <p><strong>Days Elapsed:</strong> #quarterDaysElapsed LT 0 ? 'Not started' : quarterDaysElapsed#</p>
                    <p><strong>Days Remaining:</strong> #quarterDaysRemaining LT 0 ? 'Completed' : quarterDaysRemaining#</p>
                    <cfif quarterStatus EQ "Current">
                        <p><strong>Progress:</strong> #NumberFormat(quarterProgressPercent, "0.0")#%</p>
                    </cfif>
                </div>
                
                <!-- Deadlines -->
                <div>
                    <h5>📋 Key Deadlines</h5>
                    <p><strong>Quarter End:</strong> #DateFormat(quarterEnd, "mmm d, yyyy")#</p>
                    <p><strong>Reporting Due:</strong> #DateFormat(reportingDeadline, "mmm d, yyyy")#</p>
                    <p><strong>Board Meeting:</strong> #DateFormat(boardMeeting, "mmm d, yyyy")#</p>
                </div>
            </div>
            
            <!-- Quarter Progress Bar (only for current quarter) -->
            <cfif quarterStatus EQ "Current">
                <div style="margin-top: 10px;">
                    <div style="background: ##e9ecef; height: 15px; border-radius: 8px; overflow: hidden;">
                        <div style="background: #quarter.color#; height: 100%; width: #NumberFormat(quarterProgressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
                    </div>
                    <p style="margin: 3px 0 0 0; font-size: 0.8em; color: ##666;">Quarter Progress: #NumberFormat(quarterProgressPercent, "0.0")#%</p>
                </div>
            </cfif>
        </div>
    </cfloop>
    
    <h2>🗓️ Financial Calendar Events</h2>
    <div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
        <cfloop array="#financialEvents#" index="event">
            <cfscript>
                // Create event dates for current and next fiscal year
                if (event.month GTE fiscalYearConfig.startMonth) {
                    eventDate = CreateDate(fiscalYearConfig.startYear, event.month, event.day);
                } else {
                    eventDate = CreateDate(fiscalYearConfig.startYear + 1, event.month, event.day);
                }
                
                daysUntilEvent = DateDiff("d", Now(), eventDate);
                
                // If event has passed this fiscal year, show next year's date
                if (daysUntilEvent LT 0) {
                    eventDate = DateAdd("yyyy", 1, eventDate);
                    daysUntilEvent = DateDiff("d", Now(), eventDate);
                }
                
                // Determine urgency
                if (daysUntilEvent LE 30) {
                    urgencyColor = "##dc3545"; // Red
                } else if (daysUntilEvent LE 90) {
                    urgencyColor = "##ffc107"; // Yellow
                } else {
                    urgencyColor = "##28a745"; // Green
                }
            </cfscript>
            
            <div style="background: white; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #urgencyColor#; display: flex; justify-content: space-between; align-items: center;">
                <div>
                    <h5 style="margin: 0; color: #urgencyColor#;">#event.name#</h5>
                    <p style="margin: 5px 0 0 0; color: ##666;">#event.description#</p>
                    <div style="font-family: monospace; font-size: 0.85em; margin-top: 8px; background: ##f8f9fa; padding: 5px; border-radius: 3px;">
                        CreateDate(#Year(eventDate)#, #Month(eventDate)#, #Day(eventDate)#)
                    </div>
                </div>
                <div style="text-align: right;">
                    <p style="margin: 0; font-weight: bold; color: #urgencyColor#;">#DateFormat(eventDate, "mmmm d, yyyy")#</p>
                    <p style="margin: 5px 0 0 0; font-size: 0.9em; color: ##666;">
                        #daysUntilEvent# days remaining
                    </p>
                </div>
            </div>
        </cfloop>
    </div>
    
    <h2>📊 Financial Dashboard Summary</h2>
    <div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
        <cfscript>
            // Calculate upcoming events (next 90 days)
            upcomingEvents = 0;
            urgentEvents = 0; // next 30 days
            
            for (event in financialEvents) {
                if (event.month GTE fiscalYearConfig.startMonth) {
                    eventDate = CreateDate(fiscalYearConfig.startYear, event.month, event.day);
                } else {
                    eventDate = CreateDate(fiscalYearConfig.startYear + 1, event.month, event.day);
                }
                
                daysUntilEvent = DateDiff("d", Now(), eventDate);
                if (daysUntilEvent LT 0) {
                    eventDate = DateAdd("yyyy", 1, eventDate);
                    daysUntilEvent = DateDiff("d", Now(), eventDate);
                }
                
                if (daysUntilEvent LE 90) upcomingEvents++;
                if (daysUntilEvent LE 30) urgentEvents++;
            }
            
            // Calculate quarters completed
            completedQuarters = 0;
            for (quarter in quarters) {
                if (quarter.quarter EQ "Q4") {
                    quarterEnd = CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, 1)));
                } else {
                    quarterEnd = CreateDate(fiscalYearConfig.startYear, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear, quarter.endMonth, 1)));
                }
                
                if (DateDiff("d", Now(), quarterEnd) LT 0) {
                    completedQuarters++;
                }
            }
        </cfscript>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px;">
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##6f42c1;">#completedQuarters#/4</h3>
                <p style="margin: 5px 0 0 0;">Quarters Completed</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##28a745;">#NumberFormat(fiscalProgressPercent, "0")#%</h3>
                <p style="margin: 5px 0 0 0;">Fiscal Year Progress</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##ffc107;">#upcomingEvents#</h3>
                <p style="margin: 5px 0 0 0;">Upcoming Events (90d)</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##dc3545;">#urgentEvents#</h3>
                <p style="margin: 5px 0 0 0;">Urgent Events (30d)</p>
            </div>
        </div>
    </div>
</cfoutput>

Subscription and billing management

SaaS companies and subscription businesses manage billing cycles, trial periods, and renewal dates for thousands of customers with varying subscription terms. Incorrect billing dates lead to revenue leakage, customer churn, and compliance issues. Manual subscription management incurs significant costs in terms of lost subscription revenue. Use CreateDate to establish billing cycles, calculate trial periods, and automate subscription management.
<cfscript>
    // Sample subscription data
    subscriptions = [
        {"id": "SUB001", "customer": "Acme Corporation", "plan": "Premium", "startYear": 2024, "startMonth": 1, "startDay": 15, "billing": "monthly", "trialDays": 30, "revenue": 299, "status": "active"},
        {"id": "SUB002", "customer": "Beta Industries", "plan": "Enterprise", "startYear": 2024, "startMonth": 2, "startDay": 1, "billing": "annual", "trialDays": 14, "revenue": 2999, "status": "active"},
        {"id": "SUB003", "customer": "Gamma Solutions", "plan": "Basic", "startYear": 2024, "startMonth": 3, "startDay": 10, "billing": "quarterly", "trialDays": 7, "revenue": 99, "status": "trial"},
        {"id": "SUB004", "customer": "Delta Systems", "plan": "Professional", "startYear": 2023, "startMonth": 12, "startDay": 5, "billing": "monthly", "trialDays": 30, "revenue": 199, "status": "churned"}
    ];
    
    // Plan configurations
    planConfigs = {
        "Basic": {"color": "##28a745", "features": 5, "users": 5},
        "Professional": {"color": "##17a2b8", "features": 15, "users": 25},
        "Premium": {"color": "##fd7e14", "features": 30, "users": 100},
        "Enterprise": {"color": "##6f42c1", "features": 50, "users": 500}
    };
    
    // Billing cycle configurations
    billingCycles = {
        "monthly": {"interval": "m", "multiplier": 1, "name": "Monthly"},
        "quarterly": {"interval": "m", "multiplier": 3, "name": "Quarterly"},
        "annual": {"interval": "yyyy", "multiplier": 1, "name": "Annual"}
    };
</cfscript>

<cfoutput>
    <h2>📱 Subscription Management Results</h2>
    
    <cfloop array="#subscriptions#" index="subscription">
        <cfscript>
            // Create subscription start date using CreateDate
            subscriptionStart = CreateDate(subscription.startYear, subscription.startMonth, subscription.startDay);
            
            // Calculate trial period dates
            trialEnd = DateAdd("d", subscription.trialDays - 1, subscriptionStart);
            firstBillingDate = DateAdd("d", subscription.trialDays, subscriptionStart);
            
            // Calculate billing cycle dates
            billingConfig = billingCycles[subscription.billing];
            nextBillingDate = DateAdd(billingConfig.interval, billingConfig.multiplier, firstBillingDate);
            
            // Calculate subscription metrics
            daysSinceStart = DateDiff("d", subscriptionStart, Now());
            trialDaysRemaining = DateDiff("d", Now(), trialEnd);
            daysUntilNextBilling = DateDiff("d", Now(), nextBillingDate);
            
            // Determine subscription status and colors
            planConfig = planConfigs[subscription.plan];
            
            if (subscription.status EQ "trial") {
                if (trialDaysRemaining GT 0) {
                    currentStatus = "Trial Active";
                    statusColor = "##17a2b8";
                    statusDescription = trialDaysRemaining & " days remaining in trial";
                } else if (trialDaysRemaining EQ 0) {
                    currentStatus = "Trial Ending Today";
                    statusColor = "##ffc107";
                    statusDescription = "Trial expires today - conversion opportunity";
                } else {
                    currentStatus = "Trial Expired";
                    statusColor = "##dc3545";
                    statusDescription = "Trial ended " & abs(trialDaysRemaining) & " days ago";
                }
            } else if (subscription.status EQ "active") {
                currentStatus = "Active Subscription";
                statusColor = "##28a745";
                statusDescription = "Next billing in " & daysUntilNextBilling & " days";
            } else if (subscription.status EQ "churned") {
                currentStatus = "Churned";
                statusColor = "##6c757d";
                statusDescription = "Subscription cancelled";
            } else {
                currentStatus = "Unknown";
                statusColor = "##6c757d";
                statusDescription = "Status unknown";
            }
            
            // Calculate billing history and future dates
            billingSchedule = [];
            currentBillingDate = firstBillingDate;
            
            // Generate next 6 billing cycles for active subscriptions
            if (subscription.status NEQ "churned") {
                for (local.i = 1; local.i LE 6; local.i++) {
                    local.billingInfo = {};
                    local.billingInfo["cycle"] = local.i;
                    local.billingInfo["date"] = currentBillingDate;
                    local.billingInfo["daysFromNow"] = DateDiff("d", Now(), currentBillingDate);
                    local.billingInfo["amount"] = subscription.revenue;
                    
                    if (local.billingInfo["daysFromNow"] LT 0) {
                        local.billingInfo["status"] = "Billed";
                        local.billingInfo["statusColor"] = "##28a745";
                    } else if (local.billingInfo["daysFromNow"] LE 7) {
                        local.billingInfo["status"] = "Due Soon";
                        local.billingInfo["statusColor"] = "##ffc107";
                    } else {
                        local.billingInfo["status"] = "Scheduled";
                        local.billingInfo["statusColor"] = "##6c757d";
                    }
                    
                    ArrayAppend(billingSchedule, local.billingInfo);
                    
                    // Calculate next billing date
                    currentBillingDate = DateAdd(billingConfig.interval, billingConfig.multiplier, currentBillingDate);
                }
            }
            
            // Calculate lifetime value metrics
            monthsActive = DateDiff("m", subscriptionStart, Now());
            if (monthsActive LT 1) monthsActive = 1;
            
            // Estimate annual revenue based on billing cycle
            switch(subscription.billing) {
                case "monthly":
                    annualRevenue = subscription.revenue * 12;
                    break;
                case "quarterly":
                    annualRevenue = subscription.revenue * 4;
                    break;
                case "annual":
                    annualRevenue = subscription.revenue;
                    break;
                default:
                    annualRevenue = subscription.revenue * 12;
            }
        </cfscript>
        
        <div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid #statusColor#; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
            <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
                
                <!-- Subscription Information -->
                <div>
                    <h3 style="margin-top: 0; color: ##333;">#subscription.customer#</h3>
                    <p><strong>Subscription ID:</strong> #subscription.id#</p>
                    <p><strong>Plan:</strong> <span style="color: #planConfig.color#; font-weight: bold;">#subscription.plan#</span></p>
                    <p><strong>Billing:</strong> #billingConfig.name# ($#NumberFormat(subscription.revenue, "999")#)</p>
                    <p><strong>Status:</strong> <span style="color: #statusColor#; font-weight: bold;">#currentStatus#</span></p>
                    <p><strong>Annual Value:</strong> $#NumberFormat(annualRevenue, "9,999")#</p>
                </div>
                
                <!-- Date Information -->
                <div>
                    <h4 style="margin-top: 0;">📅 Key Dates</h4>
                    <p><strong>Start Date:</strong> #DateFormat(subscriptionStart, "mmmm d, yyyy")#</p>
                    <p><strong>Trial End:</strong> #DateFormat(trialEnd, "mmmm d, yyyy")#</p>
                    <p><strong>First Billing:</strong> #DateFormat(firstBillingDate, "mmmm d, yyyy")#</p>
                    <cfif subscription.status NEQ "churned">
                        <p><strong>Next Billing:</strong> #DateFormat(nextBillingDate, "mmmm d, yyyy")#</p>
                    </cfif>
                    <p><strong>Days Active:</strong> #daysSinceStart# days (#monthsActive# months)</p>
                </div>
                
                <!-- Technical Details -->
                <div>
                    <h4 style="margin-top: 0;">⚙️ CreateDate Usage</h4>
                    <div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.85em;">
                        <strong>Subscription Start:</strong><br>
                        CreateDate(#subscription.startYear#, #subscription.startMonth#, #subscription.startDay#)<br><br>
                        <strong>Result:</strong><br>
                        #DateFormat(subscriptionStart, "yyyy-mm-dd")# 00:00:00<br><br>
                        <strong>Trial End:</strong><br>
                        DateAdd("d", #subscription.trialDays - 1#, start)
                    </div>
                </div>
            </div>
            
            <!-- Status Banner -->
            <div style="background: #statusColor#; color: white; padding: 12px; border-radius: 5px; margin-top: 15px; text-align: center;">
                <strong>#statusDescription#</strong>
            </div>
            
            <!-- Plan Features -->
            <div style="background: ##f8f9fa; padding: 15px; border-radius: 5px; margin-top: 15px;">
                <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; text-align: center;">
                    <div>
                        <h5 style="margin: 0; color: #planConfig.color#;">#subscription.plan# Plan</h5>
                        <p style="margin: 5px 0 0 0; font-size: 0.9em;">Premium features included</p>
                    </div>
                    <div>
                        <h5 style="margin: 0; color: ##666;">#planConfig.features# Features</h5>
                        <p style="margin: 5px 0 0 0; font-size: 0.9em;">Available features</p>
                    </div>
                    <div>
                        <h5 style="margin: 0; color: ##666;">#planConfig.users# Users</h5>
                        <p style="margin: 5px 0 0 0; font-size: 0.9em;">User limit</p>
                    </div>
                </div>
            </div>
            
            <!-- Billing Schedule -->
            <cfif ArrayLen(billingSchedule) GT 0>
                <div style="background: ##e8f5e8; padding: 15px; border-radius: 5px; margin-top: 15px;">
                    <h5 style="margin-top: 0;">💰 Billing Schedule (#billingConfig.name#)</h5>
                    <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; max-height: 200px; overflow-y: auto;">
                        <cfloop array="#billingSchedule#" index="billing">
                            <div style="background: white; padding: 8px; border-radius: 3px; border-left: 3px solid #billing.statusColor#;">
                                <div style="display: flex; justify-content: space-between; align-items: center;">
                                    <div>
                                        <strong>Cycle #billing.cycle#</strong>
                                        <p style="margin: 2px 0 0 0; font-size: 0.85em;">#DateFormat(billing.date, "mmm d, yyyy")#</p>
                                    </div>
                                    <div style="text-align: right;">
                                        <p style="margin: 0; font-weight: bold; font-size: 0.9em;">$#NumberFormat(billing.amount, "999")#</p>
                                        <p style="margin: 2px 0 0 0; font-size: 0.8em; color: #billing.statusColor#;">#billing.status#</p>
                                    </div>
                                </div>
                            </div>
                        </cfloop>
                    </div>
                </div>
            </cfif>
            
            <!-- Action Items -->
            <div style="background: rgba(255,255,255,0.8); padding: 12px; border-radius: 5px; margin-top: 15px;">
                <strong>📋 Subscription Actions:</strong>
                <cfif currentStatus EQ "Trial Active">
                    <br>• Monitor trial usage and engagement metrics
                    <br>• Send trial progress updates and feature highlights
                    <br>• Prepare conversion campaign for trial end
                    <br>• Schedule demo or consultation call
                <cfelseif currentStatus EQ "Trial Ending Today">
                    <br>• Send urgent conversion offer and incentives
                    <br>• Contact customer for immediate renewal discussion
                    <br>• Provide personalized onboarding assistance
                    <br>• Offer extended trial if needed
                <cfelseif currentStatus EQ "Active Subscription">
                    <br>• Monitor usage patterns and satisfaction metrics
                    <br>• Send billing reminders and invoices on schedule
                    <br>• Identify upselling and cross-selling opportunities
                    <br>• Maintain regular customer success check-ins
                <cfelseif currentStatus EQ "Churned">
                    <br>• Conduct exit interview and gather feedback
                    <br>• Archive subscription data and billing history
                    <br>• Add to win-back marketing campaign list
                    <br>• Update customer status in CRM system
                </cfif>
            </div>
        </div>
    </cfloop>
    
    <h2>📊 Subscription Business Dashboard</h2>
    <div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
        <cfscript>
            // Calculate business metrics
            totalSubscriptions = ArrayLen(subscriptions);
            activeSubscriptions = 0;
            trialSubscriptions = 0;
            churnedSubscriptions = 0;
            totalMRR = 0; // Monthly Recurring Revenue
            totalARR = 0; // Annual Recurring Revenue
            
            trialConversions = 0;
            upcomingBillings = 0; // Next 30 days
            
            for (subscription in subscriptions) {
                switch(subscription.status) {
                    case "active":
                        activeSubscriptions++;
                        break;
                    case "trial":
                        trialSubscriptions++;
                        break;
                    case "churned":
                        churnedSubscriptions++;
                        break;
                }
                
                // Calculate recurring revenue
                if (subscription.status EQ "active") {
                    switch(subscription.billing) {
                        case "monthly":
                            totalMRR += subscription.revenue;
                            totalARR += subscription.revenue * 12;
                            break;
                        case "quarterly":
                            totalMRR += subscription.revenue / 3;
                            totalARR += subscription.revenue * 4;
                            break;
                        case "annual":
                            totalMRR += subscription.revenue / 12;
                            totalARR += subscription.revenue;
                            break;
                    }
                }
                
                // Check for upcoming billings
                subscriptionStart = CreateDate(subscription.startYear, subscription.startMonth, subscription.startDay);
                firstBillingDate = DateAdd("d", subscription.trialDays, subscriptionStart);
                billingConfig = billingCycles[subscription.billing];
                nextBillingDate = DateAdd(billingConfig.interval, billingConfig.multiplier, firstBillingDate);
                
                if (subscription.status NEQ "churned" AND DateDiff("d", Now(), nextBillingDate) LE 30 AND DateDiff("d", Now(), nextBillingDate) GTE 0) {
                    upcomingBillings++;
                }
            }
            
            // Calculate conversion and churn rates
            conversionRate = totalSubscriptions > 0 ? (activeSubscriptions / totalSubscriptions) * 100 : 0;
            churnRate = totalSubscriptions > 0 ? (churnedSubscriptions / totalSubscriptions) * 100 : 0;
            
            // Calculate average revenue per user
            averageARPU = activeSubscriptions > 0 ? totalMRR / activeSubscriptions : 0;
        </cfscript>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px;">
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##28a745;">#activeSubscriptions#</h3>
                <p style="margin: 5px 0 0 0;">Active Subscriptions</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##17a2b8;">#trialSubscriptions#</h3>
                <p style="margin: 5px 0 0 0;">Trial Subscriptions</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##6c757d;">#churnedSubscriptions#</h3>
                <p style="margin: 5px 0 0 0;">Churned Customers</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##fd7e14;">$#NumberFormat(totalMRR, "9,999")#</h3>
                <p style="margin: 5px 0 0 0;">Monthly Recurring Revenue</p>
            </div>
        </div>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px; margin-top: 20px;">
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##6f42c1;">$#NumberFormat(totalARR, "99,999")#</h3>
                <p style="margin: 5px 0 0 0;">Annual Recurring Revenue</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##28a745;">#NumberFormat(conversionRate, "0.0")#%</h3>
                <p style="margin: 5px 0 0 0;">Conversion Rate</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##dc3545;">#NumberFormat(churnRate, "0.0")#%</h3>
                <p style="margin: 5px 0 0 0;">Churn Rate</p>
            </div>
            <div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
                <h3 style="margin: 0; color: ##17a2b8;">$#NumberFormat(averageARPU, "999")#</h3>
                <p style="margin: 5px 0 0 0;">Average Revenue Per User</p>
            </div>
        </div>
    </div>
</cfoutput>

Share this page

Was this page helpful?
We're glad. Tell us how this page helped.
We're sorry. Can you tell us what didn't work for you?
Thank you for your feedback. Your response will help improve this page.

On this page