Skip to main content

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:

  1. Go to Admin > Integrations > Overview in Dealops.
  2. Click Connect on the Stripe row.
  3. Stripe opens and asks the admin to install DealOps Billing Sync in the Stripe account that should receive Dealops quotes.
  4. After approval, Stripe redirects back to Dealops.
  5. 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 fieldValue from Dealops
nameProduct custom name, product short name, product name, or product spec ID
metadata.dealops_product_input_idDealops quote line ID
metadata.dealops_product_spec_idDealops product spec ID
metadata.dealops_quote_price_frequencyProduct price frequency, defaulting to monthly

Price​

Dealops creates a Stripe Price for each Product.

Stripe fieldValue from Dealops
currencyQuote target currency, lowercased
productStripe Product ID created for the quote line
unit_amountNegotiated amount for the billing period, converted to minor units, for example cents
recurring.intervalmonth or year, based on quote billing frequency
recurring.interval_count1 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 fieldValue from Dealops
descriptionDealops quote name
line_items[].priceStripe Price IDs created for the quote lines
line_items[].quantityDealops line quantity, rounded to a whole number with a minimum of 1
expires_atDealops quote end date, or a term-based fallback
subscription_data.effective_dateDealops start date when it is in the future
subscription_data.metadata.dealops_subscription_terms_monthsDealops subscription term in months
metadata.dealops_pricing_quote_idDealops pricing quote ID
metadata.dealops_opportunity_crm_idCRM opportunity ID tied to the Dealops quote
metadata.dealops_subscription_terms_monthsDealops subscription term in months
metadata.dealops_billing_frequencyBilling frequency selected on the quote
metadata.dealops_billing_period_monthsBilling period in months
metadata.dealops_target_currencyQuote target currency
metadata.dealops_start_dateDealops 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.