Billing with Stripe
Dealops connects to Stripe through the DealOps Billing Sync app. The current workflow creates a draft Stripe Quote from an approved Dealops quote, then opens that draft in Stripe for billing review.
Dealops does not finalize the quote, create the customer, start the subscription, issue invoices, or apply credits automatically.
Connect Stripe
An admin connects Stripe from Dealops settings:
- Go to Admin > Integrations > Overview in Dealops.
- Click Connect on the Stripe row.
- Stripe opens and asks the admin to install DealOps Billing Sync in the Stripe account that should receive Dealops quotes.
- After approval, Stripe redirects back to Dealops.
- Dealops stores the connected Stripe account ID and OAuth tokens for that Dealops organization.
The app asks Stripe for access to read events, customers, invoices, subscriptions, quotes, products, and prices/plans, and to write subscriptions, quotes, products, and prices/plans. The current workflow writes Products, Prices, and draft Quotes only.
If the app is removed in Stripe, or disconnected from Dealops, Dealops removes the Stripe connection.
Push a quote
Pricing flows can include a Push to Stripe action. When selected, Dealops creates:
- one Stripe Product for each supported Dealops quote line
- one Stripe Price for each Product
- one draft Stripe Quote with those Prices as line items
Dealops then opens the draft quote in Stripe. The billing team reviews and finalizes it in Stripe.
Dealops uses the catalog version pinned to the quote. Later catalog changes do not change what gets pushed for an already-created quote.
Fields written to Stripe
Product
Dealops creates a Stripe Product for each supported quote line.
| Stripe field | Value from Dealops |
|---|---|
name | Product custom name, product short name, product name, or product spec ID |
metadata.dealops_product_input_id | Dealops quote line ID |
metadata.dealops_product_spec_id | Dealops product spec ID |
metadata.dealops_quote_price_frequency | Product price frequency, defaulting to monthly |
Price
Dealops creates a Stripe Price for each Product.
| Stripe field | Value from Dealops |
|---|---|
currency | Quote target currency, lowercased |
product | Stripe Product ID created for the quote line |
unit_amount | Negotiated amount for the billing period, converted to minor units, for example cents |
recurring.interval | month or year, based on quote billing frequency |
recurring.interval_count | 1 for monthly or annual billing, 3 for quarterly billing, and 6 for semi-annual billing |
One-time fixed-fee products are sent without recurring.
Quote
Dealops creates one draft Stripe Quote.
| Stripe field | Value from Dealops |
|---|---|
description | Dealops quote name |
line_items[].price | Stripe Price IDs created for the quote lines |
line_items[].quantity | Dealops line quantity, rounded to a whole number with a minimum of 1 |
expires_at | Dealops quote end date, or a term-based fallback |
subscription_data.effective_date | Dealops start date when it is in the future |
subscription_data.metadata.dealops_subscription_terms_months | Dealops subscription term in months |
metadata.dealops_pricing_quote_id | Dealops pricing quote ID |
metadata.dealops_opportunity_crm_id | CRM opportunity ID tied to the Dealops quote |
metadata.dealops_subscription_terms_months | Dealops subscription term in months |
metadata.dealops_billing_frequency | Billing frequency selected on the quote |
metadata.dealops_billing_period_months | Billing period in months |
metadata.dealops_target_currency | Quote target currency |
metadata.dealops_start_date | Dealops start date, when present |
Stripe API calls
During connection:
GET https://marketplace.stripe.com/oauth/v2/authorize
POST https://api.stripe.com/v1/oauth/token
POST https://api.stripe.com/v1/oauth/deauthorize
During quote push:
POST /v1/products
POST /v1/prices
POST /v1/quotes
The quote push uses this shape:
products.create({
name,
metadata: {
dealops_product_input_id,
dealops_product_spec_id,
dealops_quote_price_frequency,
},
});
prices.create({
currency,
product,
unit_amount,
recurring,
});
quotes.create({
description,
metadata,
expires_at,
subscription_data,
line_items: [{ price, quantity }],
});
Dealops also receives signed Stripe webhooks for app authorization and deauthorization events. Those events keep the connection status in Dealops up to date.
Current boundaries
The current Stripe workflow supports scalar currency prices and one-time fixed fees.
The following are not automated yet:
- customer creation or customer matching
- quote finalization
- subscription creation
- live subscription amendments
- invoices, invoice previews, or credit notes
- migration of existing Stripe subscriptions into Dealops
- tiered, ramped, or hourly line items
If a quote contains unsupported line items, Dealops skips those lines and shows a warning. If no supported line items remain, Dealops does not create a Stripe quote.