Developer Required to Build a Public, Embedded Shopify App

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

TYPE OF WORK

Part Time

SALARY

1200 USD

HOURS PER WEEK

40

DATE UPDATED

Dec 16, 2025

JOB OVERVIEW

About the App

Reorder app helps Shopify merchants automate repeat purchases for consumables. After a customer buys, the app schedules reminders (e.g., 30/45 days) and sends personalized messaging with one-click checkout links (Shop Pay enabled). It also grows subscriber lists via Cart popup and Thank-You page opt-in.

Demo - ----------

Core Requirements
Public Embedded App (Shopify App Store–ready)
OAuth with session tokens, App Bridge, Polaris UI, uninstall cleanup
GraphQL Admin API (Shopify’s requirement for new public apps)
Privacy/GDPR webhooks: customers/data_request, customers/redact, shop/redact
Shopify Billing (subscription + optional usage charges)
Data ingestion & Targeting
Webhooks: orders/paid (trigger), optional products/update, collections/update
Campaign rules: product, collection, or tags; customizable delay days
Messaging
Channels: (Resend) first; (Twilio)

Template engine with variables firstName, productTitle, reorderLink
Click-tracking redirect /c/:id with UTM & revenue attribution
Quiet hours (shop timezone), frequency caps, retries
Inbound STOP handling ? update consent + cancel scheduled messages

Subscriber Growth
Theme App Extension: Cart popup / inline block for opt-in
Checkout UI Extension – Thank You page for opt-in
App Proxy endpoints for status checks + submissions
Read/write Shopify messaging marketing consent (suppress popup if already opted-in)
Scheduler & Scale
Redis + BullMQ delayed jobs, rate limits, retries
Postgres (Prisma/Drizzle) with migrations and indexes

Merchant Dashboard
Campaigns CRUD, Templates, Subscriber Growth settings
Analytics: subscribers, messages sent, CTR, attributed revenue
Settings: quiet hours, default templates, provider keys, branding

Tech Stack (preferred)
Frontend (Embedded Admin): Next.js or Remix + App Bridge + Polaris
Backend: Node.js (TypeScript), Fastify/Express
DB/Queue: Postgres + Prisma/Drizzle; Redis + BullMQ
Messaging: Resend, Twilio or Telnyx messaging
Infra: GCP/AWS/Fly/Render (open to recommendation)
Observability: Sentry, structured logs

Deliverables & Milestones
Foundation advise timeframe – Embedded app scaffold, OAuth, DB, webhooks, uninstall/privacy hooks.

MVP Loop advise timeframe – Campaigns, scheduler, Resend, click tracking, basic dashboard.

Subscriber Growth advise timeframe – Cart popup + Thank-You extension, consent endpoints, suppression.

messaging + Scale advise timeframe – Twilio/Telnyx + templates, STOP handling, quiet hours, retries.

Billing & Polish advise timeframe – Shopify Billing, analytics views, settings, UI polish.

App Owner Admin

App Store Submission (Week 9) – Listing assets, compliance review, fixes from QA.

Success Criteria
Installs cleanly on multiple stores
Passes Shopify App Review (GraphQL only, billing, privacy, uninstall)
Reliable delayed sends (no duplicates; idempotent webhooks)
Accurate consent & suppression; working STOP/unsubscribe
Clear analytics and merchant-friendly UX
Complies with international messaging laws

Nice to Have
messaging template approval helpers
Simple A/B testing for popup copy
Multi-store reporting
Internationalization (i18n) for templates and UI

What You Provide
Clean, well-documented TypeScript code
Migration scripts + seed data
Basic unit tests (rules engine, scheduler, webhooks, consent)
Deployment instructions (env vars, queues, URLs)
Handover doc + short post-launch support

About You

Proven experience shipping public Shopify apps (please share links in proposal)
Strong with Admin GraphQL, App Bridge, Polaris, Extensions
Comfortable with queues, webhooks, messaging providers
Product-minded: care about merchant UX and compliance

How to Apply
When you submit your proposal, please include:
2–3 Shopify public apps you’ve shipped (links + your role)
Short note on how you’d structure the queue/scheduler & consent syncing
Your messaging provider preference (Twilio vs Telnyx) and why
Example Admin GraphQL query or mutation you’ve used recently
Your proposed milestone plan, timeline, and budget
We are looking to partner with someone long-term to develop further new features already planned for the app.

SKILL REQUIREMENT
VIEW OTHER JOB POSTS FROM:
SHARE THIS POST
facebook linkedin
  BENCHMARKS  
Loading Time: Base Classes  0.0010
Controller Execution Time ( Jobseekers / Job )  0.0178
Total Execution Time  0.0217
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,506,152 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Developer-Required-to-Build-a-Public-Embedded-Shopify-App-1469642
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0099 seconds)  (Hide)
0.0016   SELECT *
                                
FROM exrates
                                WHERE rate_name 
'USD-PHP' 
0.0004   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1469642
 LIMIT 1 
0.0003   SELECT *
FROM `employers`
WHERE `employer_id` = 854129
 LIMIT 1 
0.0015   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `miscON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1469642
AND `misc`.`idIS NULL 
0.0004   SELECT e.business_namee.logoe.websitee.rebill_datee.date_added member_datehitsDATEDIFF('2026-04-19',ej.date_added) duration_daysDATEDIFF('2026-04-19',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-04-19',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != AND ej.deleted AND job_id '1469642' 
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1469642 
0.0019   UPDATE employer_jobs SET hit_counts '***Sep-15-2025=184***Sep-16-2025=17***Sep-17-2025=15***Sep-18-2025=11***Sep-19-2025=6***Sep-20-2025=6***Sep-21-2025=4***Sep-22-2025=7***Sep-23-2025=3***Sep-24-2025=4***Sep-25-2025=2***Sep-26-2025=3***Sep-27-2025=1***Sep-28-2025=3***Sep-29-2025=4***Sep-30-2025=4***Oct-01-2025=3***Oct-03-2025=1***Oct-04-2025=3***Oct-07-2025=2***Oct-08-2025=3***Oct-09-2025=4***Oct-10-2025=1***Oct-12-2025=1***Oct-13-2025=2***Oct-14-2025=2***Oct-16-2025=2***Oct-18-2025=1***Oct-19-2025=1***Oct-20-2025=2***Oct-21-2025=1***Oct-22-2025=1***Oct-25-2025=2***Oct-27-2025=1***Oct-28-2025=5***Oct-29-2025=2***Oct-31-2025=2***Nov-03-2025=1***Nov-06-2025=1***Nov-08-2025=1***Nov-09-2025=1***Nov-12-2025=1***Nov-15-2025=1***Nov-17-2025=2***Nov-18-2025=1***Nov-21-2025=1***Nov-24-2025=1***Nov-27-2025=1***Dec-11-2025=1***Dec-16-2025=61***Dec-17-2025=30***Dec-18-2025=10***Dec-19-2025=6***Dec-20-2025=9***Dec-21-2025=2***Dec-22-2025=4***Dec-23-2025=5***Dec-24-2025=6***Dec-25-2025=5***Dec-27-2025=1***Dec-28-2025=1***Dec-29-2025=4***Dec-30-2025=3***Jan-01-2026=1***Jan-02-2026=1***Jan-04-2026=6***Jan-05-2026=2***Jan-06-2026=5***Jan-10-2026=2***Jan-11-2026=3***Jan-12-2026=3***Jan-13-2026=2***Jan-14-2026=1***Jan-16-2026=1***Jan-17-2026=1***Jan-22-2026=1***Jan-23-2026=1***Jan-24-2026=1***Jan-26-2026=1***Jan-28-2026=3***Jan-29-2026=2***Jan-31-2026=1***Feb-06-2026=1***Feb-11-2026=2***Feb-14-2026=1***Feb-16-2026=1***Feb-20-2026=1***Feb-22-2026=1***Feb-27-2026=1***Feb-28-2026=1***Mar-01-2026=4***Mar-03-2026=2***Mar-04-2026=1***Mar-06-2026=1***Mar-09-2026=1***Mar-10-2026=1***Mar-13-2026=1***Mar-17-2026=1***Mar-19-2026=1***Mar-21-2026=1***Mar-26-2026=1***Mar-29-2026=1***Apr-05-2026=2***Apr-06-2026=1***Apr-08-2026=1***Apr-14-2026=3***Apr-18-2026=1***Apr-19-2026=1' WHERE job_id'1469642'  
0.0010   UPDATE employer_jobs SET monthly_hits '***Sep-2025=274***Oct-2025=42***Nov-2025=12***Dec-2025=148***Jan-2026=38***Feb-2026=9***Mar-2026=16***Apr-2026=9' WHERE job_id'1469642'  
0.0010   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id '' AND job_id '1469642' AND status LIKE 'sent%' ORDER BY id DESC  
0.0002   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1469642 
0.0003   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '854129'
AND `date_added` >= '2022-06-08' 
0.0008   select from teasers 
0.0002   SELECT FROM skill_categories WHERE skill_cat_id='' 
  HTTP HEADERS  (Show)
  SESSION DATA  (Show)
  CONFIG VARIABLES  (Show)