Payment Integrations
Collect one-time payments and subscriptions with Stripe and PayPal directly inside your Buildorado workflows.
Payment integrations embed checkout directly into your Buildorado form flow. Users enter payment details as a step in the form, and the charge is processed before the workflow continues. There is no redirect to an external checkout page -- the entire payment experience happens inside your form. This creates a seamless experience that reduces drop-off and increases conversion rates. All payment credentials are stored with AES-256 encryption through AWS KMS, and payment data is handled in compliance with PCI DSS requirements through Stripe and PayPal's certified payment infrastructure.
Stripe
Stripe is the primary payment integration in Buildorado. It supports one-time payments, recurring subscriptions, and save-card-for-later flows.
Connecting Your Stripe Account
- Navigate to Settings > Integrations in your Buildorado dashboard.
- Find Stripe and click Connect.
- A Stripe authorization popup appears. Sign in with your Stripe account or create a new one.
- Review the permissions Buildorado requests and click Allow.
- Once authorized, Stripe shows as Connected with your Stripe account name.
You can connect Stripe in test mode for development or live mode for production. Buildorado displays which mode is active on the integration settings page.
Payment Modes
Stripe supports three payment modes in Buildorado, configured per payment field in your form.
One-Time Payments
Charge the customer a single amount when they submit the form. The payment is processed immediately and the workflow continues only after successful payment.
| Setting | Description |
|---|---|
| Amount | Amount in cents (e.g., 1000 = $10.00) |
| Currency | USD, EUR, GBP, CAD, AUD, JPY, CHF, INR, BRL, MXN |
| Product Name | Name shown above the payment field |
| Product Description | Brief description of what the customer is paying for |
Subscriptions
Create a recurring billing relationship. The customer is charged on a schedule starting from the form submission.
| Setting | Description |
|---|---|
| Price ID | Stripe Price ID for the subscription plan (create in Stripe Dashboard) |
For subscriptions, create the product and pricing plan in your Stripe Dashboard first, then reference the Price ID in the Buildorado payment field configuration.
Save Card for Later
Collect and save a customer's card for future charges without charging immediately. Use the setup mode in the payment field configuration.
Payment Field Configuration
When you add a Stripe payment field to your form, you can configure the following settings:
| Setting | Type | Default | Description |
|---|---|---|---|
| Payment Mode | select | payment | payment (one-time), subscription, or setup (save card) |
| Product Name | string | -- | Name shown above the payment field |
| Product Description | string | -- | Brief description |
| Amount (cents) | number | -- | Amount in cents (1000 = $10.00) |
| Currency | select | usd | Currency for the payment |
| Button Text | string | Pay Now | Text shown on the payment button |
| Show Amount on Button | boolean | true | Display the amount on the button |
| Embedded Checkout | boolean | false | Show payment form inline instead of redirect |
| Allow Promotion Codes | boolean | false | Enable promo code entry |
| Collect Billing Address | boolean | false | Require billing address |
| Collect Shipping Address | boolean | false | Require shipping address |
Stripe Elements in Forms
Buildorado embeds Stripe Elements directly into the form step. Stripe Elements is a set of pre-built UI components that collect card details securely. The card number, expiration date, and CVC fields are rendered inside a Stripe-hosted iframe, which means:
- Card details never touch Buildorado's servers -- they go directly to Stripe.
- The payment form is PCI DSS compliant out of the box.
- The card input fields automatically validate and format as the user types.
- 3D Secure (SCA) authentication is handled automatically for cards that require it.
The Stripe Elements appearance adapts to your form's theme, matching fonts, colors, and border styles for a seamless look.
Payment Output Variables
When a Stripe payment is processed, the following output variables are available for use in downstream workflow nodes:
| Variable | Type | Description |
|---|---|---|
status | enum | Payment status: success, failed, canceled, requires_action, processing |
amount | number | Amount charged in cents |
currency | string | Three-letter currency code |
paymentMethod | enum | Payment method type (e.g., card, bank_transfer, klarna) |
cardBrand | enum | Card brand (e.g., visa, mastercard, amex) |
cardLast4 | string | Last 4 digits of the card |
customerEmail | string | Email associated with the payment |
errorCode | enum | Error code if payment failed (e.g., card_declined, insufficient_funds) |
errorMessage | string | Human-readable error message |
Reference these in downstream nodes:
[Payment Step]
-- [Email: Send receipt]
to: "{{form.email}}"
subject: "Payment confirmed"
body: "Thank you! Your payment of ${{stripe_1.amount}} has been processed."
-- [Google Sheets: Log payment]
values: {"Name": "{{form.name}}", "Amount": "{{stripe_1.amount}}", "Method": "{{stripe_1.paymentMethod}}", "Date": "{{submission.createdAt}}"}
-- [Slack: #payments "Payment received: {{stripe_1.amount}} cents from {{stripe_1.customerEmail}}"]Workflow Operations
In addition to the payment form field, Stripe provides workflow action operations:
createCheckoutSession
Create a Stripe Checkout session programmatically.
| Field | Type | Required | Description |
|---|---|---|---|
successUrl | string | Yes | URL to redirect after successful payment |
cancelUrl | string | Yes | URL to redirect if payment is canceled |
mode | select | No | payment, subscription, or setup (default: payment) |
lineItems | JSON | Yes | Array of line items with price_id or price_data |
customerEmail | string | No | Pre-fill customer email |
Output:
| Field | Type | Description |
|---|---|---|
sessionId | string | Checkout session ID |
url | string | Checkout URL |
expiresAt | string | Session expiration timestamp |
createPaymentIntent
Create a Payment Intent for server-side payment processing.
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Amount in cents (minimum 50) |
currency | string | Yes | Currency code (default: usd) |
description | string | No | Payment description |
receiptEmail | string | No | Email to send receipt to |
Output:
| Field | Type | Description |
|---|---|---|
paymentIntentId | string | Payment Intent ID |
clientSecret | string | Client secret for frontend |
status | string | Payment status |
amount | number | Amount in cents |
currency | string | Currency code |
getPaymentIntent
Retrieve the status of a Payment Intent.
| Field | Type | Required | Description |
|---|---|---|---|
paymentIntentId | string | Yes | Payment Intent ID (e.g., pi_xxx) |
Output:
| Field | Type | Description |
|---|---|---|
paymentIntentId | string | Payment Intent ID |
status | string | Payment status |
amount | number | Amount in cents |
currency | string | Currency code |
paymentMethod | string | Payment method used |
receiptEmail | string | Receipt email |
Failed Payment Handling
If a payment fails (declined card, insufficient funds, authentication failure), the form shows an error message to the user and allows them to retry with different payment details. The workflow does not continue until payment succeeds.
For webhook-triggered payment failures (e.g., a subscription payment fails on renewal), configure a Stripe webhook endpoint in your Stripe Dashboard pointing to a Buildorado incoming webhook to handle the failure event.
Testing with Stripe Test Mode
Stripe provides a test mode for development and testing. When your Stripe integration is connected in test mode:
- Use Stripe's test card numbers to simulate payments:
| Card Number | Result |
|---|---|
4242 4242 4242 4242 | Successful payment |
4000 0000 0000 0002 | Card declined |
4000 0025 0000 3155 | Requires 3D Secure authentication |
4000 0000 0000 9995 | Insufficient funds |
- No real charges are made. Test transactions appear in Stripe's test mode dashboard.
- Use any future expiration date and any 3-digit CVC.
- Switch to live mode by reconnecting with your live Stripe account when you are ready to accept real payments.
Tips for Stripe
- Always test your payment flow in Stripe test mode before going live. Verify the amount, currency, and receipt email are correct.
- Stripe processes amounts in the smallest currency unit (cents for USD). The
amountfield and output values are always in cents. - Enable Stripe Radar for fraud protection. Buildorado does not provide its own fraud detection.
- For subscription plans, create the products and prices in the Stripe Dashboard. Buildorado references these by Price ID rather than creating them dynamically.
- Refunds must be processed directly in the Stripe Dashboard or via the Stripe API. Buildorado does not currently support automated refunds from workflows.
PayPal
PayPal integration provides an alternative payment method for customers who prefer PayPal checkout over credit card payments.
Connecting Your PayPal Account
- Navigate to Settings > Integrations and click Connect next to PayPal.
- Sign in with your PayPal Business account in the authorization popup.
- Grant the requested permissions for payment processing.
- Once authorized, PayPal shows as Connected with your PayPal email.
A PayPal Business account is required. Personal PayPal accounts cannot accept payments through integrations.
Payment Field Configuration
When you add a PayPal payment field to your form, you can configure the following settings:
| Setting | Type | Default | Description |
|---|---|---|---|
| Product Name | string | -- | Name shown for the payment |
| Product Description | string | -- | Brief description |
| Amount (cents) | number | -- | Amount in cents (1000 = $10.00) |
| Currency | select | usd | USD, EUR, GBP, CAD, or AUD |
| Button Color | select | gold | gold, blue, silver, white, or black |
| Button Shape | select | rect | rect (rectangle) or pill |
| Button Layout | select | vertical | vertical (stacked) or horizontal (side by side) |
| Payment Intent | select | capture | capture (immediate) or authorize (manual capture) |
Checkout Experience
When a user reaches the PayPal payment step in your form:
- The PayPal button is displayed within the form.
- Clicking the button opens the PayPal checkout window.
- The user signs in to PayPal (or pays as a guest with a card).
- After payment approval, the checkout window closes and the form continues.
- The payment is captured and the workflow proceeds.
Payment Output Variables
| Variable | Type | Description |
|---|---|---|
status | enum | Payment status: success, failed, canceled, pending |
amount | number | Amount charged in cents |
currency | string | Currency code |
orderId | string | PayPal order ID |
payerEmail | string | PayPal payer email address |
errorMessage | string | Error message if payment failed |
Workflow Operations
In addition to the payment form field, PayPal provides workflow action operations:
createOrder
Create a PayPal order programmatically.
| Field | Type | Required | Description |
|---|---|---|---|
amount | string | Yes | Order amount (e.g., 10.00) |
currency | string | Yes | Currency code (default: USD) |
description | string | No | Order description |
returnUrl | string | No | URL to redirect after approval |
cancelUrl | string | No | URL to redirect if canceled |
Output:
| Field | Type | Description |
|---|---|---|
orderId | string | PayPal order ID |
status | string | Order status |
approvalUrl | string | URL for the customer to approve payment |
captureOrder
Capture payment for an approved PayPal order.
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | Yes | Order ID to capture |
Output:
| Field | Type | Description |
|---|---|---|
orderId | string | Order ID |
status | string | Capture status |
captureId | string | Capture transaction ID |
amount | string | Amount captured |
currency | string | Currency code |
payerEmail | string | Payer's email address |
getOrder
Retrieve details of a PayPal order.
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | Yes | Order ID to retrieve |
Output:
| Field | Type | Description |
|---|---|---|
orderId | string | Order ID |
status | string | Order status |
amount | string | Order amount |
currency | string | Currency code |
payerEmail | string | Payer's email address |
createTime | string | When the order was created |
Tips for PayPal
- PayPal Business accounts have different fee structures by country. Check PayPal's fee schedule for your region.
- PayPal supports guest checkout, allowing customers to pay with a credit or debit card without a PayPal account.
- For testing, use PayPal's sandbox environment with sandbox buyer and seller accounts.
- PayPal disputes and refunds are managed through the PayPal Resolution Center, not through Buildorado.
Choosing Between Stripe and PayPal
| Feature | Stripe | PayPal |
|---|---|---|
| Payment methods | Credit/debit cards, Apple Pay, Google Pay | PayPal balance, credit/debit cards, bank transfer |
| Subscriptions | Full subscription management | Limited |
| Embedded experience | Inline card fields (no redirect) | PayPal button + popup window |
| Test mode | Full test environment with test cards | Sandbox environment |
| 3D Secure / SCA | Automatic | Handled by PayPal |
| Payout speed | 2 business days (standard) | Instant to PayPal balance |
For most Buildorado workflows, Stripe is the recommended payment integration because it provides a fully embedded checkout experience without redirects and supports advanced features like subscriptions and save-card-for-later. PayPal is a valuable addition for customers who prefer paying with their PayPal balance or in regions where PayPal adoption is higher than credit card usage.
Common Payment Patterns
Order Form with Dynamic Total
[Form: Product Order]
Step 1: Select products (checkboxes with prices)
Step 2: Quantity and shipping
Step 3: Payment (dynamic pricing = sum of selected products * quantities)
-- [Email: Order confirmation with receipt link]
-- [Google Sheets: Log order details]
-- [Slack: #orders "New order {{stripe_1.amount}} cents from {{stripe_1.customerEmail}}"]Consultation Booking with Payment
[Form: Book Consultation]
Step 1: Select service type and duration
Step 2: Pick date and time
Step 3: Payment (price based on service type and duration)
-- [Google Calendar: Create event]
-- [Email: Confirmation with calendar invite]Donation Form with Custom Amount
[Form: Donation]
Step 1: Select or enter donation amount
Step 2: Donor information
Step 3: Payment
-- [Email: Thank you and tax receipt]Security and Compliance
PCI DSS Compliance
Buildorado achieves PCI compliance by using Stripe Elements and PayPal's checkout components. Card details are entered directly into Stripe or PayPal hosted fields and never pass through Buildorado's servers. This means:
- Buildorado is not in scope for PCI DSS audits for card data.
- Card numbers, CVCs, and expiration dates are never stored, logged, or transmitted by Buildorado.
- All payment processing happens on Stripe's or PayPal's PCI-certified infrastructure.
Credential Security
- Stripe API keys and PayPal OAuth tokens are encrypted with AES-256 using AWS KMS.
- Credentials are never exposed in API responses, logs, or the dashboard UI.
- Token refresh is handled automatically by Buildorado.
Fraud Protection
- Stripe Radar provides machine-learning-based fraud detection for Stripe payments.
- PayPal provides built-in buyer and seller protection.
- Buildorado does not provide its own fraud detection layer; it relies on the payment provider's fraud tools.
For additional security guidance, see the credential security section on the integrations overview page.