What You Can Do
With payment intents, you can:- Initiate Terminal Payments: Create a payment request that a POS terminal picks up and processes
- Track Payment Status: Poll for real-time status updates as the terminal processes the card
- Cancel Pending Payments: Cancel payment intents that haven’t been completed yet
- Link to Your Systems: Use external IDs to correlate Compago payments with your internal records
- Target Specific Terminals: Optionally route payment requests to a specific terminal by its serial number
Use Cases
Payment intents are designed for:- Custom POS Integrations: Build your own point-of-sale system that uses Compago terminals for card processing
- ERP Payment Modules: Add card-present payment capabilities to ERP systems (e.g., Odoo, SAP)
- Kiosk Applications: Self-service kiosks that accept card payments through connected terminals
- Restaurant/Retail Systems: Any in-person checkout flow where your software manages the transaction
How It Works
After creating a payment intent, there are two ways to handle the payment flow depending on your setup. Both start the same way (your backend creates the payment intent via the API), but differ in how the card payment is captured.Same-Device Flow (Deep Link)
Use this when the Compago POS app is installed on the same device as your integration (e.g., an Android tablet running both your POS app and the Compago app). Your app opens the Compago app via a deep link, and the Compago app handles the entire card capture flow. When the payment is complete, control returns to your app.Your system creates a payment intent
POST /api/payment-intent with amount, currency, externalId, and optionally terminalCode. Compago returns the payment intent with status: PENDING.Your app opens the Compago POS app
Use the deep link
compago-pos-app:///charge/payment-intent/{id} to hand off to the Compago app. The Compago app displays the payment screen and handles card capture.Your system polls for status
While the Compago app handles the payment, your system polls
GET /api/payment-intent/{id} every 3 seconds to detect when the payment completes.Separate-Device Flow (Polling Only)
Use this when the Compago POS terminal is a separate physical device from the one running your integration (e.g., your ERP runs on a desktop and the terminal sits on the counter). Your system simply polls for status while the terminal operator processes the card on the Compago device.Your system creates a payment intent
POST /api/payment-intent with amount, currency, externalId, and terminalCode. Compago returns the payment intent with status: PENDING.Compago notifies the POS terminal
The terminal automatically receives a notification alerting it that a new payment request is waiting.
The terminal processes the card
The terminal operator sees the incoming payment request on the Compago POS app and processes the customer’s card.
Your system polls for status
GET /api/payment-intent/{id} every 3 seconds. Once the terminal completes the payment, the response includes paymentSummary.status: "SUCCESS".Prerequisites
Before creating payment intents, ensure you have:- An active Compago merchant account with API access
- A valid API key (generate one at Configuraciones -> Desarrollador in your Compago Dashboard)
- At least one Compago POS terminal registered to your organization
- Your integration configured to use MXN currency
Payment intents currently support MXN (Mexican Peso) only. Transactions in other currencies will be rejected.
Creating a Payment Intent
Endpoint
POST /payment-intent
Authentication
Include your API key in the request headers:Request Body
Field Descriptions
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Payment amount in MXN. |
currency | string | Yes | Currency code. Must be "MXN". |
externalId | string | Yes | Your unique identifier for this payment intent. Must be unique per organization. |
terminalCode | string | No | Serial number of the target POS terminal. If provided, the payment intent is routed to that specific terminal. If omitted, the payment intent is available to any terminal in your organization. |
Response
id. You will need it to poll for status, open the Compago app, or cancel the payment intent.
Example with cURL
Opening the Compago App (Same-Device Flow)
If the Compago POS app is installed on the same device as your integration, you can open it directly using a deep link. The Compago app will display the payment screen for the given payment intent and handle the full card capture flow.Deep Link Format
{id} with the payment intent ID returned from the create endpoint.
Implementation Example
On Android-based POS devices, you can trigger the deep link by navigating to the URL. For web-based integrations running on the same device, a common approach is using a hidden iframe:The deep link requires the Compago POS app to be installed on the device. If the app is not installed, the deep link will have no effect. Your integration should still poll for status regardless, so the payment can also be processed from a separate device.
Polling for Payment Status
After creating a payment intent (and optionally opening the Compago app via deep link), your system should poll the GET endpoint to detect when the terminal completes the payment.Endpoint
GET /payment-intent/{id}
Response
When the payment is still being processed:How to Poll
The recommended approach is:- Wait 3 seconds between each request
- Check the response for a terminal state:
paymentSummary.statusis"SUCCESS": the payment was completed. Fulfill the order.expiredistrue: the payment intent timed out. Prompt the user to retry.statusis"CANCELLED": the payment intent was cancelled. Handle accordingly.
- Repeat until one of the above conditions is met, or until a maximum timeout (e.g., 10 minutes)
Example
Cancelling a Payment Intent
You can cancel a pending payment intent before it is completed or expires. This is useful when the user changes their mind, navigates away, or the order is voided.Endpoint
POST /payment-intent/{id}/cancel
For the full cancel guide, see Cancel Payment Intent.
Example
Cancelling a payment intent also notifies the POS terminal that the payment request has been withdrawn.
Important Business Rules
Payment Intent Expiration
Terminal Routing
When you provide aterminalCode:
- The payment intent is routed to that specific terminal
- Any other
PENDINGpayment intents for that terminal are automatically cancelled - This ensures only one active payment intent exists per terminal at any time
terminalCode:
- The payment intent is available to any terminal in your organization
- This is useful when you don’t know which terminal will process the payment
External ID Uniqueness
TheexternalId must be unique within your organization. Attempting to create a payment intent with a duplicate externalId will result in an error.
Use a combination of your internal identifiers with a timestamp or random suffix to ensure uniqueness across retries. For example: order-789_1710150000_a1b2c3.
Currency Restriction
Currently, only MXN (Mexican Peso) is supported. Requests with other currencies will be rejected.Payment Intent Status
Payment intents have three statuses:| Status | Description |
|---|---|
PENDING | Payment intent is active, waiting for the terminal to process the card payment. |
CONFIRMED | The terminal has successfully processed the card payment. This is a final state. |
CANCELLED | The payment intent was cancelled (manually or by creating a new intent for the same terminal). This is a final state. |
Error Handling
Common Errors
| Status Code | Error | Solution |
|---|---|---|
| 400 | User does not have an organization | Verify your API key is associated with a valid merchant organization |
| 400 | Only MXN currency is supported | Use "MXN" as the currency |
| 400 | Payment intent already confirmed | The payment was already processed. Cannot cancel a confirmed intent. |
| 401 | Unauthorized | Check your API key is valid and included in headers |
| 404 | Terminal not found | Verify the terminalCode matches a terminal registered to your organization |
| 404 | Payment intent not found | The payment intent ID does not exist or does not belong to your organization |
Example Error Response
Best Practices
Use Terminal Codes for Directed Payments
Use Terminal Codes for Directed Payments
When you know which terminal should process the payment, always provide the
terminalCode. This ensures the payment intent is routed to the correct terminal and automatically cancels any stale pending intents on that terminal.Handle Expiration Gracefully
Handle Expiration Gracefully
Payment intents expire after 10 minutes. Your integration should:
- Detect expiration in your polling loop (when
expiredistrue) - Offer the user the option to retry
- Create a new payment intent with a new
externalIdif they choose to retry
Generate Unique External IDs
Generate Unique External IDs
Combine your internal identifiers with a timestamp or random suffix to avoid collisions. For example:
session-5_order-abc_1710150000. Avoid reusing the same ID for retries, since duplicate externalId values within the same organization will be rejected.Cancel on User Exit
Cancel on User Exit
If the user navigates away from the payment screen or cancels the order, send a cancel request for the pending payment intent. This frees up the terminal and prevents stale intents from blocking new payments.
Support
If you encounter issues with payment intents:- Verify your API key is valid in Configuraciones -> Desarrollador at app.compago.com
- Ensure you have at least one terminal registered to your organization
- Check that the
terminalCodematches your terminal’s serial number - Contact Compago support at help@compago.com for assistance