> For the complete documentation index, see [llms.txt](https://staysignal.gitbook.io/staysignal-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://staysignal.gitbook.io/staysignal-docs/integration-guides/finding-stripe-subscription-ids.md).

# Finding Stripe Subscription IDs

### Finding Stripe Subscription IDs <a href="#finding-subscription-ids" id="finding-subscription-ids"></a>

Staysignal requires a `subscription_id` to identify which subscription a user is trying to cancel. Here are ways to find and use a user's Stripe subscription ID:

#### From Your Database

Most applications store subscription IDs in their database after a successful Stripe subscription creation. This is the recommended approach for performance and reliability.

{% tabs %}
{% tab title="Javascript/Node.js" %}

```javascript
<script>
// Example using Node.js with Express and MongoDB
app.get('/account', async (req, res) => {
  try {
    // Get user ID from session/JWT
    const userId = req.user.id;
    
    // Fetch subscription from your database
    const user = await User.findById(userId).populate('subscription');
    const subscriptionId = user.subscription?.stripeSubscriptionId;
    
    res.render('account', { 
      user, 
      subscriptionId  // Pass to your view
    });
  } catch (error) {
    console.error('Error fetching subscription:', error);
    res.status(500).send('Server error');
  }
});
</script>
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
// Example using PHP with Laravel
public function showAccount()
{
    $user = Auth::user();
    $subscription = $user->subscription; // Assuming relationship is set up
    $subscriptionId = $subscription ? $subscription->stripe_subscription_id : null;
    
    return view('account', [
        'user' => $user,
        'subscriptionId' => $subscriptionId
    ]);
}
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Example using Ruby on Rails
class AccountController < ApplicationController
  def show
    @user = current_user
    @subscription = @user.subscription
    @subscription_id = @subscription&.stripe_subscription_id
  end
end

# In your view: account.html.erb
<button class="staysignal-cancel" data-subscription_id="<%= @subscription_id %>">
  Cancel Subscription
</button>
```

{% endtab %}

{% tab title="Python" %}

```python
# Example using Django
def account_view(request):
    user = request.user
    subscription = Subscription.objects.filter(user=user).first()
    subscription_id = subscription.stripe_subscription_id if subscription else None
    
    return render(request, 'account.html', {
        'user': user,
        'subscription_id': subscription_id
    })
```

{% endtab %}
{% endtabs %}

#### Fetching from Stripe API

If you need to fetch the subscription ID directly from Stripe (not recommended for production):

{% tabs %}
{% tab title="Node.js" %}

```javascript
<script>
// Using Stripe Node.js SDK
const stripe = require('stripe')('sk_test_your_stripe_secret_key');

async function getCustomerSubscriptions(customerId) {
  try {
    const subscriptions = await stripe.subscriptions.list({
      customer: customerId,
      status: 'active',
      limit: 1
    });
    
    if (subscriptions.data.length > 0) {
      return subscriptions.data[0].id; // Returns the subscription ID
    }
    return null;
  } catch (error) {
    console.error('Error fetching from Stripe:', error);
    throw error;
  }
}
</script>
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
// Using Stripe PHP SDK
require_once 'vendor/autoload.php';
StripeStripe::setApiKey('sk_test_your_stripe_secret_key');

function getCustomerSubscriptions($customerId) {
    try {
        $subscriptions = StripeSubscription::all([
            'customer' => $customerId,
            'status' => 'active',
            'limit' => 1
        ]);
        
        if (count($subscriptions->data) > 0) {
            return $subscriptions->data[0]->id;
        }
        return null;
    } catch (Exception $e) {
        error_log('Stripe API Error: ' . $e->getMessage());
        return null;
    }
}
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Using Stripe Ruby SDK
require 'stripe'
Stripe.api_key = 'sk_test_your_stripe_secret_key'

def get_customer_subscriptions(customer_id)
  begin
    subscriptions = Stripe::Subscription.list(
      customer: customer_id,
      status: 'active',
      limit: 1
    )
    
    return subscriptions.data.first&.id
  rescue Stripe::StripeError => e
    Rails.logger.error("Stripe API Error: #{e.message}")
    return nil
  end
end
```

{% endtab %}

{% tab title="Python" %}

```python
# Using Stripe Python SDK
import stripe
stripe.api_key = "sk_test_your_stripe_secret_key"

def get_customer_subscriptions(customer_id):
    try:
        subscriptions = stripe.Subscription.list(
            customer=customer_id,
            status='active',
            limit=1
        )
        
        if subscriptions.data:
            return subscriptions.data[0].id
        return None
    except stripe.error.StripeError as e:
        print(f"Stripe API Error: {e}")
        return None
```

{% endtab %}
{% endtabs %}

**Security Considerations**

Always follow these security best practices:

* Never expose your Stripe secret key in client-side code
* Implement proper authentication before showing/using subscription IDs
* If using the Stripe API directly, cache the results to minimize API calls
* Consider using [Stripe Webhooks](https://stripe.com/docs/webhooks) to keep your database in sync with Stripe

### Need Help?

If you encounter any issues with the integration, please contact our support team.
