Senior Backend Engineer — Multi-Tenant SaaS + Payments (TypeScript/Node + Postgres)

Please login or register as jobseeker to apply for this job.

TYPE OF WORK

Full Time

WAGE / SALARY

$1,500–$1,600 USD/month

HOURS PER WEEK

TBD

DATE UPDATED

Jun 17, 2026

JOB OVERVIEW

Be one of two senior engineers who set the quality bar for the software that real truck-repair shops run their entire business on.

We're WrenchEngine — the operational platform a heavy-duty truck & trailer repair shop runs on: work orders, billing, inventory, managed-maintenance, on a multi-tenant / multi-brand foundation with an AI layer on top. Our first customer is an enterprise multi-brand fleet-services company; we're replacing their existing shop software and going live at a pilot shop this fall. Real shops will invoice real money on what you ship.

We build fast with AI (Claude Code is core to how we work), so the bottleneck isn't typing — it's senior review on the two things that can sink us: money-path correctness (invoices, payments, pricing, cores) and multi-tenant data isolation. We have one senior engineer today. You're the second, hired so neither of those rests on one person.

What you'll own:

Final review on tenant/brand isolation — no query ever crosses a tenant boundary, no data leaks between brands. We have a real isolation system (query-layer guard + Postgres row-level security + composite FKs) that's actively being hardened. You own it.
Backup review on the money path (invoicing, pricing, cores) so it's never a single point of failure.
Lead a reversible data migration: moving a customer off their old system into ours, with a tested rollback path and dual-run sync.
Rigorously review AI-generated code — judgment about what's correct and safe matters more than raw output.
Our stack (this is what you'll work in):

TypeScript (strict) monorepo, pnpm + Turbo
Backend: Node + Express, raw SQL over PostgreSQL, layered controller ? service ? repository (~480 endpoints, ~190 SQL migrations)
NATS JetStream for events, Redis cache, Typesense search, S3/MinIO storage
Multi-tenant: brand = organization, group ? brand ? shop, enforced by a scoped-query chokepoint that throws on a missing tenant filter, plus Postgres FORCE row-level security
Auth: FusionAuth (OAuth2), JWT
Frontend: Next.js 15 / React 19 (you don't need to be FE-strong, but it helps)
Integrations: QuickBooks/Intuit, Fullbay, Mitchell 1, GPS telematics, Twilio, SendGrid
~240 backend test files (130+ integration) — tests are the contract here
Must-haves:

Senior backend engineer, strong in TypeScript/Node + PostgreSQL
Real multi-tenant SaaS experience — you've designed or owned tenant data isolation, not just used it
Security fundamentals (authz boundaries, RLS or equivalent, least-privilege)
Payments / financial-integration experience (invoices, pricing, ledgers, or accounting integrations)
A disciplined code reviewer who can explain why a change is safe or not
Comfortable owning data migrations and third-party integrations
Nice-to-have:

Fleet / field-service / automotive or accounting-integration (QuickBooks) domain experience
Experience reviewing/steering AI-generated code
How we work: Small, senior, async team. 2-week sprints with a hard definition of done — tests green, TypeScript strict, tenant-scoped, money-path/security reviewed, merged to main. Remote, Philippines-based.

To apply — read carefully (we filter for this):
Start your reply with the word "WRENCH" so we know you read the post. Then tell us briefly:

A multi-tenant system where you owned data isolation — how did you enforce it?
A money-path or financial bug you caught (or prevented in review).
A data migration or system cutover you led.
Link code or write-ups if you have them. We read for judgment, not buzzwords. Applications that don't follow these instructions won't be reviewed

SKILL REQUIREMENT
VIEW OTHER JOB POSTS FROM:
SHARE THIS POST
facebook linkedin
  BENCHMARKS  
Loading Time: Base Classes  0.0009
Controller Execution Time ( Jobseekers / Job )  0.0275
Total Execution Time  0.0289
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,515,464 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Senior-Backend-Engineer-Multi-Tenant-SaaS-Payments-TypeScriptNode-Postgres-1671003
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0216 seconds)  (Hide)
0.0003   SELECT *
                                
FROM exrates
                                WHERE rate_name 
'USD-PHP' 
0.0010   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1671003
 LIMIT 1 
0.0013   SELECT *
FROM `employers`
WHERE `employer_id` = 825238
 LIMIT 1 
0.0107   SELECT COUNT(DISTINCT t.id) as cnt
FROM 
`t_thread` `t`
INNER JOIN `t_message` `mON `t`.`id` = `m`.`thread_id`
INNER JOIN `t_message_employer` `eON `m`.`id` = `e`.`message_id`
LEFT JOIN `t_thread_misc` `miscON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1671003
AND `misc`.`idIS NULL 
0.0005   SELECT e.business_namee.logoe.websitee.rebill_datee.date_added member_datehitsDATEDIFF('2026-06-22',ej.date_added) duration_daysDATEDIFF('2026-06-22',e.rebill_date) duration_rebillej.*, e.deactivate FROM employers eemployer_jobs ej WHERE e.employer_id ej.employer_id AND
                                   ((
e.user_level >= '500' AND ej.date_added <= e.rebill_date)
                                   OR 
e.employer_id '' OR (ej.date_approved <> '2000-01-01' and DATEDIFF('2026-06-22',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != AND ej.deleted AND job_id '1671003' 
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1671003 
0.0017   UPDATE employer_jobs SET hit_counts '***Jun-17-2026=164***Jun-18-2026=76***Jun-19-2026=62***Jun-20-2026=38***Jun-22-2026=1' WHERE job_id'1671003'  
0.0006   UPDATE employer_jobs SET monthly_hits '***Jun-2026=340' WHERE job_id'1671003'  
0.0008   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id '' AND job_id '1671003' AND status LIKE 'sent%' ORDER BY id DESC  
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1671003 
0.0037   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '825238'
AND `date_added` >= '2022-06-08' 
0.0003   select from teasers 
0.0002   SELECT FROM skill_categories WHERE skill_cat_id='' 
  HTTP HEADERS  (Show)
  SESSION DATA  (Show)
  CONFIG VARIABLES  (Show)