Push · Arazzo Workflow

Load a product catalog and attach guest purchase history

Version 1.0.0

Discover account-specific product custom fields, create a product, record a purchase against an existing guest contact, and read the purchase back to confirm it landed — the flow that turns the Cendyn CRM (PUSHTech) contact database into a customer data platform. Authored by API Evangelist against the derived OpenAPI; every operationId is verified to exist in it.

1 workflow 3 source APIs 1 provider
View Spec View on GitHub CompanyCRMCustomer Data PlatformMarketing AutomationHospitalityHotelsGuest ExperienceEmailSMSPush NotificationsWebhookSegmentationArazzoWorkflows

Provider

push

Workflows

loadCatalogAndPurchaseHistory
Create a product, attach a purchase to a contact, and verify it.
Products must exist before purchases can reference them — the purchase body links products by UUID. Note that products are keyed by UUID while contacts use a 24-character hex id; the two identifier styles are not interchangeable.
5 steps inputs: accountId, campaignId, contactId, productCurrency, productName, productPrice outputs: productUuid
1
discoverProductCustomFields
Product objects are open — account-defined custom fields are sent as plain top-level members under the field name, not its label. Read them before building the payload, because the documented property list is not exhaustive for a given account.
2
createProduct
Create the catalog entry. Returns 201; products are addressed by UUID thereafter.
3
createPurchase
Record the purchase under the contact. NOT idempotent — a retry creates a second purchase and inflates the guest's spend history. On a timeout, run listContactPurchases below and check before retrying.
4
listContactPurchases
Read the purchase back. Purchases are addressed at ACCOUNT level once created, not under the contact, so filter by contact_id here. There is no pagination on this operation — filter narrowly rather than listing the whole account.
5
verifyProduct
Confirm the catalog entry reads back with the values that were written.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Load a product catalog and attach guest purchase history
  version: 1.0.0
  description: >-
    Discover account-specific product custom fields, create a product, record a purchase against
    an existing guest contact, and read the purchase back to confirm it landed — the flow that
    turns the Cendyn CRM (PUSHTech) contact database into a customer data platform. Authored by
    API Evangelist against the derived OpenAPI; every operationId is verified to exist in it.
sourceDescriptions:
- name: productApi
  url: ../openapi/push-product-api-openapi.yml
  type: openapi
- name: productCustomFieldsApi
  url: ../openapi/push-product-custom-fields-api-openapi.yml
  type: openapi
- name: purchaseApi
  url: ../openapi/push-purchase-api-openapi.yml
  type: openapi
workflows:
- workflowId: loadCatalogAndPurchaseHistory
  summary: Create a product, attach a purchase to a contact, and verify it.
  description: >-
    Products must exist before purchases can reference them — the purchase body links products
    by UUID. Note that products are keyed by UUID while contacts use a 24-character hex id;
    the two identifier styles are not interchangeable.
  inputs:
    type: object
    required: [accountId, contactId, productName, productPrice, productCurrency]
    properties:
      accountId: {type: string, description: The Cendyn CRM account id.}
      contactId:
        type: string
        description: An existing contact id. Run push-onboard-and-welcome-guest first if you do not have one.
      productName: {type: string}
      productPrice: {type: number}
      productCurrency: {type: string, description: Currency code for the product price.}
      campaignId:
        type: string
        description: Optional campaign to attribute the purchase to.
  steps:
  - stepId: discoverProductCustomFields
    description: >-
      Product objects are open — account-defined custom fields are sent as plain top-level
      members under the field name, not its label. Read them before building the payload,
      because the documented property list is not exhaustive for a given account.
    operationId: listProductCustomFields
    parameters:
    - name: account_id
      in: path
      value: $inputs.accountId
    successCriteria:
    - condition: $statusCode == 200

  - stepId: createProduct
    description: Create the catalog entry. Returns 201; products are addressed by UUID thereafter.
    operationId: createProduct
    parameters:
    - name: account_id
      in: path
      value: $inputs.accountId
    requestBody:
      contentType: application/json
      payload:
        name: $inputs.productName
        price: $inputs.productPrice
        currency: $inputs.productCurrency
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      productUuid: $response.body#/UUID

  - stepId: createPurchase
    description: >-
      Record the purchase under the contact. NOT idempotent — a retry creates a second
      purchase and inflates the guest's spend history. On a timeout, run listContactPurchases
      below and check before retrying.
    operationId: createPurchase
    parameters:
    - name: account_id
      in: path
      value: $inputs.accountId
    - name: contact_id
      in: path
      value: $inputs.contactId
    requestBody:
      contentType: application/json
      payload:
        campaign_id: $inputs.campaignId
        products:
        - UUID: $steps.createProduct.outputs.productUuid
    successCriteria:
    - condition: $statusCode == 201

  - stepId: listContactPurchases
    description: >-
      Read the purchase back. Purchases are addressed at ACCOUNT level once created, not under
      the contact, so filter by contact_id here. There is no pagination on this operation —
      filter narrowly rather than listing the whole account.
    operationId: listPurchase
    parameters:
    - name: account_id
      in: path
      value: $inputs.accountId
    - name: contact_id
      in: query
      value: $inputs.contactId
    successCriteria:
    - condition: $statusCode == 200

  - stepId: verifyProduct
    description: Confirm the catalog entry reads back with the values that were written.
    operationId: showProduct
    parameters:
    - name: account_id
      in: path
      value: $inputs.accountId
    - name: UUID
      in: path
      value: $steps.createProduct.outputs.productUuid
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    productUuid: $steps.createProduct.outputs.productUuid

Work with this as data

Every workflow here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This workflow
curl "https://apis.io/api/v1/arazzo/push-load-catalog-and-purchase-history"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.