Senior Next.js + Payload CMS Developer — German Real-Estate Portal Rebuild (Project-Based)

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

TYPE OF WORK

Gig

SALARY

$1,200 - $2,000 for the whole project (

HOURS PER WEEK

40

DATE UPDATED

Jul 12, 2026

JOB OVERVIEW

We are a German digital-infrastructure agency. We are hiring a senior developer for a
project-based rebuild of an established German real-estate portal (site ranks #1 on Google —
SEO migration and redirects are handled by our team; you build the new frontend + CMS).

RESPONSIBILITIES
- Build 8 page templates in Next.js (App Router, TypeScript, Tailwind), fully responsive
- Implement Payload CMS inside the Next.js app (collections are pre-modeled by us)
- Render ~700 programmatic reference pages from CMS data (we deliver the data)
- Integrate one external JS search widget (snippet provided)
- Build 2 forms (multi-step + standard) with server validation, e-mail delivery and
hidden-field source attribution
- Technical SEO baseline: meta templates, sitemap.xml, structured data, clean semantic HTML

WE PROVIDE
Running Next.js + Payload scaffold in our GitHub repo, Postgres database, Vercel with preview
deployments, design assets, a complete written spec, and fast decisions (feedback within 24 h).

HOW WE WORK
Pull requests only, code review by us, weekly 30-min status call. Our team works in Bangkok
time (UTC+7) — just 1 hour behind PH time, so communication happens in YOUR working hours,
no night shifts. Acceptance is measurable: Lighthouse mobile ? 90 performance / ? 95 SEO on
three template types, Core Web Vitals budgets, CMS demo.

TIMELINE (FIXED)
Kickoff July 21 · design direction frozen July 28 · feature-complete on preview August 8 ·
acceptance/bugfixing until August 15. Full-time focus during this window required.
Good performance leads to follow-up projects (city pages rollout + more client projects).

TO APPLY — answer these 4 questions (applications without all 4 answers will be skipped):
1. Link to ONE live Next.js App-Router project you built — what exactly did you build yourself?
2. Link/repo of ONE Payload CMS project (v2 or v3) — which collections did you model?
3. Confirm full availability July 21 – August 15 (hours/week you commit).
4. Your fixed project price in USD, itemized per work package (templates, CMS, widget, forms,
SEO baseline, QA).

Start your application with the word "LIGHTHOUSE" so we know you read this.
English communication required. NDA before we share client details. No subcontracting.

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.0127
Total Execution Time  0.0141
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,500,136 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Senior-Nextjs-Payload-CMS-Developer-German-Real-Estate-Portal-Rebuild-Project-Based-1687365
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0073 seconds)  (Hide)
0.0003   SELECT *
                                
FROM exrates
                                WHERE rate_name 
'USD-PHP' 
0.0003   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1687365
 LIMIT 1 
0.0008   SELECT *
FROM `employers`
WHERE `employer_id` = 895155
 LIMIT 1 
0.0008   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `miscON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1687365
AND `misc`.`idIS NULL 
0.0005   SELECT e.business_namee.logoe.websitee.rebill_datee.date_added member_datehitsDATEDIFF('2026-08-08',ej.date_added) duration_daysDATEDIFF('2026-08-08',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-08-08',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != AND ej.deleted AND job_id '1687365' 
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1687365 
0.0008   UPDATE employer_jobs SET hit_counts '***Jul-12-2026=798***Jul-13-2026=104***Jul-14-2026=45***Jul-15-2026=23***Jul-16-2026=22***Jul-17-2026=14***Jul-18-2026=5***Jul-19-2026=2***Jul-20-2026=5***Jul-21-2026=5***Jul-22-2026=9***Jul-23-2026=2***Jul-24-2026=2***Jul-25-2026=1***Jul-26-2026=2***Jul-27-2026=6***Jul-28-2026=1***Jul-29-2026=2***Jul-30-2026=3***Jul-31-2026=7***Aug-01-2026=1***Aug-02-2026=3***Aug-03-2026=7***Aug-04-2026=1***Aug-08-2026=1' WHERE job_id'1687365'  
0.0006   UPDATE employer_jobs SET monthly_hits '***Jul-2026=1057***Aug-2026=13' WHERE job_id'1687365'  
0.0007   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id '' AND job_id '1687365' 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` = 1687365 
0.0015   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '895155'
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)