{"record":{"id":"2e0521e8f003f155","repo":"antiwork/gumroad","slug":"the-suggested-price-you-entered-was-too-low","errorCode":null,"errorMessage":"The suggested price you entered was too low.","messagePattern":"The suggested price you entered was too low\\.","errorType":"validation","errorClass":"Link::LinkInvalid","httpStatus":null,"severity":"error","filePath":"app/services/product/variant_category_updater_service.rb","lineNumber":591,"sourceCode":"    # 3. All tiers have the same set of recurrence options selected. (Currently\n    # we do not allow, e.g., Tier 1 to have monthly & yearly plans and Tier 2\n    # only to have yearly plans)\n    def validate_variant_recurrences!(variants)\n      return unless is_tiered_membership && has_variant_recurrences?\n\n      variants.each_with_index do |variant, index|\n        if variant[:customizable_price]\n          # error if \"pay what you want\" enabled but missing recurrence_price_values\n          if !variant[:recurrence_price_values].present?\n            errors.add(:base, \"Please provide suggested payment options.\")\n            raise Link::LinkInvalid, \"Please provide suggested payment options.\"\n          end\n\n          # error if \"pay what you want\" enabled but suggested price is too low\n          variant[:recurrence_price_values].each do |recurrence, price_info|\n            if price_info[:suggested_price_cents].present? && (price_info[:price_cents].to_i > price_info[:suggested_price_cents].to_i)\n              errors.add(:base, \"The suggested price you entered was too low.\")\n              raise Link::LinkInvalid, \"The suggested price you entered was too low.\"\n            end\n          end\n        end\n\n        # error if missing pricing info for the product's default recurrence\n        if product.subscription_duration.present? && (\n          !variant[:recurrence_price_values][product.subscription_duration.to_s].present? ||\n          !variant[:recurrence_price_values][product.subscription_duration.to_s][:enabled]\n        )\n          errors.add(:base, \"Please provide a price for the default payment option.\")\n          raise Link::LinkInvalid, \"Please provide a price for the default payment option.\"\n        end\n      end\n\n      # error if variants have different recurrence options:\n      # 1. Extract variant recurrence selections:\n      # Ex. [[\"monthly\", \"yearly\"], [\"monthly\"]]\n      enabled_recurrences_for_variants = variants.map do |variant|","sourceCodeStart":573,"sourceCodeEnd":609,"githubUrl":"https://github.com/antiwork/gumroad/blob/afeacbd394069a1cbf0c6c50ee8e900925050370/app/services/product/variant_category_updater_service.rb#L573-L609","documentation":"For a pay-what-you-want tier, each recurrence's entry is checked: if suggested_price_cents is present and price_cents (the tier's price for that recurrence) is greater than it, the suggestion sits below the tier's own price, so the save fails with Link::LinkInvalid. The suggested amount must be at least the tier price for that recurrence.","triggerScenarios":"A tier priced at $10/month whose suggested price for 'monthly' is set to $5 — price_cents (1000) > suggested_price_cents (500) trips the raise.","commonSituations":"Editors entering the suggestion in the wrong field or the wrong unit (dollars vs cents), or lowering a tier's base price assumption after suggestions were already set.","solutions":["Raise the suggested price to at least the tier's price for that recurrence","Or lower the tier's price (price_cents) to or below the suggested price","Double-check both fields are in cents and belong to the same recurrence (monthly vs yearly mix-ups are common)"],"exampleFix":"# before\n{ price_cents: 1000, suggested_price_cents: 500 } # $10 tier, $5 suggestion\n# => Link::LinkInvalid: The suggested price you entered was too low.\n\n# after\n{ price_cents: 1000, suggested_price_cents: 1500 } # $10 tier, $15 suggestion","handlingStrategy":"validation","validationCode":"variant_params[:recurrence_price_values].each do |recurrence, info|\n  next unless info[:suggested_price_cents].present?\n  if info[:price_cents].to_i > info[:suggested_price_cents].to_i\n    raise \"suggested price for #{recurrence} is below the tier price\"\n  end\nend","typeGuard":null,"tryCatchPattern":"begin\n  VariantCategoryUpdaterService.new(product:, category_params:).process\nrescue Link::LinkInvalid\n  render_edit_form_with(product.errors.full_messages)\nend","preventionTips":["Keep both fields in cents — dollar/cents mix-ups are the top cause of a 'too low' suggestion","Enforce suggested_price_cents >= price_cents in the form (min attribute or client check) per recurrence","Match the recurrence you are editing: monthly suggestions are not compared against yearly prices"],"tags":["ruby","rails","membership","pricing","product-validation"],"backgroundTag":"price-below-minimum","analyzedSha":"afeacbd394069a1cbf0c6c50ee8e900925050370","analyzedAt":"2026-08-21T17:58:52.159Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}