@go-labs-sg/bb 2.40.0 → 2.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,6 +22,18 @@ The shared API rechecks existing records at submission. Canonical matches reuse
22
22
 
23
23
  `bb company use` and `bb company create` are state-changing, potentially external-writing commands. In non-interactive mode their existing permission gates require `--allow-state-change --allow-external-write`. Deploy the backend before publishing this CLI change. See [company discovery details](../api/docs/company-discovery.md) for limits and retry behaviour.
24
24
 
25
+ ## Payload help and uncertain writes
26
+
27
+ Run `bb <command> --help` (for example, `bb create-item --help`) to see required and optional `--payload` fields and an example JSON object. Item creation and updates accept a finite numeric `cost` and convert it to the API's decimal-string input. Validation errors identify the affected field; unsupported QuickBooks name characters are listed explicitly.
28
+
29
+ If `create-budget` reports an uncertain outcome (including Prisma P2028 or a network interruption), **do not retry immediately**. Run `bb list-budgets --projectId <project-id>` and check for the budget name first; the write may have committed even though the CLI did not receive a successful response. This check is not an idempotency guarantee when another budget has the same name.
30
+
31
+ A failed `create-supplier` request may likewise have committed. Inspect `bb list-suppliers --name <name>` and matching supplier details before retrying; names alone do not identify one attempt. If supplier creation succeeded but its separate approval request failed or returned no approval IDs, inspect that supplier's approvals by ID and retry only the approval step if needed. Do not create the supplier again. The CLI confirms the combined supplier-and-approval workflow before the first write.
32
+
33
+ `create-budget-approval` and `create-estimate` accept `--companyPayload`, `--contactPayload`, and `--eventPayload` as JSON objects. The CLI rejects non-object JSON; the API validates required fields.
34
+
35
+ `create-project` requires an existing Asana Deals lead task. In non-interactive runs pass `--asanaTaskId`; interactive runs can select a match with `--asanaSearch`. The Slack channel is resolved from the task unless all Slack channel flags are provided. For a new direct client, create the lead task in the website form first.
36
+
25
37
  ## Shared catalogue editing
26
38
 
27
39
  All active authenticated users can edit suppliers, inventory items and item categories. Normal-user supplier updates submit a revision for approval in the shared API; item/category edits apply immediately. Lead/Admin supplier edits bypass human review. `bb supplier update` returns the server-owned approval/synchronization result without issuing another approval request. New supplier usage stays on hold during review and linked QuickBooks synchronization; existing usage continues with the last approved details until the edit is approved. Creator identity and delete/archive permissions are unchanged.
@@ -790,6 +790,18 @@
790
790
  {
791
791
  "name": "--allow-financial-write",
792
792
  "description": "Allow financial-record changes in non-interactive use."
793
+ },
794
+ {
795
+ "name": "--companyPayload <json>",
796
+ "description": "Company update JSON object with id, name, and website fields."
797
+ },
798
+ {
799
+ "name": "--contactPayload <json>",
800
+ "description": "Contact update JSON object with companyId, title, firstName, lastName, email, and mobile fields."
801
+ },
802
+ {
803
+ "name": "--eventPayload <json>",
804
+ "description": "Event timing JSON object with date, startTime, and endTime fields."
793
805
  }
794
806
  ],
795
807
  "argumentMode": "legacy-passthrough",
@@ -840,6 +852,18 @@
840
852
  {
841
853
  "name": "--allow-financial-write",
842
854
  "description": "Allow financial-record changes in non-interactive use."
855
+ },
856
+ {
857
+ "name": "--companyPayload <json>",
858
+ "description": "Company update JSON object with id, name, and website fields."
859
+ },
860
+ {
861
+ "name": "--contactPayload <json>",
862
+ "description": "Contact update JSON object with companyId, title, firstName, lastName, email, and mobile fields."
863
+ },
864
+ {
865
+ "name": "--eventPayload <json>",
866
+ "description": "Event timing JSON object with date, startTime, and endTime fields."
843
867
  }
