Experienced IT Project Manager for Payment / Merchant Services Company

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

TYPE OF WORK

Full Time

SALARY

40,000 php to 100,000 php per month

HOURS PER WEEK

45

DATE UPDATED

Sep 21, 2026

JOB OVERVIEW

Remote / Full-Time
Time Zone: EST

What the job actually is

You will run the dev board. Every bug, feature, merchant escalation, and compliance item lands there, and you d ---------- what gets worked next, who takes it, and when it ships. Right now that's split between the founder and whoever is loudest that morning. It needs to be one person.

Day to day that means:

- Triaging incoming work. A merchant reporting "charged but declined" is usually an auth hold, not a bug. A chargeback fee landing in the wrong balance account is a bug and it costs us money. You need to tell those apart within a day or two of starting.
- Writing tickets engineers don't have to rewrite. Repro steps, which merchant, which processor, which environment, what the expected behavior is. If you're guessing, say you're guessing.
- Running releases. We ship to production several times a day by tagging master. Coolify picks up the tag, builds, swaps the container. You'll coordinate what goes in each tag, hold the money-path changes for a live transaction check, and make sure someone actually watched the deploy finish instead of assuming.
- Chasing verification. "Merged" is not done. Done is serving on production and someone looked at it. A lot of our follow-up tickets are "human needs to click through this in a browser." You'll assign those and close them.
- Being the point of contact for the outside review firm we bring in on payments code, and for processor reps at Adyen and Stripe when an integration question needs a human.
- Keeping the PCI paperwork moving. We're PCI DSS v4.0. Quarterly scans, policy docs, network diagrams, evidence for the QSA. Not glamorous, has deadlines.

What you need to know about the engineering side

You are not writing code, but you have to be able to follow what the devs are doing well enough to spot when a ticket is under-scoped or a PR is riskier than it looks. Concretely:

- The app is one Next.js 14 codebase (App Router, TypeScript) with four portals: admin, merchant dashboard, agent, and affiliate. Postgres behind Prisma. You should be able to read a PR description, look at which files changed, and know whether it touches payments, webhooks, or a database migration.
- Dev and prod share a database. Migrations must be additive. If a ticket says "rename a column" or "drop a table," that's a conversation, not a task. We've lost data twice from careless schema commands and it will not happen a third time on your watch.
- We integrate with Adyen (balance platform, splits, rolling reserves, POS terminals, multi-region US/UK/CA), Stripe Connect (newer, five merchants migrated so far, more coming), PayPal, NMI, Dejavoo, and a BTCPay box for crypto. Each has its own webhook shape, its own sandbox quirks, and its own way of failing quietly. You don't need to know the APIs. You need to know which processor a merchant is on before you route their ticket.
- Money is in cents as integers everywhere. Reserves, commissions, chargeback fees, dispute evidence, refunds that the merchant funds but the platform keeps commission on. When an engineer says "the split calculator" or "the liable account," you should know roughly what they mean after your first month.
- We have WooCommerce and Shopify plugins, an Android POS app pushed through MDM, and a virtual terminal. Plugin releases and app builds have their own cadence and their own test gaps.
- Infra is Docker on Hetzner via Coolify. Crons live in Coolify scheduled tasks, not in the repo. Backups are restic with an off-site mirror. If a cron silently stops, the first place to look is Coolify, and you should know that without being told twice.
- The team works heavily with AI coding tools. PRs get generated fast. That means more review load, not less, and it means "the build passed" carries less weight than it used to. You'll be the one asking "did anyone actually open this page."

Who does well here

- Someone who has managed engineers at a fintech, payments company, or ISO/payfac and knows why a $0.30 rounding difference matters.
- Has run a release process where a bad deploy costs real money, and has the instinct to hold a change rather than push it Friday afternoon.
- Direct. We don't need status decks. We need "these three tickets are blocked on Adyen, this one is blocked on you, and this one shipped at 2pm and I checked it."
- OK with a small company. There's no PMO. You are the PMO.

Nice to have

- PCI DSS experience, especially SAQ-D or a QSA audit cycle.
- Prior work with Adyen or Stripe Connect on the platform side, not just as a merchant.
- Has used Jira, Linear, or a homegrown board and has opinions about ticket hygiene.


To Apply:
Send your resume along with a short video intro. Failure to do so may result in your application getting ignored.

SKILL REQUIREMENT
VIEW OTHER JOB POSTS FROM:
SHARE THIS POST
facebook linkedin
  BENCHMARKS  
Loading Time: Base Classes  0.0008
Controller Execution Time ( Jobseekers / Job )  0.0166
Total Execution Time  0.0181
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,513,536 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Experienced-IT-Project-Manager-for-Payment-Merchant-Services-Company-1735259
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0111 seconds)  (Hide)
0.0003   SELECT *
                                
FROM exrates
                                WHERE rate_name 
= 'USD-PHP' 
0.0004   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1735259
 LIMIT 1 
0.0004   SELECT *
FROM `employers`
WHERE `employer_id` = 760093
 LIMIT 1 
0.0009   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `misc` ON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1735259
AND `misc`.`id` IS NULL 
0.0004   SELECT e.business_name, e.logo, e.website, e.rebill_date, e.date_added member_date, hits, DATEDIFF('2026-09-27',ej.date_added) duration_days, DATEDIFF('2026-09-27',e.rebill_date) duration_rebill, ej.*, e.deactivate FROM employers e, employer_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-09-27',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != 1 AND ej.deleted = 0 AND job_id = '1735259' 
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `sc` ON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1735259 
0.0011   UPDATE employer_jobs SET hit_counts = '***Sep-21-2026=168***Sep-22-2026=77***Sep-23-2026=33***Sep-24-2026=17***Sep-25-2026=16***Sep-26-2026=8***Sep-27-2026=2' WHERE job_id= '1735259'  
0.0007   UPDATE employer_jobs SET monthly_hits = '***Sep-2026=321' WHERE job_id= '1735259'  
0.0012   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id = '' AND job_id = '1735259' AND status LIKE 'sent%' ORDER BY id DESC  
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `sc` ON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1735259 
0.0046   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '760093'
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)