---
title: Customize Checkout for Payment Links
slug: payment-links/customize
excerpt: >-
  Configure branding, payment methods, expiry, redirects, callbacks, and
  settlement behavior for Pine Labs Online Payment Link checkout flows.
hidden: false
sidebar_order: 6
metadata:
  title: Customize Payment Link Checkout — Configuration Options | Pine Labs
  description: >-
    Customize Pine Labs Online Payment Links with branding, payment methods,
    expiry settings, redirects, split settlements, partial payments, and
    callback configurations.
  keywords: >-
    customize payment link, payment link branding, payment methods, expiry
    settings, pre-authorization, split settlement, part payment
  robots: index
---
Customize how your payment links look, behave, and process payments using Pine Labs Online checkout configuration options.

With Pine Labs Online Payment Links, you can configure payment methods, branding, link expiry, redirect URLs, callback handling, pre-authorization, split settlements, partial payments, and customer details — all without building a custom checkout page.

These customization capabilities help businesses create a faster, branded, and conversion-focused payment experience while maintaining flexibility across different customer journeys and payment workflows.

You can also extend the checkout flow using webhooks, refunds, settlements, and reconciliation systems [after successful payment collection](post-payment) 


## Sign Up on the Dashboard & Get API Credentials

<TwoColumn ratio="1:1" gap="2rem" align="start">
  <Column>

Before you begin integrating, create your free Pine Labs Online developer account to get access to UAT credentials, API keys, and the merchant dashboard.

1. **Sign Up** — Visit the Pine Labs Online Dashboard and register with your business email.

<a class="hidden sm:inline-flex btn-light-green px-3.5 py-1.5 text-sm shadow-sm" href="https://dashboardv2.pluralonline.com/signup">Create Account</a>

2. **Verify Your Email** — Confirm your email address through the verification link sent to your inbox.
3. **Find Your Credentials** — Once logged in, navigate to Settings → API Keys to generate your test-mode API key and secret.
4. **Explore the Dashboard** — Use the dashboard to view test payments, refunds, settlements, and webhook configurations before going live.

Once your account is ready, you can immediately start integrating with payment methods using the UAT environment — no production credentials required.
  </Column>
  <Column>

<DocImage src="images/dashboard/signup.png" alt="Pine Labs Dashboard" align="center" />


  </Column>
</TwoColumn>


---

## Configure payment methods

Control which payment methods appear on the checkout page using `allowed_payment_methods`:

```json
{
  "allowed_payment_methods": ["CARD", "UPI", "NETBANKING", "WALLET"]
}
```

### Available methods

| Value | Payment method | Description |
|---|---|---|
| `CARD` | Cards | Visa, Mastercard, RuPay credit and debit cards |
| `UPI` | UPI | UPI Collect and Intent flows |
| `NETBANKING` | Net Banking | All major Indian banks |
| `WALLET` | Wallets | Paytm, PhonePe, Amazon Pay, etc. |
| `POINTS` | Reward Points | Pay using card reward points |
| `CREDIT_EMI` | Credit Card EMI | Monthly installments on credit cards |
| `DEBIT_EMI` | Debit Card EMI | Monthly installments on debit cards |

If `allowed_payment_methods` is omitted, all payment methods configured on your Merchant ID are shown to the customer.

> 📘 Before selecting a method, ensure it is enabled for your account. Contact your account manager to configure additional methods.

---

## Set link expiry

Define when the payment link becomes invalid:

```json
{
  "expire_by": "2025-06-15T23:59:59Z"
}
```

| Rule | Detail |
|---|---|
| **Format** | ISO 8601 UTC timestamp |
| **Maximum** | 180 days from the creation date |
| **Default** | Uses your merchant-level default expiry if not specified |
| **Behavior** | When the current time exceeds `expire_by`, status changes to `EXPIRED`. No payments accepted. |

### Recommended expiry by use case

| Use case | Suggested expiry |
|---|---|
| Instant purchase (e-commerce) | 24–48 hours |
| Invoice or bill payment | 7–30 days |
| Advance booking or deposit | 30–60 days |
| Long-term collection | Up to 180 days |

---

## Configure callback URLs

Set where customers are redirected after payment:

```json
{
  "callback_url": "https://yoursite.com/payment/success",
  "failure_callback_url": "https://yoursite.com/payment/failure"
}
```

| Configuration | Behavior |
|---|---|
| `callback_url` only | Redirects for both success and failure |
| Both URLs set | `callback_url` for success, `failure_callback_url` for failure |
| Neither URL set | Uses the default URL configured during merchant onboarding |

> 🚧 **Important**
>
> The redirect is for the customer experience only. Always verify the payment server-side using [webhooks](/developer-tools/webhooks) or the [Get Payment Link API](/api/payment-links/get-payment-link-by-id) before fulfilling the order.

