Files
where_woof/docs/PRODUCT-MODEL.md

75 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Where Woof — Product Model & Pricing (AUD)
Scope: keep small and lean now; rebuild a larger system once there are a few thousand customers.
**Explicitly out of scope (from the old CMS):** the page-builder/CMS flow and SMS campaigns — ignored.
## Two use cases (the core split)
| | **Info tags** (bulk operators: parks, trails, campgrounds) | **Owner-alert tags** (dogs, luggage, valuables) |
|---|---|---|
| What the finder sees | Rich info page (multilingual, custom content per tag) | Return details + call/SMS the owner |
| SMS to owner | **Never** (no SMS → no SMS cost) | **Automatic on every scan with location** (+ finder can also message) |
| Pricing | Per-tag or annual license | $1 tag + annual fee with **metered SMS** |
| Cost exposure | ~zero (DB only) | SMS metered (the business's only real variable cost) |
## How SMS actually fires (important)
- When a finder scans and **approves location → an SMS is automatically sent to the owner**. It is not the scanner's choice (they can *also* send one via the contact form).
- So: **every scan-with-location = 1 SMS = cost**. The throttles (250 m / 10 min, fingerprint 24 h, daily/IP caps) are *cost control*, but different finders at different spots legitimately each alert.
- A heavily-lost dog could generate several SMS/day → that's the meter working as designed (frequent loss → credits consumed → top-ups).
## Costs to design against (AUD, ex GST — 10% GST to add at checkout)
| Item | Cost |
|---|---|
| SMSGlobal **prepaid** (current) | ~**AU$0.06 / SMS** |
| SMSGlobal plans at volume (Build→Scale) | ~$0.03 → ~$0.013 / SMS |
| DB/storage/bandwidth per scan | **negligible** (a scan ≈ 100150 bytes; 10k scans/day ≈ 1.5 MB/day) — data is not a cost driver, SMS is |
| Tag manufacture (Asia, preset) | your cost basis; retail margin on top |
## Proposed retail pricing (AUD) — pinch points to tune
**Owner-alert tags**
- Tag: **$1.502.00** per tag (one-off)
- Annual plan: **$5/year = 10 SMS** (your cost ≈ 60¢ prepaid → ~88% margin)
- **Top-ups**: $2.50 / 5 SMS · $4.50 / 10 SMS · $8 / 20 SMS
- Unused credits: roll over within the year; reset (or cap) at renewal — decide per plan
**Family bundles** (pooled SMS across the account's tags)
- **5 tags / $20 yr** (50 SMS pool) · **10 tags / $35 yr** (100) · **20 tags / $60 yr** (200)
- Cost check @6¢: 20-tag plan = 200 SMS × 6¢ = $12 vs $60 retail → ~80% margin even if fully used
**Info tags (bulk)**
- e.g. **$1.50/tag** one-off **or** an annual operator license (e.g. $30/yr for up to 100 tags + content management) — no SMS, near-100% margin; tune with the parks use case
**✅ Done**: server-side metering (per-tag credits, admin top-up), renewal date + lazy expiry, unlock notice to the owner (ntfy/SMS) when gated by lapsed or credits. **Remaining pinch points:**
1. **Metering enforced server-side** — count only *sent* (OK:0) SMS; block when credits hit 0 → triggers the unlock flow.
2. **Renewal reminders** (30/7/1 days before) + **grace period** (~7 days) before lapsed.
3. **Top-up profitability at the 6¢ prepaid rate** (works above; even better on a plan).
4. **GST** (10%) — decide ex/incl display.
5. Finder-contact SMS counts toward the **same** meter.
6. Bulk-operator licenses vs per-tag — pick per deal.
## The missed location-link flow
- Scan → owner SMS contains a **short URL** (`where-woof.com/s/Ab3xY9` — shortener needed; also keeps lat/lng out of the SMS, which is already ~160-char constrained).
- The link opens a **location page**: embedded Google Map of the finder's position + finder details (phone if left) + link back to the tag page.
- **Unpaid variant**: the SMS/email instead says *"your item was found — pay the $5 annual fee to unlock the details"* (the 2014 `late_payment` flow). ⚠️ No email system yet — use SMTP (hosting) or ntfy on .13 as interim.
- Location page is the owner's private view: keyed by the unguessable short code; decide validity window.
## Product range & variants (coming)
- Tags are **manufactured in Asia → preset IDs** (100 in registry; new runs generate IDs per production order).
- Broader range coming: **sizes, colours, plaques (outdoor), screw-on** etc. → needs `product_variants` (products + variant attributes) later.
- QR/NFC **production step needed** for new runs (QR generation util — the old `qrcode.php` pattern).
- Multilingual info pages (i18n) for the info-tag use case.
## Schema implications (future, keep lean)
- `sms_allocated` / `sms_used` per tag or account + a **top-up ledger** (the old `sms_billing` / `product_network_costs` concept).
- `orders` already has status (pending/paid/lapsed/cancelled) → renewal = new order/period; add `renews_at`.
- `users.paused` (admin pause → gate alerts) + audit log (`product_accounts_actions` pattern).
- `url_shortened` table + `location_page` (scan → location page keyed by code).
- `product_variants` when the range expands.
- Email channel abstraction (ntfy now, SMTP later).