Full-Stack Data Engineer (Python / FastAPI / SQL) – Restaurant Analytics Dashboard

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

TYPE OF WORK

Part Time

SALARY

$18 - $30 USD/hr

HOURS PER WEEK

25

DATE UPDATED

Feb 22, 2026

JOB OVERVIEW

We operate a fast-growing beverage concept in California and are building an internal operating system to power multi-store expansion.

We are looking for a highly capable Full-Stack Data Engineer to help design and build our internal analytics dashboard.

This is NOT a basic web developer role.

You will help build a real-time operating intelligence system that integrates:

• Toast POS API
• 7shifts (labor scheduling)
• Inventory and recipe cost tables
• Customer loyalty and retention data
• Review sentiment tracking

Your work will directly impact business decisions, expansion strategy, labor optimization, and profitability.

This is a long-term role for someone who thinks architecturally, not just executes tasks.

RESPONSIBILITIES

• Design and implement data pipelines (API ? database ? metrics ? dashboard)
• Build and maintain FastAPI backend services
• Design clean and scalable PostgreSQL schemas
• Implement metric calculations (CPLH, contribution margin, retention rates, etc.)
• Create dashboards (React frontend preferred)
• Build alert systems (threshold-based notifications)
• Write clean, documented, maintainable code
• Proactively suggest architecture improvements

REQUIRED EXPERIENCE

• Strong Python development experience
• Experience integrating external APIs
• Strong SQL knowledge
• Experience building dashboards or analytics systems
• Experience designing database schemas
• Able to work independently and propose solutions

Bonus:
• Experience with POS systems
• Experience with ETL/data pipelines
• Familiarity with FastAPI
• Familiarity with React

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.0331
Total Execution Time  0.0345
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,488,536 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Full-Stack-Data-Engineer-Python-FastAPI-SQL-Restaurant-Analytics-Dashboard-1585521
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0260 seconds)  (Hide)
0.0004   SELECT *
                                
FROM exrates
                                WHERE rate_name 
= 'USD-PHP' 
0.0008   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1585521
 LIMIT 1 
0.0009   SELECT *
FROM `employers`
WHERE `employer_id` = 874150
 LIMIT 1 
