v0.7.0
Added
- Prefixed entity IDs: All IDs now use
pc_{entity}_{32_hex_chars}format (e.g.,pc_usr_,pc_org_,pc_lic_)- Instant entity type identification in logs and support tickets
- Collision avoidance with payment provider IDs (Stripe's
prod_,cus_,sub_) - New
src/id.rsmodule withEntityTypeenum for 15 entity types
- Transaction tracking: Revenue analytics decoupled from licenses
GET /orgs/{org_id}/transactions[/stats]— org-level revenueGET /orgs/{org_id}/projects/{project_id}/transactions[/stats]— project-level revenueGET /orgs/{org_id}/projects/{project_id}/licenses/{license_id}/transactions— license history- Filters:
product_id,transaction_type,date_range,test_mode - Stats:
total_revenue,net_revenue,transactions_by_type
- Feedback and crash reporting: Passthrough to dev-configured endpoints (no PII storage)
POST /feedbackandPOST /crashendpoints (JWT auth required)- Webhook (primary) + email (fallback) delivery with exponential backoff
- Project config:
feedback_webhook_url,feedback_email,crash_webhook_url,crash_email - SDK methods:
submitFeedback(),reportCrash(),reportError()with stack trace sanitization
- Usage metering webhook: Optional billing events for hosted deployments
- Email events:
activation_sent,feedback_sent,crash_sentwithdelivery_method - Sales events:
purchase,renewal,refundwith transaction details - Configure via
PAYCHECK_METERING_WEBHOOK_URL
- Email events:
- Refund handling: Stripe and LemonSqueezy refund webhooks create
refundtransactions - Subscription renewal transactions: Renewal webhooks now create transaction records
- 3-level email config lookup: Product → Project → Org inheritance for
email_config_id - Configurable request body size:
PAYCHECK_MAX_BODY_SIZEenv var (default: 1MB) - Docusaurus documentation site: Comprehensive docs at docs.paycheck.dev
- SDK issuer validation: Rust and TypeScript SDKs reject JWTs not issued by Paycheck
Changed
- Breaking:
/validateendpoint now accepts full JWT token instead of justjti - README simplified to point to hosted documentation
- SDK package metadata updated with correct license (Elastic-2.0) and repository URL
- Use
OsRnginstead ofthread_rng()for all cryptographic operations - Memory limits added to activation rate limiter (DoS prevention)
Fixed
- Project restore endpoint unreachable: Moved to
org_routeslayer (middleware was rejecting soft-deleted projects) - Service config deletion: Now uses TOCTOU-safe transaction
- Soft delete restore cascades:
project_membersnow properly restored with parent - Queries excluding soft-deleted entities: Joined entity lookups now filter
deleted_at - CORS headers: Added
x-on-behalf-ofto allowed headers - Feedback billing fairness: Metering correctly reports
org_keyvssystem_keyfor all email types
Full Changelog: v0.6.2...v0.7.0