844
868
  ],
845
869
  "argumentMode": "legacy-passthrough",
@@ -5504,7 +5528,7 @@
5504
5528
  {
5505
5529
  "path": ["project", "create"],
5506
5530
  "legacyAliases": ["create-project", "create_project"],
5507
- "summary": "Create Project.",
5531
+ "summary": "Create a project linked to an existing Asana Deals lead task. Supply --asanaTaskId in non-interactive use; interactive use searches for and selects a lead task (optionally --asanaSearch). The Slack channel is resolved from the selected Asana task unless all three Slack channel flags are supplied. For a new direct client, create the lead task using the website form first.",
5508
5532
  "globalOptions": [
5509
5533
  {
5510
5534
  "name": "--help",
@@ -161,6 +161,11 @@ Legacy aliases: `send-estimate-to-contact-person`, `send_estimate_to_contact_per
161
161
 
162
162
  Effects: state-change, email.
163
163
 
164
+ Payload fields (--payload JSON)
165
+ Required: estimateId: string; budgetId: string; to: email; cc: email[]; replyTo: email; subject: string; content: HTML string; signature: HTML string
166
+ Optional: estimateDocNumber: string
167
+ Example: bb send-estimate-to-contact-person --payload '{"estimateId":"<estimate-id>","budgetId":"<budget-id>","to":"client@example.com","cc":[],"replyTo":"team@example.com","subject":"Estimate","content":"<p>Attached estimate</p>","signature":"<p>Team</p>"}'
168
+
164
169
  ## `bb budget create`
165
170
 
166
171
  Create Budget.
@@ -169,6 +174,11 @@ Legacy aliases: `create-budget`, `create_budget`.
169
174
 
170
175
  Effects: state-change.
171
176
 
177
+ Payload fields (--payload JSON)
178
+ Required: name: string; budget: decimal string; paymentTerm: string; categoryId: string; projectId: string
179
+ Optional: sourceBudgetId: string; unavailableItemReviewAcknowledged: boolean (only after review); pipedriveDealId: string
180
+ Example: bb create-budget --payload '{"name":"Event budget","budget":"1500","paymentTerm":"Net 30","categoryId":"<category-id>","projectId":"<project-id>"}'
181
+
172
182
  ## `bb budget update`
173
183
 
174
184
  Update Budget.
@@ -177,6 +187,11 @@ Legacy aliases: `update-budget`, `update_budget`.
177
187
 
178
188
  Effects: state-change.
179
189
 
190
+ Payload fields (--payload JSON)
191
+ Required: id: string; name: string; budget: decimal string; paymentTerm: string; categoryId: string; projectId: string
192
+ Optional: sourceBudgetId: string; pipedriveDealId: string
193
+ Example: bb update-budget --payload '{"id":"<budget-id>","name":"Event budget","budget":"1500","paymentTerm":"Net 30","categoryId":"<category-id>","projectId":"<project-id>"}'
194
+
180
195
  ## `bb budget delete`
181
196
 
182
197
  Delete Budget.
@@ -273,6 +288,11 @@ Legacy aliases: `update-budget-commission`, `update_budget_commission`.
273
288
 
274
289
  Effects: state-change, financial-write.
275
290
 
291
+ Payload fields (--payload JSON)
292
+ Required: budgetId: string; name: string; percentage: decimal string; totalSellingAfterDiscount: number
293
+ Optional: none
294
+ Example: bb update-budget-commission --payload '{"budgetId":"<budget-id>","name":"Sales commission","percentage":"10","totalSellingAfterDiscount":1500}'
295
+
276
296
  ## `bb budget discount update`
277
297
 
278
298
  Update Budget Discount.
@@ -281,6 +301,11 @@ Legacy aliases: `update-budget-discount`, `update_budget_discount`.
281
301
 
282
302
  Effects: state-change, financial-write.
283
303
 
304
+ Payload fields (--payload JSON)
305
+ Required: budgetId: string; name: string; type: percentage|amount; value: decimal string; totalSellingBeforeDiscount: number
306
+ Optional: none
307
+ Example: bb update-budget-discount --payload '{"budgetId":"<budget-id>","name":"Discount","type":"amount","value":"100","totalSellingBeforeDiscount":1500}'
308
+
284
309
  ## `bb budget commission delete`
285
310
 
286
311
  Delete Budget Commission.
@@ -353,6 +378,11 @@ Legacy aliases: `create-bill`, `create_bill`.
353
378
 
354
379
  Effects: state-change, email, external-write, financial-write.
355
380
 
381
+ Payload fields (--payload JSON)
382
+ Required: budgetId: string; projectId: string; supplierId: string; amount: number (ex-GST); budgetItemIds: string[]; isClaimable: boolean; supplier bills: quotationIds: string[] or quotationAllocations: {budgetItemId, quotationId, amount}[] (unless --quotation-exempt)
383
+ Optional: lineAmounts: {budgetItemId, amount}[] (required with quotationAllocations); attachments: {id,name,key,size}[]; invoiceNumber: string; invoiceDate: ISO date; draftOnly: boolean; alreadyPaid: boolean; extractedAmount: number
384
+ Example: bb create-bill --payload '{"budgetId":"<budget-id>","projectId":"<project-id>","supplierId":"<supplier-id>","amount":1800,"budgetItemIds":["<budget-item-id>"],"isClaimable":false,"quotationIds":["<quotation-id>"],"attachments":[]}'
385
+
356
386
  ## `bb bill selection validate`
357
387
 
358
388
  Validate the approved supplier and selected bill line items.
@@ -361,6 +391,11 @@ Legacy aliases: `validate-bill-selection`, `validate_bill_selection`.
361
391
 
362
392
  Effects: none.
363
393
 
394
+ Payload fields (--payload JSON)
395
+ Required: projectId: string; supplierId: string; budgetItemIds: string[]
396
+ Optional: quotationIds: string[] for supplier bills; isClaimable: boolean; amount: number; lineAmounts: {budgetItemId, amount}[]; quotationAllocations: {budgetItemId, quotationId, amount}[] (requires amount and lineAmounts)
397
+ Example: bb validate-bill-selection --payload '{"projectId":"<project-id>","supplierId":"<supplier-id>","budgetItemIds":["<budget-item-id>"],"quotationIds":["<quotation-id>"]}'
398
+
364
399
  ## `bb bill quotation link`
365
400
 
366
401
  Link Bill Quotations.
@@ -369,6 +404,11 @@ Legacy aliases: `link-bill-quotations`, `link_bill_quotations`, `billId`.
369
404
 
370
405
  Effects: state-change, financial-write.
371
406
 
407
+ Payload fields (--payload JSON)
408
+ Required: positional <billId>; quotationIds: string[] or quotationAllocations: {budgetItemId, quotationId, amount}[]
409
+ Optional: none (legacy quotationId is not supported)
410
+ Example: bb link-bill-quotations <billId> --payload '{"quotationIds":["<quotation-id>"]}'
411
+
372
412
  ## `bb bill update`
373
413
 
374
414
  Update a bill or claim; payload must include id. All amount fields exclude GST: amount is the portion billed; extractedAmount is the full invoice subtotal; lineAmounts and quotationAllocations also exclude GST. Example: 1800 + 162 GST = 1962 total requires amount=1800 and extractedAmount=1800 for a full bill. The CLI does not strip GST from input. Re-read and verify both amount fields and allocations after correcting a gross/net mistake.
@@ -377,6 +417,11 @@ Legacy aliases: `update-bill`, `update_bill`.
377
417
 
378
418
  Effects: state-change, external-write, financial-write.
379
419
 
420
+ Payload fields (--payload JSON)
421
+ Required: id: string; budgetId: string; projectId: string; supplierId: string; amount: number (ex-GST); budgetItemIds: string[]; isClaimable: boolean
422
+ Optional: quotationIds: string[]; quotationAllocations: {budgetItemId, quotationId, amount}[]; lineAmounts: {budgetItemId, amount}[]; attachments: {id,name,key,size}[]; invoiceNumber: string; invoiceDate: ISO date
423
+ Example: bb update-bill --payload '{"id":"<bill-id>","budgetId":"<budget-id>","projectId":"<project-id>","supplierId":"<supplier-id>","amount":1800,"budgetItemIds":["<budget-item-id>"],"isClaimable":false,"quotationIds":["<quotation-id>"],"attachments":[]}'
424
+
380
425
  ## `bb bill payment-evidence update`
381
426
 
382
427
  Update Bill Payment Evidence.
@@ -385,6 +430,11 @@ Legacy aliases: `update-bill-payment-evidence`, `update_bill_payment_evidence`.
385
430
 
386
431
  Effects: state-change, financial-write.
387
432
 
433
+ Payload fields (--payload JSON)
434
+ Required: id: string; paymentReference: string; paymentProofAttachments: {id,name (PDF),key,size}[] (at least one)
435
+ Optional: none
436
+ Example: bb update-bill-payment-evidence --payload '{"id":"<bill-id>","paymentReference":"TRANSFER-123","paymentProofAttachments":[{"id":"<attachment-id>","name":"receipt.pdf","key":"<staged-key>","size":1000}]}'
437
+
388
438
  ## `bb bill delete`
389
439
 
390
440
  Delete Bill.
@@ -513,6 +563,11 @@ Legacy aliases: `create-quotation`, `create_quotation`.
513
563
 
514
564
  Effects: state-change.
515
565
 
566
+ Payload fields (--payload JSON)
567
+ Required: projectId: string; budgetId: string; supplierId: string; budgetItemIds: string[]; amountWithoutGst: number; gstAmount: number; attachments: array (uploaded attachment)
568
+ Optional: lineAmounts: {budgetItemId, amount}[] (required for multiple budget items)
569
+ Example: bb create-quotation --payload '{"projectId":"<project-id>","budgetId":"<budget-id>","supplierId":"<supplier-id>","budgetItemIds":["<budget-item-id>"],"amountWithoutGst":1200,"gstAmount":0,"attachments":[{"id":"<attachment-id>","name":"quote.pdf","key":"<staged-key>","size":1000}]}'
570
+
516
571
  ## `bb quotation update`
517
572
 
518
573
  Update a DRAFT or REJECTED quotation using --payload JSON with id and the complete creation payload. Multiple budget items require lineAmounts: [{"budgetItemId":"<first-id>","amount":750},{"budgetItemId":"<second-id>","amount":450}], covering every budgetItemIds entry exactly once and summing to amountWithoutGst. Amounts exclude GST; use gstAmount: 0 for no GST.
@@ -521,6 +576,11 @@ Legacy aliases: `update-quotation`, `update_quotation`.
521
576
 
522
577
  Effects: state-change.
523
578
 
579
+ Payload fields (--payload JSON)
580
+ Required: id: string; projectId: string; budgetId: string; supplierId: string; budgetItemIds: string[]; amountWithoutGst: number; gstAmount: number; attachments: array
581
+ Optional: lineAmounts: {budgetItemId, amount}[] (required for multiple budget items)
582
+ Example: bb update-quotation --payload '{"id":"<quotation-id>","projectId":"<project-id>","budgetId":"<budget-id>","supplierId":"<supplier-id>","budgetItemIds":["<budget-item-id>"],"amountWithoutGst":1200,"gstAmount":0,"attachments":[{"id":"<attachment-id>","name":"quote.pdf","key":"<staged-key>","size":1000}]}'
583
+
524
584
  ## `bb quotation delete`
525
585
 
526
586
  Delete Quotation.
@@ -641,6 +701,11 @@ Legacy aliases: `create-customer-invoice`, `create_customer_invoice`.
641
701
 
642
702
  Effects: state-change, email, external-write, financial-write.
643
703
 
704
+ Payload fields (--payload JSON)
705
+ Required: budgetId: string; splits: [{label: string, percentage: number, dueDate: ISO date}] (exactly one)
706
+ Optional: requestId: UUID string (recommended); invoiceDate: ISO date; details: {billingAddress: string, customerMemo: string}; isCustomPercentage: boolean
707
+ Example: bb create-customer-invoice --payload '{"budgetId":"<budget-id>","splits":[{"label":"Deposit","percentage":50,"dueDate":"2026-10-15"}],"details":{"billingAddress":"1 Example St","customerMemo":"Thanks"}}'
708
+
644
709
  ## `bb customer-invoice discard`
645
710
 
646
711
  Discard Customer Invoice.
@@ -689,6 +754,11 @@ Legacy aliases: `send-customer-invoice-to-contact-person`, `send_customer_invoic
689
754
 
690
755
  Effects: state-change, email.
691
756
 
757
+ Payload fields (--payload JSON)
758
+ Required: invoiceId: string; to: email; cc: email[]; replyTo: email; subject: string; content: HTML string; signature: HTML string
759
+ Optional: none
760
+ Example: bb send-customer-invoice-to-contact-person --payload '{"invoiceId":"<invoice-id>","to":"client@example.com","cc":[],"replyTo":"team@example.com","subject":"Invoice","content":"<p>Attached invoice</p>","signature":"<p>Team</p>"}'
761
+
692
762
  ## `bb customer-invoice pdf download`
693
763
 
694
764
  Download a customer invoice PDF when permitted.
@@ -817,6 +887,11 @@ Legacy aliases: `update-company`, `update_company`.
817
887
 
818
888
  Effects: state-change, external-write.
819
889
 
890
+ Payload fields (--payload JSON)
891
+ Required: id: string; name: string; website: URL string
892
+ Optional: confirmDistinct: boolean
893
+ Example: bb update-company --payload '{"id":"<company-id>","name":"Example Co","website":"https://example.com"}'
894
+
820
895
  ## `bb company delete`
821
896
 
822
897
  Delete Company.
@@ -875,7 +950,7 @@ Effects: state-change, external-write.
875
950
 
876
951
  ## `bb project create`
877
952
 
878
- Create Project.
953
+ Create a project linked to an existing Asana Deals lead task. Supply --asanaTaskId in non-interactive use; interactive use searches for and selects a lead task (optionally --asanaSearch). The Slack channel is resolved from the selected Asana task unless all three Slack channel flags are supplied. For a new direct client, create the lead task using the website form first.
879
954
 
880
955
  Legacy aliases: `create-project`, `create_project`.
881
956
 
@@ -889,6 +964,11 @@ Legacy aliases: `update-project`, `update_project`.
889
964
 
890
965
  Effects: state-change, external-write.
891
966
 
967
+ Payload fields (--payload JSON)
968
+ Required: id: string; name: string; companyId: string; contactPersonId: string; asanaTaskId: string; insideSalesId: string; businessDevelopmentId: string; venue: string; dateRange: {from: ISO date}
969
+ Optional: dateRange.to: ISO date; projectManagerId: string; pax: string; description: string; slackChannelId/slackChannelUrl/slackChannelName: strings (supply all three); requestQboAccountantNotification: boolean; confirmEstimateInvalidation: boolean
970
+ Example: bb update-project --payload '{"id":"<project-id>","name":"Launch","companyId":"<company-id>","contactPersonId":"<contact-id>","asanaTaskId":"<asana-task-id>","insideSalesId":"<user-id>","businessDevelopmentId":"<user-id>","venue":"Hall","dateRange":{"from":"2026-10-01T09:00:00Z"}}'
971
+
892
972
  ## `bb project delete`
893
973
 
894
974
  Delete Project.
@@ -953,6 +1033,11 @@ Legacy aliases: `create-contact-person`, `create_contact_person`.
953
1033
 
954
1034
  Effects: state-change.
955
1035
 
1036
+ Payload fields (--payload JSON)
1037
+ Required: companyId: string; title: MR|MRS|MS|DR; firstName: string; lastName: string|null; email: string; mobile: string
1038
+ Optional: address: {streetAddress1?, city?, state?, postalCode?, country?}
1039
+ Example: bb create-contact-person --payload '{"companyId":"<company-id>","title":"MS","firstName":"Jane","lastName":"Tan","email":"jane@example.com","mobile":"+65 9123 4567"}'
1040
+
956
1041
  ## `bb contact update`
957
1042
 
958
1043
  Update Contact Person.
@@ -961,6 +1046,11 @@ Legacy aliases: `update-contact-person`, `update_contact_person`.
961
1046
 
962
1047
  Effects: state-change.
963
1048
 
1049
+ Payload fields (--payload JSON)
1050
+ Required: id: string; companyId: string; title: MR|MRS|MS|DR; firstName: string; lastName: string|null; email: string; mobile: string
1051
+ Optional: address: object
1052
+ Example: bb update-contact-person --payload '{"id":"<contact-id>","companyId":"<company-id>","title":"MS","firstName":"Jane","lastName":"Tan","email":"jane@example.com","mobile":"+65 9123 4567"}'
1053
+
964
1054
  ## `bb supplier list`
965
1055
 
966
1056
  List suppliers.
@@ -977,6 +1067,11 @@ Legacy aliases: `create-supplier`, `create_supplier`.
977
1067
 
978
1068
  Effects: state-change, email, external-write.
979
1069
 
1070
+ Payload fields (--payload JSON)
1071
+ Required: name: string; primaryContactPerson: string; email: string; phone: string; paymentMethodId: string; paymentTerm: string; roleId: string
1072
+ Optional: gstRegistered: boolean; tags: string[]; website: URL string; address: object; attachments: array; bank and PayNow fields
1073
+ Example: bb create-supplier --payload '{"name":"Example Supplier","primaryContactPerson":"Jane Tan","email":"jane@example.com","phone":"91234567","paymentMethodId":"<method-id>","paymentTerm":"Net 30","roleId":"<role-id>"}'
1074
+
980
1075
  ## `bb supplier update`
981
1076
 
982
1077
  Update Supplier.
@@ -985,6 +1080,11 @@ Legacy aliases: `update-supplier`, `update_supplier`.
985
1080
 
986
1081
  Effects: state-change, email, external-write.
987
1082
 
1083
+ Payload fields (--payload JSON)
1084
+ Required: id: string; name: string; primaryContactPerson: string; email: string; phone: string; paymentMethodId: string; paymentTerm: string; roleId: string
1085
+ Optional: gstRegistered: boolean; tags: string[]; website: URL string; address: object; attachments: array; bank and PayNow fields
1086
+ Example: bb update-supplier --payload '{"id":"<supplier-id>","name":"Example Supplier","primaryContactPerson":"Jane Tan","email":"jane@example.com","phone":"91234567","paymentMethodId":"<method-id>","paymentTerm":"Net 30","roleId":"<role-id>"}'
1087
+
988
1088
  ## `bb supplier delete`
989
1089
 
990
1090
  Delete Suppliers.
@@ -1065,6 +1165,11 @@ Legacy aliases: `create-item`, `create_item`.
1065
1165
 
1066
1166
  Effects: state-change, external-write.
1067
1167
 
1168
+ Payload fields (--payload JSON)
1169
+ Required: name: string (QuickBooks-safe characters); categoryId: string; supplierId: string; cost: decimal string or number
1170
+ Optional: description: string; gstInclusive: boolean; gstOutOfScope: boolean; goLabsProduct: boolean; attachments: array
1171
+ Example: bb create-item --payload '{"name":"Event Crew per hour","categoryId":"<category-id>","supplierId":"<supplier-id>","cost":19}'
1172
+
1068
1173
  ## `bb item update`
1069
1174
 
1070
1175
  Update Item.
@@ -1073,6 +1178,11 @@ Legacy aliases: `update-item`, `update_item`.
1073
1178
 
1074
1179
  Effects: state-change, external-write.
1075
1180
 
1181
+ Payload fields (--payload JSON)
1182
+ Required: id: string; name: string; categoryId: string; supplierId: string; cost: decimal string or number
1183
+ Optional: description: string; gstInclusive: boolean; gstOutOfScope: boolean; goLabsProduct: boolean; attachments: array
1184
+ Example: bb update-item --payload '{"id":"<item-id>","name":"Event Crew per hour","categoryId":"<category-id>","supplierId":"<supplier-id>","cost":"19"}'
1185
+
1076
1186
  ## `bb item archive`
1077
1187
 
1078
1188
  Archive Items.
@@ -1297,6 +1407,11 @@ Legacy aliases: `save-inbound-mapping`, `save_inbound_mapping`.
1297
1407
 
1298
1408
  Effects: state-change.
1299
1409
 
1410
+ Payload fields (--payload JSON)
1411
+ Required: positional <sourceId>; payload: [{canonicalField: enum, typeformFieldId: string, required?: boolean, typeformFieldRef?: string|null}] (1-50 entries)
1412
+ Optional: required defaults false; typeformFieldRef may be omitted
1413
+ Example: bb save-inbound-mapping <sourceId> --payload '[{"canonicalField":"CONTACT_FIRST_NAME","typeformFieldId":"<typeform-field-id>"}]'
1414
+
1300
1415
  ## `bb inbound automation save`
1301
1416
 
1302
1417
  Save Inbound Automation Config.
@@ -1305,6 +1420,11 @@ Legacy aliases: `save-inbound-automation-config`, `save_inbound_automation_confi
1305
1420
 
1306
1421
  Effects: state-change.
1307
1422
 
1423
+ Payload fields (--payload JSON)
1424
+ Required: positional <sourceId>; asanaCustomFields: object; asanaDefaultAssigneeId: string|null; asanaDefaultAssigneeName: string|null; asanaFollowerIds: string[]; asanaProjectId: string; asanaSectionId: string; asanaWonSectionId: string; asanaLostSectionId: string; googleCalendarId: string; googleCalendarTimeZone: string; goshBriefBaseUrl: URL; slackDefaultAssigneeId: string|null; slackInboundChannelId: string; slackInviteUserIds: string[]; slackPitchChannelPrefix: string
1425
+ Optional: asanaDiscussionSectionId, asanaFirstContactSectionId, asanaFirstProposalSentSectionId, asanaProposalWipSectionId: string|null; asanaCustomFields.*: mapped IDs
1426
+ Example: bb save-inbound-automation-config <sourceId> --payload '{"asanaCustomFields":{},"asanaDefaultAssigneeId":null,"asanaDefaultAssigneeName":null,"asanaFollowerIds":[],"asanaProjectId":"<asana-project-id>","asanaSectionId":"<asana-section-id>","asanaWonSectionId":"<asana-won-id>","asanaLostSectionId":"<asana-lost-id>","googleCalendarId":"team@example.com","googleCalendarTimeZone":"Asia/Singapore","goshBriefBaseUrl":"https://example.com/brief","slackDefaultAssigneeId":null,"slackInboundChannelId":"<slack-channel-id>","slackInviteUserIds":[],"slackPitchChannelPrefix":"pitch"}'
1427
+
1308
1428
  ## `bb inbound processing update`
1309
1429
 
1310
1430
  Update Inbound Processing.