Skip to content

1.9.0

Latest

Choose a tag to compare

@whop-elements-release whop-elements-release released this 12 Oct 16:39

Minor Changes

  • The wallet send completion event supports bill-pay recipients identified by their saved payout method, with kind: 'bill_pay', without requiring a Whop user.

  • The payment element's change payload now carries paymentMethod, the selected payment method, saved or new, or null while nothing is selected: a saved method's id, its type and category, the displayName and icons the element shows for the pick (with balance.imageUrl, a balance owner's image), a card's network, last4 and funding, whether it needs a billing phone (requiresBillingPhone), and the countries it can pay from in the charge's currency. The top-level type, requiresBillingPhone and method are deprecated in its favor, and the top-level supportsBuyerFee is deprecated with no replacement: Whop prices its buyer service fee itself. The cardFields change payload reports the detected network and the number's last4.

  • The verifications capabilities element takes hidePayouts, hideBankDeposits, hideCards and hideAds to drop individual capability rows.

  • New paymentRequest option paymentMethodConfiguration narrows the wallets canMakePayment() reports, in the API's enabled, disabled, and include_platform_defaults format.

  • A payment request now lets you approve or refuse a payment before its confirmation token is created. With an onPaymentAuthorization handler, the sheet waits once the buyer authorizes, and the event carries the payer, the payment method, the shipping address and option, and the total. Answer respondWith({ approved: true }) to create the token, or respondWith({ approved: false, message }) to refuse. A refused payment gets no token: Apple Pay and Google Pay show your message so the buyer can change something and pay again, and on PayPal show() rejects with payment_request_refused. A handler that throws or does not answer within 25 seconds refuses the payment, in time for Apple Pay and Google Pay to show the refusal. Without a handler, every sheet works as before.

  • contentSecurityPolicy() now includes the Plaid hosts the payment and checkout elements need when they link a bank account on your page. Pass { bankConnections: false } to it on pages that don't take bank account payments.

  • A payment request now fires onPaymentMethodChange when the buyer selects a card in Apple Pay, and when the Google Pay sheet opens and each time the buyer switches cards there, right after that card's onBillingAddressChange. The event carries the method type, what the wallet tells about the card before authorization (Apple Pay reports its funding and usually withholds the network; Google Pay reports the network) and its redacted billing address. Answer it like the other change events: updateWith({ amount, lineItems }) reprices the sheet, updateWith({}) keeps the total, and updateWith({ errors }) refuses the card until the buyer picks another. The sheet updates once both events are answered, and a card either event refuses leaves the totals as they were, whatever the other answer priced.

  • On phones, the address element no longer shows street suggestions under the street field, where the keyboard covered them. A search button at the end of the street field opens a full-screen address search instead: its search field starts with what the buyer already typed, Google's suggestions are listed under it, and picking one fills the whole form. With autocomplete: false the button does not appear. Larger screens keep the list under the field.

    Postal codes that are only digits now open the number pad, and on touch screens the address inputs set their text at 16px so iOS no longer zooms the page when one is focused. The compact layout's bordered group can be styled with the new .whop-AddressGroup class, and the phone's search button with .whop-AddressSearchButton.

  • paymentRequest addresses carry name, the name on the address, the same field the address element and the API use. recipient still carries the same value and is deprecated: use name.

  • paymentRequest's show() result and its confirmationToken event carry billing, the full billing address the confirmation token carries, or null when the wallet gave none. Apple Pay and Google Pay give the card's billing address; on PayPal it is the address the buyer picked in PayPal, the one its total was taxed on.

  • Wallet withdrawals can offer a better payout method with estimated savings. Review its fee and arrival estimate, then connect it before switching. Host-managed withdrawals can supply the offer through payoutQuote.recommendedMethod.

  • The ads namespace has a new ads-agreement element for signing the Whop Ads agreement. Mount it inline or open it as a modal to let an account sign before its first launch; it emits signed with the version that was signed. campaign-creator now opens it over the builder when a launch needs a signature, and resumes the launch once it is signed.

  • element "addressSearch" added (payments.addressSearch)

  • resource option "paymentMethodConfiguration" added (payments.paymentRequest.options.paymentMethodConfiguration)

  • resource event "paymentMethodChange" added (payments.paymentRequest.events.paymentMethodChange)

  • resource event "paymentAuthorization" added (payments.paymentRequest.events.paymentAuthorization)

  • resource event failure answer "paymentAuthorization" added (payments.paymentRequest.replyFail.paymentAuthorization)

  • resource event failure answer "paymentMethodChange" added (payments.paymentRequest.replyFail.paymentMethodChange)

  • prop "hidePayouts" added (verifications.capabilities.props.hidePayouts)

  • prop "hideBankDeposits" added (verifications.capabilities.props.hideBankDeposits)

  • prop "hideCards" added (verifications.capabilities.props.hideCards)

  • prop "hideAds" added (verifications.capabilities.props.hideAds)

  • element "addressSearch" added (checkout.addressSearch)

  • element "ads-agreement" added (ads.ads-agreement)

  • page-requirement group "bankConnections" added (connect:https://production.plaid.com, connect:https://sandbox.plaid.com, frame:https://cdn.plaid.com, script:https://cdn.plaid.com) (_pageRequirements.bankConnections)

Patch Changes

  • Show ad affiliate payouts in the default wallet activity feed and the Ads activity type filter.
  • The address country list no longer offers Abkhazia, which showed as a bare "AB", or the Netherlands Antilles, which showed as a second Curaçao.
  • The email element no longer shows a label bar in its loading placeholder when it is mounted with label: false, so the placeholder matches the field that replaces it.
  • Payment request shipping answers now behave the same way on Apple Pay and Google Pay. When an answer's shippingOptions drops the selected option, the first option becomes the selection without an onShippingOptionChange, and an empty shippingOptions list changes nothing. The result's shipping.option is the option the sheet showed, the first offered one when the buyer never picked another. On Apple Pay and Google Pay, a shipping handler that hasn't answered within 25 seconds fails that address or option in the sheet, instead of the wallet failing the payment, and its later answer is ignored. An address answer with an error, or one that failed this way, now keeps Pay refused until a later address is answered cleanly. On Apple Pay, a shipping option answer that replaces the options now updates the sheet's options, and a cancelled or failed attempt no longer carries the totals, line items or options its answers wrote into the next sheet. show() trims spaces around a passed email before it uses it.
  • The card fields' loading placeholder is easier to see in light mode: its bars use a stronger gray, so they no longer fade into the page while the secure inputs load.
  • Partner payments in the activity list show a percentage icon instead of an empty circle.
  • PayPal express now saves the buyer's PayPal account with the purchase, the way Apple Pay and Google Pay save the card they pay with. Unlike those two sheets, PayPal also asks the buyer to agree to future payments inside its own window. Express checkout offers PayPal on renewing plans and free trials too, and a seller can charge the saved account later with the buyer away, through renewals or a native POST /payments with its payment_method_id (Api-Version-Date 2026-09-02-1 or later), such as a one-click upsell. On the payment request, canMakePayment() now reports payPal for a request with setupFutureUsage, and an off_session request may be $0, which saves PayPal without a charge. The token carries the request's setupFutureUsage like the other wallets' tokens. A saved PayPal account charges only with the buyer away, like a saved Apple Pay or Google Pay card.
  • On PayPal, a payment request's shipping address or shipping option handler that hasn't answered within 25 seconds now refuses that address or option inside PayPal, as it does on Apple Pay and Google Pay, and its later answer is ignored. Before, the ask waited until PayPal gave up on it.
  • Payout timelines show bank-specific descriptions only for bank deposits.
  • In a withdrawal, a PayPal payout method that PayPal refused now tells the seller how to fix it: add PayPal again with their PayPal email, or a phone number that starts with + and the country code.