Answer questions faster

Answer questions faster

Get answers without handoffs or context switches,
directly from Slack, Notion, linear (or anywhere else you work).

Get answers without handoffs or context switches, directly from Slack, Notion, linear (or anywhere else you work).

Analyze US subscribers who churned in March. Are there correlations between churn and lifecycle marketing — channel opt-in, channel engagement, etc.?

Read 2 observations

Explored 2 searches, 3 reads

Search

churn subscription cancellation

Search

lifecycle marketing email push channel opt-in

Read

subscribers

Read

subscriptions

Read

channel_opt_ins

Read

lifecycle_campaigns

Confirmed: user_id is the shared key across all four tables. Using existing domain knowledge for cohort definitions: churned = subscription_end_at in March window AND is_active = FALSE. Retained = is_active = TRUE AND converted_at IS NOT NULL.


The fix is to compare channel opt-in rates, lifecycle engagement quality, and product activity state between these two cohorts to isolate what actually correlates with churn.

Ran 2 queries

Query

march-churn-cohort

Query

channel-opt-in-churn-vs-retained

Query

lifecycle-engagement-churn-vs-retained

Query

churn-rate-by-duration-channel

Query

churn-rate-by-duration-channel

Monthly both-channel users churn at 13.2% vs 22.8% push-only (~42% relative reduction). Pattern inverts for annual plans. Small sample caveat (n=155).

Data visualization

Monthly both-channel users churn at 13.2% vs 22.8% push-only (~42% relative reduction). Pattern inverts for annual plans. Small sample caveat (n=155).

Cohort: 6,840 churned US subscribers (subscription ended March 1–23, 2026, no longer active) vs. 118,500 retained US subscribers (active subscription, converted). Internal/test accounts excluded.

Assumptions:

Churn = subscription ended in window AND no longer active (query: march-churn-cohort)

Retained = currently active AND has a conversion date (query: march-churn-cohort)

Channel opt-in derived from first opt-in timestamps; "active" push = opted in and never opted out, or re-opted in after opt-out (query: channel-opt-in-churn-vs-retained)

Lifecycle engagement measured over trailing 90 days (query: lifecycle-engagement-churn-vs-retained)

Ask anything

indent/indent

production

Datadog +3

SELECT

s.plan_duration,

CASE

WHEN c.first_push_opt_in_at IS NOT NULL AND c.first_email_subscribed_at IS NOT NULL THEN 'Both'

WHEN c.first_push_opt_in_at IS NOT NULL THEN 'Push Only'

WHEN c.first_email_subscribed_at IS NOT NULL THEN 'Email Only'

ELSE 'None'

END AS channel_bucket,

COUNT(*) AS total,

SUM(CASE WHEN churn_status = 'churned' THEN 1 ELSE 0 END) AS churned,

ROUND(100.0 * SUM(CASE WHEN churn_status = 'churned' THEN 1 ELSE 0 END) / COUNT(*), 2)

AS churn_rate

FROM cohort co

JOIN subscriptions s ON co.user_id = s.user_id

LEFT JOIN channel_opt_ins c ON co.user_id = c.user_id

GROUP BY 1, 2

ORDER BY 1, 5 DESC

Duration

Monthly

Monthly

Monthly

Monthly

Annual

Annual

Annual

Annual

Channel

Both

Push Only

Email Only

Duration

None

Push Only

Email Only

None

n

155

19,200

48

3,100

2,050

84,100

620

15,900

Churn Rate

13.2%

22.8%

24.1%

20.6%

7.8%

2.3%

8.4%

3.1%

Analyze US subscribers who churned in March. Are there correlations between churn and lifecycle marketing — channel opt-in, channel engagement, etc.?

Read 2 observations

Explored 2 searches, 3 reads

Search

churn subscription cancellation

Search

lifecycle marketing email push channel opt-in

Read

subscribers

Read

subscriptions

Read

channel_opt_ins

Read

lifecycle_campaigns

Confirmed: user_id is the shared key across all four tables. Using existing domain knowledge for cohort definitions: churned = subscription_end_at in March window AND is_active = FALSE. Retained = is_active = TRUE AND converted_at IS NOT NULL.


