Principal .NET Engineer
- Compensation
- Not disclosed
- Location
- Not listed
- Work setup
- Remote
- Seniority
- Principal
- Employment
- Not specified
- Experience
- 10+ years
- Category
- Software engineering
- Posted
Skills
Nice to have
- Payments experience: card processors and acquirers, 3-D Secure, refunds, settlement, and idempotent money movement.
- Experience with card-present or terminal payments, or with integrations such as Worldpay, Stripe, Fiserv, or Verifone.
- Deep SQL and index tuning experience.
- Hands-on experience with Dapper, EF Core, Hangfire, Redis or ValKey, and Centrifugo or another websocket layer.
- Comfortable on Linux and self-hosted infrastructure (bare metal, Proxmox), including the operational side when something breaks.
- Experience with Rust, Go, or another systems language.
- Has led a team before and would now rather be building.
- Experience in a consultancy or professional-services environment working with client engineering teams.
Full description
We are looking for a Principal .NET Engineer to join Payforge as part of a very small team responsible for the backend of a client’s live, multi-tenant payments platform. Merchants on the platform take card payments online, through payment links, and — with a new physical terminal about to launch — in shops, restaurants, and venues. Volumes are growing week on week, and card-present traffic will add constant, bursty load from thousands of concurrent devices that cannot be asked to wait. The decisions made now have to hold at several times today’s load, so database performance, correctness under retries, and the cost of every request are commercial concerns rather than housekeeping. This is a hands-on role with no direct reports, by design: there is no separate architecture team, and the engineer who builds a feature designs it. You will work alongside the client’s technical lead on the parts of the system where design decisions have a direct financial consequence.
Key Responsibilities
- Own features end to end — the business conversation, the design, the schema, the API, the tests, the deployment, and the follow-up when something behaves unexpectedly in production.
- Build and harden online payment flows across multiple acquirers and payment providers, including hosted payment pages, card authentication, provider callbacks, and webhooks.
- Keep a payment and its order consistent when a provider is slow, a callback never arrives, or a customer loses connection mid-checkout, and make refunds and repeat payments safe to retry.
- Help carry the new card-present terminal product into production: ingest sales, refunds, and settlement data from thousands of concurrent devices and provider webhooks through Kafka into PostgreSQL as set-based batch writes.
- Ensure transaction processing stays correct under bursty traffic, replay, duplicate delivery, partial failure, and rolling deploys, with idempotency and uniqueness guaranteed where they actually hold.
- Own read performance for merchant-facing pages and reports over hundreds of thousands of rows per tenant, including a two-tier cache (local memory plus a ValKey cluster) with correct invalidation across nodes.
- Treat database performance as a commercial concern: understand what a statement costs, measure it against production-sized data rather than estimating, and treat a slow query as a defect.
- Provide design input early where small savings compound — milliseconds per request, avoided round trips, and avoided reads — including challenging designs specified by others before they ship.
- Investigate unexplained production behaviour through to root cause, rather than closing work at the first passing test.
- Take part in direct, written code review: give clear, constructive scrutiny and expect the same on your own work.