The register records the payment: the card brand and the last 4 digits. The card itself is charged by your merchant account, on your processor's terminal. When the card was taken through a connected terminal (below), a void or a refund in ParallelPOS goes back to the card through the processor. A card run standalone has nothing for ParallelPOS to call: the refund is booked here, and you return the money on your terminal.
There are two ways to get the card details into the register:
| Partner | Terminal | Auto-capture | Refunds & voids |
|---|---|---|---|
| Stripe Terminal | WisePOS E, Reader S700 (internet readers registered to your Stripe account) | driven directly | back to the card through Stripe |
| Square | Square Terminal, paired to your Square account | driven directly | back to the card through Square |
| Clover | a Clover device on your Clover merchant account, with Cloud Pay Display installed | driven directly you sign in to Clover — no key to copy | back to the card through Clover |
| Dejavoo | a Dejavoo terminal (P1, P3, P5, QD series) with SPIn enabled on its TPN in the iPOSpays portal | driven directly you paste the SPIn auth key and the terminal's TPN | a whole sale is voided through SPIn until the batch settles; after that, or for a part, a Return on the terminal with the customer's card |
| Fiserv CardPointe (Bolt) | a CardPointe "Bolt" terminal (Ingenico Lane / Link, or a Clover provisioned to CardPointe) on a First Data / Fiserv merchant account | driven directly you paste the Terminal API key, the merchant id, the Gateway username:password and the site name; the HSN is picked from Test connection | a sale is voided through the Gateway until its batch settles, then refunded (part or whole) — both from here |
| Worldpay triPOS Cloud (FIS / Vantiv) | a Worldpay-keyed PIN pad (Verifone MX / Ingenico Lane) paired to a triPOS Cloud lane on a Worldpay (Express) merchant account | driven directly through triPOS Cloud: you paste the Express account token, acceptor id, account id and the lane id from your Worldpay implementation consultant | a sale is voided whole while its batch is open, then returned (part or whole) — both from here; a debit sale is voided only |
| Heartland Genius (Global Payments) | a Genius device (Verifone P400 / MX) on a Heartland / Global Payments (TSYS, Cayan) merchant account | driven directly through Meet in the Cloud: you paste the REST API key, the API secret, the account credential (X-Web ID:Terminal ID:Auth Key) and the device id from Global Payments onboarding | a sale is voided whole while its batch is open, then refunded (part or whole) — both from here; a debit sale is voided only |
| PAX on Cybersource | a PAX (A35, A77, A920, A920 Pro, A920 MAX) running the Cybersource / Visa Acceptance app; the processor behind it is yours (FDC Nashville or Visa Platform Connect) | driven directly you paste the REST-Certificate private key, key id, merchant id and the device serial | back to the card through Cybersource (a same-day refund is reversed) |
| PAX on another cloud, Verifone, Ingenico, bank terminals | whatever your processor issued | standalone or a custom bridge your processor or integrator hosts | through the bridge's refund endpoint; standalone: on your terminal |
sk_live_…). A test key (sk_test_…) drives Stripe's simulated readers.tmr_…). Tick Enable, save.device:…). Tick Enable, save.ParallelPOS drives a Clover device directly through Clover's cloud (REST Pay Display). There is no key to copy: you sign in to Clover from ParallelPOS, and the sale prompt appears on the Clover device at the register.
Use the terminal standalone — it is the normal way most shops run. If your processor or integrator offers a cloud API for the terminal, they can host a small bridge that ParallelPOS's server calls. Every call carries your key as Authorization: Bearer <key>, goes to a public https URL, and never follows a redirect.
POST <endpoint> with {"amount": 4.89, "amount_cents": 489, "currency": "USD", "reference": "…", "charge_id": "…"}. Answer {"status": "approved", "brand": "visa", "last4": "4242", "ref": "<your payment id>"} — or "approved": true. Anything without an explicit verdict is not booked as a card sale.
A public https URL that leads somewhere other than both charge endpoints (primary and secondary — compared by where the path leads, so a trailing ?, ./ or a change of case is the same URL), with no #fragment. With one, every refund and void of a sale the bridge charged — and a charge whose sale never landed — is sent to it:
POST <refund endpoint>, header Idempotency-Key: <refund_id>, body {"action": "refund", "charge_id": "…", "payment_ref": "<the ref you answered at charge>", "reference": "…", "amount": 4.89, "amount_cents": 489, "currency": "USD", "refund_id": "pprf…", "unwind": false, "reason": "ParallelPOS order #123 (refund)"}.
{"status": "refunded" | "voided" | "pending" | "declined", "refund_ref": "<your refund id>", "message": "…"}.unwind: true means the whole sale is being reversed, the amount is the full charge and nothing has been refunded on it yet — you may void instead, and answer voided. Never answer voided to a request without it.refund_id is sent again when ParallelPOS retries a refund it got no answer for: answer a repeated refund_id with the outcome of the first request, never refund it twice. Until that refund is answered, no other refund of the same charge is sent.declined — or an HTTP 4xx other than 408, 409, 425 and 429, or a 501 — means nothing was refunded: the operator is then offered other ways to give the money back. Use it only when that is true. Any other word (failed, rejected and denied included), a 2xx without one of the four words, a redirect (3xx), a timeout, a 408 / 409 / 425 / 429 or any other 5xx is treated as unknown: the refund may have reached the card, so nothing is booked and only a retry is offered.approved — the charge endpoint's word — is treated as a misrouted request: nothing is booked, nothing more is sent to that refund URL until it is changed, and the operator is told to check for an extra charge.pprel… and unwind: true; after a declined, the next try is a new id (pprel…-1, -2), and after three the operator is told to refund it on the processor's dashboard.GET <refund endpoint>?charge_id=…&payment_ref=…[&refund_id=…] answering {"refunded_cents": 489, "refunds": [{"refund_id": "pprf…", "status": "refunded"}]} — the total refunded on that payment so far. ParallelPOS reads it before every refund, so a refund that reached the card but whose answer was lost is booked rather than sent twice, and it follows a pending refund to its end — listing the refund_id is what lets it do so. Answer 404 if you do not support it; a pending refund nobody can follow is put in front of the shop's admins after a day.
192.168… or localhost address) cannot be reached from our server and is refused. It has to be reachable from the internet, over https — the charge endpoint too. Refunds always go back through the bridge that took the card: if the entity later switches to a different bridge, earlier sales are refunded on the old processor's dashboard. Without a refund endpoint, a refund of a bridge sale is booked here and you return the money on the processor's dashboard.A keyboard-style magstripe reader (MagTek Dynamag, ID Tech MiniMag) plugged into the till fills in the brand and last 4 when the Card Details sheet is open. It does not charge the card — the terminal still does that.
Some refunds are accepted by the processor and settle later (Square often answers "pending"). ParallelPOS checks every ten minutes. If the processor then fails the refund — a closed card account, a lost card, a merchant balance too low to cover it — the order stays booked as refunded but the customer has not been paid. The shop's admins and managers get a bell, and Order Management lists the refund at the top of the page until it is made good.
Before anything is sent or booked, the processor is asked what it has refunded. Stripe and Square are read refund by refund: a refund redone on their dashboard since is booked as that — and followed, if it is still settling — and nobody is paid twice. A custom bridge gives only a total, which after a declined refund cannot tell a redo from the declined one; then, and whenever the processor cannot be read or shows money ParallelPOS has not booked, you are asked to check the dashboard and tick that you did before cash is handed over. Each failed refund can be made good once, and only by someone who may refund orders.