# LiqPay + Krokul CRM

Yes. Krokul CRM integrates with LiqPay. Krokul builds a LiqPay payment page from a deal with the deal order_id, and the LiqPay callback to server_url turns the expected payment into an actual one after the signature check. The setup runs through the Krokul API and webhooks.

**Status:** Via API and webhooks.

## What your team gets

### A LiqPay payment page from the deal card

A manager clicks «Payment link» on the deal. Krokul builds a LiqPay checkout with action pay, the amount and currency of the expected payment, a description and an order_id that points to the deal. Krokul signs data with the store private key and gives the client a link to the payment page.

### The success callback records the payment

After payment, LiqPay sends the data and signature fields to server_url. Krokul checks the signature, decodes data, finds the deal by order_id and, for the success status, turns the plan into an actual payment. The `payment.received` event goes to accounting, and full coverage of the invoice triggers `invoice.paid`.

### One payment_id, one payment

Krokul stores the LiqPay payment_id as the external key of the payment. A repeated callback with the same payment_id finds the payment already recorded and creates no second one.

### A refund is visible on the deal

A callback with the reversed status means that LiqPay returned the money. Krokul records the refund on the deal, reduces the paid amount and leaves an entry in the feed, so the accountant sees why the payments differ from the invoice.

### A failed attempt does not get lost

The failure and error statuses leave the payment open, and an entry about the failed attempt appears in the deal feed. The manager sees that the client tried to pay and can offer another way.

## What moves between LiqPay and Krokul

| LiqPay | Krokul | Direction | When |
|---|---|---|---|
| Checkout: action pay, amount, currency, description, order_id, server_url | Expected deal payment | Krokul → LiqPay | A manager creates a payment link |
| Callback to server_url with the success status | Actual deal payment, `payment.received` event | LiqPay → Krokul | The client has paid |
| payment_id | External key of the payment | LiqPay → Krokul | On the first callback |
| Callback with the reversed status | Refund on the deal, entry in the feed | LiqPay → Krokul | After a refund |
| Callback with the failure or error status | Entry about the failed attempt, the plan stays open | LiqPay → Krokul | The payment did not go through |

## How to connect today

### Your own flow through the Krokul API and webhooks

1. Copy public_key and private_key from the store API settings in the LiqPay account, and issue a Krokul API key with scopes for deals and payments.
2. Your handler builds a LiqPay checkout with action pay, the amount, the deal order_id and a server_url that points to the handler itself, and signs data with the private key.
3. On a callback with the success status, the handler checks signature, records the payment through `payment/api-create` with the deal `cardUuid` and links the LiqPay payment_id to the payment through `externalRef/api-set`.
4. Subscribe a Krokul webhook to `payment.received` and `invoice.paid`, so accounting learns about the money. Each delivery carries the `x-crm-signature` header, and your receiver checks it with the secret.

### For integrators

A LiqPay link can also be created through the Krokul public API. The `payment/api-link` route takes a deal and an amount, and the `provider` parameter with the value `liqpay` is added when several providers accept the currency. The LiqPay payment_id is available as an `externalRef` external key, and the `payment.received` event arrives as a signed webhook with a delivery log and redelivery.

[API documentation](https://app.krokul.com/api/v1/docs)

## Questions and answers

### How does Krokul verify a LiqPay callback?

Krokul computes base64 of the hash of the string private_key + data + private_key, as the LiqPay documentation describes. Krokul rejects a callback without a valid signature and records nothing.

### How do I avoid recording one LiqPay payment twice?

Krokul stores payment_id as the external key of the payment. A repeated callback with the same payment_id creates no second payment.

### What does a manager see if a LiqPay payment fails?

An entry in the deal feed with the LiqPay status. The expected payment stays open, and the manager can send a new link.

## Limits

Refunds and payment cancellations are made in the LiqPay account or through its API, and Krokul gets the result as a callback with the reversed status. Recurring payments and donations (the subscribe and paydonate actions) stay in LiqPay, and Krokul uses the pay action for a deal payment.

## Related services

- [monobank](https://krokul.com/en/integrations/monobank/index.md)
- [WayForPay](https://krokul.com/en/integrations/wayforpay/index.md)
- [NovaPay](https://krokul.com/en/integrations/novapay/index.md)
- [PrivatBank](https://krokul.com/en/integrations/privatbank/index.md)
- [Checkbox](https://krokul.com/en/integrations/checkbox/index.md)

[Payments and banks (Ukraine)](https://krokul.com/en/integrations/category/payments-ua/index.md)

LiqPay is a trademark of its owner. Krokul is not affiliated with LiqPay.

Updated: 2026-10-15

---

App: https://app.krokul.com/ · API: https://app.krokul.com/api/v1/docs
