09.15.2026
Today’s release includes the following updates:
bugfix
- Fixed an issue where a Refill or Adjust Prescription command added from an automation could be populated with a medication that was not on the patient’s own medication list. The medication field now starts empty when one of these commands comes from an automation, so the drug is chosen from the patient’s list.
- Saved automations are corrected automatically and do not need to be re-saved.
ui
- In the Review eligibility window, a payer’s note on a copay or coinsurance line now reads inline beside the amount instead of sitting behind an information icon. Lines a payer returns under the same service type, such as a primary care visit and a specialist visit, can be told apart without hovering, so the intended copay is the one saved onto the coverage.
- The Receipts window now names the patient in the Payer column for a payment posted directly to a claim. That column filled in only for payments collected as a patient payment, and was blank for the rest.
sdk
- Plugins can now charge a patient’s card on file with a new Charge Stored Card effect. Canvas runs the charge through its configured payment processor, so no card data crosses the plugin boundary.
- The payment applies to the patient’s outstanding balance, or to a single claim when a claim is named. A charge against a named claim can instead be recorded as a copay, which is how a copay or prepayment is collected on a claim that carries no balance.
- Every charge carries an idempotency key, so retrying one cannot charge the patient twice.
- The result comes back on a new
REVENUE__STORED_CARD__CHARGE_RESPONSEevent rather than from the effect itself, carrying whether the charge succeeded, the processor’s payment identifier, and an error code when it did not. - A patient’s cards on file are readable through a new PaymentCard data model, covering brand, last four digits, expiration, cardholder name, and which card is the default. The stored card token is never exposed.
- Canvas does not enforce patient consent for a stored-card charge. Obtaining it remains the practice’s responsibility.
- Plan- and Procedures-section commands can now be linked through the SDK to an Assessment made in the same note: Plan, Instruct, Follow Up, Goal, Update Goal, Close Goal, Stop Medication, Perform, Immunize, and Task.
- A command in the commands module takes the link as an
assessment_idwhen it is originated or edited. The matching model in the data module exposes it asassessment, and an Assessment lists the commands linked to it. - An assessment made in another note is rejected, and the link clears if the assessment is deleted or entered in error.
- The link is recorded but is not shown anywhere in a note yet.
- A command in the commands module takes the link as an
- The Medication data model now exposes
latest_sig, the most recent instructions recorded for a medication, taken from its latest prescription, medication change, or medication statement. Reading it no longer means walking the medication’s history.Medication.objects.with_latest_sig()loads it for a whole queryset at once.