PaymentsIn-Person PaymentsOverview

Overview

Accept card-present payments at the counter, on the go, and at unattended kiosks with VINR terminals.

View as MarkdownInstall skills

VINR in-person payments bring together three complementary layers: the Terminal API (available in both cloud-managed and local network modes), Tap to Pay for software-only acceptance on compatible mobile devices, and pre-built POS integrations for common point-of-sale systems. All three share the same payment object model and produce the same payment.completed webhook events as your online integrations — you do not need a separate data pipeline or reconciliation flow for in-person volume.

Solution typesAsk

SolutionBest forConnectivityPrinterIntegration path
Countertop terminal (Nexgo CT20 / CT20P)Fixed checkout lanes, reception desksEthernet or WiFiBuilt-in receipt printerTerminal API or standalone
Handheld terminal (Nexgo N92 / N86Pro)Table-side, queue-busting, field sales4G / WiFi / BluetoothBuilt-in printer (N92); N86Pro large-screen variantTerminal API or standalone
Compact mPOS (Ciontek CM30)Pop-ups, delivery, lightweight mobile acceptanceBluetooth / WiFiNo printer — pair with a Bluetooth receipt printerTerminal API
Tap to PayLowest-hardware-cost mobile acceptanceMobile data / WiFi (host device)None — digital receipt onlyVINR Mobile SDK
StandaloneCountertop sales with no back-end integrationPer devicePer deviceNo code required — configure from the Dashboard

All VINR terminals — Nexgo N92, N86Pro, CT20, CT20P, and Ciontek CM30 — support contactless (NFC), chip+PIN, and magnetic stripe in every market where the device is certified.

How it connects to your backendAsk

Your backend asks VINR to collect a payment; the terminal handles the card interaction; VINR delivers the result as a standard webhook. The same payment object you work with online is what arrives in your system.

Create a terminal payment session

Call vinr.terminal.sessions.create() from your server with the amount, currency, and target terminal ID. VINR reserves the terminal and returns a session object.

import { Vinr } from '@vinr/sdk';

const vinr = new Vinr({ secretKey: process.env.VINR_SECRET_KEY });

const session = await vinr.terminal.sessions.create({
  amount: 2500,
  currency: 'EUR',
  terminalId: 'term_8Rv3x...',
  description: 'Table 12 — lunch',
  metadata: { tableId: '12', serverId: 'emp_44' },
});

// session.id     → "ts_9Zp7k..."
// session.status → "pending"
curl -X POST https://api.vinr.com/v1/terminal/sessions \
  -H "X-Api-Key: $VINR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 2500,
    "currency": "EUR",
    "terminalId": "term_8Rv3x...",
    "description": "Table 12 — lunch"
  }'

Terminal presents the transaction

VINR pushes the session to the terminal over the cloud connection (or local API if you use local mode). The device prompts the customer to tap, insert, or swipe.

Customer completes the card interaction

The terminal reads the card, performs online authorization with the issuer, and reports the result back to VINR.

VINR fires payment.completed (or payment.failed)

Your webhook endpoint receives the same event structure as an online payment. The payment.terminalId field identifies the device; all other fields — id, amount, status, metadata — are identical to online payments.

app.post('/webhooks/vinr', (req, res) => {
  const event = vinr.webhooks.constructEvent(
    req.body,
    req.headers['vinr-signature'] as string,
    process.env.VINR_WEBHOOK_SECRET!,
  );

  if (event.type === 'payment.completed') {
    const payment = event.data;
    console.log('Collected', payment.amount, payment.currency, 'on terminal', payment.terminalId);
  }

  res.sendStatus(200);
});

Poll or subscribe for session status (optional)

If your POS needs a synchronous result rather than a webhook, poll vinr.terminal.sessions.retrieve(session.id) until status is completed or failed. The typical card interaction completes in under five seconds.

Never treat a pending or processing session as collected. Always wait for payment.completed via webhook or a terminal session status of completed before fulfilling an order.

What's supportedAsk

Every VINR terminal supports the following acceptance capabilities out of the box. Feature availability can depend on your acquiring agreement and the market in which the device is deployed.

  • Chip + PIN — EMV contact card with cardholder PIN entry
  • Contactless / NFC — tap-to-pay for cards and mobile wallets up to the issuer's contactless limit
  • Magnetic stripe — fallback swipe acceptance where regulations permit
  • Apple Pay and Google Pay — in-store NFC wallet payments treated as contactless EMV tokens
  • Tipping — percentage or fixed tip amounts presented on the terminal screen before authorization
  • Surcharging — automatic card-type-based surcharge calculation (see Surcharging for legal requirements)
  • Dynamic Currency Conversion (DCC) — offer foreign cardholders the option to pay in their home currency
  • Cashback — dispense cash on debit transactions where the acquirer and jurisdiction allow
  • MOTO — Mail Order / Telephone Order key-entry for card-not-present transactions processed through a terminal
  • Offline authorization — store-and-forward for transactions taken during connectivity loss, subject to floor-limit rules
  • Gift cards — closed-loop gift card redemption via the VINR Gift Card module
  • Installments — split a purchase into equal installments at the point of sale where the issuer supports it

Before you startAsk

To accept your first in-person payment you need a provisioned terminal and a decision on which Terminal API mode fits your architecture.

  • Hardware — review the full device specifications, supported markets, and ordering process in Terminal hardware.
  • API mode — choose between cloud mode (VINR routes sessions to the device over the internet) and local mode (your server communicates with the terminal directly on the local network) in Terminal architecture.

Before going live with card-present acceptance, complete the steps in the In-person go-live checklist — this includes certifying your terminal software version, confirming your PCI P2PE scope, and enabling live mode on each device.

Next stepsAsk

Was this page helpful?
Edit on GitHub

Last updated on

On this page