Get customer portal settings
Retrieves the customer portal configuration and settings for the authenticated shop. The customer portal is the self-service interface where subscribers can manage their subscriptions, update payment methods, modify delivery addresses, and more.
What is the Customer Portal? The customer portal is a dedicated web interface that allows your subscribers to manage their subscription accounts independently. This reduces support burden and improves customer experience by enabling self-service subscription management.
Settings Returned:
-
Display Configuration:
- Portal theme and branding settings
- Custom colors and logo
- Layout preferences
- Custom CSS selectors
-
Feature Toggles:
- Enable/disable subscription pausing
- Enable/disable order skipping
- Enable/disable product swapping
- Enable/disable frequency changes
- Enable/disable quantity modifications
- Enable/disable address editing
- Enable/disable payment method updates
- Enable/disable subscription cancellation
-
Subscription Management Options:
- Maximum pause duration allowed
- Minimum subscription duration requirements
- Skip limits per billing cycle
- Product swap availability
- One-time product add-ons
-
Communication Settings:
- Email notification preferences
- Custom portal messaging
- Support contact information
- Help text and instructions
-
Access Control:
- Portal authentication method
- Password requirements
- Magic link settings
- Session duration
-
Advanced Options:
- Custom domain configuration
- Redirect URLs
- Webhook endpoints
- Analytics tracking settings
Use Cases:
- Display customer portal with correct branding and theme
- Determine which features are available to subscribers
- Build custom portal interfaces using your settings
- Sync portal configuration across systems
- Validate subscription management capabilities
- Configure third-party integrations
Important Notes:
- Settings are shop-specific and unique per merchant
- Some features may be restricted based on subscription plan
- Changes to settings are reflected immediately in the portal
- Custom CSS must be valid and secure
- Portal URL is typically: shop-domain.com/apps/subscriptions
Common Configuration Scenarios:
1. Standard Self-Service Portal:
- Allow pausing (up to 3 months)
- Allow skipping (max 2 consecutive orders)
- Allow frequency changes
- Allow quantity updates
- Allow address editing
- Enable payment method updates
- Enable cancellation with feedback
2. Locked-Down Portal (Minimal Self-Service):
- Disable pausing
- Disable skipping
- Disable cancellation (require support contact)
- Allow address editing only
- Allow payment method updates only
3. Full-Service Portal (Maximum Flexibility):
- Enable all subscription management features
- Allow unlimited pauses and skips
- Enable product swapping
- Enable one-time add-ons
- Allow subscription splitting/merging
- Custom branding and domain
Authentication: Requires valid X-API-Key header
curl --request GET \
--url https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}import requests
url = "https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}';
const options = {method: 'GET'};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"allowAddressEdit": true,
"allowCancellation": true,
"allowFrequencyChange": true,
"allowPause": true,
"allowPaymentMethodUpdate": true,
"allowProductSwap": true,
"allowQuantityChange": true,
"allowSkip": true,
"authentication": {
"method": "MAGIC_LINK",
"requireEmailVerification": true,
"sessionDuration": 3600
},
"createdAt": "2024-01-15T10:30:00Z",
"customDomain": "subscriptions.example.com",
"enableOneTimeProducts": true,
"id": 12345,
"maxConsecutiveSkips": 2,
"maxPauseDuration": 90,
"minimumSubscriptionCycles": 3,
"notifications": {
"sendCancellationConfirmation": true,
"sendFrequencyChangeConfirmation": true,
"sendPauseConfirmation": true,
"sendSkipConfirmation": true
},
"portalEnabled": true,
"requireCancellationReason": true,
"shop": "example-shop.myshopify.com",
"supportContact": {
"chatEnabled": true,
"email": "support@example.com",
"phone": "+1-800-123-4567"
},
"theme": {
"accentColor": "#F5A623",
"customCss": ".subscription-card { border-radius: 8px; }",
"fontFamily": "'Helvetica Neue', Arial, sans-serif",
"logoUrl": "https://cdn.shopify.com/s/files/1/0000/0000/files/logo.png",
"primaryColor": "#4A90E2",
"secondaryColor": "#50E3C2"
},
"updatedAt": "2024-02-20T14:45:00Z"
}{
"detail": "Valid X-API-Key header is required",
"status": 401,
"title": "Authentication required",
"type": "https://example.com/errors/unauthorized"
}{
"detail": "API key does not have permission to view portal settings",
"status": 403,
"title": "Insufficient permissions",
"type": "https://example.com/errors/forbidden"
}{
"detail": "Customer portal settings have not been configured for this shop",
"status": 404,
"title": "Settings not found",
"type": "https://example.com/errors/not-found"
}Headers
Path Parameters
Query Parameters
API Key (Deprecated - Use Header X-API-Key instead)
Response
Customer portal settings successfully retrieved
NONE, EXISTING_PLAN, PRODUCT_PLAN, PRODUCT_THEN_EXISTING ALL_PRODUCTS, PRODUCTS_FROM_ALL_PLANS, PRODUCTS_FROM_CURRENT_PLAN LEGACY_UNION, COMPATIBLE_ONLY Show child attributes
Show child attributes
PERCENTAGE, AMOUNT curl --request GET \
--url https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}import requests
url = "https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}';
const options = {method: 'GET'};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://subscription-admin.appstle.com/api/external/v2/customer-portal-settings/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"allowAddressEdit": true,
"allowCancellation": true,
"allowFrequencyChange": true,
"allowPause": true,
"allowPaymentMethodUpdate": true,
"allowProductSwap": true,
"allowQuantityChange": true,
"allowSkip": true,
"authentication": {
"method": "MAGIC_LINK",
"requireEmailVerification": true,
"sessionDuration": 3600
},
"createdAt": "2024-01-15T10:30:00Z",
"customDomain": "subscriptions.example.com",
"enableOneTimeProducts": true,
"id": 12345,
"maxConsecutiveSkips": 2,
"maxPauseDuration": 90,
"minimumSubscriptionCycles": 3,
"notifications": {
"sendCancellationConfirmation": true,
"sendFrequencyChangeConfirmation": true,
"sendPauseConfirmation": true,
"sendSkipConfirmation": true
},
"portalEnabled": true,
"requireCancellationReason": true,
"shop": "example-shop.myshopify.com",
"supportContact": {
"chatEnabled": true,
"email": "support@example.com",
"phone": "+1-800-123-4567"
},
"theme": {
"accentColor": "#F5A623",
"customCss": ".subscription-card { border-radius: 8px; }",
"fontFamily": "'Helvetica Neue', Arial, sans-serif",
"logoUrl": "https://cdn.shopify.com/s/files/1/0000/0000/files/logo.png",
"primaryColor": "#4A90E2",
"secondaryColor": "#50E3C2"
},
"updatedAt": "2024-02-20T14:45:00Z"
}{
"detail": "Valid X-API-Key header is required",
"status": 401,
"title": "Authentication required",
"type": "https://example.com/errors/unauthorized"
}{
"detail": "API key does not have permission to view portal settings",
"status": 403,
"title": "Insufficient permissions",
"type": "https://example.com/errors/forbidden"
}{
"detail": "Customer portal settings have not been configured for this shop",
"status": 404,
"title": "Settings not found",
"type": "https://example.com/errors/not-found"
}