---

## Enable pre-authorization

Create payment links that authorize a payment without capturing it immediately:

```json
{
  "pre_auth": "true"
}
```

When `pre_auth` is `"true"`:
- The payment amount is **held** (authorized) on the customer's card or account.
- You **capture** the payment later using the [Capture Order API](/api/orders/capture-order).
- You can **cancel** the authorization using the [Cancel Order API](/api/orders/cancel-order).
- The authorization window is typically 5–7 days, depending on the payment network.

**Use cases:** Hotel bookings, service deposits, rental reservations, order verification before shipping.

Default is `"false"` — payment is captured immediately when the customer pays.

> 📘 Pre-authorization must be enabled for your Merchant ID. Contact your account manager to set this up.

---

## Accept part payments

Allow customers to pay a portion of the total amount:

```json
{
  "part_payment": true
}
```

When enabled:
- The customer can pay any amount up to the total.
- The `amount_due` field in the API response tracks the remaining balance.
- The same link remains active for additional payments until fully paid or expired.
- The link status changes to `PROCESSED` only when the full amount is paid.

**Use cases:** Advance payments, deposits, installments, layaway plans.

---

## Split payments across merchants

Distribute the payment across multiple merchant accounts:

```json
{
  "split_info": {
    "split_type": "ABSOLUTE",
    "split_details": [
      {
        "split_merchant_id": "MERCHANT_002",
        "amount": {
          "value": 3000,
          "currency": "INR"
        }
      }
    ]
  }
}
```

When split info is provided:
- The total amount is divided between you and the sub-merchant(s) as specified.
- Each merchant receives their share during settlement.
- You can place individual splits on hold using the `on_hold` parameter.

**Use cases:** Marketplace payouts, franchise collections, aggregator models.

> 🚧 **Prerequisite**
>
> Split settlements must be enabled for your account. See [Split Settlements](/docs/split-settlements) for configuration details.

---

## Enable multi-currency conversion (MCC)

For international or cross-border payment links:

```json
{
  "is_mcc_transaction": "true"
}
```

This is **mandatory** when creating payment links for MCC transactions. Failure to set this flag may cause payment processing failures.

> 📘 International payments must be enabled for your Merchant ID. See [International Payments](/international-payments) for details.

---

## Collect customer details

Pre-fill customer information to reduce checkout friction and improve conversion:

```json
{
  "customer": {
    "email_id": "customer@example.com",
    "first_name": "Rahul",
    "last_name": "Sharma",
    "mobile_number": "9876543210",
    "country_code": "+91",
    "billing_address": {
      "address1": "123 Main Street",
      "city": "Mumbai",
      "state": "Maharashtra",
      "pincode": "400001",
      "country": "India"
    },
    "shipping_address": {
      "address1": "456 Park Avenue",
      "city": "Delhi",
      "state": "Delhi",
      "pincode": "110001",
      "country": "India"
    }
  }
}
```

Pre-filled details appear on the checkout page, so the customer doesn't have to enter them manually.

---

## Display product and cart details

Show itemized product information on the checkout page:

```json
{
  "product_details": [
    {
      "product_code": "SKU-001",
      "product_amount": {
        "value": 5000,
        "currency": "INR"
      }
    }
  ],
  "cart_details": {
    "items": [
      {
        "name": "Premium T-Shirt",
        "quantity": 2,
        "amount": 5000
      }
    ]
  }
}
```

When cart details are provided, the itemized cart is displayed during checkout. This builds customer trust and reduces abandonment.

---

## Apply cart-level discounts

Pass a coupon or discount at the cart level:

```json
{
  "cart_coupon_discount_amount": {
    "value": 500,
    "currency": "INR"
  }
}
```

The discount is applied to the total cart amount.

---

## Attach custom metadata

Add custom key-value pairs for your internal tracking and reporting:

```json
{
  "merchant_metadata": {
    "invoice_id": "INV-2025-001",
    "department": "Sales",
    "campaign": "summer_sale"
  }
}
```

Metadata is:
- Stored with the payment link
- Returned in API responses when you retrieve the link
- Available in webhook payloads for reconciliation

**Use cases:** Internal order IDs, campaign tracking, department codes, customer IDs from your CRM.

---

## See also


<CardGrid columns={3}>
<Card title="Webhooks" description="Receive real-time server-to-server payment notifications and automate event-driven workflows." icon="zap" href="/developer-tools/webhooks" />
<Card title="Refunds" description="Manage refund lifecycles, track refund status, and integrate refund APIs seamlessly." icon="refresh-cw" href="/dashboard/refunds" />
<Card title="Settlements" description="Track settlements, monitor payout schedules, and reconcile payment transactions efficiently." icon="coins" href="/dashboard/settlements" />
</CardGrid>
