DotMik

Payment Links or Dynamic QR? Picking the Right Way to Get Paid

Both carry the amount and a reference, so both reconcile cleanly. The real difference is how the request reaches the customer, and that decides which one fits.

10 min readPayments
A QR matrix composed of brand-coloured modules with finder squares

Once you have moved past static QR codes, the choice is usually between a payment link and a dynamic QR. They solve the same reconciliation problem in the same way. What separates them is distribution — whether the customer is in front of you or at the other end of a message.

What they have in common

Both are generated per transaction, and both carry the amount and a reference you control. That single property is what makes automatic reconciliation possible, and it is the main reason to use either in preference to a static code.

  • The customer cannot enter the wrong amount, because they do not enter one.
  • The reference returns with the payment, so matching is a lookup rather than an inference.
  • Both can expire, which prevents an old request being paid months later against a closed invoice.
  • Both can be cancelled, which a printed code cannot.
  • Both produce a status you can query, rather than a credit you have to recognise.

Where they differ

Payment linkDynamic QR
Reaches the customer byMessage, email, chatBeing shown on a screen in person
Customer isRemotePresent
Works on desktopYesOnly if they scan with a phone
Can be forwardedYes — useful and occasionally a riskNot easily
Natural forInvoices, remote collection, follow-upsCounters, deliveries, field collection
Needs at the point of saleNothingA screen
Chasing an unpaid requestResend the same linkNot applicable — the moment has passed

Choosing by situation

The question is not which is better but where the customer is standing when you ask for money.

Use a payment link when

  • You are invoicing and the customer will pay later, from wherever they are.
  • Collection happens over chat or email, where a tappable link fits the medium.
  • You want to chase: a link can be resent, and each reminder carries the same reference.
  • The payer may not be the person you are talking to — finance often pays what sales negotiated.
  • You need a record of when the request was sent and opened, which a link gives you and a code does not.

Use a dynamic QR when

  • The customer is physically present and holding a phone.
  • You are delivering, where the amount is known at the door and the customer is standing there.
  • You want no typing and no app switching on your side either.
  • The transaction completes now, not later.
  • There is a queue, and the few seconds a link would take to send and open actually matter.

Use both when

Many providers let one underlying request be rendered as both. That is often the best arrangement: show the code to the customer in front of you, send the link to the one who is not, and reconcile a single record either way.

The operational details that decide how well either works

  1. Set a sensible expiryLong enough that a reasonable customer can pay, short enough that stale requests do not get settled against closed invoices. For invoices, align it with your payment terms.
  2. Make the reference meaningful to youIt comes back with the payment, so encode what you will want to match on — the invoice number rather than a random string.
  3. Handle partial and duplicate paymentsBoth happen. Decide in advance whether a short payment closes the request, and what to do when the same link is paid twice.
  4. Decide what cancellation meansIf an invoice is credited, the outstanding link should stop working. Wire cancellation to your billing events rather than leaving it manual.
  5. Confirm server-sideUse a signed webhook, and sweep anything still outstanding with a status poll. Do not rely on the customer landing back on a success page.

Partial payments: pick a policy and hold it

A customer paying 40,000 against a 50,000 request is common in B2B and it is not an error. What is an error is having no policy, so the behaviour depends on which code path happened to run.

  • Either the request stays open for the balance, or it closes and the shortfall becomes a new receivable. Both are defensible; drifting between them is not.
  • Whatever you choose, the customer should see it — a request that silently closed short will be queried.
  • Make sure your ledger can represent a part-settled request, or the reconciliation you built this for will break on the first one.

Chasing without annoying

The chasing advantage of links is real and easily overused. A reminder that carries the same reference and the same link is helpful; four reminders in a week from an automated sequence that does not know the invoice was queried is not.

Tie the reminder schedule to the payment terms and stop it on any human contact about that invoice. The system should know when a conversation is already happening.

Sharing, forwarding and what that means for security

A payment link is a URL, which means it travels — forwarded to a colleague, pasted into a finance system, screenshotted into a group chat. Mostly that is the point, because the person who owes the money is often not the person who pays it. It does mean the link itself has to be safe to see.

  • Keep the link free of anything sensitive beyond the amount and a reference. It should not reveal a customer's other invoices, their balance, or their contact details.
  • Make the identifier unguessable. Sequential link IDs let anyone who holds one enumerate the rest.
  • Expire it, so a forwarded request cannot be settled months later against something already closed.
  • Make it single-settlement where the commercial context allows, so a link shared in a group chat cannot be paid twice.
  • Log who opened it and when. That is useful for chasing and occasionally useful for explaining what happened.

What to measure

Both methods produce a request with a status, which means collection stops being a mystery and starts being a funnel you can read. The useful figures are not the ones most dashboards show first.

MeasureTells youAct when
Opened but not paidThe request arrived and something stopped themThe share rises — usually a checkout or amount problem
Time from send to paymentHow your terms actually performIt drifts well past your stated terms
Expired unpaidRequests that quietly diedAny material volume — these are recoverable revenue
Paid after a reminderWhether chasing worksIt is near zero, meaning reminders are noise
Partial settlementsDisputes or deductions you are not seeingThe rate climbs for one customer

The first row is the most actionable and the least watched. A request that was opened and not paid is a customer who intended to pay and did not, which is a fixable problem rather than a collections one.

Fitting collection into how you already invoice

A payment request is only useful if it reaches the person who pays, at the moment they are deciding to pay. That is an invoicing question more than a payments one, and it is where most collection improvements actually come from.

  1. Generate the request with the invoiceNot afterwards as a separate step. A request created at invoicing time carries the invoice number naturally and cannot be forgotten.
  2. Put it on the document itselfThe details that get used are the ones on the thing being paid. A link in a covering email is read by a different person than the invoice PDF that reaches accounts payable.
  3. Send to the payer, not only the buyerIn most businesses these are different people. A request that reaches only the person who ordered waits until they forward it.
  4. Reference the same identifier everywhereThe invoice number on the document, in the request, and in the reconciliation. Three identifiers for one transaction is how matching breaks.
  5. Stop chasing on contactIf someone has replied about an invoice, the automated reminders should pause. Nothing erodes a relationship faster than a sequence that keeps nagging through a conversation.

Frequently asked questions

Can one request be both a link and a QR?

Commonly yes — the same underlying request can be rendered as a scannable code and as a shareable URL. That is often the best setup, because it covers the present and the remote customer without creating two records.

What expiry should a payment link have?

Match it to the commercial context. For an invoice, align with your payment terms; for a point-of-sale request, minutes. The aim is to prevent a stale request being paid against something already closed.

What happens if a customer pays a link twice?

Decide the behaviour before it happens: either the request becomes unpayable once settled, or you detect the second payment and refund it. The failure to avoid is silently accepting both and reconciling neither.

How should a partial payment be handled?

Pick a policy and apply it consistently — either the request stays open for the balance or it closes and the shortfall becomes a new receivable. Both work; what breaks reconciliation is drifting between them.

Are payment links safe to forward?

Forwarding is usually a feature, since the person who owes the money is often not the person who pays it. Keep the link free of sensitive detail beyond the amount and reference, and expire it, so a forwarded request cannot be misused later.

Should an outstanding link be cancelled when an invoice is credited?

Yes, and automatically. Wire cancellation to your billing events rather than leaving it manual, or you will eventually collect against something that was written off.