0.0116   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `misc` ON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1585521
AND `misc`.`id` IS NULL 
0.0006   SELECT e.business_name, e.logo, e.website, e.rebill_date, e.date_added member_date, hits, DATEDIFF('2026-09-25',ej.date_added) duration_days, DATEDIFF('2026-09-25',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-25',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != 1 AND ej.deleted = 0 AND job_id = '1585521' 
0.0008   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `sc` ON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1585521 
0.0013   UPDATE employer_jobs SET hit_counts = '***Feb-22-2026=144***Feb-23-2026=220***Feb-24-2026=82***Feb-25-2026=56***Feb-26-2026=48***Feb-27-2026=15***Feb-28-2026=13***Mar-01-2026=21***Mar-02-2026=31***Mar-03-2026=21***Mar-04-2026=15***Mar-05-2026=10***Mar-06-2026=15***Mar-07-2026=17***Mar-08-2026=15***Mar-09-2026=13***Mar-10-2026=16***Mar-11-2026=13***Mar-12-2026=5***Mar-13-2026=5***Mar-14-2026=7***Mar-15-2026=5***Mar-16-2026=2***Mar-17-2026=8***Mar-18-2026=2***Mar-19-2026=7***Mar-20-2026=9***Mar-21-2026=8***Mar-22-2026=5***Mar-23-2026=5***Mar-24-2026=8***Mar-25-2026=3***Mar-26-2026=2***Mar-27-2026=11***Mar-28-2026=4***Mar-29-2026=3***Mar-30-2026=40***Mar-31-2026=121***Apr-01-2026=75***Apr-02-2026=13***Apr-03-2026=14***Apr-04-2026=14***Apr-05-2026=4***Apr-06-2026=6***Apr-07-2026=4***Apr-08-2026=3***Apr-09-2026=10***Apr-10-2026=8***Apr-11-2026=2***Apr-12-2026=18***Apr-13-2026=1***Apr-14-2026=11***Apr-15-2026=3***Apr-16-2026=6***Apr-17-2026=4***Apr-18-2026=3***Apr-19-2026=5***Apr-20-2026=6***Apr-21-2026=8***Apr-22-2026=8***Apr-23-2026=8***Apr-24-2026=1***Apr-25-2026=4***Apr-26-2026=2***Apr-27-2026=13***Apr-28-2026=4***Apr-29-2026=7***Apr-30-2026=5***May-01-2026=5***May-03-2026=4***May-04-2026=9***May-05-2026=4***May-06-2026=7***May-07-2026=2***May-08-2026=4***May-09-2026=4***May-10-2026=3***May-11-2026=5***May-12-2026=1***May-13-2026=7***May-14-2026=3***May-15-2026=3***May-16-2026=4***May-17-2026=4***May-18-2026=3***May-20-2026=2***May-21-2026=3***May-22-2026=2***May-23-2026=3***May-24-2026=1***May-25-2026=1***May-26-2026=2***May-28-2026=3***May-29-2026=4***May-31-2026=1***Jun-01-2026=5***Jun-02-2026=6***Jun-03-2026=8***Jun-04-2026=2***Jun-05-2026=3***Jun-07-2026=4***Jun-08-2026=2***Jun-09-2026=2***Jun-10-2026=3***Jun-11-2026=4***Jun-12-2026=4***Jun-13-2026=4***Jun-14-2026=5***Jun-15-2026=1***Jun-16-2026=7***Jun-17-2026=2***Jun-18-2026=2***Jun-19-2026=3***Jun-20-2026=9***Jun-21-2026=4***Jun-22-2026=1***Jun-23-2026=3***Jun-24-2026=2***Jun-25-2026=4***Jun-27-2026=1***Jun-28-2026=2***Jun-29-2026=5***Jun-30-2026=4***Jul-01-2026=1***Jul-02-2026=3***Jul-03-2026=2***Jul-04-2026=5***Jul-05-2026=1***Jul-06-2026=5***Jul-07-2026=2***Jul-08-2026=4***Jul-09-2026=5***Jul-10-2026=6***Jul-11-2026=1***Jul-12-2026=4***Jul-13-2026=3***Jul-14-2026=1***Jul-15-2026=2***Jul-16-2026=8***Jul-17-2026=3***Jul-18-2026=2***Jul-19-2026=1***Jul-20-2026=2***Jul-21-2026=8***Jul-22-2026=3***Jul-23-2026=2***Jul-24-2026=3***Jul-25-2026=6***Jul-26-2026=9***Jul-27-2026=4***Jul-28-2026=2***Jul-29-2026=1***Jul-30-2026=4***Jul-31-2026=6***Aug-02-2026=2***Aug-03-2026=7***Aug-04-2026=5***Aug-05-2026=3***Aug-07-2026=2***Aug-08-2026=1***Aug-09-2026=1***Aug-10-2026=1***Aug-11-2026=8***Aug-12-2026=1***Aug-13-2026=2***Aug-14-2026=1***Aug-15-2026=2***Aug-16-2026=2***Aug-17-2026=4***Aug-18-2026=5***Aug-20-2026=5***Aug-21-2026=2***Aug-22-2026=1***Aug-23-2026=1***Aug-24-2026=1***Aug-25-2026=7***Aug-26-2026=2***Aug-28-2026=3***Aug-29-2026=5***Aug-30-2026=1***Aug-31-2026=4***Sep-01-2026=2***Sep-02-2026=2***Sep-03-2026=6***Sep-04-2026=3***Sep-05-2026=6***Sep-06-2026=7***Sep-07-2026=2***Sep-08-2026=11***Sep-11-2026=3***Sep-12-2026=5***Sep-13-2026=1***Sep-14-2026=5***Sep-15-2026=8***Sep-16-2026=5***Sep-17-2026=2***Sep-18-2026=1***Sep-19-2026=1***Sep-25-2026=1' WHERE job_id= '1585521'  
0.0035   UPDATE employer_jobs SET monthly_hits = '***Feb-2026=578***Mar-2026=447***Apr-2026=270***May-2026=94***Jun-2026=102***Jul-2026=109***Aug-2026=79***Sep-2026=71' WHERE job_id= '1585521'  
0.0022   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id = '' AND job_id = '1585521' AND status LIKE 'sent%' ORDER BY id DESC  
0.0004   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `sc` ON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1585521 
0.0027   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '874150'
AND `date_added` >= '2022-06-08' 
0.0004   select * from teasers 
0.0005   SELECT * FROM skill_categories WHERE skill_cat_id='' 
  HTTP HEADERS  (Show)
  SESSION DATA  (Show)
  CONFIG VARIABLES  (Show)