diff --git a/docker/ss-atlas/internal/handlers/subscription.go b/docker/ss-atlas/internal/handlers/subscription.go index 87c3138..918a97d 100644 --- a/docker/ss-atlas/internal/handlers/subscription.go +++ b/docker/ss-atlas/internal/handlers/subscription.go @@ -36,7 +36,8 @@ func (a *App) handleLanding(w http.ResponseWriter, r *http.Request) { tier := pricing.ForCustomer(count, a.cfg.FreeTierLimit, a.cfg.YearTierLimit) useForm := a.cfg.StripePriceID != "" || a.cfg.StripePriceIDFree != "" || - a.cfg.StripePriceIDYear != "" || a.cfg.StripePriceIDMonth200 != "" + a.cfg.StripePriceIDYear != "" || a.cfg.StripePriceIDMonth100 != "" || + a.cfg.StripePriceIDMonth200 != "" data := map[string]any{ "AppURL": a.cfg.AppURL, "Commit": version.Commit, @@ -89,7 +90,7 @@ func (a *App) handleCreateCheckout(w http.ResponseWriter, r *http.Request) { sess, err := a.stripe.CreateCheckoutSession(email, domain, phone, count) if err != nil { if errors.Is(err, stripe.ErrNoPriceForTier) { - http.Error(w, "pricing not configured for current tier", http.StatusServiceUnavailable) + http.Error(w, "pricing not configured for current tier — set STRIPE_PRICE_ID or tier prices in env", http.StatusServiceUnavailable) return } log.Printf("stripe checkout error: %v", err) @@ -213,7 +214,7 @@ func (a *App) handleResubscribe(w http.ResponseWriter, r *http.Request) { sess, err := a.stripe.CreateCheckoutForCustomer(customerID, count) if err != nil { if errors.Is(err, stripe.ErrNoPriceForTier) { - http.Error(w, "pricing not configured for current tier", http.StatusServiceUnavailable) + http.Error(w, "pricing not configured for current tier — set STRIPE_PRICE_ID or tier prices in env", http.StatusServiceUnavailable) return } log.Printf("stripe resubscribe error: %v", err) diff --git a/docker/ss-atlas/internal/stripe/client.go b/docker/ss-atlas/internal/stripe/client.go index 14b06b2..6448cf0 100644 --- a/docker/ss-atlas/internal/stripe/client.go +++ b/docker/ss-atlas/internal/stripe/client.go @@ -45,6 +45,9 @@ func (c *Client) priceForTier(t pricing.Tier) string { if c.cfg.StripePriceIDMonth200 != "" { return c.cfg.StripePriceIDMonth200 } + if c.cfg.StripePriceIDMonth100 != "" { + return c.cfg.StripePriceIDMonth100 + } } return c.cfg.StripePriceID } @@ -53,6 +56,8 @@ func (c *Client) CreateCheckoutSession(email, customerDomain, customerPhone stri t := pricing.ForCustomer(customerCount, c.cfg.FreeTierLimit, c.cfg.YearTierLimit) priceID := c.priceForTier(t) if priceID == "" { + log.Printf("stripe: no price for tier %d (count=%d freeLimit=%d yearLimit=%d); set STRIPE_PRICE_ID or tier-specific price", + t, customerCount, c.cfg.FreeTierLimit, c.cfg.YearTierLimit) return nil, ErrNoPriceForTier } @@ -81,6 +86,7 @@ func (c *Client) CreateCheckoutForCustomer(customerID string, customerCount int) t := pricing.ForCustomer(customerCount, c.cfg.FreeTierLimit, c.cfg.YearTierLimit) priceID := c.priceForTier(t) if priceID == "" { + log.Printf("stripe: no price for tier %d (count=%d); set STRIPE_PRICE_ID or tier-specific price", t, customerCount) return nil, ErrNoPriceForTier }