When the Client Forgets to Pay You (or Pretends They Did)

by Arif Ikhsanudin, Backend Developer

It’s awkward, frustrating, and more common than you think.
Handling unpaid invoices gracefully can save relationships—and your sanity.

Don’t Panic, Stay Professional

Your first instinct might be to shout or send a passive-aggressive email. Resist it.

  • Take a deep breath before contacting the client.
  • Assume good intent initially; maybe the payment genuinely slipped through.
  • Keep all communication polite and factual.

Professionalism keeps doors open, even when money is involved.

Gather Your Facts

Before sending any reminder, know exactly where things stand:

  • Check your invoices, payment records, and contract terms.
  • Note the date, amount, and any agreed-upon deadlines.
  • Document previous communications regarding payment.

Having clear facts strengthens your position and avoids misunderstandings.

Send a Clear, Friendly Reminder

A short, direct message works best:

  • Reference the invoice number and amount due.
  • Politely mention the original due date.
  • Ask if there’s any issue preventing payment.

Example: “Just checking in on Invoice #123, due last Friday. Please let me know if there’s any problem with processing it.”

Escalate Tactfully if Needed

If reminders go unanswered:

  • Follow up with a firmer email or phone call.
  • Offer multiple payment options if possible.
  • Mention consequences lightly, like late fees or pausing work, without sounding hostile.

Firmness protects your business while maintaining professionalism.

Learn and Protect Yourself

After the issue is resolved—or even if it isn’t—think about prevention:

  • Consider contracts with clear payment terms and late fees.
  • Use milestone payments for larger projects.
  • Keep communications and invoices organized for future reference.

Good habits reduce stress and prevent repeat problems.

Closing Thought

Unpaid invoices are painful, but how you handle them defines your business reputation.
Stay calm, be clear, and protect your work—money will follow.

Scale Your Backend - Need an Experienced Backend Developer?

We provide backend engineers who join your team as contractors to help build, improve, and scale your backend systems.

We focus on clean backend design, clear documentation, and systems that remain reliable as products grow. Our goal is to strengthen your team and deliver backend systems that are easy to operate and maintain.

We work from our own development environments and support teams across US, EU, and APAC timezones. Our workflow emphasizes documentation and asynchronous collaboration to keep development efficient and focused.

  • Production Backend Experience. Experience building and maintaining backend systems, APIs, and databases used in production.
  • Scalable Architecture. Design backend systems that stay reliable as your product and traffic grow.
  • Contractor Friendly. Flexible engagement for short projects, long-term support, or extra help during releases.
  • Focus on Backend Reliability. Improve API performance, database stability, and overall backend reliability.
  • Documentation-Driven Development. Development guided by clear documentation so teams stay aligned and work efficiently.
  • Domain-Driven Design. Design backend systems around real business processes and product needs.

Tell us about your project

Our offices

  • Copenhagen
    1 Carlsberg Gate
    1260, København, Denmark
  • Magelang
    12 Jalan Bligo
    56485, Magelang, Indonesia

More articles

SSRF, Path Traversal, and Other Spring Boot Vulnerabilities That Don't Get Enough Attention

SQL injection and XSS get attention. SSRF, path traversal, ReDoS, XXE, and deserialization vulnerabilities are less discussed but appear regularly in penetration tests and bug bounty reports. Here is how each manifests in Spring Boot and how to prevent it.

Read more

Securing Microservices Is Harder Than Securing a Monolith

A monolith has one trust boundary. Microservices have as many as you have services, and every internal network call is an attack surface if you treat your internal network as trusted.

Read more

Stop Writing Unit Tests That Only Work When Nothing Goes Wrong

Happy path tests confirm that your code functions under ideal conditions. They do almost nothing to protect you from the conditions that actually cause production incidents. Error paths, edge cases, and boundary conditions are where your tests need to live.

Read more

Distributed Tracing: How to Find Where Your Request Actually Failed

Without distributed tracing, debugging failures in a microservices system means correlating timestamps across disconnected log files from multiple teams. Distributed tracing makes request flows visible and failure points obvious.

Read more