# 9. Available Web-Components

Web components provide a user-friendly solution for partners looking to implement a streamlined and interactive payment system. Its ease of inclusion and integration make it simple to set up and customize, providing a seamless user experience from onboarding to transaction and batch processing, to eventual payouts.&#x20;

{% hint style="warning" %}
**Note:** Refer to [this doc](https://docs.payengine.co/developer-docs/getting-started-1/securing-embedded-uis-merchant-session) for guidance on implementing embedded web components. Platform now uses **MerchantSession** to enable embedded web components.

If you're currently using HMAC-based security, please note that it has been deprecated and will continue to be supported for backward compatibility. However, we strongly recommend migrating to **MerchantSession** for improved security and future support.
{% endhint %}

### 1. Onboarding

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="boarding">
</payment-platform>
```

### 2. Transactions

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="transactions">
</payment-platform>
```

To enable the print option in the transaction widget, set the "print-receipt" attribute to true in the transaction web-component as shown below:

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    print-receipt="true"
    type="transactions">
</payment-platform>
```

### 3. Batch Settlements

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="payouts"
    view-type="settlement">
</payment-platform>
```

### 4. Payouts (Funding)&#x20;

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="payouts"
    view-type="funding">
</payment-platform>
```

### 5. Credit Card Form

{% tabs %}
{% tab title="Credit Card Form" %}

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="creditcardform"
    show-zip="true" >
</payment-platform>
```

{% endtab %}

{% tab title="Credit Card Form - Zip Code Properties" %}

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="creditcardform"
    show-zip="true" 
    allowed-countries="UK, JP, AU"
    validate-zip="true">
</payment-platform>
```

{% endtab %}

{% tab title="Example" %}

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Platform Test</title>

    <script src="http://<Platform_HOST>/js/1.0.0/embed.js?key=<Public API Key>"></script>
    <style>
      #btn {
        width: 100%;
        color: #fff;
        background-color: #409eff;
        display: block;
        line-height: 1;
        white-space: nowrap;
        cursor: pointer;
        border: 1px solid #409eff;
        -webkit-appearance: none;
        text-align: center;
        box-sizing: border-box;
        outline: none;
        margin: 0;
        transition: .1s;
        font-weight: 500;
        padding: 12px 20px;
        font-size: 14px;
        border-radius: 4px;
      }
    </style>
  </head>

  <body style="overflow: auto !important">
    <payment-platform style="width: 500px;" id="pf-cc" 
      type="creditcardform" 
      show-zip="true" 
      merchant-id="<Merchant ID>" 
      hash="<HMAC>">
    </payment-platform>
    <button id="btn">Submit</button>
    <h4>Result</h4>
    <div id="result"></div>
    <script>
      document.getElementById('btn').addEventListener('click', function() {
        document.getElementById("pf-cc").submit();
      })
      document.getElementById("pf-cc")?.addEventListener("success", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
      document.getElementById("pf-cc")?.addEventListener("error", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
    </script>
  </body>
</html>
```

{% endtab %}
{% endtabs %}

You can customize the **allowed countries** and **ZIP code validation** behavior in the credit card form web-component using the following properties:

#### `allowed-countries` (optional)

* Defines which countries are allowed for the zip code in the form.
* If not specified, the default is **US** and **CA**.
* Provide a comma-separated list of country codes (case-insensitive), for example: `"JP, AU"`
* To allow **all supported countries**, use: `allowed-countries="INTL"`

#### `validate-zip` (optional)

* Accepts `true` or `false`. Default is `true`.
* When `true`, the form will validate ZIP/postal codes for the allowed countries.
* When `false`, ZIP validation will be skipped for all allowed countries.

{% hint style="info" %}
Supported countries for zip code

`UK`, `JE`, `GG`, `IM`, `US`, `CA`, `IE`, `DE`, `JP`, `FR`, `AU`, `IT`, `CH`, `AT`, `ES`, `NL`, `BE`, `DK`, `SE`, `NO`, `BR`, `PT`, `FI`, `AX`, `KR`, `CN`, `TW`, `SG`, `DZ`, `AD`, `AR`, `AM`, `AZ`, `BH`, `BD`, `BB`, `BY`, `BM`, `BA`, `IO`, `BN`, `BG`, `KH`, `CV`, `CL`, `CR`, `HR`, `CY`, `CZ`, `DO`, `EC`, `EG`, `EE`, `FO`, `GE`, `GR`, `GL`, `GT`, `HT`, `HN`, `HU`, `IS`, `IN`, `ID`, `IL`, `JO`, `KZ`, `KE`, `KW`, `LA`, `LV`, `LB`, `LI`, `LT`, `LU`, `MK`, `MY`, `MV`, `MT`, `MU`, `MX`, `MD`, `MC`, `MA`, `NP`, `NZ`, `NI`, `NG`, `OM`, `PK`, `PY`, `PH`, `PL`, `PR`, `RO`, `RU`, `SM`, `SA`, `SN`, `SK`, `SI`, `ZA`, `LK`, `TJ`, `TH`, `TN`, `TR`, `TM`, `UA`, `UY`, `UZ`, `VA`, `VE`, `ZM`, `AS`, `CC`, `CK`, `RS`, `ME`, `CS`, `YU`, `CX`, `ET`, `FK`, `NF`, `FM`, `GF`, `GN`, `GP`, `GS`, `GU`, `GW`, `HM`, `IQ`, `KG`, `LR`, `LS`, `MG`, `MH`, `MN`, `MP`, `MQ`, `NC`, `NE`, `VI`, `PF`, `PG`, `PM`, `PN`, `PW`, `RE`, `SH`, `SJ`, `SO`, `SZ`, `TC`, `WF`, `XK`, `YT`, `INTL`
{% endhint %}

{% hint style="warning" %}
**Visa 3D Secure Mandate**

Partners must collect cardholder's mobile number OR email address during payment processing. For this purpose, set show-email = "true" and/or show-phone-number = "true"
{% endhint %}

### 6. ACH Form

{% tabs %}
{% tab title="ACH Form" %}

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="bankaccountform"> 
</payment-platform>
```

{% endtab %}

{% tab title="ACH Form - Optional Business Bank Account Name" %}

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="bankaccountform"
    show-business-name="true"> //optional field
</payment-platform>
```

{% endtab %}

{% tab title="Example" %}

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Platform Test</title>

    <script src="http://<Platform_HOST>/js/1.0.0/embed.js?key=<Public API Key>"></script>
    <style>
      #btn {
        width: 100%;
        color: #fff;
        background-color: #409eff;
        display: block;
        line-height: 1;
        white-space: nowrap;
        cursor: pointer;
        border: 1px solid #409eff;
        text-align: center;
        box-sizing: border-box;
        outline: none;
        margin: 0;
        transition: .1s;
        font-weight: 500;
        padding: 12px 20px;
        font-size: 14px;
        border-radius: 4px;
      }
    </style>
  </head>

  <body style="overflow: auto !important">
    <payment-platform style="width: 500px;" 
      id="pf-ach" 
      type="bankaccountform" 
      merchant-id="<Merchant ID>" 
      hash="<HAMC>">
    </payment-platform>
    <button id="btn">Submit</button>
    <h4>Result</h4>
    <div id="result"></div>
    <script>
      document.getElementById('btn').addEventListener('click', function() {
        document.getElementById("pf-ach").submit();
      })
      document.getElementById("pf-ach")?.addEventListener("success", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
      document.getElementById("pf-ach")?.addEventListener("error", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
    </script>
  </body>
</html>

```

{% endtab %}
{% endtabs %}

If your use case supports both personal and business bank accounts, you can include the optional `show-business-name` property in the ACH web-component. When enabled, the form will display a **Business Name** input field. This field should be completed by the user when they are entering a business bank account.

### 7. Device Management

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="devices">
</payment-platform>
```

### 8. Dispute Management (Contact support to enable)

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="disputes">
</payment-platform>
```

### 9. Plaid Connect (Plaid Account Required)

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="plaidconnect">
</payment-platform>
```

### 10. Dashboard (Merchant's GMV)

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="dashboard">
</payment-platform>
```

### 11. Virtual Terminal

{% tabs %}
{% tab title="Virtual terminal" %}

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-terminal">
</payment-platform>
```

{% endtab %}

{% tab title="Virtual terminal with zip code validation" %}

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-terminal"
    show-zip="true"> //optional field
</payment-platform>
```

{% endtab %}
{% endtabs %}

#### `show-zip` (optional)

* Accepts `true` or `false`. Default is `false`.
* When set to `true`, the form will display a mandatory ZIP/postal code field and apply validation based on the entered ZIP/postal code.

### 12. Merchant Statements

```
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="statements">
</payment-platform>
```

### 13. Merchant Reports

```
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-reports">
</payment-platform>
```

### &#x20;14. Payment Session and Link

#### a. **Payment Session**

Use the following web-component to embed a customer-facing payment session on your page:

```javascript
<payment-platform
    id="elementID"
    payment-link-id="<Payment Link ID>"
    shouldProcess3ds="true" // Optional. Default is false
    onTransactionEvent="<custom callback function>"
    type="payment-session">
</payment-platform>
```

Note: Refer to the `onTransactionEvent` [documentation](https://docs.payengine.co/api-reference/ui-styleguide-specs/accounting-web-component/payment-link-web-component) for details and usage examples of the callback function.

#### b. Payment Link

To embed the payment link, use the following web-component:

```javascript
<payment-platform
    id="elementID"
    payment-link-id="<Payment Link ID>"
    shouldProcess3ds="true" // Optional. Default is false
    type="payment-link">
</payment-platform>
```

{% hint style="warning" %}
**Difference between Payment Link and Payment Session**

**Payment Session**: If your use case involves displaying a secure form to collect payment information within a modal and showing the transaction status in the same modal through a callback mechanism, then use Payment Session.

**Payment Link**: If your use case requires presenting a payment link that captures additional details—such as contact information—along with payment details, and you prefer to display the link in a flexible manner (not necessarily in a modal), then use Payment Link.
{% endhint %}

#### c.  Creating and Managing Payment Links

To embed the interface for creating and managing payment links, use the following web-component:

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="payment-link-create">
</payment-platform>
```

### 15. Payment page

```javascript
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    shouldProcess3ds="true" // Optional. Default is false
    type="payment-hosted-page">
</payment-platform>
```

### 16. Recurring Payments

```
<payment-platform
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-recurring-payment">
</payment-platform>
```

### 17. Gateway Connection&#x20;

<pre><code><strong>&#x3C;payment-platform
</strong>    id="elementID"
    merchant-id="&#x3C;Merchant ID>"
    type="gateway-connect"
    gateway-id="&#x3C;GATEWAY-ID>">
&#x3C;/payment-platform>
</code></pre>

Please see [Gateway Orchestration](https://docs.payengine.co/payengine-api-reference/transactions/gateway-orchestration) for more details


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.payengine.co/developer-docs/getting-started-1/9.-available-web-components.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
