widgetfied

© 2026 Widgetfied

Payment Widget

Stripe Connected

Secure payment processing with Stripe integration, dynamic tipping, customizable fees, and Venmo support.

Secure Payments

PCI-compliant Stripe-powered processing

Dynamic Tipping

Optional tip selection with custom percentages

Multiple Methods

Cards, Apple Pay, Google Pay support

Venmo Support

Accept payments via Venmo for convenience

🚀

Looking for a simpler integration?

Check out our Standalone Payment Widget - perfect for creating invoice payment pages, donation forms, or simple payment links with minimal code.

View Standalone Documentation

Embed Code

Standalone Payment Widget

<!-- Payment Widget (standalone) -->
<div id="qt-portal-payment"
  data-widget="payment"
  data-tenant="YOUR_TENANT_ID"
  data-container="qt-portal-payment"
  data-display-mode="button">
</div>

<!-- Load widgets -->
<script type="module" 
  src="https://cdn.widgetfied.com/portal.js">
</script>

Replace YOUR_TENANT_ID with your actual tenant ID from the dashboard

With Customer Portal Integration

<!-- Payment Widget with Customer Portal integration -->
<div id="qt-portal-payment"
  data-widget="payment"
  data-tenant="YOUR_TENANT_ID"
  data-container="qt-portal-payment"
  data-global-name="qtPortalPayment">
</div>

<script type="module" src="https://cdn.widgetfied.com/portal.js"></script>

<script>
  // Listen for payment results on the global event bus
  window.addEventListener('DOMContentLoaded', () => {
    qtPortalPayment.on('payment:complete', (data) => {
      if (data.success) {
        // data: { success, type, reference, amount, sessionId }
        console.log('Payment complete:', data);
        // Run your post-payment logic here (redirect, update UI, etc.)
      }
    });

    qtPortalPayment.on('payment:closed', () => {
      // Modal closed — fires on both success and cancel.
      // Gate any "cancelled" handling on whether payment:complete fired first.
    });
  });
</script>

Reconciliation is event-bus based, not redirect-based. Use data-global-name when integrating with the Customer Portal widget, then subscribe to payment:complete and payment:closed on the global (default name: qtPortalPayment).

How It Works

1

Customer Enters Amount

Customer enters the payment amount or selects from predefined amounts.

2

Optional Tip Selection

Customer can add a tip using percentage buttons or custom amount.

3

Secure Payment

Payment is processed securely through Stripe with their preferred method.

4

Confirmation

Both you and the customer receive confirmation emails with receipt details.

Two Trigger Contracts

How you trigger payment depends on the displayMode you render. Mixing them up is the most common integration mistake.

A

Inline / Button (data-* sync)

Widget renders its own Pay button. Drive it by writing data-amount, data-reference, data-service, data-customer-* on the placeholder div. The widget reads them live at click time — no re-init needed.

B

Modal (payment:open emit)

Your UI triggers checkout programmatically. Call qtPortalPayment.emit("payment:open", { reference, amount, type, ... }) — the widget opens Stripe Checkout immediately. Use this when you don't want a rendered button.

Both: listen for payment:complete

Subscribe to qtPortalPayment.on("payment:complete", cb) regardless of trigger. Match data.reference back to your pending purchase and credit the customer in your DB.

See the full production guide → (React hook, Next.js rewrites, CSP, gotchas)

Stripe Connect Setup

The payment widget requires Stripe Connect to process payments:

  1. 1Go to Settings in your dashboard
  2. 2Click "Connect Stripe Account" in the Payments section
  3. 3Sign in with your Stripe account or create a new one
  4. 4Complete the Stripe onboarding process
  5. 5Once connected, payments will be deposited to your Stripe account

Stripe takes 2.9% + $0.30 per transaction. Funds are deposited daily.

Supported Payment Methods

Credit/Debit Cards

Visa, Mastercard, American Express, Discover

Apple Pay

One-tap payment on Apple devices

Google Pay

Quick payment on Android and Chrome

Link

Stripe one-click checkout

Venmo

Alternative payment via Venmo link

Configuration

Configure your payment widget in the dashboard:

Stripe Connect

Required
Settings - Payments

Connect your Stripe account to receive payments

Tip Percentages

Settings - Payments

Set custom tip percentage options (e.g., 15%, 20%, 25%)

Processing Fee

Settings - Payments

Optionally pass processing fees to customers

Venmo Link

Settings - Payments

Add your Venmo username for alternative payments

Minimum Amount

Settings - Payments

Set a minimum payment amount if needed

Discount Code

White-Label → Payment → General

Enable a discount code for customers to enter at checkout. Set the code string and a percentage discount (5–50%). Each email can only use the code once — usage is tracked in your Google Sheet.

Fee Structure

Understanding payment processing fees:

Stripe Fee

Per transaction, deducted by Stripe

2.9% + $0.30

Platform Fee

No additional platform fees

Included in plan

Pass to Customer

You can pass processing fees to customers

Optional

Requirements

  • Active Widgetfied subscription
  • Stripe Connect account configured
  • Valid business information for Stripe
  • SSL certificate on your website (https://)

Troubleshooting

Payment failing
  • Verify Stripe Connect is properly configured
  • Check that your Stripe account is in good standing
  • Ensure the customer card is valid
  • Check for sufficient funds
Stripe Connect not connecting
  • Complete all required Stripe onboarding steps
  • Verify your business information is accurate
  • Contact Stripe support if issues persist
Tips not showing
  • Enable tips in payment settings
  • Set tip percentage options
  • Verify the widget is using latest configuration
Venmo link not working
  • Verify your Venmo username is correct
  • Ensure Venmo is enabled in settings
  • Test the link manually
⚡ Quick setup
🚀 Get Started
DOCS