Growth analytics

Track signups, activation and returning users for your project out of the box, without bolting on a separate analytics tool.

Last updated

Your project already records who signs up, who signs in and who pays. Growth analytics is a set of charts over that data, on a dashboard your team can read. There's no tracking script to install and no events to send.

Anythink has no single "growth" feature. You assemble it from parts that are already there, and this page says what each part measures.

Question What you build Built from
How many people sign up? A line chart of Users signed up A platform metric
Where do they come from? Attribution on each user's profile signup_context at registration
Do they get started? A cohort funnel from signup to a first action A funnel chart
Do they come back? Active users (by session) per week, and a repeat-action funnel A platform metric and a funnel chart
Do they pay and stay? Revenue, active subscribers, MRR and churn AnythinkPay platform metrics

Each section below shows the task in the Anythink dashboard, with the CLI and with an AI assistant. The chart settings themselves are explained in Dashboards and charts.

What the numbers mean#

  • Signups count the people added to your project, by the date they joined, whether they registered themselves, were invited or signed in with a social provider.
  • Active users count distinct people who started or renewed a sign-in session in each interval. Someone who signs in daily counts once per week on a weekly chart.
  • Activation is whatever first action you decide shows a person got started, such as creating a record or paying. Anythink can't know which action matters in your app, so you define it as a funnel stage.
  • Retention here means people coming back. There's no cohort retention grid. You measure it with active users over time and with funnels that ask whether a person repeated an action.

Chart signups over time#

Users signed up is a platform metric. It's available as a stat, gauge, line, area, column or pie chart. Break it down by Sign-in provider (password, Google, Apple and so on) or by Active state. Turn on Compare to see the change against the previous period.

In the Anythink dashboard

  1. Open Dashboard, select the pencil, then Add widget and choose Chart.
  2. Select Design a new chart.
  3. Under Data source, choose Users signed up (Platform).
  4. Choose Line as the chart type and set the Interval to week.
  5. Set the Timeframe to 90 days. Turn on Compare to measure it against the 90 days before.
  6. To split the line by how people signed up, set Break down by to Sign-in provider.
  7. Name the chart and save it, then select Save on the dashboard.

For a single headline number, choose Stat instead of Line.

With the CLI

The CLI has no chart commands, so charts go through the project's REST API with anythink fetch. Chart request bodies use camelCase names. Responses come back in snake_case.

bash
anythink fetch /charts --method POST --body '{
  "name": "Signups per week",
  "chartType": "line",
  "dataSource": "platform",
  "platformMetric": "users",
  "platformPeriod": "quarter",
  "xInterval": "week",
  "compareEnabled": true
}'

The response includes the chart id. To see every platform metric you can chart, with its supported chart types and breakdowns:

bash
anythink fetch /charts/platform-metrics

To read the numbers, put the chart on a dashboard (see the last task on this page) and post to /dashboards/{id}/data. Each point has a period and a value. With Compare on, the response also carries delta_pct and compare_period_days.

With an AI assistant (MCP)

text
Create a line chart of users signed up per week over the last quarter, and compare it with the previous period.

The assistant creates the chart with anythink fetch /charts --method POST through the cli tool. Adding it to a dashboard is done in the Anythink dashboard, or by the dashboard call shown below.

Capture signup attribution#

Anythink can record where a new user came from: utm_source, utm_medium, utm_campaign, utm_term, utm_content, referrer and signup_country. Your app reads these from the page the visitor landed on and sends them when it registers the user. Anythink also records the sign-up IP address on the server.

For email and password sign-up, add signup_context to the registration request:

http
POST /org/{project_id}/auth/v1/register
Content-Type: application/json

{
  "first_name": "Alice",
  "last_name": "Smith",
  "email": "alice@example.com",
  "password": "a-strong-password",
  "signup_context": {
    "utm_source": "newsletter",
    "utm_medium": "email",
    "utm_campaign": "launch",
    "referrer": "https://example.com/post",
    "signup_country": "GB"
  }
}

For social sign-in, add the same values as query parameters on the authorise request. See Social sign-in with Apple, Google, GitHub and LinkedIn. Every field is optional, and each value is trimmed and capped at 512 characters (2,048 for referrer).

Anythink stores attribution once, on the profile it creates with the user. Later sign-ins don't change it.

In the Anythink dashboard

  1. Open Settings › Users and select the user.
  2. Open the Profile panel.
  3. Read the Attribution group (source, medium, campaign, term, content and referrer) and the Signup group (country and IP).

The same panel shows Marketing consent, which tells you whether the person agreed to marketing and when it last changed. See Manage app users and team members for editing profiles.

With the CLI

