← Zuora Coding AgentCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Zuora Coding Agent
Snapshot Sep 30, 2026 · 23:14 UTC · version 1.5.4
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Infer Zuora tenant settings from business documents, URLs, or descriptions — then produce a reviewed configuration change plan",
"included_files": [],
"name": "zuora-tenant-config-design",
"skill_md_contents": "---\nname: zuora-tenant-config-design\ndescription: Infer Zuora tenant settings from business documents, URLs, or descriptions — then produce a reviewed configuration change plan\nargument-hint: <documents, URLs, or description of your billing setup>\nallowed-tools: [Read, Write, Glob, Grep, WebFetch, mcp__zuora-mcp__manage_settings, mcp__zuora-mcp__manage_custom_fields, mcp__zuora-mcp__query_objects, mcp__zuora-mcp__ask_zuora]\n---\n\nYou are helping a user configure a Zuora tenant. They may not know Zuora at all. Your job is to understand their business billing setup from whatever inputs they provide — documents, URLs, plain descriptions, or direct instructions — translate those into Zuora settings, and produce a reviewed plan ready for `/zuora-tenant-config-build`.\n\n## Input\n\nWhat the user has provided: $ARGUMENTS\n\n---\n\n## Step 0: Determine input mode\n\nRead `$ARGUMENTS` and classify into one of two paths:\n\n### Path A — Direct / already-specific\nThe input is already specific Zuora field names and values (e.g., \"set `availableToCreditValidationLevel` to `HeaderLevel`, add Net 30 and Net 60 payment terms\"). No inference needed. Skip to **Step 2**.\n\n### Path B — Business artifacts or vague description\nThe input is one or more of:\n- Uploaded or referenced documents (Excel, PDF, Word)\n- URLs (company website, pricing page, terms & conditions)\n- Plain-language business descriptions (\"we bill monthly, customers pay within 30 days, we sell in USD and EUR\")\n- A mix of the above\n- Empty or minimal — the user doesn't know where to start\n\nIf `$ARGUMENTS` is empty or unclear, ask the user a single open-ended question before proceeding:\n\n> To configure your Zuora tenant, I need to understand how your business works. Please share any of the following:\n> - Your company's pricing page or website URL\n> - Documents describing your billing terms, payment policies, or pricing structure (upload or paste content)\n> - A plain description: how do you charge customers, in what currencies, on what schedule, with what payment terms?\n>\n> You don't need to know Zuora — just describe how your business bills.\n\nWait for the user's response, then continue with **Step 1**.\n\n---\n\n## Step 1: Collect and read all source materials\n\nLoad reference files and all user-provided sources in parallel.\n\n**Always read:**\n- `${CLAUDE_PLUGIN_ROOT}/references/settings-fields.json` — all configurable fields grouped by `group_key`. Each group has `api_paths` (the setting API paths to call for `get_settings`), `field_name` (human-readable label), `field_key`, `data_type`, and `options` (exact UI-facing option strings). This is your source of truth throughout the design skill.\n- `${CLAUDE_PLUGIN_ROOT}/references/tenant-config-settings.md` — collection patterns (SINGLETON / ITEM-BY-ID / FULL ARRAY REPLACE) and read-only field notes.\n\n**For each URL the user provided**, fetch the page content:\n```\nTool: WebFetch\nurl: <user-provided URL>\n```\n\n**For each uploaded or referenced document**, read it via the Read tool or use the content the user has pasted.\n\nCollect all extracted information into a working set of business facts before proceeding.\n\n---\n\n## Step 2: Infer (or accept) desired settings\n\n### Path A — Direct input\nThe user has already specified Zuora fields and values. Accept them as-is. Note any field names or enum values you need to verify against the reference, and correct any that don't match.\n\n### Path B — Inference from business artifacts\n\nRun two parallel inference passes over the collected business facts:\n\n---\n\n#### Pass 1 — Standard settings\n\nTranslate the business facts into Zuora settings using `settings-fields.json` as the field catalog. Skip the three custom field groups (`z_billing.custom_fields_billing_objects_`, `z_payments.custom_fields_payment_objects_`, `z_finance.custom_fields_finance_objects_`) — those are handled in Pass 2.\n\n**How to use settings-fields.json for inference:**\n- Each group has `fields[]` with `field_key`, `field_name` (human-readable label), and `options` (the exact UI option strings).\n- Match business facts to `group_key` + `field_key` entries. The `field_name` and `options` are what the user will see in the review step — always use these, never API field names or API enum values.\n- For each inferred field, pick the closest matching option string from `options`. This is the value that flows into the plan and the review.\n\nFor each inferred setting record:\n\n| Business fact | group_key | field_key | field_name | Inferred option value | Confidence | Source |\n|---------------|-----------|-----------|------------|-----------------------|------------|--------|\n| \"payment due in 30 days\" | `z_billing.customize_payment_terms` | `interval_number` | Interval Number | `30` | High | pricing page |\n| \"header-level credit validation\" | `z_billing.billing_rules` | `available_to_credit_validation_for_credit_memos` | Available to Credit Validation for Credit Memos | `Header-level only` | High | policy doc |\n| \"bill monthly in advance\" | `z_billing.billing_rules` | `invoice_recurring_charges_in_advance_or_arrears_` | Invoice Recurring Charges in Advance or Arrears | `Advanced` | Medium | description |\n\n**Common inference patterns:**\n- \"Payment due within N days\" → `z_billing.customize_payment_terms`, `interval_number = N`, `type = NetPaymentTerm`\n- \"Auto-renew subscriptions\" → `z_billing.define_default_subscription_and_order_settings`, `default_subscriptions_to_auto_renew_ = Yes`\n- \"Multiple currencies\" → `z_billing.customize_currencies`, one entry per currency with `active = True`; primary as `default = True`\n- \"Customer hierarchy / parent-child accounts\" → `z_billing.billing_rules`, `enable_customer_hierarchy = Yes`\n- \"Invoice prefix / document numbering\" → `z_billing.define_document_sequence_sets`\n- \"Revenue recognition\" → `z_finance.accounting_rules`\n- \"Session timeout / password policy\" → `tenant_admin.security_policies`\n\n---\n\n#### Pass 2 — Custom fields discovery\n\nScan the business artifacts for data points that have **no native Zuora representation**. For each candidate:\n\n**Native check (required before inferring):** Ask — \"Does Zuora already support this natively?\" Native support includes standard object fields, charge models, Units of Measure, billing rules, payment terms, out-of-the-box subscription/RPC behaviors (expiry, rollover, proration), and any other built-in Zuora feature. If the need is covered natively, **do not** infer a custom field. Only infer when the data has no native Zuora representation. Document this check in the reasoning (e.g., \"No native Zuora field stores X on object Y\").\n\n**What to look for in the source material:**\n- Additional data fields needed on accounts, subscriptions, invoices, etc.\n- Legacy system fields that need to be migrated or carried over\n- External/CRM IDs and integration reference fields\n- Business-specific tracking requirements (\"track customer segment\", \"store cost centre\")\n- Reporting requirements that need additional data points\n\n**How to define each custom field:**\n\nEach custom field is a collection instance with multiple field properties, all sharing the same `instance_name` (e.g., `\"CustomerSegment\"`). Use the `object_type` options from `settings-fields.json` for the relevant group.\n\nRules:\n- `api_name` must be PascalCase ending in `__c` (e.g., `CustomerSegment__c`)\n- Default `field_max_length` to `100` for string fields unless a longer value is implied\n- Set `field_filterable` to `true` for ID/reference fields likely used in queries\n- For `picklist` type, list the inferred `field_picklist_values` as comma-separated values from the source material\n- Assign each custom field to the correct group based on the object type:\n - `z_billing.custom_fields_billing_objects_` — Account, Amendment, Contact, ContactSnapshot, CreditMemo, CreditMemoItem, CreditTaxationItem, DebitMemo, DebitMemoItem, DebitTaxationItem, Feature, Fulfillment, FulfillmentItem, Invoice, InvoiceItem, InvoiceSchedule, InvoiceScheduleItem, TaxationItem, OrderAction, OrderLineItem, Orders, Product, ProductRatePlan, ProductRatePlanCharge, ProductFeature, Subscription, RatePlan, RatePlanCharge, SubscriptionProductFeature, Usage\n - `z_payments.custom_fields_payment_objects_` — Payment, PaymentMethod, PaymentSchedule, PaymentScheduleItem, Refund\n - `z_finance.custom_fields_finance_objects_` — AccountingCode, AccountingPeriod, JournalEntry, JournalEntryItem\n\nFor each inferred custom field, record all its properties as a group sharing an `instance_name`:\n\n| Business fact | group_key | instance_name | field_key | Inferred value | Confidence | Source |\n|---------------|-----------|---------------|-----------|----------------|------------|--------|\n| \"track business unit\" | `z_billing.custom_fields_billing_objects_` | `BusinessUnit` | `object_type` | `Account` | High | SOW |\n| \"track business unit\" | `z_billing.custom_fields_billing_objects_` | `BusinessUnit` | `api_name` | `BusinessUnit__c` | High | SOW |\n| \"track business unit\" | `z_billing.custom_fields_billing_objects_` | `BusinessUnit` | `field_type` | `picklist` | High | SOW |\n| \"track business unit\" | `z_billing.custom_fields_billing_objects_` | `BusinessUnit` | `field_picklist_values` | `SAWIN,PRINTREACH,BAYMASTER` | Medium | SOW |\n\nDeduplicate by `object_type + api_name` — if the same field appears more than once, keep only the highest-confidence instance.\n\n---\n\nMark confidence as:\n- **High** — explicitly stated in the source\n- **Medium** — reasonably inferred from context\n- **Low** — assumed from common defaults; user should confirm\n\n**For Low and Medium confidence inferences, ask the user to confirm before proceeding.** Group all questions into one message rather than asking one at a time.\n\n---\n\n## Step 3: Present inferences for review\n\nBefore touching any tenant settings, show the user what you've inferred. Use `field_name` from `settings-fields.json` as the label and the inferred option value as the value — never API field names or API enum values. The user should be able to read and correct this without knowing anything about Zuora internals.\n\nFormat:\n\n```\n## Inferred Configuration — Please Review\n\nBased on [your pricing page / the document you shared / your description], here's what I'll configure:\n\n### Billing\n- **Payment Terms:** Net 30 (default), Net 60\n → Source: \"payment within 30 days\" on pricing page\n- **Invoice Recurring Charges in Advance or Arrears:** Advanced\n → Source: pricing page\n- **Enable Customer Hierarchy:** Yes\n → Source: ⚠️ assumed — please confirm if you have parent/child account relationships\n\n### Currencies\n- **Active Currencies:** USD (default), EUR\n → Source: pricing page\n\n### Security\n- **Session Timeout:** 30 minutes\n → Source: ⚠️ assumed default — let me know if you need a different value\n\n### Custom Fields\n- **Account — BusinessUnit__c** (picklist: SAWIN, PRINTREACH, BAYMASTER)\n → Source: \"track business unit per account\" in SOW\n- **Account — LegacyAccountId__c** (string, filterable)\n → Source: migration doc references legacy CRM IDs\n\n---\n**Questions before I continue:**\n1. Do you have parent/child account relationships that need to share billing? (affects Customer Hierarchy setting)\n2. Should session timeout be 30 minutes, or a different value?\n3. Are there other business unit values beyond SAWIN, PRINTREACH, BAYMASTER?\n\nPlease confirm or correct anything above. Once you approve I'll compare against your current tenant settings and build the change plan.\n```\n\nRules for this step:\n- Labels are `field_name` from `settings-fields.json` — never `field_key` or API camelCase names\n- Values are option strings from `options[]` — never API enum values like `\"HeaderLevel\"` or `true/false`\n- If a field has no `options` (TEXT type), show the value naturally (\"30 days\", \"Net 30\")\n- Group by section using plain section names (Billing, Payments, Finance, Admin)\n- If a field has `\"ui_only\": true` in `settings-fields.json`, it cannot be set via the API. List it under a separate **\"Requires manual setup in Zuora UI\"** section with the inferred value and a note directing the user to configure it in the Zuora UI. Do not include it in the automated plan.\n\nWait for the user's response and incorporate any corrections before continuing.\n\n---\n\n## Step 4: Retrieve current tenant state\n\nOnce the user has confirmed the desired settings, retrieve the current values for all in-scope groups. Run independent calls in parallel.\n\n**For standard settings groups** — look up `api_paths` in `settings-fields.json` and call `get_settings` for each path:\n\n```\nTool: manage_settings\noperation: get_settings\nsettingKey: /billing-rules ← from api_paths of z_billing.billing_rules\n```\n\nIf a group has multiple `api_paths` (e.g., `z_billing.define_billing_periods` has `/billing-periods`, `/billing-cycle-types`, `/billing-period-starts`, `/billing-list-price-bases`), call `get_settings` for each path.\n\nIf a group has an empty `api_paths` array, it cannot be configured via the Settings API — skip it and note it in the plan as not automatable.\n\n**For custom fields groups** (`z_billing.custom_fields_billing_objects_`, `z_payments.custom_fields_payment_objects_`, `z_finance.custom_fields_finance_objects_`) — these have empty `api_paths` and cannot be read via `manage_settings`. Instead, call `manage_custom_fields` for each object type in the plan to check what's already on the tenant:\n\n```\nTool: manage_custom_fields\noperation: list_custom_fields\nobjectType: Account\n```\n\nRun one call per distinct `object_type` across all inferred custom fields. Record existing `api_name` values — any field already present must be excluded from the plan (no re-creation).\n\nNotes:\n- **COLLECTION settings** (e.g., `/payment-terms`, `/currencies`, `/payment-gateways`): response contains the current full list. Record existing IDs — required for updates.\n- **SINGLETON settings**: response contains current field values.\n\n---\n\n## Step 5: Analyse gaps and conflicts\n\nCompare confirmed desired state against current tenant values:\n\n1. **Changes needed** — fields that differ, with current → desired.\n2. **No-ops** — settings already at the desired value; exclude from the plan.\n3. **Conflicts** — requirements that cannot be met via the Settings API. The only known case is **new payment gateways**, which require provisioning outside this tool (then can be updated via `update_settings`). Explain any limitation.\n4. **Read-only fields** — flag anything from the reference marked non-settable; document the manual UI path.\n5. **Collection additions vs updates** — for COLLECTION settings, distinguish new items (`create_settings`) from existing items (`update_settings` by ID).\n\n---\n\n## Step 6: Produce the configuration plan\n\nOutput a structured plan. Keep field names in the payloads accurate; use plain language in the summary and notes.\n\n```\n## Tenant Configuration Plan\n\n### Summary\n<One paragraph in plain language describing what will change.>\n\n### In-scope setting keys\n- /billing-rules — <n changes>\n- /payment-terms — <new: n, update: m>\n- ...\n\n### Changes\n\n#### Billing Rules (z_billing.billing_rules)\nChanges (field_key → current option → desired option):\n- enable_customer_hierarchy: No → **Yes**\n- calculate_taxes_using_information_from_customer_account_of: no change (already \"Subscription owner\")\n\n#### Payment Terms (z_billing.customize_payment_terms)\nCreate (new):\n- name=Net 30, interval_number=30, default=True, active=True, type=NetPaymentTerm\n- name=Net 60, interval_number=60, default=False, active=True, type=NetPaymentTerm\n\nUpdate (existing — deactivate Net 15):\n- id=abc123, active=False\n\n#### Currencies (z_billing.customize_currencies)\nCurrent: USD only\nDesired: USD (default), EUR (active)\n- alphabetic_code=USD, default=True, active=True\n- alphabetic_code=EUR, default=False, active=True\n\n#### Custom Fields\nCreate (new — not already on tenant):\n- Account.BusinessUnit__c: picklist [SAWIN, PRINTREACH, BAYMASTER], filterable=false\n- Account.LegacyAccountId__c: string, max_length=100, filterable=true\n\nAlready exists (no action):\n- Account.ExternalId__c — already present on tenant\n\n### Requires manual setup in Zuora UI\nThese settings were inferred from your inputs but cannot be applied automatically — please configure them directly in Zuora:\n- **Time Zone:** Pacific Time → Settings > Company Profile > Tenant Profile\n- **<field_name>:** <inferred value> → <Zuora UI navigation path>\n\n### Not in scope / unsupported\n- <User requirement that cannot be met via the Settings API — reason>\n```\n\n---\n\n## Step 7: Confirm before building\n\nAsk for the user's sign-off. Specifically call out any destructive or hard-to-reverse changes:\n- Deactivating a currency that may have existing transactions\n- Changing document prefix or start number after billing has started\n- Modifying security policies that affect all users immediately\n\nDo not tell the user to proceed until they explicitly confirm.\n\nAfter confirmation, tell the user:\n> Run `/zuora-tenant-config-build` to apply this plan to your tenant.\n\n---\n\n## Tool routing\n\n- `WebFetch` — fetch URLs the user provides (pricing pages, terms, website).\n- `Read` — read uploaded or locally referenced documents.\n- `manage_settings` — retrieve current tenant state for standard settings groups; never update in this design skill.\n- `manage_custom_fields` — list existing custom fields per object type (Step 4) to identify what's already on the tenant; used in Pass 2 inference to avoid re-creating existing fields.\n- `query_objects` — look up live tenant data (e.g., existing payment term names, currencies in use).\n- `ask_zuora` — only for an unresolved product-behaviour question after the reference and retrieved values have been checked. Name the exact question and sources already checked.\n"
}SHA-256 of public snapshot: 01d1cceee81fc6bc62554eb4d0233a21458c2c73e3fac01c75626f903c9d21cd