Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: $199 pricing model for unlimited plans #1564

Merged
merged 3 commits into from
Nov 6, 2023

Conversation

ShubhamPalriwala
Copy link
Contributor

What does this PR do?

Introduce new plan for the unlimited offering and update accordingly in Stripe

Type of change

  • Enhancement (small improvements)

Checklist

Required

  • Filled out the "How to test" section in this PR
  • Read How we Code at Formbricks
  • Self-reviewed my own code
  • Commented on my code in hard-to-understand bits
  • Ran pnpm build
  • Checked for warnings, there are none
  • Removed all console.logs
  • Merged the latest changes from main onto my branch with git pull origin main
  • My changes don't cause any responsiveness issues
  • First PR at Formbricks? Please sign the CLA! Without it we wont be able to merge it 🙏

Appreciated

  • If a UI change was made: Added a screen recording or screenshots to this PR
  • Updated the Formbricks Docs if changes were necessary

Copy link

vercel bot commented Nov 2, 2023

The latest updates on your projects. Learn more about Vercel for Git ↗︎

2 Ignored Deployments
Name Status Preview Comments Updated (UTC)
formbricks-cloud ⬜️ Ignored (Inspect) Visit Preview Nov 3, 2023 8:24am
formbricks-com ⬜️ Ignored (Inspect) Visit Preview Nov 3, 2023 8:24am

Copy link
Contributor

github-actions bot commented Nov 2, 2023

Thank you for following the naming conventions for pull request titles! 🙏

Copy link
Contributor

subscriptionCreatedOrUpdated.ts

The code has a lot of redundancy, especially in the switch-case statements where the same logic is repeated for different cases. This can be refactored by creating a function that encapsulates the common logic and takes the varying parts as parameters.

Create Issue

    async function handleProduct(productName, featureKey, unlimitedKey, unlimitedKey199, team, stripeSubscriptionObject) {
      let updatedFeatures = team.billing.features;
      if (
        !(
          stripeSubscriptionObject.cancel_at_period_end &&
          team.billing.features[featureKey].status === "cancelled"
        )
      ) {
        updatedFeatures[featureKey].status = "active";
      }
      if (
        item.price.lookup_key === unlimitedKey ||
        item.price.lookup_key === unlimitedKey199
      ) {
        updatedFeatures[featureKey].unlimited = true;
      } else {
        const countForTeam = await getMonthlyTeamResponseCount(team.id);
        await reportUsage(
          stripeSubscriptionObject.items.data,
          featureKey,
          countForTeam
        );
      }
      return updatedFeatures;
    }

    for (const item of stripeSubscriptionObject.items.data) {
      const product = await stripe.products.retrieve(item.price.product as string);
      switch (product.name) {
        case StripeProductNames.inAppSurvey:
          updatedFeatures = await handleProduct(StripeProductNames.inAppSurvey, ProductFeatureKeys.inAppSurvey, StripePriceLookupKeys.inAppSurveyUnlimited, StripePriceLookupKeys.inAppSurveyUnlimited199, team, stripeSubscriptionObject);
          break;
        case StripeProductNames.linkSurvey:
          updatedFeatures = await handleProduct(StripeProductNames.linkSurvey, ProductFeatureKeys.linkSurvey, StripePriceLookupKeys.linkSurveyUnlimited, StripePriceLookupKeys.linkSurveyUnlimited199, team, stripeSubscriptionObject);
          break;
        case StripeProductNames.userTargeting:
          updatedFeatures = await handleProduct(StripeProductNames.userTargeting, ProductFeatureKeys.userTargeting, StripePriceLookupKeys.userTargetingUnlimited, StripePriceLookupKeys.userTargetingUnlimited199, team, stripeSubscriptionObject);
          break;
      }
    }
The code throws generic Error objects with a message string. This is not ideal for error handling because it does not provide much context about the error. It would be better to create custom error classes that can carry more information about the error.

Create Issue

    class TeamNotFoundError extends Error {
      constructor() {
        super("Team not found");
        this.name = "TeamNotFoundError";
      }
    }

    // Usage
    if (!team) {
      throw new TeamNotFoundError();
    }

page.tsx

The code throws generic Error objects with a message string. This is not ideal for error handling because it does not provide much context about the error. It would be better to create custom error classes that can carry more information about the error.

