@stackbe/sdk 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1653,6 +1653,252 @@ declare class FeatureRequestsClient {
1653
1653
  getCustomerActivity(customerId: string): Promise<CustomerFeatureActivity>;
1654
1654
  }
1655
1655
 
1656
+ interface AffiliateInfo {
1657
+ enrolled: boolean;
1658
+ id?: string;
1659
+ code?: string;
1660
+ status?: 'active' | 'suspended' | 'pending';
1661
+ totalEarned?: number;
1662
+ pendingBalance?: number;
1663
+ paidOut?: number;
1664
+ totalReferrals?: number;
1665
+ totalConversions?: number;
1666
+ createdAt?: string;
1667
+ }
1668
+ interface AffiliateEnrollment {
1669
+ id: string;
1670
+ code: string;
1671
+ status: string;
1672
+ createdAt: string;
1673
+ }
1674
+ interface AffiliateStats {
1675
+ enrolled: boolean;
1676
+ totalEarned: number;
1677
+ pendingBalance: number;
1678
+ paidOut: number;
1679
+ totalReferrals: number;
1680
+ totalConversions: number;
1681
+ }
1682
+ interface AffiliateCommission {
1683
+ id: string;
1684
+ amount: number;
1685
+ currency: string;
1686
+ status: 'pending' | 'approved' | 'paid' | 'rejected';
1687
+ createdAt: string;
1688
+ referredCustomerEmail?: string;
1689
+ }
1690
+ interface AffiliateCommissionsResponse {
1691
+ commissions: AffiliateCommission[];
1692
+ total: number;
1693
+ }
1694
+ interface TrackReferralResponse {
1695
+ token: string;
1696
+ expiresInDays: number;
1697
+ }
1698
+ interface EnrollOptions {
1699
+ /** Preferred referral code (auto-generated if not provided) */
1700
+ code?: string;
1701
+ /** PayPal email for payouts */
1702
+ payoutEmail?: string;
1703
+ }
1704
+ declare class AffiliatesClient {
1705
+ private http;
1706
+ constructor(http: HttpClient);
1707
+ /**
1708
+ * Get the current customer's affiliate info.
1709
+ * Requires customer session token.
1710
+ *
1711
+ * @example
1712
+ * ```typescript
1713
+ * const affiliate = await stackbe.affiliates.get();
1714
+ *
1715
+ * if (affiliate.enrolled) {
1716
+ * console.log(`Your referral code: ${affiliate.code}`);
1717
+ * console.log(`Earnings: $${(affiliate.totalEarned! / 100).toFixed(2)}`);
1718
+ * } else {
1719
+ * console.log('Not enrolled in affiliate program');
1720
+ * }
1721
+ * ```
1722
+ */
1723
+ get(): Promise<AffiliateInfo>;
1724
+ /**
1725
+ * Enroll the current customer as an affiliate.
1726
+ * Requires customer session token.
1727
+ *
1728
+ * @example
1729
+ * ```typescript
1730
+ * // Enroll with auto-generated code
1731
+ * const affiliate = await stackbe.affiliates.enroll();
1732
+ * console.log(`Your referral code: ${affiliate.code}`);
1733
+ *
1734
+ * // Enroll with custom code
1735
+ * const affiliate = await stackbe.affiliates.enroll({
1736
+ * code: 'MYCODE',
1737
+ * payoutEmail: 'payouts@example.com',
1738
+ * });
1739
+ * ```
1740
+ */
1741
+ enroll(options?: EnrollOptions): Promise<AffiliateEnrollment>;
1742
+ /**
1743
+ * Get affiliate statistics.
1744
+ * Requires customer session token.
1745
+ *
1746
+ * @example
1747
+ * ```typescript
1748
+ * const stats = await stackbe.affiliates.getStats();
1749
+ *
1750
+ * if (stats.enrolled) {
1751
+ * console.log(`Total earned: $${(stats.totalEarned / 100).toFixed(2)}`);
1752
+ * console.log(`Pending: $${(stats.pendingBalance / 100).toFixed(2)}`);
1753
+ * console.log(`Referrals: ${stats.totalReferrals}`);
1754
+ * console.log(`Conversions: ${stats.totalConversions}`);
1755
+ * }
1756
+ * ```
1757
+ */
1758
+ getStats(): Promise<AffiliateStats>;
1759
+ /**
1760
+ * Get affiliate commission history.
1761
+ * Requires customer session token.
1762
+ *
1763
+ * @example
1764
+ * ```typescript
1765
+ * const { commissions, total } = await stackbe.affiliates.getCommissions();
1766
+ *
1767
+ * commissions.forEach((c) => {
1768
+ * console.log(`$${(c.amount / 100).toFixed(2)} - ${c.status}`);
1769
+ * });
1770
+ * ```
1771
+ */
1772
+ getCommissions(): Promise<AffiliateCommissionsResponse>;
1773
+ /**
1774
+ * Track a referral click (store token for attribution).
1775
+ * Call this when a user lands on your site with a referral code.
1776
+ * Requires API key.
1777
+ *
1778
+ * @example
1779
+ * ```typescript
1780
+ * // In your landing page handler
1781
+ * const refCode = req.query.ref;
1782
+ * if (refCode) {
1783
+ * const { token, expiresInDays } = await stackbe.affiliates.trackReferral(refCode);
1784
+ * // Store token in cookie for attribution on signup
1785
+ * res.cookie('ref_token', token, { maxAge: expiresInDays * 24 * 60 * 60 * 1000 });
1786
+ * }
1787
+ * ```
1788
+ */
1789
+ trackReferral(code: string, referralUrl?: string): Promise<TrackReferralResponse>;
1790
+ }
1791
+
1792
+ interface EarlyAccessSignup {
1793
+ id: string;
1794
+ status: 'new' | 'invited' | 'converted' | 'archived';
1795
+ email: string;
1796
+ name?: string;
1797
+ createdAt: string;
1798
+ }
1799
+ interface CreateEarlyAccessSignupOptions {
1800
+ email: string;
1801
+ name?: string;
1802
+ note?: string;
1803
+ metadata?: Record<string, any>;
1804
+ }
1805
+ interface EarlyAccessSignupListResponse {
1806
+ items: Array<{
1807
+ id: string;
1808
+ email: string;
1809
+ name?: string;
1810
+ status: string;
1811
+ metadata?: Record<string, any>;
1812
+ createdAt: string;
1813
+ }>;
1814
+ page: number;
1815
+ limit: number;
1816
+ total: number;
1817
+ hasMore: boolean;
1818
+ }
1819
+ interface ListEarlyAccessOptions {
1820
+ status?: 'new' | 'invited' | 'converted' | 'archived';
1821
+ search?: string;
1822
+ limit?: number;
1823
+ offset?: number;
1824
+ }
1825
+ declare class EarlyAccessClient {
1826
+ private http;
1827
+ private appId;
1828
+ constructor(http: HttpClient, appId: string);
1829
+ /**
1830
+ * Submit an early access / waitlist signup.
1831
+ * This is a public endpoint - no auth required.
1832
+ *
1833
+ * @example
1834
+ * ```typescript
1835
+ * // Basic signup
1836
+ * const signup = await stackbe.earlyAccess.signup({
1837
+ * email: 'user@example.com',
1838
+ * });
1839
+ *
1840
+ * // With additional info
1841
+ * const signup = await stackbe.earlyAccess.signup({
1842
+ * email: 'user@example.com',
1843
+ * name: 'John Doe',
1844
+ * note: 'Interested in enterprise features',
1845
+ * metadata: { source: 'landing_page', campaign: 'launch' },
1846
+ * });
1847
+ *
1848
+ * console.log(`Signup ID: ${signup.id}`);
1849
+ * ```
1850
+ */
1851
+ signup(options: CreateEarlyAccessSignupOptions): Promise<EarlyAccessSignup>;
1852
+ /**
1853
+ * List early access signups.
1854
+ * Requires API key (admin).
1855
+ *
1856
+ * @example
1857
+ * ```typescript
1858
+ * // Get all signups
1859
+ * const { items, total } = await stackbe.earlyAccess.list();
1860
+ *
1861
+ * // Filter by status
1862
+ * const newSignups = await stackbe.earlyAccess.list({ status: 'new' });
1863
+ *
1864
+ * // Search by email
1865
+ * const results = await stackbe.earlyAccess.list({ search: 'example.com' });
1866
+ *
1867
+ * // Paginate
1868
+ * const page2 = await stackbe.earlyAccess.list({ offset: 50, limit: 50 });
1869
+ * ```
1870
+ */
1871
+ list(options?: ListEarlyAccessOptions): Promise<EarlyAccessSignupListResponse>;
1872
+ /**
1873
+ * Get a specific early access signup.
1874
+ * Requires API key (admin).
1875
+ *
1876
+ * @example
1877
+ * ```typescript
1878
+ * const signup = await stackbe.earlyAccess.get('signup_123');
1879
+ * console.log(`${signup.email} - ${signup.status}`);
1880
+ * ```
1881
+ */
1882
+ get(signupId: string): Promise<EarlyAccessSignup>;
1883
+ /**
1884
+ * Update the status of an early access signup.
1885
+ * Requires API key (admin).
1886
+ *
1887
+ * @example
1888
+ * ```typescript
1889
+ * // Mark as invited
1890
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'invited');
1891
+ *
1892
+ * // Mark as converted (user signed up)
1893
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'converted');
1894
+ *
1895
+ * // Archive
1896
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'archived');
1897
+ * ```
1898
+ */
1899
+ updateStatus(signupId: string, status: 'new' | 'invited' | 'converted' | 'archived'): Promise<EarlyAccessSignup>;
1900
+ }
1901
+
1656
1902
  declare class StackBE {
1657
1903
  private http;
1658
1904
  private appId;
@@ -1676,6 +1922,10 @@ declare class StackBE {
1676
1922
  readonly products: ProductsClient;
1677
1923
  /** Feature requests and voting */
1678
1924
  readonly featureRequests: FeatureRequestsClient;
1925
+ /** Affiliate program (customer-facing) */
1926
+ readonly affiliates: AffiliatesClient;
1927
+ /** Early access / waitlist signups */
1928
+ readonly earlyAccess: EarlyAccessClient;
1679
1929
  /**
1680
1930
  * Create a new StackBE client.
1681
1931
  *
@@ -1776,4 +2026,4 @@ declare class StackBE {
1776
2026
  }): (req: any, res: any, next: any) => Promise<any>;
1777
2027
  }
1778
2028
 
1779
- export { type AddMemberOptions, type AnyWebhookEvent, AuthClient, type CancelSubscriptionOptions, type CancelSubscriptionResponse, type CheckEntitlementResponse, type CheckUsageResponse, CheckoutClient, type CheckoutSessionResponse, type CreateCheckoutOptions, type CreateCustomerOptions, type CreateFeatureRequestOptions, type CreateOrganizationOptions, type Customer, type CustomerCreatedEvent, type CustomerFeatureActivity, type CustomerUpdatedEvent, type CustomerUsageResponse, type CustomerWebhookPayload, type CustomerWithSubscription, CustomersClient, EntitlementsClient, type EntitlementsResponse, type FeatureRequest, type FeatureRequestComment, type FeatureRequestListResponse, FeatureRequestsClient, type InterestedCustomer, type InterestedCustomersResponse, type InviteMemberOptions, type ListFeatureRequestsOptions, type ListPlansOptions, type ListProductsOptions, type MagicLinkOptions, type MagicLinkResponse, type Organization, type OrganizationInvite, type OrganizationMember, OrganizationsClient, type PaymentFailedEvent, type PaymentSucceededEvent, type PaymentWebhookPayload, type Plan, PlansClient, type Product, ProductsClient, type SessionResponse, StackBE, type StackBEConfig, StackBEError, type StackBEErrorCode, type StackBEErrorResponse, type Subscription, type SubscriptionCancelledEvent, type SubscriptionCreatedEvent, type SubscriptionRenewedEvent, type SubscriptionUpdatedEvent, type SubscriptionWebhookPayload, type SubscriptionWithPlan, SubscriptionsClient, type TrackUsageOptions, type TrackUsageResponse, type TrialEndedEvent, type TrialStartedEvent, type UpdateCustomerOptions, type UpdateOrganizationOptions, type UpdateSubscriptionOptions, UsageClient, type UsageMetric, type VerifyTokenResponse, type WebhookEvent, type WebhookEventType };
2029
+ export { type AddMemberOptions, type AffiliateCommission, type AffiliateCommissionsResponse, type AffiliateEnrollment, type AffiliateInfo, type AffiliateStats, AffiliatesClient, type AnyWebhookEvent, AuthClient, type CancelSubscriptionOptions, type CancelSubscriptionResponse, type CheckEntitlementResponse, type CheckUsageResponse, CheckoutClient, type CheckoutSessionResponse, type CreateCheckoutOptions, type CreateCustomerOptions, type CreateEarlyAccessSignupOptions, type CreateFeatureRequestOptions, type CreateOrganizationOptions, type Customer, type CustomerCreatedEvent, type CustomerFeatureActivity, type CustomerUpdatedEvent, type CustomerUsageResponse, type CustomerWebhookPayload, type CustomerWithSubscription, CustomersClient, EarlyAccessClient, type EarlyAccessSignup, type EarlyAccessSignupListResponse, type EnrollOptions, EntitlementsClient, type EntitlementsResponse, type FeatureRequest, type FeatureRequestComment, type FeatureRequestListResponse, FeatureRequestsClient, type InterestedCustomer, type InterestedCustomersResponse, type InviteMemberOptions, type ListEarlyAccessOptions, type ListFeatureRequestsOptions, type ListPlansOptions, type ListProductsOptions, type MagicLinkOptions, type MagicLinkResponse, type Organization, type OrganizationInvite, type OrganizationMember, OrganizationsClient, type PaymentFailedEvent, type PaymentSucceededEvent, type PaymentWebhookPayload, type Plan, PlansClient, type Product, ProductsClient, type SessionResponse, StackBE, type StackBEConfig, StackBEError, type StackBEErrorCode, type StackBEErrorResponse, type Subscription, type SubscriptionCancelledEvent, type SubscriptionCreatedEvent, type SubscriptionRenewedEvent, type SubscriptionUpdatedEvent, type SubscriptionWebhookPayload, type SubscriptionWithPlan, SubscriptionsClient, type TrackReferralResponse, type TrackUsageOptions, type TrackUsageResponse, type TrialEndedEvent, type TrialStartedEvent, type UpdateCustomerOptions, type UpdateOrganizationOptions, type UpdateSubscriptionOptions, UsageClient, type UsageMetric, type VerifyTokenResponse, type WebhookEvent, type WebhookEventType };
package/dist/index.d.ts CHANGED
@@ -1653,6 +1653,252 @@ declare class FeatureRequestsClient {
1653
1653
  getCustomerActivity(customerId: string): Promise<CustomerFeatureActivity>;
1654
1654
  }
1655
1655
 
1656
+ interface AffiliateInfo {
1657
+ enrolled: boolean;
1658
+ id?: string;
1659
+ code?: string;
1660
+ status?: 'active' | 'suspended' | 'pending';
1661
+ totalEarned?: number;
1662
+ pendingBalance?: number;
1663
+ paidOut?: number;
1664
+ totalReferrals?: number;
1665
+ totalConversions?: number;
1666
+ createdAt?: string;
1667
+ }
1668
+ interface AffiliateEnrollment {
1669
+ id: string;
1670
+ code: string;
1671
+ status: string;
1672
+ createdAt: string;
1673
+ }
1674
+ interface AffiliateStats {
1675
+ enrolled: boolean;
1676
+ totalEarned: number;
1677
+ pendingBalance: number;
1678
+ paidOut: number;
1679
+ totalReferrals: number;
1680
+ totalConversions: number;
1681
+ }
1682
+ interface AffiliateCommission {
1683
+ id: string;
1684
+ amount: number;
1685
+ currency: string;
1686
+ status: 'pending' | 'approved' | 'paid' | 'rejected';
1687
+ createdAt: string;
1688
+ referredCustomerEmail?: string;
1689
+ }
1690
+ interface AffiliateCommissionsResponse {
1691
+ commissions: AffiliateCommission[];
1692
+ total: number;
1693
+ }
1694
+ interface TrackReferralResponse {
1695
+ token: string;
1696
+ expiresInDays: number;
1697
+ }
1698
+ interface EnrollOptions {
1699
+ /** Preferred referral code (auto-generated if not provided) */
1700
+ code?: string;
1701
+ /** PayPal email for payouts */
1702
+ payoutEmail?: string;
1703
+ }
1704
+ declare class AffiliatesClient {
1705
+ private http;
1706
+ constructor(http: HttpClient);
1707
+ /**
1708
+ * Get the current customer's affiliate info.
1709
+ * Requires customer session token.
1710
+ *
1711
+ * @example
1712
+ * ```typescript
1713
+ * const affiliate = await stackbe.affiliates.get();
1714
+ *
1715
+ * if (affiliate.enrolled) {
1716
+ * console.log(`Your referral code: ${affiliate.code}`);
1717
+ * console.log(`Earnings: $${(affiliate.totalEarned! / 100).toFixed(2)}`);
1718
+ * } else {
1719
+ * console.log('Not enrolled in affiliate program');
1720
+ * }
1721
+ * ```
1722
+ */
1723
+ get(): Promise<AffiliateInfo>;
1724
+ /**
1725
+ * Enroll the current customer as an affiliate.
1726
+ * Requires customer session token.
1727
+ *
1728
+ * @example
1729
+ * ```typescript
1730
+ * // Enroll with auto-generated code
1731
+ * const affiliate = await stackbe.affiliates.enroll();
1732
+ * console.log(`Your referral code: ${affiliate.code}`);
1733
+ *
1734
+ * // Enroll with custom code
1735
+ * const affiliate = await stackbe.affiliates.enroll({
1736
+ * code: 'MYCODE',
1737
+ * payoutEmail: 'payouts@example.com',
1738
+ * });
1739
+ * ```
1740
+ */
1741
+ enroll(options?: EnrollOptions): Promise<AffiliateEnrollment>;
1742
+ /**
1743
+ * Get affiliate statistics.
1744
+ * Requires customer session token.
1745
+ *
1746
+ * @example
1747
+ * ```typescript
1748
+ * const stats = await stackbe.affiliates.getStats();
1749
+ *
1750
+ * if (stats.enrolled) {
1751
+ * console.log(`Total earned: $${(stats.totalEarned / 100).toFixed(2)}`);
1752
+ * console.log(`Pending: $${(stats.pendingBalance / 100).toFixed(2)}`);
1753
+ * console.log(`Referrals: ${stats.totalReferrals}`);
1754
+ * console.log(`Conversions: ${stats.totalConversions}`);
1755
+ * }
1756
+ * ```
1757
+ */
1758
+ getStats(): Promise<AffiliateStats>;
1759
+ /**
1760
+ * Get affiliate commission history.
1761
+ * Requires customer session token.
1762
+ *
1763
+ * @example
1764
+ * ```typescript
1765
+ * const { commissions, total } = await stackbe.affiliates.getCommissions();
1766
+ *
1767
+ * commissions.forEach((c) => {
1768
+ * console.log(`$${(c.amount / 100).toFixed(2)} - ${c.status}`);
1769
+ * });
1770
+ * ```
1771
+ */
1772
+ getCommissions(): Promise<AffiliateCommissionsResponse>;
1773
+ /**
1774
+ * Track a referral click (store token for attribution).
1775
+ * Call this when a user lands on your site with a referral code.
1776
+ * Requires API key.
1777
+ *
1778
+ * @example
1779
+ * ```typescript
1780
+ * // In your landing page handler
1781
+ * const refCode = req.query.ref;
1782
+ * if (refCode) {
1783
+ * const { token, expiresInDays } = await stackbe.affiliates.trackReferral(refCode);
1784
+ * // Store token in cookie for attribution on signup
1785
+ * res.cookie('ref_token', token, { maxAge: expiresInDays * 24 * 60 * 60 * 1000 });
1786
+ * }
1787
+ * ```
1788
+ */
1789
+ trackReferral(code: string, referralUrl?: string): Promise<TrackReferralResponse>;
1790
+ }
1791
+
1792
+ interface EarlyAccessSignup {
1793
+ id: string;
1794
+ status: 'new' | 'invited' | 'converted' | 'archived';
1795
+ email: string;
1796
+ name?: string;
1797
+ createdAt: string;
1798
+ }
1799
+ interface CreateEarlyAccessSignupOptions {
1800
+ email: string;
1801
+ name?: string;
1802
+ note?: string;
1803
+ metadata?: Record<string, any>;
1804
+ }
1805
+ interface EarlyAccessSignupListResponse {
1806
+ items: Array<{
1807
+ id: string;
1808
+ email: string;
1809
+ name?: string;
1810
+ status: string;
1811
+ metadata?: Record<string, any>;
1812
+ createdAt: string;
1813
+ }>;
1814
+ page: number;
1815
+ limit: number;
1816
+ total: number;
1817
+ hasMore: boolean;
1818
+ }
1819
+ interface ListEarlyAccessOptions {
1820
+ status?: 'new' | 'invited' | 'converted' | 'archived';
1821
+ search?: string;
1822
+ limit?: number;
1823
+ offset?: number;
1824
+ }
1825
+ declare class EarlyAccessClient {
1826
+ private http;
1827
+ private appId;
1828
+ constructor(http: HttpClient, appId: string);
1829
+ /**
1830
+ * Submit an early access / waitlist signup.
1831
+ * This is a public endpoint - no auth required.
1832
+ *
1833
+ * @example
1834
+ * ```typescript
1835
+ * // Basic signup
1836
+ * const signup = await stackbe.earlyAccess.signup({
1837
+ * email: 'user@example.com',
1838
+ * });
1839
+ *
1840
+ * // With additional info
1841
+ * const signup = await stackbe.earlyAccess.signup({
1842
+ * email: 'user@example.com',
1843
+ * name: 'John Doe',
1844
+ * note: 'Interested in enterprise features',
1845
+ * metadata: { source: 'landing_page', campaign: 'launch' },
1846
+ * });
1847
+ *
1848
+ * console.log(`Signup ID: ${signup.id}`);
1849
+ * ```
1850
+ */
1851
+ signup(options: CreateEarlyAccessSignupOptions): Promise<EarlyAccessSignup>;
1852
+ /**
1853
+ * List early access signups.
1854
+ * Requires API key (admin).
1855
+ *
1856
+ * @example
1857
+ * ```typescript
1858
+ * // Get all signups
1859
+ * const { items, total } = await stackbe.earlyAccess.list();
1860
+ *
1861
+ * // Filter by status
1862
+ * const newSignups = await stackbe.earlyAccess.list({ status: 'new' });
1863
+ *
1864
+ * // Search by email
1865
+ * const results = await stackbe.earlyAccess.list({ search: 'example.com' });
1866
+ *
1867
+ * // Paginate
1868
+ * const page2 = await stackbe.earlyAccess.list({ offset: 50, limit: 50 });
1869
+ * ```
1870
+ */
1871
+ list(options?: ListEarlyAccessOptions): Promise<EarlyAccessSignupListResponse>;
1872
+ /**
1873
+ * Get a specific early access signup.
1874
+ * Requires API key (admin).
1875
+ *
1876
+ * @example
1877
+ * ```typescript
1878
+ * const signup = await stackbe.earlyAccess.get('signup_123');
1879
+ * console.log(`${signup.email} - ${signup.status}`);
1880
+ * ```
1881
+ */
1882
+ get(signupId: string): Promise<EarlyAccessSignup>;
1883
+ /**
1884
+ * Update the status of an early access signup.
1885
+ * Requires API key (admin).
1886
+ *
1887
+ * @example
1888
+ * ```typescript
1889
+ * // Mark as invited
1890
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'invited');
1891
+ *
1892
+ * // Mark as converted (user signed up)
1893
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'converted');
1894
+ *
1895
+ * // Archive
1896
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'archived');
1897
+ * ```
1898
+ */
1899
+ updateStatus(signupId: string, status: 'new' | 'invited' | 'converted' | 'archived'): Promise<EarlyAccessSignup>;
1900
+ }
1901
+
1656
1902
  declare class StackBE {
1657
1903
  private http;
1658
1904
  private appId;
@@ -1676,6 +1922,10 @@ declare class StackBE {
1676
1922
  readonly products: ProductsClient;
1677
1923
  /** Feature requests and voting */
1678
1924
  readonly featureRequests: FeatureRequestsClient;
1925
+ /** Affiliate program (customer-facing) */
1926
+ readonly affiliates: AffiliatesClient;
1927
+ /** Early access / waitlist signups */
1928
+ readonly earlyAccess: EarlyAccessClient;
1679
1929
  /**
1680
1930
  * Create a new StackBE client.
1681
1931
  *
@@ -1776,4 +2026,4 @@ declare class StackBE {
1776
2026
  }): (req: any, res: any, next: any) => Promise<any>;
1777
2027
  }
1778
2028
 
1779
- export { type AddMemberOptions, type AnyWebhookEvent, AuthClient, type CancelSubscriptionOptions, type CancelSubscriptionResponse, type CheckEntitlementResponse, type CheckUsageResponse, CheckoutClient, type CheckoutSessionResponse, type CreateCheckoutOptions, type CreateCustomerOptions, type CreateFeatureRequestOptions, type CreateOrganizationOptions, type Customer, type CustomerCreatedEvent, type CustomerFeatureActivity, type CustomerUpdatedEvent, type CustomerUsageResponse, type CustomerWebhookPayload, type CustomerWithSubscription, CustomersClient, EntitlementsClient, type EntitlementsResponse, type FeatureRequest, type FeatureRequestComment, type FeatureRequestListResponse, FeatureRequestsClient, type InterestedCustomer, type InterestedCustomersResponse, type InviteMemberOptions, type ListFeatureRequestsOptions, type ListPlansOptions, type ListProductsOptions, type MagicLinkOptions, type MagicLinkResponse, type Organization, type OrganizationInvite, type OrganizationMember, OrganizationsClient, type PaymentFailedEvent, type PaymentSucceededEvent, type PaymentWebhookPayload, type Plan, PlansClient, type Product, ProductsClient, type SessionResponse, StackBE, type StackBEConfig, StackBEError, type StackBEErrorCode, type StackBEErrorResponse, type Subscription, type SubscriptionCancelledEvent, type SubscriptionCreatedEvent, type SubscriptionRenewedEvent, type SubscriptionUpdatedEvent, type SubscriptionWebhookPayload, type SubscriptionWithPlan, SubscriptionsClient, type TrackUsageOptions, type TrackUsageResponse, type TrialEndedEvent, type TrialStartedEvent, type UpdateCustomerOptions, type UpdateOrganizationOptions, type UpdateSubscriptionOptions, UsageClient, type UsageMetric, type VerifyTokenResponse, type WebhookEvent, type WebhookEventType };
2029
+ export { type AddMemberOptions, type AffiliateCommission, type AffiliateCommissionsResponse, type AffiliateEnrollment, type AffiliateInfo, type AffiliateStats, AffiliatesClient, type AnyWebhookEvent, AuthClient, type CancelSubscriptionOptions, type CancelSubscriptionResponse, type CheckEntitlementResponse, type CheckUsageResponse, CheckoutClient, type CheckoutSessionResponse, type CreateCheckoutOptions, type CreateCustomerOptions, type CreateEarlyAccessSignupOptions, type CreateFeatureRequestOptions, type CreateOrganizationOptions, type Customer, type CustomerCreatedEvent, type CustomerFeatureActivity, type CustomerUpdatedEvent, type CustomerUsageResponse, type CustomerWebhookPayload, type CustomerWithSubscription, CustomersClient, EarlyAccessClient, type EarlyAccessSignup, type EarlyAccessSignupListResponse, type EnrollOptions, EntitlementsClient, type EntitlementsResponse, type FeatureRequest, type FeatureRequestComment, type FeatureRequestListResponse, FeatureRequestsClient, type InterestedCustomer, type InterestedCustomersResponse, type InviteMemberOptions, type ListEarlyAccessOptions, type ListFeatureRequestsOptions, type ListPlansOptions, type ListProductsOptions, type MagicLinkOptions, type MagicLinkResponse, type Organization, type OrganizationInvite, type OrganizationMember, OrganizationsClient, type PaymentFailedEvent, type PaymentSucceededEvent, type PaymentWebhookPayload, type Plan, PlansClient, type Product, ProductsClient, type SessionResponse, StackBE, type StackBEConfig, StackBEError, type StackBEErrorCode, type StackBEErrorResponse, type Subscription, type SubscriptionCancelledEvent, type SubscriptionCreatedEvent, type SubscriptionRenewedEvent, type SubscriptionUpdatedEvent, type SubscriptionWebhookPayload, type SubscriptionWithPlan, SubscriptionsClient, type TrackReferralResponse, type TrackUsageOptions, type TrackUsageResponse, type TrialEndedEvent, type TrialStartedEvent, type UpdateCustomerOptions, type UpdateOrganizationOptions, type UpdateSubscriptionOptions, UsageClient, type UsageMetric, type VerifyTokenResponse, type WebhookEvent, type WebhookEventType };
package/dist/index.js CHANGED
@@ -20,9 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ AffiliatesClient: () => AffiliatesClient,
23
24
  AuthClient: () => AuthClient,
24
25
  CheckoutClient: () => CheckoutClient,
25
26
  CustomersClient: () => CustomersClient,
27
+ EarlyAccessClient: () => EarlyAccessClient,
26
28
  EntitlementsClient: () => EntitlementsClient,
27
29
  FeatureRequestsClient: () => FeatureRequestsClient,
28
30
  OrganizationsClient: () => OrganizationsClient,
@@ -1694,6 +1696,213 @@ var FeatureRequestsClient = class {
1694
1696
  }
1695
1697
  };
1696
1698
 
1699
+ // src/affiliates.ts
1700
+ var AffiliatesClient = class {
1701
+ constructor(http) {
1702
+ this.http = http;
1703
+ }
1704
+ /**
1705
+ * Get the current customer's affiliate info.
1706
+ * Requires customer session token.
1707
+ *
1708
+ * @example
1709
+ * ```typescript
1710
+ * const affiliate = await stackbe.affiliates.get();
1711
+ *
1712
+ * if (affiliate.enrolled) {
1713
+ * console.log(`Your referral code: ${affiliate.code}`);
1714
+ * console.log(`Earnings: $${(affiliate.totalEarned! / 100).toFixed(2)}`);
1715
+ * } else {
1716
+ * console.log('Not enrolled in affiliate program');
1717
+ * }
1718
+ * ```
1719
+ */
1720
+ async get() {
1721
+ return this.http.get("/v1/affiliate");
1722
+ }
1723
+ /**
1724
+ * Enroll the current customer as an affiliate.
1725
+ * Requires customer session token.
1726
+ *
1727
+ * @example
1728
+ * ```typescript
1729
+ * // Enroll with auto-generated code
1730
+ * const affiliate = await stackbe.affiliates.enroll();
1731
+ * console.log(`Your referral code: ${affiliate.code}`);
1732
+ *
1733
+ * // Enroll with custom code
1734
+ * const affiliate = await stackbe.affiliates.enroll({
1735
+ * code: 'MYCODE',
1736
+ * payoutEmail: 'payouts@example.com',
1737
+ * });
1738
+ * ```
1739
+ */
1740
+ async enroll(options = {}) {
1741
+ return this.http.post("/v1/affiliate/enroll", options);
1742
+ }
1743
+ /**
1744
+ * Get affiliate statistics.
1745
+ * Requires customer session token.
1746
+ *
1747
+ * @example
1748
+ * ```typescript
1749
+ * const stats = await stackbe.affiliates.getStats();
1750
+ *
1751
+ * if (stats.enrolled) {
1752
+ * console.log(`Total earned: $${(stats.totalEarned / 100).toFixed(2)}`);
1753
+ * console.log(`Pending: $${(stats.pendingBalance / 100).toFixed(2)}`);
1754
+ * console.log(`Referrals: ${stats.totalReferrals}`);
1755
+ * console.log(`Conversions: ${stats.totalConversions}`);
1756
+ * }
1757
+ * ```
1758
+ */
1759
+ async getStats() {
1760
+ return this.http.get("/v1/affiliate/stats");
1761
+ }
1762
+ /**
1763
+ * Get affiliate commission history.
1764
+ * Requires customer session token.
1765
+ *
1766
+ * @example
1767
+ * ```typescript
1768
+ * const { commissions, total } = await stackbe.affiliates.getCommissions();
1769
+ *
1770
+ * commissions.forEach((c) => {
1771
+ * console.log(`$${(c.amount / 100).toFixed(2)} - ${c.status}`);
1772
+ * });
1773
+ * ```
1774
+ */
1775
+ async getCommissions() {
1776
+ return this.http.get("/v1/affiliate/commissions");
1777
+ }
1778
+ /**
1779
+ * Track a referral click (store token for attribution).
1780
+ * Call this when a user lands on your site with a referral code.
1781
+ * Requires API key.
1782
+ *
1783
+ * @example
1784
+ * ```typescript
1785
+ * // In your landing page handler
1786
+ * const refCode = req.query.ref;
1787
+ * if (refCode) {
1788
+ * const { token, expiresInDays } = await stackbe.affiliates.trackReferral(refCode);
1789
+ * // Store token in cookie for attribution on signup
1790
+ * res.cookie('ref_token', token, { maxAge: expiresInDays * 24 * 60 * 60 * 1000 });
1791
+ * }
1792
+ * ```
1793
+ */
1794
+ async trackReferral(code, referralUrl) {
1795
+ return this.http.post("/v1/affiliate/track", {
1796
+ code,
1797
+ referralUrl
1798
+ });
1799
+ }
1800
+ };
1801
+
1802
+ // src/early-access.ts
1803
+ var EarlyAccessClient = class {
1804
+ constructor(http, appId) {
1805
+ this.http = http;
1806
+ this.appId = appId;
1807
+ }
1808
+ /**
1809
+ * Submit an early access / waitlist signup.
1810
+ * This is a public endpoint - no auth required.
1811
+ *
1812
+ * @example
1813
+ * ```typescript
1814
+ * // Basic signup
1815
+ * const signup = await stackbe.earlyAccess.signup({
1816
+ * email: 'user@example.com',
1817
+ * });
1818
+ *
1819
+ * // With additional info
1820
+ * const signup = await stackbe.earlyAccess.signup({
1821
+ * email: 'user@example.com',
1822
+ * name: 'John Doe',
1823
+ * note: 'Interested in enterprise features',
1824
+ * metadata: { source: 'landing_page', campaign: 'launch' },
1825
+ * });
1826
+ *
1827
+ * console.log(`Signup ID: ${signup.id}`);
1828
+ * ```
1829
+ */
1830
+ async signup(options) {
1831
+ return this.http.post(
1832
+ `/v1/apps/${this.appId}/early-access/signups`,
1833
+ options
1834
+ );
1835
+ }
1836
+ // ==================== Admin Methods ====================
1837
+ /**
1838
+ * List early access signups.
1839
+ * Requires API key (admin).
1840
+ *
1841
+ * @example
1842
+ * ```typescript
1843
+ * // Get all signups
1844
+ * const { items, total } = await stackbe.earlyAccess.list();
1845
+ *
1846
+ * // Filter by status
1847
+ * const newSignups = await stackbe.earlyAccess.list({ status: 'new' });
1848
+ *
1849
+ * // Search by email
1850
+ * const results = await stackbe.earlyAccess.list({ search: 'example.com' });
1851
+ *
1852
+ * // Paginate
1853
+ * const page2 = await stackbe.earlyAccess.list({ offset: 50, limit: 50 });
1854
+ * ```
1855
+ */
1856
+ async list(options = {}) {
1857
+ const params = {};
1858
+ if (options.status) params.status = options.status;
1859
+ if (options.search) params.search = options.search;
1860
+ if (options.limit) params.limit = options.limit;
1861
+ if (options.offset) params.offset = options.offset;
1862
+ return this.http.get(
1863
+ `/v1/apps/${this.appId}/early-access/signups`,
1864
+ params
1865
+ );
1866
+ }
1867
+ /**
1868
+ * Get a specific early access signup.
1869
+ * Requires API key (admin).
1870
+ *
1871
+ * @example
1872
+ * ```typescript
1873
+ * const signup = await stackbe.earlyAccess.get('signup_123');
1874
+ * console.log(`${signup.email} - ${signup.status}`);
1875
+ * ```
1876
+ */
1877
+ async get(signupId) {
1878
+ return this.http.get(
1879
+ `/v1/apps/${this.appId}/early-access/signups/${signupId}`
1880
+ );
1881
+ }
1882
+ /**
1883
+ * Update the status of an early access signup.
1884
+ * Requires API key (admin).
1885
+ *
1886
+ * @example
1887
+ * ```typescript
1888
+ * // Mark as invited
1889
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'invited');
1890
+ *
1891
+ * // Mark as converted (user signed up)
1892
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'converted');
1893
+ *
1894
+ * // Archive
1895
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'archived');
1896
+ * ```
1897
+ */
1898
+ async updateStatus(signupId, status) {
1899
+ return this.http.patch(
1900
+ `/v1/apps/${this.appId}/early-access/signups/${signupId}`,
1901
+ { status }
1902
+ );
1903
+ }
1904
+ };
1905
+
1697
1906
  // src/client.ts
1698
1907
  var DEFAULT_BASE_URL = "https://api.stackbe.io";
1699
1908
  var DEFAULT_TIMEOUT = 3e4;
@@ -1757,6 +1966,8 @@ var StackBE = class {
1757
1966
  this.plans = new PlansClient(this.http);
1758
1967
  this.products = new ProductsClient(this.http, config.appId);
1759
1968
  this.featureRequests = new FeatureRequestsClient(this.http, config.appId);
1969
+ this.affiliates = new AffiliatesClient(this.http);
1970
+ this.earlyAccess = new EarlyAccessClient(this.http, config.appId);
1760
1971
  }
1761
1972
  /**
1762
1973
  * Create a middleware for Express that tracks usage automatically.
@@ -1890,9 +2101,11 @@ var StackBE = class {
1890
2101
  };
1891
2102
  // Annotate the CommonJS export names for ESM import in node:
1892
2103
  0 && (module.exports = {
2104
+ AffiliatesClient,
1893
2105
  AuthClient,
1894
2106
  CheckoutClient,
1895
2107
  CustomersClient,
2108
+ EarlyAccessClient,
1896
2109
  EntitlementsClient,
1897
2110
  FeatureRequestsClient,
1898
2111
  OrganizationsClient,
package/dist/index.mjs CHANGED
@@ -1657,6 +1657,213 @@ var FeatureRequestsClient = class {
1657
1657
  }
1658
1658
  };
1659
1659
 
1660
+ // src/affiliates.ts
1661
+ var AffiliatesClient = class {
1662
+ constructor(http) {
1663
+ this.http = http;
1664
+ }
1665
+ /**
1666
+ * Get the current customer's affiliate info.
1667
+ * Requires customer session token.
1668
+ *
1669
+ * @example
1670
+ * ```typescript
1671
+ * const affiliate = await stackbe.affiliates.get();
1672
+ *
1673
+ * if (affiliate.enrolled) {
1674
+ * console.log(`Your referral code: ${affiliate.code}`);
1675
+ * console.log(`Earnings: $${(affiliate.totalEarned! / 100).toFixed(2)}`);
1676
+ * } else {
1677
+ * console.log('Not enrolled in affiliate program');
1678
+ * }
1679
+ * ```
1680
+ */
1681
+ async get() {
1682
+ return this.http.get("/v1/affiliate");
1683
+ }
1684
+ /**
1685
+ * Enroll the current customer as an affiliate.
1686
+ * Requires customer session token.
1687
+ *
1688
+ * @example
1689
+ * ```typescript
1690
+ * // Enroll with auto-generated code
1691
+ * const affiliate = await stackbe.affiliates.enroll();
1692
+ * console.log(`Your referral code: ${affiliate.code}`);
1693
+ *
1694
+ * // Enroll with custom code
1695
+ * const affiliate = await stackbe.affiliates.enroll({
1696
+ * code: 'MYCODE',
1697
+ * payoutEmail: 'payouts@example.com',
1698
+ * });
1699
+ * ```
1700
+ */
1701
+ async enroll(options = {}) {
1702
+ return this.http.post("/v1/affiliate/enroll", options);
1703
+ }
1704
+ /**
1705
+ * Get affiliate statistics.
1706
+ * Requires customer session token.
1707
+ *
1708
+ * @example
1709
+ * ```typescript
1710
+ * const stats = await stackbe.affiliates.getStats();
1711
+ *
1712
+ * if (stats.enrolled) {
1713
+ * console.log(`Total earned: $${(stats.totalEarned / 100).toFixed(2)}`);
1714
+ * console.log(`Pending: $${(stats.pendingBalance / 100).toFixed(2)}`);
1715
+ * console.log(`Referrals: ${stats.totalReferrals}`);
1716
+ * console.log(`Conversions: ${stats.totalConversions}`);
1717
+ * }
1718
+ * ```
1719
+ */
1720
+ async getStats() {
1721
+ return this.http.get("/v1/affiliate/stats");
1722
+ }
1723
+ /**
1724
+ * Get affiliate commission history.
1725
+ * Requires customer session token.
1726
+ *
1727
+ * @example
1728
+ * ```typescript
1729
+ * const { commissions, total } = await stackbe.affiliates.getCommissions();
1730
+ *
1731
+ * commissions.forEach((c) => {
1732
+ * console.log(`$${(c.amount / 100).toFixed(2)} - ${c.status}`);
1733
+ * });
1734
+ * ```
1735
+ */
1736
+ async getCommissions() {
1737
+ return this.http.get("/v1/affiliate/commissions");
1738
+ }
1739
+ /**
1740
+ * Track a referral click (store token for attribution).
1741
+ * Call this when a user lands on your site with a referral code.
1742
+ * Requires API key.
1743
+ *
1744
+ * @example
1745
+ * ```typescript
1746
+ * // In your landing page handler
1747
+ * const refCode = req.query.ref;
1748
+ * if (refCode) {
1749
+ * const { token, expiresInDays } = await stackbe.affiliates.trackReferral(refCode);
1750
+ * // Store token in cookie for attribution on signup
1751
+ * res.cookie('ref_token', token, { maxAge: expiresInDays * 24 * 60 * 60 * 1000 });
1752
+ * }
1753
+ * ```
1754
+ */
1755
+ async trackReferral(code, referralUrl) {
1756
+ return this.http.post("/v1/affiliate/track", {
1757
+ code,
1758
+ referralUrl
1759
+ });
1760
+ }
1761
+ };
1762
+
1763
+ // src/early-access.ts
1764
+ var EarlyAccessClient = class {
1765
+ constructor(http, appId) {
1766
+ this.http = http;
1767
+ this.appId = appId;
1768
+ }
1769
+ /**
1770
+ * Submit an early access / waitlist signup.
1771
+ * This is a public endpoint - no auth required.
1772
+ *
1773
+ * @example
1774
+ * ```typescript
1775
+ * // Basic signup
1776
+ * const signup = await stackbe.earlyAccess.signup({
1777
+ * email: 'user@example.com',
1778
+ * });
1779
+ *
1780
+ * // With additional info
1781
+ * const signup = await stackbe.earlyAccess.signup({
1782
+ * email: 'user@example.com',
1783
+ * name: 'John Doe',
1784
+ * note: 'Interested in enterprise features',
1785
+ * metadata: { source: 'landing_page', campaign: 'launch' },
1786
+ * });
1787
+ *
1788
+ * console.log(`Signup ID: ${signup.id}`);
1789
+ * ```
1790
+ */
1791
+ async signup(options) {
1792
+ return this.http.post(
1793
+ `/v1/apps/${this.appId}/early-access/signups`,
1794
+ options
1795
+ );
1796
+ }
1797
+ // ==================== Admin Methods ====================
1798
+ /**
1799
+ * List early access signups.
1800
+ * Requires API key (admin).
1801
+ *
1802
+ * @example
1803
+ * ```typescript
1804
+ * // Get all signups
1805
+ * const { items, total } = await stackbe.earlyAccess.list();
1806
+ *
1807
+ * // Filter by status
1808
+ * const newSignups = await stackbe.earlyAccess.list({ status: 'new' });
1809
+ *
1810
+ * // Search by email
1811
+ * const results = await stackbe.earlyAccess.list({ search: 'example.com' });
1812
+ *
1813
+ * // Paginate
1814
+ * const page2 = await stackbe.earlyAccess.list({ offset: 50, limit: 50 });
1815
+ * ```
1816
+ */
1817
+ async list(options = {}) {
1818
+ const params = {};
1819
+ if (options.status) params.status = options.status;
1820
+ if (options.search) params.search = options.search;
1821
+ if (options.limit) params.limit = options.limit;
1822
+ if (options.offset) params.offset = options.offset;
1823
+ return this.http.get(
1824
+ `/v1/apps/${this.appId}/early-access/signups`,
1825
+ params
1826
+ );
1827
+ }
1828
+ /**
1829
+ * Get a specific early access signup.
1830
+ * Requires API key (admin).
1831
+ *
1832
+ * @example
1833
+ * ```typescript
1834
+ * const signup = await stackbe.earlyAccess.get('signup_123');
1835
+ * console.log(`${signup.email} - ${signup.status}`);
1836
+ * ```
1837
+ */
1838
+ async get(signupId) {
1839
+ return this.http.get(
1840
+ `/v1/apps/${this.appId}/early-access/signups/${signupId}`
1841
+ );
1842
+ }
1843
+ /**
1844
+ * Update the status of an early access signup.
1845
+ * Requires API key (admin).
1846
+ *
1847
+ * @example
1848
+ * ```typescript
1849
+ * // Mark as invited
1850
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'invited');
1851
+ *
1852
+ * // Mark as converted (user signed up)
1853
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'converted');
1854
+ *
1855
+ * // Archive
1856
+ * await stackbe.earlyAccess.updateStatus('signup_123', 'archived');
1857
+ * ```
1858
+ */
1859
+ async updateStatus(signupId, status) {
1860
+ return this.http.patch(
1861
+ `/v1/apps/${this.appId}/early-access/signups/${signupId}`,
1862
+ { status }
1863
+ );
1864
+ }
1865
+ };
1866
+
1660
1867
  // src/client.ts
1661
1868
  var DEFAULT_BASE_URL = "https://api.stackbe.io";
1662
1869
  var DEFAULT_TIMEOUT = 3e4;
@@ -1720,6 +1927,8 @@ var StackBE = class {
1720
1927
  this.plans = new PlansClient(this.http);
1721
1928
  this.products = new ProductsClient(this.http, config.appId);
1722
1929
  this.featureRequests = new FeatureRequestsClient(this.http, config.appId);
1930
+ this.affiliates = new AffiliatesClient(this.http);
1931
+ this.earlyAccess = new EarlyAccessClient(this.http, config.appId);
1723
1932
  }
1724
1933
  /**
1725
1934
  * Create a middleware for Express that tracks usage automatically.
@@ -1852,9 +2061,11 @@ var StackBE = class {
1852
2061
  }
1853
2062
  };
1854
2063
  export {
2064
+ AffiliatesClient,
1855
2065
  AuthClient,
1856
2066
  CheckoutClient,
1857
2067
  CustomersClient,
2068
+ EarlyAccessClient,
1858
2069
  EntitlementsClient,
1859
2070
  FeatureRequestsClient,
1860
2071
  OrganizationsClient,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackbe/sdk",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "description": "Official JavaScript/TypeScript SDK for StackBE - the billing backend for your side project",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",