> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sagescreen.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Save deal as draft

> Creates a new `ss_deal` post in `draft` status, or updates an existing
draft. On first save generates `deal_uuid`, `deal_lookup_code`, and
`quote_number`. Accepts all deal form fields. Calculates and stores
computed financial values (year totals, commission, margin deduction).

**Nonce:** `sagescreen_sales_calc`
**Capability:** `ss_sales` or `ss_sales_admin` or `ss_admin_all`




## OpenAPI

````yaml /openapi/private/specs/wp/deal-internal.yml post /wp-admin/admin-ajax.php?action=sagescreen_save_deal
openapi: 3.1.0
info:
  title: SageScreen — Deal Module
  description: >
    Enterprise deal lifecycle management. Deals represent sales proposals that

    flow through a multi-stage approval and payment pipeline before provisioning

    a council.


    **CPT:** `ss_deal`

    **Custom statuses:** `draft`, `ss_pending_approval`, `ss_approved`,

    `ss_customer_sent`, `ss_customer_approved`, `ss_customer_rejected`,

    `ss_invoiced`, `ss_paid`, `ss_closed`, `ss_lost`


    **Business rule:** Only Enterprise (E-SKU) products go through the
    deal/sales

    process. Packs and subscriptions are not sold via deals. Trials are
    Stripe-only.
  version: 1.0.0
servers:
  - url: https://{domain}/wp-json/sagescreen/v1
    description: WordPress REST API
    variables:
      domain:
        default: api.sagescreen.app
security: []
tags:
  - name: Deal REST
    description: REST API endpoints authenticated via X-API-Key
  - name: Deal AJAX
    description: AJAX endpoints authenticated via WordPress nonce + capability check
paths:
  /wp-admin/admin-ajax.php?action=sagescreen_save_deal:
    post:
      tags:
        - Deal AJAX
      summary: Save deal as draft
      description: |
        Creates a new `ss_deal` post in `draft` status, or updates an existing
        draft. On first save generates `deal_uuid`, `deal_lookup_code`, and
        `quote_number`. Accepts all deal form fields. Calculates and stores
        computed financial values (year totals, commission, margin deduction).

        **Nonce:** `sagescreen_sales_calc`
        **Capability:** `ss_sales` or `ss_sales_admin` or `ss_admin_all`
      operationId: ajaxSaveDeal
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/SaveDealRequest'
      responses:
        '200':
          description: Deal saved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AjaxSuccessWithDealId'
              example:
                success: true
                data:
                  message: Deal saved successfully
                  deal_id: 1042
        '400':
          $ref: '#/components/responses/AjaxBadRequest'
        '403':
          $ref: '#/components/responses/AjaxForbidden'
      security:
        - wpAjaxNonce: []
