Update pricing UX, billing flows, and API rules

This commit is contained in:
Dwindi Ramadhana
2026-02-12 00:52:40 +07:00
parent cf065fab1e
commit a905256353
202 changed files with 22348 additions and 301 deletions

View File

@@ -43,7 +43,7 @@
- [x] Implement `GET /v1/categories`.
- [x] Implement `POST /v1/license/verify` (temporary env-based validation).
- [x] Support both `q` and `query`.
- [ ] Add/verify full response contract parity with live docs (`variants`, `related`, trimmed `keywords_en`, limit behavior by tier).
- [x] Add/verify full response contract parity with live docs (`variants`, `related`, trimmed `keywords_en`, limit behavior by tier).
- [x] Match live cache/rate semantics baseline (`page=1` metering behavior, 401/429 payload shape, ETag/304 behavior).
- [x] Verify header compatibility baseline: `Authorization`, `X-License-Key`, `X-Account-Id`, `X-Dewemoji-Frontend`, `X-Dewemoji-Tier`.
- [x] Restrict CORS to configured origins (no default `*`).
@@ -63,9 +63,9 @@
- [x] Keep URL behavior parity (canonical no-trailing-slash pages, redirect rules, pretty-to-query hydration).
- [x] no-trailing-slash redirect middleware and canonical link baseline implemented.
- [x] pretty route hydration wired into homepage initial filters + URL sync.
- [ ] Port homepage behavior parity:
- [x] Port homepage behavior parity:
- API-backed filters (`q`, category, subcategory), URL sync, load-more pagination.
- API fallback when scoped search returns 0 (retry on `all` + hint).
- [ ] API fallback when scoped search returns 0 (retry on `all` + hint).
- [ ] Port single emoji page parity:
- 404 `noindex` for missing.
- 410 + `X-Robots-Tag: noindex, noarchive` for policy-hidden emoji.
@@ -73,17 +73,17 @@
- related fallback (same subcategory), prev/next navigation.
- details blocks: aliases, shortcodes, EN/ID keywords, copy interactions.
- curated blurbs support from `data/emoji_descriptions.json`.
- [ ] Port legal/support content parity and FAQ schema blocks.
- [x] Port legal/support content parity and FAQ schema blocks.
### Phase 4 - Pricing and payments
- [ ] Keep pricing structure parity:
- [x] Keep pricing structure parity:
- Free, Pro subscription, Lifetime.
- Pro: `$3/mo` and yearly display `$27/yr` in UI.
- Lifetime: `$69`.
- [ ] Preserve live Gumroad links:
- [x] Preserve live Gumroad links:
- `https://dwindown.gumroad.com/l/dewemoji-pro-subscription`
- `https://dwindown.gumroad.com/l/dewemoji-pro-lifetime`
- [ ] Keep IDR/Mayar messaging parity (manual-renew note).
- [x] Keep IDR/Mayar messaging parity (manual-renew note).
- [ ] Implement real license lifecycle (activate/deactivate/verify + max 3 Chrome profiles) in new backend.
- [x] Implement real license lifecycle baseline in rebuild (`verify/activate/deactivate`, immutable owner binding behavior, max device cap).
- [ ] Implement provider verification parity:
@@ -92,10 +92,10 @@
- [x] Gumroad verify API flow (final payload/contract parity with live provider account)
- [x] Mayar verify API flow (final payload/contract parity with live provider account)
- gateway mode switch (`sandbox` vs `live`)
- [ ] Implement immutable license binding to user + multi-device activation policy parity.
- [x] Implement immutable license binding to user + multi-device activation policy parity.
### Phase 5 - SEO parity (must not disrupt GSC)
- [ ] Preserve canonical strategy for all pages (including emoji detail + pretty category pages).
- [x] Preserve canonical strategy for all pages (including emoji detail + pretty category pages).
- [x] Add/verify meta + social tags parity baseline: title/description/OG/Twitter + theme color.
- [ ] Port JSON-LD strategy:
- [x] Global `WebSite` + `SearchAction` + Organization.
@@ -105,12 +105,13 @@
- [x] `CreativeWork` + `BreadcrumbList` baseline on emoji pages.
- [x] Implement `robots.txt` parity and dynamic `sitemap.xml` baseline.
- [x] Ensure sitemap excludes policy-hidden emoji URLs (same filter policy as live).
- [ ] Keep core indexed URLs stable: `/`, `/pricing`, `/api-docs`, `/support`, `/privacy`, `/terms`, `/emoji/{slug}`.
- [x] Keep core indexed URLs stable: `/`, `/pricing`, `/api-docs`, `/support`, `/privacy`, `/terms`, `/emoji/{slug}`.
### Phase 6 - Analytics, consent, and compliance
- [ ] Re-implement cookie consent flow before analytics activation.
- [ ] Re-implement GA4 only on allowed production hosts (live uses `G-R7FYYRBVJK`).
- [ ] Keep privacy/terms statements aligned with live content.
- [ ] Add light/dark mode toggle in UI (persist user preference).
### Phase 7 - Data/ops pipelines
- [ ] Port blurb pipeline:
@@ -124,6 +125,12 @@
- Keywords index build (`build_keywords_json_from_sql.php`)
- Unicode parity validation (`validate_emojis_against_unicode.php`)
- License expiry revocation cron (`check_license_expiry.php`)
- [x] Added live SQL import command for app DB (`php artisan dewemoji:import-live-sql`).
- [x] Added legacy table migrations + JSON normalization for import.
- [ ] Port legacy JSON generator as Laravel command (cache-first strategy):
- Source: `dewemoji-live-backend/jobs/build_emojis_json_from_sql.php`
- Output: `app/data/emojis.json` (default API dataset)
- [ ] Add scheduled task (Coolify) for JSON rebuild (daily or on-demand).
### Phase 8 - Community feature migration
- [ ] Port contributor auth flow:
@@ -159,6 +166,7 @@
- [ ] Add deployment runbook with minimum required env vars and health verification steps.
- [ ] Add post-deploy smoke checks (`/`, `/v1/health`, `/v1/emojis`, `/robots.txt`, `/sitemap.xml`).
- [x] Add container healthcheck for app service using `/v1/health`.
- [x] Staging data sync validated using R2 upload + import flow.
## Recent implementation update
@@ -197,10 +205,22 @@
- Added billing provider hardening:
- Gumroad: validate `is_valid`, reject refunded/chargebacked purchases, preserve product-id matching.
- Mayar: broaden request payload compatibility, normalize multiple response shapes, optional product-id allowlist (`DEWEMOJI_MAYAR_PRODUCT_IDS`).
- Added live SQL import tooling:
- New migrations for legacy tables + import service
- JSON normalization for legacy `meta_json`/`payload`/`raw_response` fields
- API list responses now always include `plan` for pro/free tests.
- Added SEO polish:
- Global JSON-LD for `WebSite`, `SearchAction`, and `Organization` in shared layout.
- Static `public/robots.txt` now explicitly allows crawling and exposes sitemap URL.
## Cache strategy decision (open)
- Current API reads from `app/data/emojis.json`.
- Live legacy server regenerates that JSON from MySQL via cron:
- `dewemoji-live-backend/jobs/build_emojis_json_from_sql.php`
- Recommendation: keep JSON cache (fast + stable) and port the generator into Laravel,
then schedule it in Coolify (daily or on-demand).
## Live audit highlights (reference)
- Live web routes in `dewemoji-live/public_html`: `/`, `/emoji/{slug}`, `/browse`, `/pricing`, `/api-docs`, `/support`, `/privacy`, `/terms`, `/sitemap.xml`.