Compare commits

..

1 Commits

Author SHA1 Message Date
Dean Wenstrand
81565b7676 Add pastDueUsers, newPaidToday, and cohort paidTotal to usage stats
All checks were successful
Tests / Tests (pull_request) Successful in 4m48s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 22:28:53 -04:00
6 changed files with 15 additions and 396 deletions

View File

@@ -265,6 +265,7 @@ export type CohortStatsGql = {
activated7d: Scalars["Int"]["output"];
activatedNotPaid7d: Scalars["Int"]["output"];
paid7d: Scalars["Int"]["output"];
paidTotal: Scalars["Int"]["output"];
signups: Scalars["Int"]["output"];
weekStart: Scalars["Date"]["output"];
};
@@ -2323,6 +2324,8 @@ export type FunnelStatsGql = {
freemiumEpoch: Scalars["Date"]["output"];
newPaid7d: Scalars["Int"]["output"];
newPaid30d: Scalars["Int"]["output"];
newPaidToday: Scalars["Int"]["output"];
pastDueUsers: Scalars["Int"]["output"];
payingUsers: Scalars["Int"]["output"];
retentionPrevActive: Scalars["Int"]["output"];
retentionReturned: Scalars["Int"]["output"];
@@ -4078,7 +4081,6 @@ export type SyncAppleSubscriptionResultGql = {
export type TableStateGql = {
__typename?: "TableStateGQL";
homography?: Maybe<HomographyInfoGql>;
identifierToBox: Array<BoundingBoxGql>;
identifierToColor: Array<Maybe<RgbColorGql>>;
identifierToPosition: Array<Array<Scalars["Float"]["output"]>>;
};
@@ -7050,46 +7052,6 @@ export type GetSessionCoachQuery = {
unknownOutcomeCount: number;
analyzedShotCount: number;
makePercentage?: number | null;
longestMakeStreak: number;
recentBaseline?: {
__typename?: "SessionCoachBaselineGQL";
sessionCount: number;
attemptCount: number;
madeCount: number;
makePercentage: number;
} | null;
positiveCandidates: Array<{
__typename?: "SessionCoachCandidateGQL";
id: string;
rank: number;
family: SessionCoachCandidateFamilyEnum;
kind: SessionCoachCandidateKindEnum;
title: string;
body: string;
action: string;
supportingShotIds: Array<number>;
drillId?: string | null;
limitations: Array<string>;
evidence: {
__typename?: "SessionCoachEvidenceGQL";
bucketKey: string;
bucketLabel: string;
attemptCount: number;
madeCount: number;
missedCount: number;
makePercentage: number;
comparisonAttemptCount: number;
comparisonMadeCount: number;
comparisonMakePercentage?: number | null;
patternShotCount: number;
score: number;
rankReason: string;
baselineSessionCount: number;
baselineAttemptCount: number;
baselineMadeCount: number;
baselineMakePercentage?: number | null;
};
}>;
primaryCandidate?: {
__typename?: "SessionCoachCandidateGQL";
id: string;
@@ -7116,10 +7078,6 @@ export type GetSessionCoachQuery = {
patternShotCount: number;
score: number;
rankReason: string;
baselineSessionCount: number;
baselineAttemptCount: number;
baselineMadeCount: number;
baselineMakePercentage?: number | null;
};
} | null;
candidates: Array<{
@@ -7148,10 +7106,6 @@ export type GetSessionCoachQuery = {
patternShotCount: number;
score: number;
rankReason: string;
baselineSessionCount: number;
baselineAttemptCount: number;
baselineMadeCount: number;
baselineMakePercentage?: number | null;
};
}>;
agentGeneration?: {
@@ -7162,13 +7116,7 @@ export type GetSessionCoachQuery = {
completedAt?: any | null;
decision?: {
__typename?: "SessionCoachDecisionGQL";
selectedPositiveCandidateId?: string | null;
positiveTitle?: string | null;
positiveBody?: string | null;
selectedCandidateId?: string | null;
supportingCandidateIds: Array<string>;
supportingShotIds: Array<number>;
sessionSummary?: string | null;
title?: string | null;
body?: string | null;
suggestedAction?: string | null;
@@ -7196,7 +7144,6 @@ export type GetSessionCoachQuery = {
startedAt?: any | null;
lastEnqueuedAt?: any | null;
abstentionReason?: string | null;
synthesisRationale?: string | null;
} | null;
} | null;
};
@@ -7219,13 +7166,7 @@ export type RequestSessionCoachGenerationMutation = {
completedAt?: any | null;
decision?: {
__typename?: "SessionCoachDecisionGQL";
selectedPositiveCandidateId?: string | null;
positiveTitle?: string | null;
positiveBody?: string | null;
selectedCandidateId?: string | null;
supportingCandidateIds: Array<string>;
supportingShotIds: Array<number>;
sessionSummary?: string | null;
title?: string | null;
body?: string | null;
suggestedAction?: string | null;
@@ -7253,7 +7194,6 @@ export type RequestSessionCoachGenerationMutation = {
startedAt?: any | null;
lastEnqueuedAt?: any | null;
abstentionReason?: string | null;
synthesisRationale?: string | null;
} | null;
} | null;
};
@@ -7285,10 +7225,6 @@ export type SessionCoachCandidateFieldsFragment = {
patternShotCount: number;
score: number;
rankReason: string;
baselineSessionCount: number;
baselineAttemptCount: number;
baselineMadeCount: number;
baselineMakePercentage?: number | null;
};
};
@@ -7300,13 +7236,7 @@ export type SessionCoachGenerationFieldsFragment = {
completedAt?: any | null;
decision?: {
__typename?: "SessionCoachDecisionGQL";
selectedPositiveCandidateId?: string | null;
positiveTitle?: string | null;
positiveBody?: string | null;
selectedCandidateId?: string | null;
supportingCandidateIds: Array<string>;
supportingShotIds: Array<number>;
sessionSummary?: string | null;
title?: string | null;
body?: string | null;
suggestedAction?: string | null;
@@ -7334,24 +7264,9 @@ export type SessionCoachGenerationFieldsFragment = {
startedAt?: any | null;
lastEnqueuedAt?: any | null;
abstentionReason?: string | null;
synthesisRationale?: string | null;
} | null;
};
export type CreateShotShareLinkMutationVariables = Exact<{
shotIds: Array<Scalars["Int"]["input"]> | Scalars["Int"]["input"];
paddingSeconds?: InputMaybe<Scalars["Float"]["input"]>;
}>;
export type CreateShotShareLinkMutation = {
__typename?: "Mutation";
createShotShareLink: {
__typename?: "ShareLinkGQL";
slug: string;
url: string;
};
};
export type PlayerSummaryFieldsFragment = {
__typename?: "PlayerSummaryGQL";
clusterId: number;
@@ -8149,6 +8064,8 @@ export type GetUsageStatsQuery = {
activationCohort: number;
activationActivated: number;
payingUsers: number;
pastDueUsers: number;
newPaidToday: number;
newPaid7d: number;
newPaid30d: number;
retentionPrevActive: number;
@@ -8161,6 +8078,7 @@ export type GetUsageStatsQuery = {
activated7d: number;
paid7d: number;
activatedNotPaid7d: number;
paidTotal: number;
}>;
windows: Array<{
__typename?: "UsageStatsWindowGQL";
@@ -9432,71 +9350,6 @@ export type GetUploadLinkMutation = {
};
};
export type GetUploadLinksMutationVariables = Exact<{
videoId: Scalars["Int"]["input"];
segmentIndexes: Array<Scalars["Int"]["input"]> | Scalars["Int"]["input"];
}>;
export type GetUploadLinksMutation = {
__typename?: "Mutation";
getUploadLinks: {
__typename?: "GetUploadLinksReturn";
value:
| {
__typename?: "GetUploadLinkErrors";
error:
| { __typename?: "InitUploadAlreadyCompletedErr" }
| {
__typename?: "MustHaveSetForUploadLinkErr";
resolution?: boolean | null;
framesPerSecond?: boolean | null;
}
| { __typename?: "NoInitForChunkedUploadErr" }
| {
__typename?: "ProcessingFailedErr";
processing: {
__typename?: "VideoProcessingGQL";
status: ProcessingStatusEnum;
errors: Array<{
__typename?: "VideoProcessingErrorGQL";
message: string;
}>;
};
}
| { __typename?: "SegmentAlreadyUploadedErr" }
| {
__typename?: "StorageLimitExceededErr";
reason: string;
tierName: string;
retainedStorageUsedBytes: any;
retainedStorageLimitBytes?: any | null;
remainingStorageBytes?: any | null;
}
| { __typename?: "TooManyInitUploadsErr" }
| { __typename?: "TooManyProfileImageUploadsErr" };
}
| {
__typename?: "UploadLinkBatch";
alreadyUploaded: Array<number>;
links: Array<{
__typename?: "SegmentUploadLink";
segmentIndex: number;
uploadUrl: string;
headers: Array<{
__typename?: "Header";
key: string;
value: string;
} | null>;
}>;
};
stream?: {
__typename?: "UploadStreamGQL";
id: string;
uploadCompletionCursor: number;
} | null;
};
};
export type GetHlsInitUploadLinkMutationVariables = Exact<{
videoId: Scalars["Int"]["input"];
}>;
@@ -9894,10 +9747,6 @@ export const SessionCoachCandidateFieldsFragmentDoc = gql`
patternShotCount
score
rankReason
baselineSessionCount
baselineAttemptCount
baselineMadeCount
baselineMakePercentage
}
}
`;
@@ -9908,13 +9757,7 @@ export const SessionCoachGenerationFieldsFragmentDoc = gql`
createdAt
completedAt
decision {
selectedPositiveCandidateId
positiveTitle
positiveBody
selectedCandidateId
supportingCandidateIds
supportingShotIds
sessionSummary
title
body
suggestedAction
@@ -9941,7 +9784,6 @@ export const SessionCoachGenerationFieldsFragmentDoc = gql`
startedAt
lastEnqueuedAt
abstentionReason
synthesisRationale
}
}
`;
@@ -15574,16 +15416,6 @@ export const GetSessionCoachDocument = gql`
unknownOutcomeCount
analyzedShotCount
makePercentage
longestMakeStreak
recentBaseline {
sessionCount
attemptCount
madeCount
makePercentage
}
positiveCandidates {
...SessionCoachCandidateFields
}
primaryCandidate {
...SessionCoachCandidateFields
}
@@ -15719,63 +15551,6 @@ export type RequestSessionCoachGenerationMutationOptions =
RequestSessionCoachGenerationMutation,
RequestSessionCoachGenerationMutationVariables
>;
export const CreateShotShareLinkDocument = gql`
mutation CreateShotShareLink(
$shotIds: [Int!]!
$paddingSeconds: Float = null
) {
createShotShareLink(
input: { shotIds: $shotIds, paddingSeconds: $paddingSeconds }
) {
slug
url
}
}
`;
export type CreateShotShareLinkMutationFn = Apollo.MutationFunction<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>;
/**
* __useCreateShotShareLinkMutation__
*
* To run a mutation, you first call `useCreateShotShareLinkMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useCreateShotShareLinkMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [createShotShareLinkMutation, { data, loading, error }] = useCreateShotShareLinkMutation({
* variables: {
* shotIds: // value for 'shotIds'
* paddingSeconds: // value for 'paddingSeconds'
* },
* });
*/
export function useCreateShotShareLinkMutation(
baseOptions?: Apollo.MutationHookOptions<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>(CreateShotShareLinkDocument, options);
}
export type CreateShotShareLinkMutationHookResult = ReturnType<
typeof useCreateShotShareLinkMutation
>;
export type CreateShotShareLinkMutationResult =
Apollo.MutationResult<CreateShotShareLinkMutation>;
export type CreateShotShareLinkMutationOptions = Apollo.BaseMutationOptions<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>;
export const VideoPlayerClustersDocument = gql`
query VideoPlayerClusters($videoId: Int!) {
videoPlayerClusters(videoId: $videoId) {
@@ -17236,6 +17011,8 @@ export const GetUsageStatsDocument = gql`
activationCohort
activationActivated
payingUsers
pastDueUsers
newPaidToday
newPaid7d
newPaid30d
retentionPrevActive
@@ -17247,6 +17024,7 @@ export const GetUsageStatsDocument = gql`
activated7d
paid7d
activatedNotPaid7d
paidTotal
}
totalUsers
totalVideos
@@ -20288,96 +20066,6 @@ export type GetUploadLinkMutationOptions = Apollo.BaseMutationOptions<
GetUploadLinkMutation,
GetUploadLinkMutationVariables
>;
export const GetUploadLinksDocument = gql`
mutation GetUploadLinks($videoId: Int!, $segmentIndexes: [Int!]!) {
getUploadLinks(videoId: $videoId, segmentIndexes: $segmentIndexes) {
value {
... on UploadLinkBatch {
links {
segmentIndex
uploadUrl
headers {
key
value
}
}
alreadyUploaded
}
... on GetUploadLinkErrors {
error {
... on MustHaveSetForUploadLinkErr {
resolution
framesPerSecond
}
... on ProcessingFailedErr {
processing {
status
errors {
message
}
}
}
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
}
}
}
stream {
id
uploadCompletionCursor
}
}
}
`;
export type GetUploadLinksMutationFn = Apollo.MutationFunction<
GetUploadLinksMutation,
GetUploadLinksMutationVariables
>;
/**
* __useGetUploadLinksMutation__
*
* To run a mutation, you first call `useGetUploadLinksMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useGetUploadLinksMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [getUploadLinksMutation, { data, loading, error }] = useGetUploadLinksMutation({
* variables: {
* videoId: // value for 'videoId'
* segmentIndexes: // value for 'segmentIndexes'
* },
* });
*/
export function useGetUploadLinksMutation(
baseOptions?: Apollo.MutationHookOptions<
GetUploadLinksMutation,
GetUploadLinksMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
GetUploadLinksMutation,
GetUploadLinksMutationVariables
>(GetUploadLinksDocument, options);
}
export type GetUploadLinksMutationHookResult = ReturnType<
typeof useGetUploadLinksMutation
>;
export type GetUploadLinksMutationResult =
Apollo.MutationResult<GetUploadLinksMutation>;
export type GetUploadLinksMutationOptions = Apollo.BaseMutationOptions<
GetUploadLinksMutation,
GetUploadLinksMutationVariables
>;
export const GetHlsInitUploadLinkDocument = gql`
mutation GetHlsInitUploadLink($videoId: Int!) {
getHlsInitUploadLink(videoId: $videoId) {

View File

@@ -14,16 +14,6 @@ query GetSessionCoach($videoId: Int!) {
unknownOutcomeCount
analyzedShotCount
makePercentage
longestMakeStreak
recentBaseline {
sessionCount
attemptCount
madeCount
makePercentage
}
positiveCandidates {
...SessionCoachCandidateFields
}
primaryCandidate {
...SessionCoachCandidateFields
}
@@ -69,10 +59,6 @@ fragment SessionCoachCandidateFields on SessionCoachCandidateGQL {
patternShotCount
score
rankReason
baselineSessionCount
baselineAttemptCount
baselineMadeCount
baselineMakePercentage
}
}
@@ -82,13 +68,7 @@ fragment SessionCoachGenerationFields on SessionCoachGenerationGQL {
createdAt
completedAt
decision {
selectedPositiveCandidateId
positiveTitle
positiveBody
selectedCandidateId
supportingCandidateIds
supportingShotIds
sessionSummary
title
body
suggestedAction
@@ -115,6 +95,5 @@ fragment SessionCoachGenerationFields on SessionCoachGenerationGQL {
startedAt
lastEnqueuedAt
abstentionReason
synthesisRationale
}
}

View File

@@ -1,8 +0,0 @@
mutation CreateShotShareLink($shotIds: [Int!]!, $paddingSeconds: Float = null) {
createShotShareLink(
input: { shotIds: $shotIds, paddingSeconds: $paddingSeconds }
) {
slug
url
}
}

View File

@@ -7,6 +7,8 @@ query getUsageStats($days: Int! = 30) {
activationCohort
activationActivated
payingUsers
pastDueUsers
newPaidToday
newPaid7d
newPaid30d
retentionPrevActive
@@ -18,6 +20,7 @@ query getUsageStats($days: Int! = 30) {
activated7d
paid7d
activatedNotPaid7d
paidTotal
}
totalUsers
totalVideos

View File

@@ -54,51 +54,6 @@ mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
}
}
mutation GetUploadLinks($videoId: Int!, $segmentIndexes: [Int!]!) {
getUploadLinks(videoId: $videoId, segmentIndexes: $segmentIndexes) {
value {
... on UploadLinkBatch {
links {
segmentIndex
uploadUrl
headers {
key
value
}
}
alreadyUploaded
}
... on GetUploadLinkErrors {
error {
... on MustHaveSetForUploadLinkErr {
resolution
framesPerSecond
}
... on ProcessingFailedErr {
processing {
status
errors {
message
}
}
}
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
}
}
}
stream {
id
uploadCompletionCursor
}
}
}
mutation GetHlsInitUploadLink($videoId: Int!) {
getHlsInitUploadLink(videoId: $videoId) {
value {

View File

@@ -214,6 +214,7 @@ type CohortStatsGQL {
activated7d: Int!
paid7d: Int!
activatedNotPaid7d: Int!
paidTotal: Int!
}
type CommentGQL {
@@ -464,6 +465,8 @@ type FunnelStatsGQL {
activationCohort: Int!
activationActivated: Int!
payingUsers: Int!
pastDueUsers: Int!
newPaidToday: Int!
newPaid7d: Int!
newPaid30d: Int!
retentionPrevActive: Int!
@@ -1713,7 +1716,6 @@ type TableStateGQL {
identifierToPosition: [[Float!]!]!
homography: HomographyInfoGQL
identifierToColor: [RGBColorGQL]!
identifierToBox: [BoundingBoxGQL!]!
}
type TagClassGQL {