Zuora is a leading subscription management & billing solution.
Stigg’s native integration with Zuora enables one-way synchronization (Stigg to Zuora) of product catalog (products, plans, add-ons, coupons), customers, subscriptions, and usage. Data does not flow back from Zuora to Stigg.
Entity mapping
By default, Stigg uses the following mapping:
- Stigg plan → Zuora product
- Stigg price → Zuora rate plan and charge
This model prioritizes isolation between plans.
Stigg entities are mapped to Zuora entities as follows:
| Stigg Entity | Zuora Entity |
|---|
| Feature | N/A |
| Product | N/A |
| Plan | Product Rate Plan (“Pro plan”) |
| Add-on | Product Rate Plan (as an add-on) |
| Plan / add-on billing period | Billing period on Product Rate Plan Charge |
| Plan / add-on charge | Product Rate Plan Charge |
| Customer | Account |
| Subscription | Subscription (created via Order) |
Entities that are not synced to Zuora
| Entity | Not synced to Zuora when… |
|---|
| Customer | Customer doesn’t have any subscription |
| Customer only has subscriptions to free plans |
| Customer only has trial subscriptions |
| Customer only has subscriptions to plans with a custom price |
| Customer’s billing information is not sent to Stigg |
| Customer doesn’t have a payment method |
| Syncing of customers is disabled in the environment |
| Subscription | Subscription is for a free plan |
| Subscription is for a trial plan |
| Subscription is for a plan with a custom price |
| Syncing of subscriptions is disabled in the environment |
These are the default rules. Customers and subscriptions can still be forced to sync in special cases. For example, if a Billing ID is set to link with an existing Zuora record or if metadata with the ZUORA__ prefix is provided.
Syncing customer usage to Zuora
When customers are subscribed to plans with pay-as-you-go pricing, feature usage that’s reported to Stigg is synced to Zuora every hour.
When the integration is enabled, it’s possible to manually trigger this sync from the Stigg app by leveraging the “Sync usage to Zuora” action in details screen of the relevant subscription.
Setting up the integration
Create an API user in Zuora
In Zuora, under the Settings section click on Administration
In the opened screen, click on Manage Users.
Create a new user that will be used for the integration with Stigg.
A valid email address is required for activation of the Zuora user.
Set the following roles:
- Zuora Platform Role - API User
- Billing Role - Zuora Billing Standard User
- Payments Role - Zuora Payments Standard User
- Finance Role - Zuora Finance Standard User
- Commerce Role - Zuora Commerce Standard User
- Reporting Role - Zuora Reporting Standard User
Click Save.
You should receive an email with instructions on how to activate the user.
Follow the instructions to the activate it.
Create an OAuth client in Zuora
In Zuora, open the user that was created and activated in the previous step.
Under the OAuth Clients section, create a new client called stigg-api.
In the opened modal, copy the client ID and secret - you will need to enter them in the Stigg app.
Once closed, the client secret will no longer be shown. To view it again, you will need to create a new OAuth client.
In Zuora, under the Settings section click on Billing
In the opened screen, select Manage Custom Fields.
Add the following custom fields to the relevant Zuora entities.
You can add up to 10 indexed custom and 40 non-indexed fields in Zuora. Indexed fields are recommended for performance but are not required for the integration to work.
These custom fields are required for the integration. The integration will not work correctly if they are missing from your Zuora tenant.
| Zuora entity | Field type | Field label | API name | Length |
|---|
| Product | text | stiggEntityUrl | stiggEntityUrl | 255 |
| Account | text | stiggEntityUrl | stiggEntityUrl | 255 |
| Account | text | stiggCustomerId | stiggCustomerId | 255 |
| Subscription | text | stiggEntityUrl | stiggEntityUrl | 255 |
| Subscription | text | stiggCustomerId | stiggCustomerId | 255 |
| Subscription | text | stiggResourceId | stiggResourceId | 255 |
| Order | text | stiggEntityUrl | stiggEntityUrl | 255 |
| Order | text | stiggCustomerId | stiggCustomerId | 255 |
| Order | text | stiggResourceId | stiggResourceId | 255 |
Save the changes.
Zuora automatically adds a ‘__c’ suffix to all API names, for example: stiggEntityUrl__c
To mirror metadata from Stigg into Zuora custom fields, prefix your Stigg metadata keys with ZUORA__.
For example:
ZUORA__CustomField__c (in Stigg metadata) → CustomField__c (in Zuora).
The target custom field must already exist in Zuora before syncing.
Connect Stigg with Zuora
In the Stigg app, navigate to the Settings > Integrations > Apps section.
Select the Zuora integration app.
In the opened form, enter the following information:
- Zuora tenant - the URL of the your Zuora tenant
- Client ID - the ID of the OAuth client that you created in the previous step
- Client secret - the secret of the OAuth client that you created in the previous step
Confirm the integration setup by clicking on the Connect to Zuora button.
Indication for synced entities
Entities that are synced from Stigg to Zuora have a clickable “billing ID” property with a Zuora logo next to it and indication of their sync status (successful, failed, will not be synced).
Accessing Zuora entities from Stigg
In the Stigg app, clicking on the link of the “billing ID” property will open the relevant entity in Zuora.
Subscription status handling and retry behavior
Status Mapping
| Zuora Status | Stigg Status |
|---|
| Draft | Not handled |
| Pending Activation | Not handled |
| Pending Acceptance | Not handled |
| Active | Active |
| Cancelled | Cancelled |
| Suspended | Not handled |
Retry Behavior
During retries, Stigg keeps the subscription Active until Zuora confirms a terminal state.
Status changes are applied only after receiving a successful update from Zuora.
Removing the integration
To remove the integration, click on the dotted menu icon and select the “Remove” action.
Confirm the action by clicking on the “Remove” button in the opened modal.