---
# System prepended metadata

title: Autonomy premium account subscription design
tags: [Autonomy]

---

# Autonomy premium account subscription design

###### tags: `Autonomy`

## Terms
1. Persona
2. Receipt: A valid base64 string returns from Apple/Google when a user finishes their purchase.
3. Client-only premium features: Features that don't require the server side to involve.
4. Server side premium features


## Flow

### Subscription

```mermaid
sequenceDiagram

autonumber

    Client->>+Subscription Server: GET /subscriptions/current
    Subscription Server-->>-Client: subscription status
    
    alt if not subscribed
        Client->>Client: finish subscription
        Client->>+Subscription Server: POST /subscriptions/receipts
        Subscription Server->>+Apple: POST https://buy.itunes.apple.com/verifyReceipt
        Note left of Apple: See appendex 1.
        Apple->>-Subscription Server: receipt info
        Subscription Server->>Subscription Server: Update the subscription information
    else
    end

    Apple->>Subscription Server: POST /subscriptions/callback/apple 
    Note left of Apple: See appendex 2.
```

#### Appendix

1. [Send a receipt to the App Store for verification](https://developer.apple.com/documentation/appstorereceipts/verifyreceipt)
    > As a best practice, always call the production URL for verifyReceipt first, and proceed to verify with the sandbox URL if you receive a 21007 status code.
2. [App Store Server Notifications](https://developer.apple.com/documentation/storekit/in-app_purchase/subscriptions_and_offers/enabling_app_store_server_notifications)

## Backend Design


### Premise

- Based on discussion in [slack thread](https://bitmark.slack.com/archives/C01EPPD07HU/p1633941432033700?thread_ts=1633938186.025400&cid=C01EPPD07HU), we allow a receipt be bound to multiple accounts.
- Wait for the design of account validation. (For example, using DID)

### API

#### GET /auth

Request: 

```json
{
    "platform": "apple",
    "receipt_data": "<base64 apple subscription receipt>"
}
```

Response:

```json
{
    "jwt": "<json web token>"
}
```