Unmatched mutual fund
Scheme code unavailable. Stored fund data.
Find ideas. Follow changes. Understand what you own.
Explore Q-Score, valuation and charts across US & NSE stocks.
Illustrative examples, not live market or account data. Open a feature for real data.
Example screener · illustrative scores
| Stock | Q-Score |
|---|
Compare the full metric set in the screener.
Example watchlist · illustrative chart
| Period | Price ₹ | Q-Score |
|---|
Illustrative alert · nothing sent
Example rule: a daily move of at least 5%.
Example funds · illustrative scores
| Fund | MF-Score | Avg Q-Score |
|---|
Compare funds and their underlying holdings.
Illustrative portfolio · not account data
Example gain ₹27,000 · 9.0%
Import CAS or add holdings after signing in.
Aurora Equity · illustrative holdings
Fund-by-fund quality, not a return forecast.
Examples are not recommendations. Playback resumes after five seconds without interaction.
Your watchlist, scored and colour-coded — then one click into valuation, charts, AI summaries and backtests.
Research, valuation, screening, simulation and alerts — no spreadsheets, and free to start.
The free plan is free forever — no card, no ads. Continue with Google, or use an email and password.
Research and analysis only. VroomStocks never places trades and is not investment advice.
The Basic plan is free of charge, forever, and it covers the whole product — watchlists, valuation, charts, screeners, AI summaries, mutual funds, backtesting and screener alerts. Only the size of the numbers is capped: how many stocks you can track, how far back the financial history goes, how many AI summaries you can generate each month and which alerts you can set. Advanced raises every one of those. There are no ads, and nothing is charged unless you choose a paid plan.
Yes — that is what Alerts are for. Set one on a buy/sell signal, a price move on your watchlist, a saved screen gaining or losing a name, a shareholding or insider transaction, a new earnings call or an AI summary, and it arrives by email hourly, daily, weekly or monthly. Everything due in the same window is combined into a single digest, and nothing is ever reported to you twice. The two screener alerts are included on the free plan.
Prices and fundamentals come from Yahoo Finance, with SEC EDGAR and other public sources as fallbacks for US names and NSE for India. Mutual fund data comes from AMFI's official direct-growth catalogue. Earnings-call transcripts come from the exchange filings themselves.
Every account gets its own isolated store. Your watchlist, holdings, screens and settings are scoped to your sign-in and are never shared with or visible to other users.
No. VroomStocks is a research and analysis tool — it never connects to a broker and never places an order. Backtesting and paper-trading are simulated on historical and live prices.
US stocks (NYSE and Nasdaq) and Indian stocks (NSE), plus 2,500+ Indian direct-growth mutual funds. You can switch markets at any time from the sidebar.
An illustrated walkthrough of every feature — from adding your first stock to screening the market, reading AI summaries, tracking your mutual funds, backtesting a trading strategy and setting the alerts that tell you when something changes.
Log in to your dashboard
Free forever. No card, no ads — and your data stays yours.
By continuing you agree to our and .
Loading questionnaire...
Everything described here is free — no card, no ads, and your data stays yours.
Setting up your profile…
We're shipping a quick improvement — you'll be back in a few seconds. No need to refresh.
Safari is the only iPhone browser that can install web apps.
Your next step
Sign in to save your research across devices.
Save your favourite screens
Build a watchlist of your own
Pick up where you left off
Browsing stays free. No account required.
Changes apply immediately. Select multiple categories to include any of them.
Add it to the companies you're comparing on Visual, or open its full Analysis page.
Name this metric selection so you can pick it again from the Template list.
Starts with your current metric selection.
| Ticker |
|---|
| Ticker |
|---|
| Ticker |
|---|
| Ticker |
|---|
| Ticker |
|---|
Which of the 10 backtest strategies wins most consistently — across your whole portfolio, and against the broad market.
No analysis yet for this region. Run it once to see which strategy performs best across your portfolio and vs the market. This fetches 5 years of history for every stock you track, so it may take a little while — after that, it loads instantly from your saved results until you hit Refresh again.
Fetching 5-year history and simulating 9 strategies…
Start from an index rather than from your own list: filter its members on 45 metrics, sort by anything, and save the searches you want to run again.
Pick a market and an index, set your filters, then add any of the 45 available metrics as columns. Q-Score plus every filtered metric stay locked in place; everything else is yours to arrange. Each column sorts, and blanks always sink to the bottom rather than crowding the top.
Any result opens straight into the full stock page — valuation, fundamentals, technicals, options and AI summaries — so a screen is a starting point rather than a dead end.
Screen the Indian mutual fund universe on returns, cost and risk — then open any fund to see exactly what it owns.
Filter and sort on returns over multiple horizons, expense ratio, category and fund house. As with the stock screener, the metrics you filter on are pinned into the table, and every column — including the fund name — sorts.
Holdings-level detail is what turns a shortlist into a decision: three well-rated funds that hold the same twenty companies give you far less diversification than their labels suggest.
Scheme code unavailable. Stored fund data.
Upload a Consolidated Account Statement (CAS) PDF from CAMS or KFintech. On the CAMS request page, use these settings:
Everything is parsed on the server — the file is never stored.
Open charts
Choose a starting template, then choose a template for each ticker below.
Select a ticker above or choose a template to get started. Your watchlist stays unchanged.
Create a study or test a strategy against completed bars.
Rich editing loads locally. Your source stays in this browser until you choose an existing save, check or run action.
OpenScript 0.8.1. Lines, candles, fills, levels, markers, drawings, tables and dynamic colors. Use input() defaults in your source. Alerts are historical matches only; no live notifications. Other-symbol/timeframe requests are not supported.
Add a ticker to run a script.
Long-only cash equities, whole-share market entries and full-position closes. No shorts, leverage, pyramiding, partial exits or live trading. Signals on completed bars fill at the next open. Warm-up bars cannot trade. Orders on the final bar cannot fill.
Strategy capital must match the tester. Use fillOn="nextOpen", qtyType="units" and no declaration commissions or slippage. Tester costs apply to both strategy and buy and hold. One basis point is 0.01%.
Yahoo adjusted OHLCV, not executable quotes. Dividends are not added again. Current-day daily candles are excluded conservatively. Buy and hold buys whole shares at the first scoring open and retains residual cash. Open positions are marked at the final close, not forcibly sold.
New scoring dates default to the last five calendar years through the latest loaded completed bar. Daily runs fetch up to 366 calendar days before scoring for warm-up, independently of chart lookback. Check the reported warm-up count for long indicators and actual coverage for recent listings. Intraday history is limited to seven days for one-minute bars and 60 days for other intervals; shorten scoring dates or use daily bars. Missing backtest price bars are added to the chart without resetting its zoom or templates.
Maximum 10,000 bars, 64 plots, 120 compiler checks and 20 runs per UTC day. Complex studies may need shorter ranges to fit the bounded worker. Runs expire after seven days. No fees are assumed beyond the costs you enter. Results are research, not investment advice.
Write an indicator or a simulated strategy for the active ProCharts ticker. This guide covers the OpenScript 0.8.1 features supported here. Reading it does not change your draft or run a script.
No matching topics. Your current chapter stays open.
Begin with version 1 and a study() declaration. Use overlay=true for a price overlay or overlay=false for a separate pane. Values are calculated from the selected chart's adjusted OHLCV bars.
version 1
study("My EMA", overlay=true)
length = input(20, "Length")
plot(ema(close, length), "EMA", aqua)
input() defines a default in your source. Change that default to change the calculation. plot() draws a numeric series; this example draws the exponential moving average of close over 20 bars. An indicator does not place orders.
Use open, high, low, close and volume for the current bar. bar.index is the bar index, including warm-up. Functions such as sma(close, 20), ema(close, 20), rsi(close, 14) and atr(14) calculate series from server-fetched history.
crossUp(fast, slow) detects a crossing above and crossDown(fast, slow) a crossing below. Put conditional actions in an indented block after if. Daily runs request up to 366 calendar days before scoring for warm-up; inspect the reported count rather than assuming every indicator has enough history.
Use strategy() instead of study(). This example buys one share on an EMA crossover and closes the full position on the opposite crossover. It has no stop-loss and can lose money.
version 1
strategy("EMA crossover", capital=10000, qty=1, fillOn="nextOpen")
fast = ema(close, 10)
slow = ema(close, 30)
if crossUp(fast, slow)
buy()
if crossDown(fast, slow)
close()
plot(fast, "Fast average", aqua)
plot(slow, "Slow average", orange)
Match declaration capital to Run settings. Orders use whole-share units; use qtyType="units" if specifying the quantity type. Only long-only market entries and full-position closes are supported. No shorts, leverage, pyramiding, partial exits or live trading.
Completed-bar signals fill at the next scoring bar's open. Warm-up bars cannot trade and the final bar cannot fill an order without another scoring bar. Set fees and slippage in Run settings, not in the declaration. Open positions are marked at the final close, not forcibly sold.
Return to Source code and choose Check code to see compiler diagnostics. Review the ticker, timeframe, scoring dates, capital and costs before choosing Run backtest for a strategy or Run & apply for an indicator. Compiler checks and runs consume separate daily allowances.
Results and chart plots are frozen snapshots, not live signals. A successful run replaces the previous OpenScript chart snapshot; a failed or cancelled run keeps it. Editing your draft does not update an old result. Chart context changes remove its plots.
Backtest results show net PnL over time, including costs and open-position value. Use the Trades icon for entry and exit details, or compare with buy and hold using the same tester costs. All BUY and SELL markers are simulated fills, not real orders. Historical results on adjusted Yahoo prices are research, not executable quotes or investment advice.
Use Explanation to describe purpose, calculations, inputs, usage and limitations. Headings, lists, bold and inline code are supported; HTML remains text.
Save private revision keeps your script private. Publishing requires a saved revision, successful compilation, an explanation and explicit source-disclosure consent. Community can read and clone the published source and explanation; your runs and tester settings stay private. Clone a Built-in or Community script before editing it.
Use line, marker-line, step, area, histogram, column and candle plots, including dynamic colors. Fills, levels, drawing objects and tables are included in the frozen snapshot. Alert conditions are listed as historical matches, not live notifications. Other-symbol or other-timeframe requests remain unsupported. Native ProCharts source buttons show labeled OpenScript counterparts; the native renderer is not replaced.
Maximum 120,000 source characters, 64 plots and 10,000 bars, within a 128 MB, 30-second worker and 8 MB result limit. Complex studies may require shorter ranges. Up to 120 compiler checks and 20 runs per UTC day. Reports expire after seven days. Unsupported features produce diagnostics rather than silently running.
Describe the purpose, calculation, inputs, use, assumptions and limitations. Publication makes this explanation and the saved source revision public. Runs and tester settings remain private.
Use # headings, - list items, **bold** and `inline code`. HTML is displayed as text.
Run a script to see its results. Study plots do not imply simulated trades.
Simulated trades. No real orders.
Everyone in Community can read and clone this saved source and explanation. Runs and tester settings stay private. Unpublishing cannot recall clones.
Choose a starting point. Saving does not publish.
No matching scripts in the loaded entries. Change the search or type filter.
One OpenScript snapshot. A successful run replaces it; failure keeps it. Maximum 20 runs per UTC day. Native indicators are added separately.
Only loaded rows are exported. Blank bounds include all loaded times.
Get an email when something you follow actually moves. Everything due in the same window arrives as one message, so more alerts does not mean more email.
Your details and how you sign in. Nothing here is shown to anyone else.
Warm and refresh the shared screener and transcript caches, and schedule them to keep themselves up to date.
| Market | Universe | Loaded | Last updated | Actions |
|---|
Warm fetches only the stocks that are missing or stale. Refresh force-re-fetches every stock in that universe (slow for “All”). Warm missing (under a market) warms every not-fully-loaded universe in that market at once. The job now retries throttled fetches and only gives up on genuinely un-fetchable symbols (shown below). One job runs at a time. The auto-refresh cadence below force-refreshes the whole universe server-side on a schedule, even when no one is on the page.
Users, stocks added, app installs, and activity across the selected window. Activity is logged from this feature's deploy onward; stock counts and “last active” also reflect earlier data.
| User | Stocks added | Added in window | Activity in window | Top actions | Last active |
|---|
Uses the time window above: rolling 24 hours, 7 days, 30 days or 365 days. Counts recorded visits, not unique people; shared networks and VPNs can share an IP. Locations are approximate and use the latest known location recorded in that window. Known bots and visits without an IP are excluded.
| IP address | Location | Visits | Last visit |
|---|
Enterprise requests from Pricing > Contact Sales, newest first, across all time (not the window above). Expand an inquiry for contact details and the full project description. New submissions are saved from this feature's deployment onward; older email-only inquiries are not included.
Every row recorded in activity_log, newest first. Filters and paging are applied on the server, so they search the whole table rather than the rows on screen.
| ID | Time (UTC) | User | Action | Detail | Region | Location | IP | Device | Browser |
|---|
How the APIs readers actually call are behaving, and how the background sync jobs are doing. A failure is a 5xx or an unhandled exception — a 4xx is counted separately as a client error, so an endpoint that validates its input does not look broken. Reliability is (calls − failures) / calls. API timings are recorded into hourly buckets and flushed every minute, so the last minute may be missing.
Azure Monitor for investwithai, last 30 days through the last completed hour. Times are UTC; weeks start Monday. This history is independent of the API/job window above.
Percentage of available capacity used on FlaskApp's hosting plan, including all apps and platform usage on that plan. CPU and memory show averages of available hourly percentages; memory also shows the highest reported peak. Azure combines plan instances. Missing samples stay blank, not zero. Results are cached for up to 5 minutes.
| Period (UTC) | Avg CPU (%) | Avg memory (%) | Peak memory (%) | Hours: CPU / avg / peak / expected |
|---|
Azure Monitor for investwithai-sync, last 30 days through the last completed hour. Times are UTC; weeks start Monday. This history is independent of the API/job window above.
Percentage of available capacity used on SyncApp's hosting plan, including all apps and platform usage on that plan. CPU and memory show averages of available hourly percentages; memory also shows the highest reported peak. Azure combines plan instances. Missing samples stay blank, not zero. Results are cached for up to 5 minutes.
| Period (UTC) | Avg CPU (%) | Avg memory (%) | Peak memory (%) | Hours: CPU / avg / peak / expected |
|---|
Ordered by number of failures. Select a row to see why it failed.
| API | Method | Calls | Failures | Client errors | Reliability | Why |
|---|
Ordered by average server time, not by the worst single call — one cold start is not a slow endpoint.
| API | Method | Calls | Avg | Slowest | Reliability |
|---|
Every endpoint called in this window, least reliable first.
| API | Method | Calls | Failures | Client errors | Avg | Reliability |
|---|
Failed and partial runs with their message. A run that merely had failing tasks carries its reasons on the tasks, so those are shown underneath.
| Job | Outcome | When | Took | Failed tasks | Message |
|---|
| Job | Runs | Avg | Longest | Tasks done | Tasks failed |
|---|
A partial run counts against reliability; a cancelled one does not — a deploy stops the worker mid-run by design, and counting that would track how often we ship rather than how well the jobs work.
| Job | Runs judged | Succeeded | Partial | Failed | Cancelled | Reliability |
|---|
Warm and refresh the shared mutual-fund universe (AMFI Direct-Growth schemes, NAV history via mfapi.in). Warm fetches only missing or stale funds; Refresh re-fetches every fund in that category (slow for “All”). The auto-refresh cadence below warms every category on a schedule, server-side, even when no one is on the page. One fund job runs at a time.
| Category | Loaded | Last updated | Actions |
|---|
A stock's Q-Score is recalculated every time that stock is refreshed, but a fund's Avg Q-Score is a stored holding-weighted average of its constituents' scores, so nothing recomputes it on its own — this job does. It sweeps the whole cached universe, oldest-scored scheme first, and also refreshes Avg Technical Upside% and Avg Analyst Upside% alongside it. It costs one fund-detail request per scheme, so it is scheduled separately from the warm above; weekly is the sensible cadence. It also snapshots each fund's holdings and descriptive info, which the Fund Detail page then serves from this cache instead of calling Groww itself. Recompute now runs the same sweep immediately.
Pre-fetch earnings-call transcripts for every stock in the covered indexes (membership read from the index_constituents table) into the shared earning_call store, so the Earnings Call page answers from the database instead of waiting on a provider. Sync due checks each ticker's next earnings date (cached, refreshed about once a quarter) and only fetches the ones that have reported since we last stored a report — the cheapest pass, and what the schedule runs; Sync new re-checks every ticker and stores only reports that became newly available since its last sync; Prefetch skips tickers fetched in the last 30 days; Refresh all re-fetches everything (slow). The auto-refresh cadence below runs Sync due on a schedule. One job runs at a time; each run's synced reports are listed under Recent syncs. Only the 4 most recent reports are kept per company — storing a newer one evicts the oldest.
| Market | Indexes | Stored | Actions |
|---|
Reads primary regulatory documents straight from the source — no model, no vendor, no API key. United States (SEC EDGAR): XBRL financials parse each 10-Q/10-K's tagged facts into sec_xbrl_financials (the source behind the Financials page, including the revenue/segment breakdowns); Form 4 records every insider trade into sec_form4, distinguishing an open-market purchase from a vest or a tax withholding; 13F-HR records what a curated set of active institutional managers holds, into sec_thirteenf. India (NSE/BSE): the exchange's XBRL result filings land in the same financials table, PIT insider disclosures are India's Form 4 analogue and share sec_form4, and the quarterly shareholding pattern — an issuer-side promoter / public / employee-trust split rather than a per-manager holdings list — lands in nse_shareholding. Only 13F is US-only: it has no Indian equivalent, and India's shareholding pattern has no US one.
Full sync seeds a market from scratch — a year of Form 4 / PIT history per ticker, two quarters per 13F manager, and as much XBRL history as that market's XBRL history selector asks for (1–10 years, or everything the source still serves) — and takes hours. Deeper history costs proportionally more time: each company files four periodic reports a year and every one is parsed individually, so ten years is roughly three times the work of the three-year default. Incremental sync is exactly what the schedule runs, and only asks for what can have changed: XBRL takes each company's newest filing (the history selector does not apply), Form 4 pulls the market-wide filing index for the last few days (one request for the whole universe, not one per ticker), and quarterly holdings do nothing at all outside their filing window, because a book is frozen between deadlines. Recommended cadence: daily. An insider must file within two business days of trading, so anything slower reports the news late; XBRL lands with the periodic report a median of one day after the earnings release; and the 13F window opens itself four times a year (14 Feb · 15 May · 14 Aug · 14 Nov) without costing anything on the other ~300 days.
| Dataset | Stored | Companies | Latest | Incremental strategy |
|---|
These checkboxes control the scheduled US run only — the ones beside the manual sync buttons below are separate. XBRL always runs and has no checkbox: this pass is the only thing that syncs structured financials — nothing else pulls a company's 10-Q/10-K — so switching it off would stop the Financials page updating entirely. Datasets run in order (XBRL → Form 4 → 13F) and each waits for the one before it.
These checkboxes control the scheduled India run only. XBRL always runs and has no checkbox, for the same reason as the US group. The two India boxes are separate documents: PIT insider disclosures are the Form 4 analogue (individual trades), while the shareholding pattern is the issuer's quarterly promoter / public / employee-trust split — it travels on the same dataset slot as 13F because it answers the same "who owns this" question, so switching it off leaves ownership stale even though insider trades keep flowing.
US and India XBRL fetches paused until manual retry. Unlisted means SEC could not resolve the issuer, not confirmed exchange delisting. Paused means the fetch exhausted its retry budget. A failed filing pauses only that filing, not the company or other datasets. Stored financials are retained.
Keep the per-user stocks watchlist rows up to date server-side, even for tickers nobody has opened. A ticker is due when it has never been fetched, when it was last fetched on or before the company's latest earnings report (so the stored numbers predate results that already exist), or when it was last fetched more than 90 days ago. Report dates come from the earnings calendar the transcript sync already maintains. Refresh due fetches only those; Refresh all re-fetches every ticker (slow). Each ticker is fetched once and merged into every user's row that holds it. The auto-refresh cadence below runs Refresh due on a schedule. One job runs at a time.
How completely the structured filings store (sec_xbrl_financials) is populated, per metric and per region. The Financials page renders only what was stored, so a line item the extractor never populates is invisible — it simply does not appear, which reads as “the company does not report this” rather than as a gap. A metric at or near 0% filled is therefore a mapping bug, not a disclosure fact, and this is the only place it shows up. Percentages are of that region's own row count, so the two columns are comparable in share but not in absolute rows. Click any column heading to sort.
The section above asks whether a stored row is filled; this one asks whether the row exists at all. Every stored filing is folded onto the calendar quarter its period ends in — a 10-Q, an Indian quarterly result and a 10-K all land on a quarter boundary, and a 10-K's period end is its fiscal Q4 end, which is exactly the column the Financials page derives Q4 from — so this counts renderable quarters, not filings. The window ends at the newest quarter that market has actually reached, not at today, because a quarter that is simply not reported yet is not a gap. Each absence is then split by why it is absent: quarters before the stock's first filing, quarters still inside ordinary filing lag and quarters a delisted stock will never file are facts about the company, while a hole with filings on both sides — or a live index member that has fallen behind — is ours. Only the last two are worth chasing, and the Real gaps column counts only those.
Every third-party feed the app depends on, grouped by the functionality it serves, with whether its credential is actually set on this instance. Keyless is a deliberate design choice throughout — the exchange and regulator feeds need no account — so it is a healthy state, not a gap. Not configured means that source is currently unavailable and whatever depends on it is running on its fallback.
Every HTTP endpoint this app exposes, with what it is for and a worked request and response. The list is discovered from the running app's own routing table, not hand-maintained, so it cannot fall behind the code — a route added tomorrow appears here on the next load, marked undocumented until its entry is written in api_catalog.API_DOCS. Samples are illustrative literals: opening this page makes no upstream call and reads no user data.
Every background job now runs in a separate worker process, not inside the web app. A card's “Run now” only puts a run on the queue; the worker claims it, splits it into units of work and records each one. That is what makes a sync survive a deploy: whatever was mid-flight simply loses its lease and is picked up again, rather than vanishing with the process that was running it.
Each unit keeps its own attempt count, backoff and last error, so a failure is recorded rather than retried invisibly. A run that finished with some units still failing is marked partial — expand it to see exactly which ones and why, then retry just those. Only one run per job is ever in flight; that is enforced by the database, not by this page.
The four digest jobs are ordinary queue jobs, but they run as often as hourly, so the history above leaves them out by default — tick “Include alert digests” there to see the individual runs. This is the part the run rows cannot tell you anyway: what went out each day, by alert type, and what failed. A run that succeeded having found nothing is normal and common — only the sends table distinguishes it from one that mailed hundreds of findings.
Two questions about alerting, answered side by side: how many alerts we have actually sent, by type and by frequency, and how many readers have configured each type and frequency. Sends are counted from a ledger written at the moment an email goes out, so an alert someone has since edited or deleted is still counted — the configuration table alone could not tell you it ever fired.
A finding is one thing worth reporting; a digest is one email, which may carry several. Rules and readers are counted separately on purpose: one reader with twelve price alerts is a very different signal from twelve readers with one each.
Configure background job timing and throughput. Changes are stored in SQL; workers pick up most settings within a minute. Each field explains any delayed effect. Filings leases apply to newly claimed runs, not existing claims or running workers. Default shows the value restored by Reset. Values are range-checked.
The Azure AI Foundry wiring behind AI Insight and the earnings-call metrics, plus every prompt the models are given. An edit is stored in SQL and applied immediately — the other worker picks it up within a minute. Default is the App Service app setting (or the built-in value) the app started with, so Reset always restores it. The API key is write-only: once saved it is never sent back to this page.
These are sent verbatim to the model. The system prompt is what forbids outside knowledge, buy/sell calls and price targets, and what tells the model to treat stock data as untrusted input — weakening it weakens those guarantees. Existing summaries are cached and are not regenerated by an edit; use a card's ↻ Refresh to rewrite one. For the extraction prompts, bump the prompt version so stored metrics are re-extracted.
The Q-Score puts every input on the same 0–100 scale before comparing them. Each metric gets a straight line between a low anchor, which scores 0, and a high anchor, which scores 100; anything beyond either end is clamped. The quality metrics are averaged into the Q-Green-Score, the valuation multiples into the Q-Black-Score, and Q-Score = Q-Green-Score − Q-Black-Score, so it always lands between −100 and +100.
The anchors are absolute, not peer-relative, on purpose: a score has to mean the same thing in every watchlist, and a percentile against neighbours would move a stock's score when the neighbours change. Widening a range makes that metric less decisive; narrowing it makes it more. A multiple that is missing because the company loses money is scored at the maximum expensive end rather than skipped, which is what stops losses from flattering a score. Edits are stored in SQL and apply within a minute on every worker; they do not rewrite already-stored scores — those refresh as each stock does.
Every number the two plans differ on: watchlist size and count, years of financial history, saved visuals, the two monthly AI allowances, how many alerts of each type a reader may create, the price and the free trial. Advanced is any admin — the owner or a delegated address — plus anyone with a live paid subscription (see Billing), and everyone else is Basic. So this card configures what each tier gets, not who is in it.
Edits are stored in SQL and apply within a minute on every worker, including the out-of-process sync worker. The same numbers are served to the public pricing cards through /api/plans, so a change here moves the marketing copy as well — which is the point: hand-written copy drifts from the cap the server enforces. Stocks treats 0 as unlimited; each Alerts: field is a per-kind cap where 0 means that alert type is not on the tier at all. ⚠ Watchlists is advertised but not yet enforced — there is no per-user watchlist cap. Prices are in INR. ⚠ Changing a price here does not change what an existing mandate debits — a provider plan’s amount is immutable, so mint a new one from the Billing card afterwards.
Cashfree one-time purchases: select Cashfree to enter the PG sandbox App ID and Secret Key below. Set Accept one-time PG payments to 1 and leave PG production mode at 0 for sandbox. Production has separate credential fields. Prices include GST: 30 days ₹99, 90 days ₹249, 180 days ₹499, 365 days ₹999. Eligible new users choose a free Trial or receive 30 additional trial days with any paid option. Both use the once-only trial allowance. Remaining trial days are preserved; existing orders keep their recorded terms. No automatic renewal. Sandbox payments never grant real access or consume the trial. The free Trial option works without enabling PG payments.
Whitelist vroomstocks.com in Cashfree and enable UPI, cards and net banking. PG webhook URL: /api/billing/prepaid/webhook/sandbox. Subscribe to payment success, failed and user-dropped events. Use the PG API Secret Key for signatures; do not copy a legacy webhook secret into PG fields. Keep the legacy Accept payments switch off for new purchases.
⚠ A secret is never shown again once saved — only whether one is set. The webhook signature is the security boundary of the whole feature: entitlement is granted only by a callback whose HMAC verifies, never by the browser. Cashfree issues no separate webhook secret — it signs with the key secret above, so leave that field blank; Razorpay does issue one and needs it filled in. Point the provider at /api/billing/webhook/cashfree and subscribe it to its subscription events. Create plan appears only for Razorpay, whose plan amounts cannot be edited — mint a new plan after any price change or customers keep paying the old one. Cashfree sends the price inline with every subscription, so it needs no plan step and cannot drift.
⚠ Test legacy mandate checks the old recurring credentials, not the PG keys. It creates a subscription in the provider’s sandbox, resolves the authorisation link and cancels it again. It refuses while legacy Live mode is on. Verify the separate PG integration with a sandbox checkout before enabling production purchases.
Delegate the admin console to another address, and raise a single user's AI allowance above the plan default. Both lists are stored in SQL and picked up by every worker within a minute.
An address here gets the whole admin console — every sync job, every user's analytics and every setting on this page. Grant it sparingly. The owner is compiled into the app rather than stored as a row, so it can never be removed and no database edit can lock it out; for the same reason, only the owner can grant or revoke admin — a delegated admin that could delegate further would let one compromised account entrench itself. Delegated admins see this list but cannot change it.
Overrides for one address. Daily is the anti-burst ceiling on generations per UTC day; Summaries and Insights are the monthly plan caps for earnings-call summaries and the four insight kinds. Leave a box blank to keep that bucket on the default. Admins are already exempt from the monthly caps, so this is for normal users. Any admin can set these — it moves a spend cap, not access.
One-off checks that touch the real outside world. Use them to verify a template or a provider end-to-end without creating an account.
Sends the onboarding email — the same one a new user gets after verifying their address (email/password) or on their first page load (Google sign-in) — to any address you type here. This is a real send through Resend, and it deliberately does not touch the send-once ledger: testing against an address never uses up that person's actual welcome email, and you can repeat it as often as you like. Preview renders the same HTML in a new tab without sending anything.
Search for any listed company to open its analysis page.
| # | Side | Date | Price | Shares | P&L |
|---|
M = millions. Cr = crores. Display scale only; each stock keeps its native currency.