bash
anythink fetch /user-profiles/by-user/42
anythink fetch "/user-profiles?page=1&page_size=200"

The first call returns one user's profile. The second pages through every profile, up to 200 at a time, so a script of yours can count signups by utm_source, utm_campaign or marketing_consent. Listing every profile is for administrators.

With an AI assistant (MCP)

text
Read the profiles of my project's users and tell me how many signed up from each utm_source, and how many gave marketing consent.

The assistant pages through fetch /user-profiles and counts the results.

Note: Attribution lives on the user profile, not in an entity, so charts can't group by it. Use the profile views above, or your own script, to count by source, and use the charts for volume over time.

Build an activation funnel#

An activation funnel counts the same people at each step: they signed up, then they did the thing that shows they got started. Use a cohort funnel. Every stage counts distinct people, and each later stage only counts people who also passed the stages before it.

There are two ways to define the first action.

Signed up, then paid. The base is your users. Stages can come from AnythinkPay payments, subscriptions, subscription events or offer redemptions, so no extra data is needed.

Signed up, then created something. Add an integer field such as user_id to the entities involved, and fill it in when records are created. For example, a members entity with one record per signup and a projects entity that records who created each project both have user_id. The cohort field must have the same name on every entity in the funnel. Each stage can add a within days window, counted from the person's first record, and a minimum count, such as at least three projects.

In the Anythink dashboard

  1. Start a chart as in the first task, with Users signed up (Platform) as the data source.
  2. Change the chart type to Funnel. Anythink switches to a cohort funnel on your users with an All users (baseline) stage.
  3. Select Add stage. For the second stage, choose a source: Entity in this project or one of the AnythinkPay sources.
  4. For a payment stage, set Status to Completed. For an entity stage, choose the entity and add filters, a within days window or a minimum count.
  5. Set the Timeframe. It applies to the first stage, so it's the signup window you're measuring.
  6. Name the chart and save it.

To base the funnel on your own entity instead, choose that entity as the data source, set Funnel mode to Cohort and pick the Cohort field.

With the CLI

A funnel from signup to first payment within 30 days:

bash
anythink fetch /charts --method POST --body '{
  "name": "Signup to first payment",
  "chartType": "funnel",
  "dataSource": "entity",
  "entityName": "anythink_users",
  "funnelMode": "cohort",
  "cohortField": "id",
  "timeframePreset": "90d",
  "funnelStyle": "vertical",
  "funnelStages": [
    {"label": "Signed up"},
    {"label": "Paid", "source": "payments", "sourceFilter": {"status": "Completed"}, "withinDays": 30}
  ]
}'

A funnel from signup to creating a project within seven days, using the members and projects entities:

bash
anythink fetch /charts --method POST --body '{
  "name": "Signup to first project",
  "chartType": "funnel",
  "dataSource": "entity",
  "entityName": "members",
  "funnelMode": "cohort",
  "cohortField": "user_id",
  "timeframePreset": "30d",
  "funnelStyle": "vertical",
  "funnelStages": [
    {"label": "Signed up"},
    {"label": "Created a project", "entityName": "projects", "withinDays": 7}
  ]
}'

Read the result from a dashboard's data endpoint. A funnel comes back as stages, each with a label and a count:

json
{ "stages": [ { "label": "Signed up", "count": 3 }, { "label": "Created a project", "count": 1 } ] }

With an AI assistant (MCP)

text
Create a cohort funnel on my members entity with the cohort field user_id: signed up, then created a project within 7 days. Use the last 30 days.

The assistant creates the chart with fetch /charts --method POST, using the body above.

Track returning users#

Two charts cover the question of whether people come back.

Active users per week. The Active users (by session) platform metric counts distinct people who started or renewed a session in each interval. It supports stat, gauge, line, area, column and funnel charts, and Compare shows whether this period is up or down on the last.

Repeat action. A cohort funnel with a minimum count asks how many of the people who signed up did something more than once. For example, a second stage on projects with within days set to 30 and minimum count set to 3.

In the Anythink dashboard

  1. Add a chart with Active users (by session) (Platform) as the data source and Line as the type.
  2. Set the Interval to week and the Timeframe to 90 days.
  3. Turn on Compare. Turn on Show on chart to overlay the earlier period on the line.
  4. For the repeat-action view, add a funnel as in the previous task and set a minimum count on its second stage.

With the CLI

bash
anythink fetch /charts --method POST --body '{
  "name": "Weekly active users",
  "chartType": "line",
  "dataSource": "platform",
  "platformMetric": "active_users",
  "platformPeriod": "quarter",
  "xInterval": "week",
  "compareEnabled": true,
  "compareShowOverlay": true
}'

