Update pricing UX, billing flows, and API rules
This commit is contained in:
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user