The fix is to compare channel opt-in rates, lifecycle engagement quality, and product activity state between these two cohorts to isolate what actually correlates with churn.

Ran 2 queries

Query

march-churn-cohort

Query

channel-opt-in-churn-vs-retained

Query

lifecycle-engagement-churn-vs-retained

Query

churn-rate-by-duration-channel

Query

churn-rate-by-duration-channel

Monthly both-channel users churn at 13.2% vs 22.8% push-only (~42% relative reduction). Pattern inverts for annual plans. Small sample caveat (n=155).

Data visualization

Monthly both-channel users churn at 13.2% vs 22.8% push-only (~42% relative reduction). Pattern inverts for annual plans. Small sample caveat (n=155).

Cohort: 6,840 churned US subscribers (subscription ended March 1–23, 2026, no longer active) vs. 118,500 retained US subscribers (active subscription, converted). Internal/test accounts excluded.

Assumptions:

Churn = subscription ended in window AND no longer active (query: march-churn-cohort)

Retained = currently active AND has a conversion date (query: march-churn-cohort)

Channel opt-in derived from first opt-in timestamps; "active" push = opted in and never opted out, or re-opted in after opt-out (query: channel-opt-in-churn-vs-retained)

Lifecycle engagement measured over trailing 90 days (query: lifecycle-engagement-churn-vs-retained)

Ask anything

indent/indent

production

Datadog +3

SELECT

s.plan_duration,

CASE

WHEN c.first_push_opt_in_at IS NOT NULL AND c.first_email_subscribed_at IS NOT NULL THEN 'Both'

WHEN c.first_push_opt_in_at IS NOT NULL THEN 'Push Only'

WHEN c.first_email_subscribed_at IS NOT NULL THEN 'Email Only'

ELSE 'None'

END AS channel_bucket,

COUNT(*) AS total,

SUM(CASE WHEN churn_status = 'churned' THEN 1 ELSE 0 END) AS churned,

ROUND(100.0 * SUM(CASE WHEN churn_status = 'churned' THEN 1 ELSE 0 END) / COUNT(*), 2)

AS churn_rate

FROM cohort co

JOIN subscriptions s ON co.user_id = s.user_id

LEFT JOIN channel_opt_ins c ON co.user_id = c.user_id

GROUP BY 1, 2

ORDER BY 1, 5 DESC

Duration

Monthly

Monthly

Monthly

Monthly

Annual

Annual

Annual

Annual

Channel

Both

Push Only

Email Only

Duration

None

Push Only

Email Only

None

n

155

19,200

48

3,100

2,050

84,100

620

15,900

Churn Rate

13.2%

22.8%

24.1%

20.6%

7.8%

2.3%

8.4%

3.1%

Indent explores the available data, writes fluent queries, assembles nuanced, step-by-step explanations, and makes presentation-ready visualizations.

Indent explores the available data, writes fluent queries, assembles nuanced, step-by-step explanations, and makes presentation-ready visualizations.

Josh

9:19 AM

@indent

How is the Hospital Partnership marketing campaign performing so far?

1 reply

1 minute ago

Analyzed for 1m 24s

Referencing 5 observations

Searched:

marketing campaigns performance • 25 schemas

Search codebase:

hospital|campaign|track

Query:

lookup-hospital-partnership-performance

Query:

compare-hospital-partnership-to-recent-campaigns

Campaign summary:


  • 68,450 impressions, 1,369 clicks (2.0% CTR)

  • 74 conversions (5.4% conversion rate)

  • $14,250 spend, $192.56 cost per conversion

  • $96,000 pipeline value, 573% ROI


Top channels:


  • LinkedIn (41 conversions, 6.8% conversion rate)

  • Google Search (22 conversions, 4.5% conversion rate)

  • Direct/Email (11 conversions, 9.2% conversion rate)

Explanation

Saved one observation about how conversion rate is calculated

Query

Answer

Remember

ask

Indent understands your code, your business logic, and the current state of your services, so the ambiguity and nuance of your data won’t get accidentally flattened.

which users are about to churn?

which users are about to churn?

