Commit 2ca28ed
Ultra: Teams, per-seat billing, and plugin access (#274)
* Ultra
* Add Ultra teams, per-seat billing, and plugin access system
- Team management with Livewire (create teams, invite/remove members, add/remove seats)
- Per-seat billing via Stripe with confirmation modals and loading states
- Free official plugins for Ultra subscribers ($0 pricing, skip Stripe checkout)
- Team member plugin access (inherit owner's licenses, revoked on removal)
- Satis API support for team plugin downloads
- Team plugins section on Purchased Plugins page
- Dashboard Premium Plugins count includes team plugins
- Ultra nav link in mobile and desktop menus
- Comped subscription tracking (is_comped field + MarkCompedSubscriptions command)
- Plugin marketplace shows "Free with Ultra" badge for official plugins
- Comprehensive test coverage for all features
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Teams
* Fix duplicate ownedTeam method and restore team plugin access logic
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Per-seat billing UI, comped sub exclusion, and plugin submission flow improvements
- Add seat management UI with Add/Remove Seats modals and Stripe billing
- Pending invitations now count against seat capacity
- Comped Max subscriptions excluded from Ultra features
- Move Stripe Connect and author display name into plugin submission flow
- Dashboard card badges wrap on smaller layouts
- Fix PHP 8.5 PDO deprecation in database config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Ultra upgrade flow with swap, upsell banner, and confirmation modal
Existing subscribers can now upgrade to Ultra via swap() instead of
creating a duplicate subscription. The pricing page detects active
subscriptions and shows an upgrade button with a confirmation modal
that includes monthly/annual interval selection. A dashboard upsell
banner directs non-Ultra subscribers to the pricing page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add comped Ultra subscription command, config, and plugin access tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Max-to-Ultra announcement email, command, and tests
One-time notification for paying Max subscribers about the Ultra rename.
Includes dry-run support, comped/Pro exclusion, and full test coverage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Ultra upgrade promotion email, command, and tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add license holder promo, Plugin Dev Kit benefit, and monthly billing option
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Dashboard UI overhaul: Flux components, license renewal, plugin submission, teams
- Convert dashboard cards, sub-license manager, purchase history, team manager, and settings to Flux components
- Add masked license key component to prevent leaking via screen share
- Move license renewal under /dashboard with auth, add yearly ($250) and monthly ($35) Ultra upgrade options
- Split plugin repo selector into account picker + searchable repo dropdown
- Remove Stripe Connect section from My Plugins (moved to Settings)
- Fix Carbon 3 signed float issue with diffInDays() on license expiry
- Add create/edit sub-license modals with Livewire
- Add sidebar team management link for Ultra subscribers
- Add comprehensive tests for all new functionality
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Move namespace check before plugin creation in submission flow
Pre-validate composer.json and namespace availability by fetching from
GitHub before creating any plugin record. Also split repo selector into
account picker + searchable dropdown, fix dropdown click-outside behavior,
and remove Stripe Connect section from My Plugins index.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix CI failures: Pint formatting, test compatibility, and team plugins view
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Deferred repo loading, cached GitHub API, Flux Pro searchable selects
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Ultra teams: dashboard team pages, sidebar improvements, pricing & notification updates
- Add per-team detail page showing membership benefits and accessible plugins
- Show each team by name in sidebar and dropdown menu (supports multiple teams)
- Collapse sidebar groups by default with spacing between sections
- Add pro-rata pricing breakdown to add-seats modal
- Show billing-interval-specific pricing (monthly or yearly, not both)
- Add Ultra link with New badge to public nav, mobile menu, and footer
- Replace third-party plugin discounts with 90% marketplace revenue messaging
- Fix missing validation message when team seat limit is hit
- Fix team members incorrectly getting subscriber-tier pricing
- Add plugin access check for team owner's purchased plugins
- Update cancellation FAQ with plugin retention details
- Add tests for team detail page, plugin access, and pricing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Team dashboard refinements: billing summary, merged plugin list, Flux confirmation modals
- Add billing summary card showing Ultra plan cost, extra seats, and estimated next bill from Stripe
- Merge official and owner-purchased plugins into single de-duplicated list on team member page
- Remove team plugins section from Purchased Plugins page (now on team detail page)
- Replace browser confirm() with Flux modals for removing members and cancelling invitations
- Link GitHub repo benefit to Integrations page
- Fix DashboardLayoutTest assertions for new team name sidebar items
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix re-inviting previously removed team members
Reuse the existing Removed team_users record instead of inserting a
duplicate, which violated the team_id+email unique constraint.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Replace hasMaxTierAccess() with hasActiveUltraSubscription() for Ultra-aware platform fee logic
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix plugin icon button layout and update UltraPluginAccessTest for third-party pricing rules
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add team seat validation, owner self-invite prevention, and fix seat counting to include owner
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix billing summary to use annualized seat price instead of raw Stripe unit amount
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Reduce included seats to 5 and show unused seat count in remove modal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove Anystack license creation from subscription handler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update seat counts to 5, add Ultra section to sponsor page, and update discount copy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add EAP pricing on /ultra page, back arrow on license page, and Ultra upsell banner on dashboard
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add upgrade proration preview, persist interval toggle, refresh /ultra page hero and copy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix CI test failures from main merge
- Fix webhook mock in CustomerPluginReviewChecksTest to return 422 so webhook correctly appears as a failing check
- Add missing required supportChannel field in PluginCreateTest
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>1 parent ec1b4d7 commit 2ca28ed
96 files changed
Lines changed: 8041 additions & 1894 deletions
File tree
- app
- Console/Commands
- Enums
- Filament/Resources/UserResource/Pages
- Http
- Controllers
- Api
- Auth
- Requests
- Jobs
- Listeners
- Livewire
- Customer
- Plugins
- Models
- Notifications
- config
- database
- factories
- migrations
- resources/views
- cart
- components
- customer
- layouts
- customer/team
- license
- livewire
- customer
- licenses
- plugins
- routes
- tests/Feature
- Jobs
- Livewire/Customer
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| 70 | + | |
70 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
71 | 75 | | |
72 | 76 | | |
73 | 77 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
0 commit comments