A repeat-action funnel is the same call as the activation funnel, with "minCount": 3 on the second stage.

With an AI assistant (MCP)

text
Create a line chart of weekly active users over the last quarter, compared with the previous quarter, with the earlier period overlaid.

Note: Timeframe and offset settings let you look at any past window: an Offset (days) of 30 with a 30-day timeframe shows the month before last.

Chart revenue and subscribers#

If your project takes payments through AnythinkPay, its numbers are platform metrics too. See How payments and subscriptions work and Create plans and manage subscriptions.

Metric What it shows
Revenue, Net revenue (after fees) Completed payments, summed over time
Paying customers Distinct people with a completed payment
Active subscribers Distinct people with an active subscription
MRR (normalized), ARR (MRR × 12) Monthly and annual recurring revenue
Trials started, Renewed subscriptions, Churned subscriptions, Refunds Subscription events over time
Subscriptions Subscriptions by status, provider or billing interval

Revenue can be split by provider, type or currency. Subscription events can be split by event type or source. Use Churned subscriptions next to Active subscribers to see whether the base is growing.

In the Anythink dashboard

  1. Add a chart and choose Revenue (Platform) as the data source, then Column or Line as the type.
  2. Set the Interval to month and turn on Compare.
  3. Add a second chart for Active subscribers (Platform), and a third for Churned subscriptions (Platform).
  4. Add a Stat chart for MRR (normalized) (Platform) as the headline figure.

With the CLI

bash
anythink fetch /charts --method POST --body '{
  "name": "Revenue per month",
  "chartType": "column",
  "dataSource": "platform",
  "platformMetric": "payments_revenue",
  "platformPeriod": "year",
  "xInterval": "month",
  "compareEnabled": true
}'

anythink fetch /charts --method POST --body '{
  "name": "Active subscribers",
  "chartType": "line",
  "dataSource": "platform",
  "platformMetric": "active_subscribers",
  "platformPeriod": "quarter",
  "xInterval": "week"
}'

With an AI assistant (MCP)

text
Create a monthly revenue chart for the last year, compared with the year before, plus a line chart of active subscribers and one of churned subscriptions.

Put it on a shared growth dashboard#

Charts sit on a dashboard. Put the growth charts together on one dashboard and share it, and your team sees the same page. Everyone sees only the data their role lets them read.

In the Anythink dashboard

  1. Open the dashboard switcher and select New dashboard. Name it Growth and turn on the share switch.
  2. Select Add widget, choose Chart and pick each saved chart from the list: signups, weekly active users, the activation funnel and revenue.
  3. Drag the widgets into place: headline stats along the top, trends in the middle, the funnel below.
  4. Select Save.

To change who can edit it, open the share icon and choose Shared — view only or Shared — anyone can edit. See Dashboards and charts for the sharing levels.

With the CLI

Add each chart as a chart widget. Use the chart ids returned when you created them:

bash
anythink fetch /dashboards --method POST --body '{
  "name": "Growth",
  "description": "Signups, activation, returning users and revenue",
  "is_shared": true,
  "allow_shared_edit": false,
  "widgets": [
    {"type": "chart", "title": "Signups per week", "config_json": "{\"chartId\":49}", "sort_order": 0},
    {"type": "chart", "title": "Weekly active users", "config_json": "{\"chartId\":50}", "sort_order": 1},
    {"type": "chart", "title": "Signup to first payment", "config_json": "{\"chartId\":51}", "sort_order": 2}
  ]
}'

Read what the widgets show with the dashboard's data endpoint. Leave widget_ids empty to get every widget:

bash
anythink fetch /dashboards/12/data --method POST --body '{"widget_ids": []}'

With an AI assistant (MCP)

text
Create a dashboard called Growth, shared with the whole project as view only, with my signups, weekly active users and signup-to-payment funnel charts on it.

The assistant creates the dashboard with fetch /dashboards --method POST. Arranging the widgets is easier in the Anythink dashboard.

Limits#

  • No retention grid. There's no cohort-by-week retention table. Use active users over time and repeat-action funnels.
  • Active users count sessions. A person is active in an interval when they start or renew a sign-in session in it. Using the app without signing in again isn't recorded.
  • Attribution isn't chartable. It lives on the profile, is recorded once at signup and can't be edited. Count by source with the profile endpoints.
  • You define activation. Cohort funnels need an integer cohort field with the same name on every entity in the funnel, and your app must fill it in.
  • Funnels don't offer Compare. Run two funnels over different timeframes, using Offset (days), to compare periods.
  • Payment metrics need AnythinkPay. Without it, those data sources have nothing to count.
  • Charts read live data. There's no schedule, export or stored history. See Dashboards and charts for the full limits.

Next steps#