components:
  schemas:
    SaveDealRequest:
      type: object
      description: |
        All deal form fields. Accepts both snake_case and camelCase keys
        (e.g. `customer_name` or `customerName`). Only `nonce` and `action`
        are strictly required; all other fields are optional on save.
      required:
        - nonce
        - action
      properties:
        nonce:
          type: string
          examples:
            - abc123def456
        action:
          type: string
          enum:
            - sagescreen_save_deal
            - sagescreen_create_quote
        dealId:
          type: integer
          description: Existing deal post ID (omit for new deal)
          examples:
            - 1042
        customerName:
          type: string
          examples:
            - Greenville City Council
        councilId:
          type: integer
          description: Linked council post ID (for existing customers)
          examples:
            - 312
        contactFirstName:
          type: string
          examples:
            - Bob
        contactLastName:
          type: string
          examples:
            - Johnson
        contactTitle:
          type: string
          examples:
            - IT Director
        contactEmail:
          type: string
          format: email
          examples:
            - bob@greenville.gov
        contactPhone:
          type: string
          examples:
            - +1-555-123-4567
        customerUrl:
          type: string
          format: uri
          examples:
            - https://greenville.gov
        customerIndustry:
          type: string
          examples:
            - Government
        companySize:
          type: string
          examples:
            - 51-200
        companyRevenue:
          type: string
          examples:
            - $1M-$10M
        customerAddress:
          type: string
          examples:
            - 100 Main Street
        customerAddress2:
          type: string
          examples:
            - Suite 200
        customerCity:
          type: string
          examples:
            - Greenville
        customerState:
          type: string
          examples:
            - SC
        customerZip:
          type: string
          examples:
            - '29601'
        customerCountry:
          type: string
          examples:
            - US
        numSages:
          type: integer
          examples:
            - 5
        creditInputMode:
          type: string
          examples:
            - direct
        numCredits:
          type: integer
          examples:
            - 500
        screensPerRole:
          type: integer
          examples:
            - 100
        extraCredits:
          type: integer
          examples:
            - 0
        creditsFloor:
          type: integer
          examples:
            - 100
        creditsCeiling:
          type: integer
          examples:
            - 1000
        tierLite:
          type: integer
          description: Percentage (0-100)
          examples:
            - 20
        tierCore:
          type: integer
          examples:
            - 60
        tierAdvanced:
          type: integer
          examples:
            - 20
        onboardingType:
          $ref: '#/components/schemas/OnboardingType'
        whiteGlovePrice:
          type: number
          format: float
          examples:
            - 5000
        addonCustomBranding:
          type: boolean
          examples:
            - true
        addonCustomUrl:
          type: boolean
          examples:
            - false
        addonPrioritySupport:
          type: boolean
          examples:
            - true
        compliance:
          type: string
          description: JSON-encoded array of compliance tags
          examples:
            - '["hipaa","soc2"]'
        integrations:
          type: string
          description: JSON-encoded array of integration tags
          examples:
            - '["salesforce","workday"]'
        pricePerCredit:
          type: number
          format: float
          examples:
            - 2.5
        pricePerSage:
          type: number
          format: float
          examples:
            - 125
        growthRate:
          type: number
          format: float
          description: Annual growth percentage
          examples:
            - 15
        priceIncreaseRate:
          type: number
          format: float
          description: Annual price increase percentage
          examples:
            - 3
        discountMode:
          $ref: '#/components/schemas/DiscountMode'
        discountPercent:
          type: number
          format: float
          examples:
            - 10
        discountDollar:
          type: number
          format: float
          examples:
            - 0
        hasReferral:
          type: boolean
          examples:
            - false
        expenseMonthly:
          type: number
          format: float
          examples:
            - 0
        expenseAnnual:
          type: number
          format: float
          examples:
            - 0
        expenseOnetime:
          type: number
          format: float
          examples:
            - 0
        customerNotes:
          type: string
          examples:
            - Includes complimentary onboarding session.
        quoteExpirationDays:
          type: integer
          examples:
            - 5
    AjaxSuccessWithDealId:
      type: object
      properties:
        success:
          type: boolean
          const: true
        data:
          type: object
          properties:
            message:
              type: string
              examples:
                - Deal saved successfully
            deal_id:
              type: integer
              examples:
                - 1042
    OnboardingType:
      type: string
      enum:
        - self_serve
        - white_glove
      description: Onboarding tier selection
    DiscountMode:
      type: string
      enum:
        - percent
        - dollar
        - ''
      description: How the discount is expressed
    AjaxErrorResponse:
      type: object
      description: WordPress AJAX error envelope (wp_send_json_error)
      required:
        - success
        - data
      properties:
        success:
          type: boolean
          const: false
        data:
          oneOf:
            - type: object
              properties:
                message:
                  type: string
                  description: Human-readable error message
                  examples:
                    - Deal not found
                errors:
                  type: array
                  description: Validation error list (submit_deal only)
                  items:
                    type: string
                  examples:
                    - - Customer name is required
                      - Contact email is required
                redirect_edit:
                  type: boolean
                  description: Whether front end should redirect to edit form
                  examples:
                    - true
                edit_url:
                  type: string
                  description: URL to redirect to for fixing validation errors
                  examples:
                    - /admin/sales/calc?deal=1042
            - type: string
              description: Simple error message string
              examples:
                - Deal not found
  responses:
    AjaxBadRequest:
      description: Bad request — missing or invalid parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AjaxErrorResponse'
          example:
            success: false
            data:
              message: Invalid deal ID
    AjaxForbidden:
      description: User does not have the required capability
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AjaxErrorResponse'
          example:
            success: false
            data:
              message: You do not have permission to perform this action
  securitySchemes:
    wpAjaxNonce:
      type: apiKey
      in: query
      name: nonce
      description: |
        WordPress AJAX nonce — either `sagescreen_frontend_nonce` or
        `sagescreen_sales_calc` depending on the endpoint (see each endpoint
        description). Sent as a form field in the POST body.

````