{"record":{"id":"8d08558e6dd8f370","repo":"antiwork/gumroad","slug":"you-can-t-gift-your-own-product-to-give-it-away-f","errorCode":null,"errorMessage":"You can't gift your own product. To give it away for free, create a 100% off discount code under Checkout > Discounts and share the checkout link.","messagePattern":"You can't gift your own product\\. To give it away for free, create a 100% off discount code under Checkout > Discounts and share the checkout link\\.","errorType":"exception","errorClass":"Purchase::PurchaseInvalid","httpStatus":null,"severity":"error","filePath":"app/services/purchase/create_service.rb","lineNumber":329,"sourceCode":"          return nil, nil, result.slice(:success, :requires_card_action, :client_secret, :purchase)\n        end\n\n        purchase = result[:purchase] || restartable_subscription.original_purchase\n        self.purchase = purchase\n        Rails.logger.info(\"Subscription #{restartable_subscription.external_id} restarted during checkout for product #{product.id}\")\n        return purchase, nil\n      else\n        return nil, result[:error_message]\n      end\n    end\n\n    def create_gift\n      # A seller buying their own product can only ever be a test purchase, and test purchases were\n      # never built for gifts, so this case has to be rejected. The message names what the seller\n      # actually did and points at the supported way to give a product away, because the old wording\n      # (\"Test gift purchases have not been enabled yet.\") described an internal capability and read\n      # as a flag we could switch on for them, which generated support tickets asking us to do that.\n      raise Purchase::PurchaseInvalid, \"You can't gift your own product. To give it away for free, create a 100% off discount code under Checkout > Discounts and share the checkout link.\" if buyer == product.user\n      raise Purchase::PurchaseInvalid, \"You cannot gift a product to yourself. Please try gifting to another email.\" if giftee_email == purchase_params[:email]\n      raise Purchase::PurchaseInvalid, \"Gift purchases cannot be on installment plans.\" if params[:pay_in_installments]\n\n      if product.can_gift?\n        gift = product.gifts.build(giftee_email:, gift_note: gift_params[:gift_note], gifter_email: params[:purchase][:email], is_recipient_hidden: gift_params[:giftee_email].blank?)\n        error_message = gift.save ? nil : gift.errors.full_messages[0]\n        raise Purchase::PurchaseInvalid, error_message if error_message.present?\n\n        gift\n      else\n        error_message = product.user.gifting_disabled? ? \"The creator has disabled gifting for their products.\" : \"Gifting is not yet enabled for pre-orders.\"\n        raise Purchase::PurchaseInvalid, error_message\n      end\n    end\n\n    def validate_perceived_price\n      if purchase_params[:perceived_price_cents] && !Purchase::MAX_PRICE_RANGE.cover?(purchase_params[:perceived_price_cents])\n        raise Purchase::PurchaseInvalid, \"Purchase price is invalid. Please check the price.\"","sourceCodeStart":311,"sourceCodeEnd":347,"githubUrl":"https://github.com/antiwork/gumroad/blob/afeacbd394069a1cbf0c6c50ee8e900925050370/app/services/purchase/create_service.rb#L311-L347","documentation":"create_gift rejects a gift when buyer == product.user: a seller buying their own product can only ever be a test purchase, and test purchases were never built for gifts. The message names the supported alternative (a 100% off discount code) because the old internal-capability wording generated support tickets asking Gumroad to 'enable' test gifts.","triggerScenarios":"The authenticated buyer equals product.user and gift params are present (params[:gift] set, so is_gift? is true) when Purchase::CreateService#perform runs.","commonSituations":"Sellers testing the gift flow on their own product; creators trying to send their own product to a customer as a gift.","solutions":["Create a 100% off discount code under Checkout > Discounts and share its checkout link with the recipient.","To exercise the gift flow end-to-end, purchase from a different, non-seller account.","Drop params[:gift] when making a seller test purchase."],"exampleFix":"# before: seller account submits a gift purchase of its own product\nparams[:gift] = { giftee_email: 'friend@example.com' } # buyer == product.user\n\n# after: self-purchases are test purchases; give the product away via a 100% off code instead\nparams.delete(:gift)","handlingStrategy":"validation","validationCode":"params.delete(:gift) if params[:gift].present? && buyer == product.user","typeGuard":"def self_gift?(buyer, product, gift_params)\n  gift_params.present? && buyer == product.user\nend","tryCatchPattern":"begin\n  Purchase::CreateService.new(product:, params:, buyer:).perform\nrescue Purchase::PurchaseInvalid => e\n  # message already contains the actionable guidance (100% off code); show it verbatim\n  render_checkout_error(e.message) if e.message.start_with?(\"You can't gift your own product\")\nend","preventionTips":["Hide the gift option when the current user is the product's seller.","Use 100% off discount codes for giveaways instead of attempting self-gifts.","Run gift end-to-end tests from a non-seller account."],"tags":["gifting","test-purchase","seller-self-purchase","checkout","gumroad"],"backgroundTag":"gifting-not-allowed","analyzedSha":"afeacbd394069a1cbf0c6c50ee8e900925050370","analyzedAt":"2026-08-21T17:58:52.159Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}