Explored 2 searches, 3 reads

Explored 2 searches, 3 reads

Signups didn't drop. Your iOS SDK stopped firing user_signed_up events after the 3.2.1 release on Tuesday. Web and Android are actually up 12%.

Signups didn't drop. Your iOS SDK stopped firing user_signed_up events after the 3.2.1 release on Tuesday. Web and Android are actually up 12%.

Ran 5 queries

Ran 5 queries

Signups are not down. iOS event tracking broke in v3.2.1.

Signups are not down. iOS event tracking broke in v3.2.1.

The apparent 34% drop is entirely from missing iOS events. Cross-referencing Stripe payment creation timestamps against signup events: 580 iOS users successfully signed up and paid last week but have no corresponding user_signed_up event.

The apparent 34% drop is entirely from missing iOS events. Cross-referencing Stripe payment creation timestamps against signup events: 580 iOS users successfully signed up and paid last week but have no corresponding user_signed_up event.

As you iterate with Indent on complex questions, its understanding of your processes deepens and its ability to reason about your business improves.

Observations

Patterns learned from working with your team

7 observatios

3 observatios

across 5 repos

Error handling

·

@sarah-chen · PR #1204

Team wraps all errors with AppError for structured Sentry traces. Never use generic Error class.

Code style

·

Observed · 2 weeks ago

Named exports only in services/. 34 of 34 files follow this. No default exports.

Infrastructure

·

INC-4821 · 5 days ago

EU batch job runs 3:00 AM UTC. Must not overlap with connection-heavy ops on db-primary.

Testing

·

Observed across 12 PRs

Integration tests over unit tests for API routes. Snapshot tests for webhook payloads.

Deploy

·

Slack #engineering · 1w ago

No Friday deploys. Staging must pass 2h before prod. @arjun-m enforces.

Naming

·

Observed · 3 services

Routes: kebab-case. DB columns: snake_case. TS interfaces: PascalCase with I prefix.

Dependencies

·

PR #1847 review · 4w ago

No Puppeteer in prod after CVE-2024-3847. Use Playwright for PDF generation.

Plays well with others

Indent asks questions when it needs more context and always shows its work.

Which metrics should I pull?

Total chats created per user

Daily active users (7-day breakdown)

Avg. conversations per user

Mode distribution (Chat vs Workflow vs Data)

Session duration (first message → last activity)

Write your answer

Move up

↑↓

Discard

esc

Skip question

Hear it from our customers

Hear it from our customers

"Before Indent, getting a quick data answer meant waiting in a weeks-long queue. Now, product managers, growth marketers, and even our finance team can gather and analyze data in minutes. We went from a bottleneck workflow to true self-serve analytics."

Jared Forman, Data Lead at Speak

"Before Indent, getting a quick data answer meant waiting in a weeks-long queue. Now, product managers, growth marketers, and even our finance team can gather and analyze data in minutes. We went from a bottleneck workflow to true self-serve analytics."

Jared Forman, Data Lead at Speak

"Before Indent, getting a quick data answer meant waiting in a weeks-long queue. Now, product managers, growth marketers, and even our finance team can gather and analyze data in minutes. We went from a bottleneck workflow to true self-serve analytics."

Jared Forman, Data Lead at Speak

"Before Indent, getting a quick data answer meant waiting in a weeks-long queue. Now, product managers, growth marketers, and even our finance team can gather and analyze data in minutes. We went from a bottleneck workflow to true self-serve analytics."

Jared Forman, Data Lead at Speak

Stop waiting for data answers. Start getting them instantly.

Stop waiting for data answers. Start getting them instantly.

Stop waiting for data answers. Start getting them instantly.

Stop waiting for data answers. Start getting them instantly.

Company

We’re hiring

Security

Skip the docs.

We'll walk you through everything.

© 2026 Indent

Company

We’re hiring

Security

Skip the docs.

We'll walk you through everything.

© 2026 Indent

Company

We’re hiring

Security

Skip the docs.

We'll walk you through everything.

© 2026 Indent

Company

We’re hiring

Security

Skip the docs.

We'll walk you through everything.

© 2026 Indent