77 currencyFormatter ,
88 formatDateTimeSmart ,
99 nFormatter ,
10+ pluralize ,
1011} from "@dub/utils" ;
1112import { formatDistance } from "date-fns" ;
1213import Link from "next/link" ;
@@ -18,7 +19,11 @@ export function CustomerStats({
1819} : {
1920 customer ?: Pick < CustomerEnriched , "sales" | "saleAmount" | "createdAt" > ;
2021} ) {
21- const { customerId } = useParams < { customerId : string } > ( ) ;
22+ const { slug : workspaceSlug , customerId } = useParams < {
23+ slug : string ;
24+ customerId : string ;
25+ } > ( ) ;
26+
2227 const { customerActivity, isCustomerActivityLoading } = useCustomerActivity ( {
2328 customerId,
2429 } ) ;
@@ -29,49 +34,64 @@ export function CustomerStats({
2934 href ?: string ;
3035 } [ ] = useMemo (
3136 ( ) => [
37+ {
38+ label : "First sale date" ,
39+ value :
40+ isCustomerActivityLoading ? undefined : customerActivity ?. firstSaleAt ? (
41+ < TimestampTooltip
42+ timestamp = { customerActivity . firstSaleAt }
43+ side = "right"
44+ rows = { [ "local" , "utc" ] }
45+ >
46+ < span className = "hover:text-content-emphasis underline decoration-dotted underline-offset-2" >
47+ { formatDateTimeSmart ( customerActivity . firstSaleAt ) }
48+ </ span >
49+ </ TimestampTooltip >
50+ ) : (
51+ "-"
52+ ) ,
53+ } ,
3254 {
3355 label : "Time to sale" ,
3456 value :
3557 ! customer || isCustomerActivityLoading
3658 ? undefined
37- : customerActivity ?. firstSaleDate
38- ? formatDistance (
39- customerActivity . firstSaleDate ,
40- customer . createdAt ,
41- )
59+ : customerActivity ?. firstSaleAt
60+ ? formatDistance ( customerActivity . firstSaleAt , customer . createdAt )
4261 : "-" ,
4362 } ,
4463 {
45- label : "First sale date" ,
64+ label : "Lifetime value" ,
65+ value : customer ? (
66+ < div className = "flex items-center gap-1" >
67+ { currencyFormatter ( customer . saleAmount ?? 0 ) }
68+ < span className = "text-xs text-neutral-500" >
69+ ({ nFormatter ( customer . sales ?? 0 , { full : true } ) } { " " }
70+ { pluralize ( "sale" , customer . sales ?? 0 ) } )
71+ </ span >
72+ </ div >
73+ ) : undefined ,
74+ href : `/${ workspaceSlug } /events?event=sales&customerId=${ customerId } &interval=1y` ,
75+ } ,
76+ {
77+ label : "Subscription canceled" ,
4678 value :
47- isCustomerActivityLoading ? undefined : customerActivity ?. firstSaleDate ? (
79+ isCustomerActivityLoading ? undefined : customerActivity ?. subscriptionCanceledAt ? (
4880 < TimestampTooltip
49- timestamp = { customerActivity . firstSaleDate }
81+ timestamp = { customerActivity . subscriptionCanceledAt }
5082 side = "right"
5183 rows = { [ "local" , "utc" ] }
5284 >
5385 < span className = "hover:text-content-emphasis underline decoration-dotted underline-offset-2" >
54- { formatDateTimeSmart ( customerActivity . firstSaleDate ) }
86+ { formatDateTimeSmart ( customerActivity . subscriptionCanceledAt ) }
5587 </ span >
5688 </ TimestampTooltip >
5789 ) : (
5890 "-"
5991 ) ,
6092 } ,
61- {
62- label : "Sales" ,
63- value : customer
64- ? nFormatter ( customer . sales ?? 0 , { full : true } )
65- : undefined ,
66- } ,
67- {
68- label : "Lifetime value" ,
69- value : customer
70- ? currencyFormatter ( customer . saleAmount ?? 0 )
71- : undefined ,
72- } ,
7393 ] ,
74- [ customer , customerActivity , isCustomerActivityLoading ] ,
94+ [ workspaceSlug , customer , customerActivity , isCustomerActivityLoading ] ,
7595 ) ;
7696
7797 return (
0 commit comments