Create Issue

    class UnauthorizedError extends Error {
      constructor() {
        super("Unauthorized");
        this.name = "UnauthorizedError";
      }
    }

    class TeamNotFoundError extends Error {
      constructor() {
        super("Team not found");
        this.name = "TeamNotFoundError";
      }
    }

    // Usage
    if (!session) {
      throw new UnauthorizedError();
    }

    if (!team) {
      throw new TeamNotFoundError();
    }

checkoutSessionCompleted.ts

The code throws generic Error objects with a message string. This is not ideal for error handling because it does not provide much context about the error. It would be better to create custom error classes that can carry more information about the error.

Create Issue

    class TeamNotFoundError extends Error {
      constructor() {
        super("Team not found");
        this.name = "TeamNotFoundError";
      }
    }

    // Usage
    if (!team) {
      throw new TeamNotFoundError();
    }

@mattinannt mattinannt self-assigned this Nov 6, 2023
Copy link
Member

@mattinannt mattinannt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💪🙏

@mattinannt mattinannt added this pull request to the merge queue Nov 6, 2023
Merged via the queue into main with commit 6d6987d Nov 6, 2023
11 of 12 checks passed
@mattinannt mattinannt deleted the shubham/stripe-199-unlimited-plan branch November 6, 2023 09:02
kevinkong91 added a commit to kevinkong91/formbricks that referenced this pull request Nov 7, 2023
* main: (42 commits)
  chore: add revert to oss-friends (formbricks#745)
  fix: pass authOptions to getServerSession in authLayout (formbricks#1584)
  fix: fixed URL example for "Create Survey" API endpoint is wrong formbricks#1555 (formbricks#1586)
  fix(docs): default account info docs changes (formbricks#1583)
  chore: Add docker packages to Github Packages on release (formbricks#1585)
  feat: avatar upload (formbricks#1546)
  fix: editor crashing (formbricks#1582)
  fix: Add scroll to the setting navbar  (formbricks#1398)
  are you sure modal missing fix:formbricks#1419 (formbricks#1485)
  fix: github linting issues (formbricks#1510)
  refactor: added authorization to airtable integration and create a common actions file (formbricks#1538)
  docs: add docs for airtable (formbricks#1541)
  fix: missing static generation store in revalidation due to pages dir (formbricks#1581)
  feat: Pagination for other values in multi choice (formbricks#1560)
  feat:  $199 pricing model for unlimited plans (formbricks#1564)
  fix: make pricing pages consistent (formbricks#1567)
  fix: openText issue (formbricks#1579)
  fix: avoid blocking the request if it does not have an associated ip (formbricks#1540)
  feat: Add Unkey to OSS Friends (formbricks#1574)
  feat: FOR-683 Role Switch (formbricks#1450)
  ...
kevinkong91 added a commit to kevinkong91/formbricks that referenced this pull request Nov 7, 2023
* main: (70 commits)
  chore: add revert to oss-friends (formbricks#745)
  fix: pass authOptions to getServerSession in authLayout (formbricks#1584)
  fix: fixed URL example for "Create Survey" API endpoint is wrong formbricks#1555 (formbricks#1586)
  fix(docs): default account info docs changes (formbricks#1583)
  chore: Add docker packages to Github Packages on release (formbricks#1585)
  feat: avatar upload (formbricks#1546)
  fix: editor crashing (formbricks#1582)
  fix: Add scroll to the setting navbar  (formbricks#1398)
  are you sure modal missing fix:formbricks#1419 (formbricks#1485)
  fix: github linting issues (formbricks#1510)
  refactor: added authorization to airtable integration and create a common actions file (formbricks#1538)
  docs: add docs for airtable (formbricks#1541)
  fix: missing static generation store in revalidation due to pages dir (formbricks#1581)
  feat: Pagination for other values in multi choice (formbricks#1560)
  feat:  $199 pricing model for unlimited plans (formbricks#1564)
  fix: make pricing pages consistent (formbricks#1567)
  fix: openText issue (formbricks#1579)
  fix: avoid blocking the request if it does not have an associated ip (formbricks#1540)
  feat: Add Unkey to OSS Friends (formbricks#1574)
  feat: FOR-683 Role Switch (formbricks#1450)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants