Customer Engagement Platform for Email, Push Notifications, & SMS
모바일 푸시, 웹 푸시, SMS, 이메일, 인앱 메시징 분야 세계 최고, 200만 기업이 신뢰해 연간 120억 건 이상 전송
소매업체 전반에 걸친 경쟁사 가격·재고를 모니터링해 제품을 매칭하고, 확인된 MAP 위반이나 큰 변동 시에만 알림
Monitor competitor prices and stock levels across retailers, matching products and alerting only on confirmed MAP violations or significant changes
AI가 요약 · 페이지와 README에서
마케팅Python · HTMLGitHub @gaopfEditer온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Retail Price & MAP Watch — competitor monitoring that only alerts you when it matters
Monitors 5 retailers/marketplaces on a schedule, matches the same product across sites (GTIN/MPN + fuzzy title with pack-size/variant guards, low-confidence matches go to a review queue), stores full price & stock history, and fires alerts only on meaningful events (drop > X%, out-of-stock, new/delisted, MAP breach confirmed twice). Detects rate limits, challenge pages and layout changes instead of producing false alerts, and notifies you when a source breaks.README 전문 보기 ↗Retail Price & MAP Watch — competitor monitoring that only alerts you when it matters
Monitors 5 retailers/marketplaces on a schedule, matches the same product across sites (GTIN/MPN + fuzzy title with pack-size/variant guards, low-confidence matches go to a review queue), stores full price & stock history, and fires alerts only on meaningful events (drop > X%, out-of-stock, new/delisted, MAP breach confirmed twice). Detects rate limits, challenge pages and layout changes instead of producing false alerts, and notifies you when a source breaks. MAP violations come with screenshot evidence and seller identity; used/bundle/shipping-only cases are filtered out. Exports to CSV, multi-sheet Excel and Google Sheets; alerts via Telegram, Slack or email. Python · FastAPI · Playwright · SQLite/Postgres · Docker. Runs fully offline with a bundled sandbox so you can try it in 2 minutes.
All retailers, products, prices, and sellers in this repository are synthetic sandbox data for portfolio demonstration. The app does not scrape real stores in the demo.
| Client pain (from Upwork / community research) | How this demo addresses it |
|---|---|
| Alert noise (“200 alerts because price moved 2¢”) | Absolute/percent thresholds, two-observation confirmation, cooldowns, and a visible “noise suppressed” counter with reasons |
| Cross-site matching errors (single unit vs 2-pack) | GTIN/MPN first, fuzzy title with attribute guards; conflicts land in Match Review Queue |
| Blockers / challenge pages / silent bad parses | Fetch layer marks rate_limited / challenge / parse_fail; bad rows do not drive price diffs; Sources Health panel |
| MAP false positives (used, shipping-inclusive) | MAP module filters used/refurb, bundles, and shipping traps; real breaches need consecutive confirmations + evidence HTML |
| Deliver to Sheets/Excel + low ops | CSV + multi-sheet Excel export, notification Outbox (Telegram/Slack/SMTP hooks), Docker one-liner |
flowchart TB
subgraph sandbox [Synthetic Sandbox :8001]
SA[Shop A static HTML]
SB[Shop B JSON API]
SC[Shop C 429 / challenge]
SD[Shop D DOM revisions]
MX[Market X multi-seller]
CLK[Time simulator /admin/tick]
end
subgraph app [Monitor App :8000]
AD[Site adapters]
FE[Fetch: rate limit / retry / challenge detect]
EX[Extract: rules first, LLM optional]
MA[Match: GTIN / guards / fuzzy]
DI[Diff: significance + confirm]
MP[MAP: whitelist + traps + evidence]
RL[YAML rules engine]
SCH[Scheduler / demo pipeline]
UI[Jinja2 + HTMX + Chart.js dashboard]
EXP[CSV / Excel export]
OUT[Notification outbox]
end
DB[(SQLite / Postgres)]
CLK --> SA & SB & SC & SD & MX
AD --> FE --> EX --> MA --> DI
DI --> DB
MA --> DB
MP --> DB
SCH --> AD
UI --> DB
EXP --> DB
OUT --> DB
FE --> sandbox
AD --> sandbox
Layout
docker-compose
├─ sandbox/ FastAPI fake shops + time simulator (8001)
└─ app/ FastAPI monitor + dashboard (8000)
scripts/demo.py 14-day scripted run (tick + ingest)
tests/ Core logic unit tests
docs/screenshots/ Dashboard captures (from Playwright)
data/demo_readonly.db Bundled DB for Vercel read-only demo
docker compose up -d --build
make demo # simulates 14 sandbox days + ingests observations
open http://localhost:8000
Terminal A — sandbox:
pip install -r requirements.txt
cd sandbox && uvicorn main:app --port 8001
Terminal B — demo + dashboard:
pip install -r requirements.txt
playwright install chromium # optional; MAP HTML evidence stubs work without it
make demo-local
cd app && DATABASE_URL=sqlite:///../data/app.db uvicorn main:app --port 8000
Then open http://localhost:8000.
After make demo-local, data/demo_summary.json contains:
{
"events_total": 3133,
"events_pushed": 2,
"events_suppressed": 3131,
"map_detected": 1,
"map_traps_filtered": 1,
"match_queue": 1,
"match_rejected": 1
}
Interpretation: thousands of raw movements collapsed to 2 pushed alerts, with pack-size guard rejections and MAP traps visible on their boards.
| Page | Path | Screenshot |
|---|---|---|
| Overview | / | |
| Events (pushed) | /events | |
| Events (+ suppressed noise) | /events?show_suppressed=1 | |
| Match Review Queue | /match-queue | |
| MAP Board | /map | |
| Sources Health | /sources | |
| Rules & Export / Outbox | /rules | |
| Product detail (example) | /products/{id} |
Regenerate screenshots (app must be running on :8000 with demo DB loaded):
make screenshots
make test
# or: PYTHONPATH=app pytest tests -q
Covers: pack-size match rejection, 2¢ jitter suppression, confirmed real drops, 24h flash-sale suppression, MAP traps, challenge-page detection.
app/adapters/your_shop.py subclassing Adapter with iter_listings() (and parse_html() if HTML).app/adapters/registry.py.sources (seed or UI) with adapter key and base_url.SiteFetcher (interval / retries) — never bypass CAPTCHAs or login.parse_fail and surface in Sources Health.POST /api/run or the scheduler to validate observations.For production clients, only target sites where you have legal permission; use robots.txt and ToS review.
This repo ships a pre-generated SQLite snapshot at data/demo_readonly.db (produced by scripts/demo.py).
vercel.json and api/index.py are at the repo root.READONLY=1).make demo-local and committing an updated data/demo_readonly.db.No API keys required for the public demo.
| Component | Demo | Small prod sketch |
|---|---|---|
| Compute | Docker on a $5–10 VPS or local | 1 small VM running scheduler + Playwright workers |
| Database | SQLite file | Managed Postgres ~$15/mo |
| Playwright | Only for Shop B optional path / MAP evidence | Pool 2–4 browsers on worker nodes |
| LLM | Off by default (LLM_API_KEY empty) | Optional OpenAI-compatible endpoint for missing fields only |
| Egress | Sandbox-only in demo | Scale with SKU count × check frequency; use ETag/hash skips |
MIT (demo / portfolio use). Synthetic catalog and shop names are fictitious.