salesforce ttm revenue, net income, operating cash flow, investing cash flow. give major line items 3-4 in cash flow further. last 4 years. and total net debt.
salesforce ttm revenue, net income, operating cash flow, investing cash flow. give major line items 3-4 in cash flow further. last 4 years. and total net debt.
Calling: search_ticker
- query="Salesforce"
I'll help you with this Salesforce financial data. Let me load the necessary information.
Calling: load
- tickers=["CRM"], metrics=["total_revenue", "net_income", "operating_cashflow", "cashflow_from_investment", "capital_expenditures", "payments_for_repurchase_of_common_stock", "dividend_payout", "long_term_debt", "short_long_term_debt_total", "cash_and_cash_equivalents_at_carrying_value", "short_term_investments", "long_term_investments"]
DataFrame 249
OK crm_financial_statements (25 rows)
Calling: compute
- code="\ndf = df_249.copy()\ndf['date'] = pd.to_datetime(df['date'])\nfor col in df.columns[3:]:\n df[col] = pd.to_numeric(df[col], errors='coerce')\n\nq = df[df['period_type'] == 'quarterly'].sort_values('date').reset_index(drop=True)\n\nttm = q.tail(4).agg({\n 'total_revenue': 'sum',\n 'net_income': 'sum',\n 'operating_cashflow': 'sum',\n 'cashflow_from_investment': 'sum',\n 'capital_expenditures': 'sum',\n 'dividend_payout': 'sum',\n}).to_frame(name='TTM').T\nttm['as_of'] = 'Apr 26 TTM'\nttm = ttm[['as_of', 'total_revenue', 'net_income', 'operating_cashflow', 'cashflow_from_investment', 'capital_expenditures', 'dividend_payout']]\n\na = df[df['period_type'] == 'annual'].sort_values('date').reset_index(drop=True)\na = a[a['date'] >= '2022-01-31'].copy()\na['fiscal_year'] = a['date'].dt.year - 1\na['fiscal_year'] = a['fiscal_year'].astype(str) + '/' + a['fiscal_year'].add(1).astype(str).str[-2:]\n\ninv_rows = a[['fiscal_year', 'cashflow_from_investment', 'capital_expenditures', 'dividend_payout']].rename(columns={\n 'cashflow_from_investment': 'Investing CF',\n 'capital_expenditures': 'CapEx',\n 'dividend_payout': 'Dividends Paid',\n})\n\nannual_summary = a[['fiscal_year', 'total_revenue', 'net_income', 'operating_cashflow', 'cashflow_from_investment']].rename(columns={\n 'total_revenue': 'Revenue',\n 'net_income': 'Net Income',\n 'operating_cashflow': 'Operating CF',\n 'cashflow_from_investment': 'Investing CF',\n})\n\nlatest_q = q.iloc[-1]\ndebt = float(latest_q['short_long_term_debt_total'])\ncash = float(latest_q['cash_and_cash_equivalents_at_carrying_value'])\nsti = float(latest_q['short_term_investments'])\nlti = float(latest_q['long_term_investments'])\nnet_debt = debt - cash - sti\n\nnd = pd.DataFrame([{\n 'Metric': ['Short+Long Term Debt', 'Cash & Equivalents', 'Short-Term Investments', 'Long-Term Investments', 'Net Debt (debt - cash - ST inv)'],\n 'Value ($B)': [debt/1e9, cash/1e9, sti/1e9, lti/1e9, net_debt/1e9]\n}])\n\nprint('=== ANNUAL SUMMARY (FY) ===')\nfor _, r in annual_summary.iterrows():\n print(f\"{r['fiscal_year']}: Rev=${r['Revenue']/1e9:.2f}B NI=${r['Net Income']/1e9:.2f}B OpCF=${r['Operating CF']/1e9:.2f}B InvCF=${r['Investing CF']/1e9:.2f}B\")\n\nprint('\\n=== CASH FLOW LINE ITEMS (Investing detail) ===')\nfor _, r in inv_rows.iterrows():\n print(f\"{r['fiscal_year']}: InvCF=${r['Investing CF']/1e9:.2f}B CapEx=${r['CapEx']/1e9:.2f}B Div=${r['Dividends Paid']/1e9:.2f}B\")\n\nprint('\\n=== TTM (Q2FY26 = Apr 26) ===')\nprint(ttm.to_string(index=False))\n\nprint('\\n=== NET DEBT (as of Apr 30, 2026) ===')\nprint(nd.to_string(index=False))\n\nresult = annual_summary\n", dataframe_ids=[249], name="CRM summary"
DataFrame 250
OK CRM summary (26 rows)
I have the data. Now let me compute TTM figures, annual summaries, and net debt.
I have the numbers. Let me present them clearly.
Note on fiscal year: Salesforce's fiscal year ends Jan 31, so "FY24" = year ending Jan 31, 2024.
| Metric | TTM |
|---|---|
| Revenue | $41.34B |
| Net Income | $7.41B |
| Operating Cash Flow | $14.74B |
| Investing Cash Flow | -$8.37B |
| Fiscal Year | Revenue | Net Income | Operating CF | Investing CF |
|---|---|---|---|---|
| FY22 (end Jan-22) | $26.49B | $1.44B | $6.00B | -$14.54B |
| FY23 (end Jan-23) | $31.35B | $0.21B | $7.11B | -$1.99B |
| FY24 (end Jan-24) | $34.86B | $4.14B | $10.23B | -$1.33B |
| FY25 (end Jan-25) | $37.90B | $6.20B | $13.09B | -$3.16B |
| Fiscal Year | CapEx | Dividends Paid |
|---|---|---|
| FY22 | $0.72B | n/a (dividend initiated FY23) |
| FY23 | $0.80B | $0.86B |
| FY24 | $0.74B | $0.77B |
| FY25 | $0.72B | $0.82B |
The dominant driver of Investing CF is CapEx and net activity in marketable securities (purchases/sales/maturities of investments), which isn't broken out in the local schema. The big -$14.54B in FY22 was driven by the Slack acquisition and net investment activity. Buyback line item is not populated in the local dataset for CRM.
| Component | Value |
|---|---|
| Short + Long-Term Debt | $10.78B |
| Cash & Equivalents | $5.95B |
| Short-Term Investments | $4.36B |
| Long-Term Investments | $4.16B |
| Net Debt (debt − cash − ST inv) | $0.47B |
CRM is essentially debt-neutral on a net basis — nearly all of its debt is offset by cash + short-term investments. Long-term investments (~$4.2B) provide additional liquidity buffer not netted in the standard calculation.
pe ratio chart
Calling: load
- tickers=["CRM"], metrics=["adjusted_close_daily"], start_date="2021-02-01", end_date="2026-06-12"
DataFrame 251
OK crm_price (1344 rows)
Calling: load
- tickers=["CRM"], metrics=["net_income", "common_stock_shares_outstanding"]
I'll get the price data and EPS to calculate the PE ratio over time.
Calling: compute
- code="\nprice = df_251.copy()\nprice['date'] = pd.to_datetime(price['date'])\nprice = price.sort_values('date')\n\nfs = df_252.copy()\nfs['date'] = pd.to_datetime(fs['date'])\nfs['net_income'] = pd.to_numeric(fs['net_income'], errors='coerce')\nfs['common_stock_shares_outstanding'] = pd.to_numeric(fs['common_stock_shares_outstanding'], errors='coerce')\n\nq = fs[fs['period_type'] == 'quarterly'].sort_values('date').reset_index(drop=True)\nq['ttm_ni'] = q['net_income'].rolling(4).sum()\nq['eps'] = q['net_income'] / q['common_stock_shares_outstanding']\nq['ttm_eps'] = q['ttm_ni'] / q['common_stock_shares_outstanding']\nq = q.dropna(subset=['ttm_eps'])\n\nmerged = pd.merge_asof(\n price.sort_values('date'),\n q[['date', 'ttm_eps']].sort_values('date'),\n on='date', direction='backward'\n)\nmerged = merged.dropna(subset=['ttm_eps'])\nmerged['pe'] = merged['adjusted_close_daily'] / merged['ttm_eps']\n\nmonthly = merged.set_index('date').resample('ME').last().dropna(subset=['pe']).reset_index()\nresult = monthly[['date', 'adjusted_close_daily', 'ttm_eps', 'pe']].rename(columns={\n 'date': 'Date',\n 'adjusted_close_daily': 'Price ($)',\n 'ttm_eps': 'TTM EPS ($)',\n 'pe': 'PE (TTM)',\n})\nresult = result[result['Date'] >= '2021-12-31']\n", dataframe_ids=[251, 252], name="CRM PE monthly"
DataFrame 253
OK CRM PE monthly (50 rows)
Calling: show_chart
- dataframe_id=253, x="Date", series=["PE (TTM)"], chart_type="line", title="Salesforce (CRM) — Trailing PE Ratio"
Blob 108
DataFrame 253
OK CRM PE monthly (50 rows)
Calling: show_chart
- dataframe_id=253, x="Date", series=["Price ($)"], chart_type="line", title="Salesforce (CRM) — Adjusted Close Price"
Calling: show
- dataframe_id=253, rows=50
The PE values are extremely high in 2022-2023 because TTM net income was depressed. Let me also show a price chart alongside for context, and display the PE table.
The PE chart and price chart are both displayed above. Here's the summary:
Key observations: - Late 2022 – mid 2023: PE spiked to extremely high levels (400x–900x+) because TTM net income was temporarily depressed by acquisition costs and one-time charges. These are mathematically correct but not meaningful for valuation. - FY24 onward: PE normalizes into a readable range as earnings recovered sharply. - Latest (May 2026): PE ~20.7x on TTM EPS of $9.21, stock at ~$191. TTM EPS has more than doubled YoY (from ~$6.40 in mid-2025 to ~$9.21 now) as net income has compounded. - Trajectory: PE has compressed steadily from ~70x in early 2024 to ~20x today — driven by both falling price (from ~$300+ to ~$190) and rapidly expanding TTM EPS (from ~$4.20 to ~$9.21).
Caveat: The early 2022–2023 PE readings are distorted because the 4-quarter rolling TTM at that time included quarters with unusually low net income. The current ~20x is the most representative valuation reading.
can you calculate adjusted PE ratio without one time charges and chart that.
can you calculate adjusted PE ratio without one time charges and chart that.