Payment Patterns — Staff Fee Collection
Last updated: March 3, 2026
Overview
GovAssist supports two patterns for collecting fees after an initial application is submitted. Both patterns are designed to be configured per permit type based on your jurisdiction's fee structure.
Pattern 1 — Manual Fee Entry: Staff determines and enters the fee amount directly on the record.
Pattern 2 — Fee Definition with Staff Confirmation: Fees are auto-calculated from rate structures after staff verifies input variables.
Both patterns can coexist with filing fees collected at initial submission (filing fees use a separate payment configuration).
Prerequisites — Payment Form & Automation Setup
Both patterns require a dedicated payment form and automation to deliver the payment link to the applicant.
Step 1: Create a Payment Form
- Create a new form (or edit an existing payment form)
- Add at least one required field on Step 1 (e.g., applicant name, contact info)
- Add a Payment field on Step 2 or later
- Configure the payment provider (e.g., Govolution, Stripe)
- Set
amount_typetoDYNAMIC(Pattern 1) orCALCULATION(Pattern 2)
- Save the payment field
Payment cannot be the first step in a GovAssist form. Always add at least one required non-payment field on Step 1.
Step 2: Get the Citizen Form Link
- On the form configuration view find the Share Form button
- Click the Share Form button
- Copy the Citizen Form Link — this is the public URL applicants will use to access the form
Example link:
https://yourjurisdiction.govassist.app/forms/public/abc123def456
Step 3: Build the Automation
Create an automation on the permit entity to send the payment link when triggered:
Trigger:
- When a record is updated on the permit entity
- Condition: Fee field is not empty (Pattern 1), OR Confirmation checkbox is
true(Pattern 2)
Action: Send Email
- Add a Send Email action node
- Configure recipient: Use the applicant email field from the permit record
- Compose the email body with the payment link:
Message body template:
Payment is required for your permit application.
Please complete payment here:
[Citizen Form Link]?record_id=[Record ID]
Dynamic field substitution:
- Replace
[Citizen Form Link]with the static URL you copied in Step 2 - Replace
[Record ID]with the dynamic Record ID field from the permit record
Example (with dynamic fields):
Payment is required for your permit application.
Please complete payment here:
https://yourjurisdiction.govassist.app/forms/public/abc123def456?record_id={{record.id}}
The record_id query parameter ensures the payment form loads with the correct permit record context, so the payment is linked back to the triggering permit.
- Save and publish the automation
Why This Workflow Matters
- Form + Automation are required — Payments cannot be triggered without this setup
- The Citizen Form Link is static — it's the same for all applicants using this payment form
- The Record ID is dynamic — it changes per permit and ties the payment submission to the correct record
- The automation must append the Record ID to the form URL, not just send the base link
Pattern 1 — Manual Fee Entry
When to Use
Use this pattern when the fee amount cannot be calculated from a rate structure:
- Flat fees determined by staff review
- Penalty amounts
- Case-by-case fees without defined rates
- Discretionary fees requiring staff judgment
How It Works
Applicant Submits Application
The application may include a filing fee payment at submission (configured separately).
Staff Reviews and Determines Fee
Staff reviews the record and calculates the fee amount per your jurisdiction's fee schedule.
Staff Enters Fee Amount
Staff enters the dollar amount in a designated fee amount field on the permit record (e.g., manual_fee_amount, review_fee).
Saving this field can trigger an automation to send the payment link (optional, depending on workflow configuration).
Applicant Receives Payment Form
The automation (configured per the Prerequisites section above) sends an email with the payment form link + record ID to the applicant.
The automation triggers when the fee amount field is updated (not empty).
Applicant Pays
The applicant accesses the payment form. The amount is dynamically pulled from the fee field staff populated.
Configuration Requirements
Entity Setup:
| Requirement | Details |
|---|---|
| Fee amount field | A number or currency field (e.g., manual_fee_amount) to hold the staff-entered amount |
| Applicant email field | Required for sending payment links |
Payment Configuration:
| Setting | Value |
|---|---|
amount_type | DYNAMIC |
amount_field_id | ID of the fee amount field on the entity |
Automation (Required):
See Prerequisites — Payment Form & Automation Setup above for the complete automation workflow.
Summary:
- Trigger: Fee amount field is updated (not empty)
- Action: Send email with
[Citizen Form Link]?record_id={{record.id}}
Example Workflow
Scenario: Building permit with post-review fee
- Applicant submits application and pays $50 filing fee
- Staff reviews plans and calculates permit fee: $1,200
- Staff enters
1200in themanual_fee_amountfield and saves - Automation emails applicant: "Payment of $1,200 is required. [Pay Now Link]"
- Applicant clicks link, payment form loads with $1,200 pre-filled
- Applicant pays via credit card through payment provider
- Payment status updates on permit record
Notes
- Staff has full control over the amount — no automated calculation occurs
- If the amount needs to change, staff updates the field; the automation can re-fire with the new amount
- Filing fees and post-review fees are separate payment configurations
Pattern 2 — Fee Definition with Staff Confirmation
When to Use
Use this pattern when fees are calculated from a rate structure, but the input variable must be verified by staff before billing:
- Per-acre or per-square-foot fees
- Tiered fees based on construction value
- Formula-based fees with staff-confirmed inputs
- Any scenario where applicant-submitted values need official verification
How It Works
Applicant Submits Application
Applicant enters estimated values (e.g., building area, acreage). A filing fee may be collected at this stage.
Staff Reviews and Verifies Input
Staff reviews the record and updates the input variable to the verified value based on official sources (parcel records, site plans, etc.).
Example: Applicant entered 2,500 sq ft; staff verifies from plans and updates to 2,750 sq ft.
Staff Checks Confirmation Field
Staff checks a confirmation checkbox on the record (e.g., fee_confirmed, label: "Fee Values Confirmed").
This checkbox is a formal attestation that the input is accurate and the fee calculation is ready.
Automation Sends Payment Link
The automation (configured per the Prerequisites section above) sends an email with the payment form link + record ID to the applicant.
The automation triggers when the confirmation checkbox changes to true.
Fee Is Auto-Calculated
The payment form uses the staff-confirmed value(s) to calculate the fee against configured fee definitions.
Example: 2,750 sq ft × $0.45/sq ft = $1,237.50
Applicant Pays
Applicant sees the calculated total and completes payment.
Configuration Requirements
Entity Setup:
| Requirement | Details |
|---|---|
| Confirmation checkbox field | Boolean field (e.g., fee_confirmed) that triggers the payment automation |
| Input variable field(s) | Field(s) holding the staff-verified value (e.g., building_area, acreage) — must be editable by staff |
| Applicant email field | Required for sending payment links |
Fee Definitions:
| Setting | Details |
|---|---|
| Calculation method | per_unit, tiered, formula, percentage, or fixed_amount |
| Fee schedule mapping | permit_field_id must reference the input variable field on the entity |
is_calculated | Set to true in the fee schedule |
Payment Configuration:
| Setting | Value |
|---|---|
amount_type | CALCULATION |
fee_config.fee_schedules | List of applicable fee definitions with is_calculated: true |
Automation (Required):
See Prerequisites — Payment Form & Automation Setup above for the complete automation workflow.
Summary:
- Trigger: Confirmation checkbox field changes to
true - Action: Send email with
[Citizen Form Link]?record_id={{record.id}}
The confirmation checkbox is a one-time trigger per review cycle. If the input value changes after checking the box, the workflow must account for resetting the checkbox or issuing an updated payment request.
Example Workflow
Scenario: Grading permit with acreage-based fee
- Applicant submits application, enters 3 acres (estimated)
- Staff pays $100 filing fee (separate config)
- Staff reviews and verifies actual acreage from parcel records: 3.5 acres
- Staff updates
acreagefield to3.5 - Staff checks "Fee Values Confirmed" checkbox and saves
- Automation emails applicant: "Payment is required. [Pay Now Link]"
- Payment form calculates: 3.5 acres × $200/acre = $700
- Applicant pays $700
- Payment status updates on permit record
Fee Calculation Methods
The calculation_method in a fee definition determines how the fee is calculated:
| Method | Description | Example |
|---|---|---|
fixed_amount | Flat fee | $50 application fee |
per_unit | Rate × quantity | $0.25/sq ft × 2,000 sq ft = $500 |
tiered | Different rates per tier | 0-1,000 sq ft @ $0.50; 1,001-5,000 @ $0.30 |
formula | Custom formula with variables | (base_fee + sqft * rate) * (1 + tech_fee_pct) |
percentage | Percentage of another value | 10% of construction value |
Notes
- Staff must not check the confirmation box until all input fields are finalized — it's the point of no return for that billing cycle
- Multiple fee definitions can be applied in the same payment configuration (e.g., base fee + per-unit fee + technology fee)
- If input values change post-confirmation, coordinate with your jurisdiction's refund/adjustment policy
Comparison Summary
| Pattern 1 — Manual Entry | Pattern 2 — Fee Definition + Confirmation | |
|---|---|---|
| Fee determined by | Staff judgment | Configured fee definition |
| Calculation | None — staff enters amount directly | Automated against fee definition(s) |
| Trigger for payment link | Manual, automation, or status transition | Confirmation checkbox automation |
| Input variable verified | N/A | Yes — required before checkbox |
| Filing fee at submission | Optional, separate config | Optional, separate config |
| Best for | Variable or discretionary fees | Rate-based fees with verifiable inputs |
| Amount type | DYNAMIC | CALCULATION |
Filing Fees at Submission
Both patterns are compatible with collecting a filing fee at initial application submission. This is configured as a separate payment configuration on the submission form, independent of the post-review payment step.
Filing fee configuration:
amount_type:STATIC(fixed amount) orCALCULATION(if filing fee varies by permit type)- Collected at Step 1 or during the application form submission
- Does not require staff review or confirmation
Payment Field Configuration
For details on creating the payment form and automation, see Prerequisites — Payment Form & Automation Setup above.
Payment field settings by pattern:
| Setting | Pattern 1 Value | Pattern 2 Value |
|---|---|---|
| Component type | Payment | Payment |
| Payment provider | (e.g., Govolution, Stripe) | (e.g., Govolution, Stripe) |
| Amount type | DYNAMIC | CALCULATION |
| Dynamic source | Fee amount field ID | N/A |
| Fee config | N/A | Fee schedule(s) with is_calculated: true |
Refunds and Adjustments
Payment providers (e.g., Govolution) do not process refunds automatically. Refunds must be coordinated with your finance department externally.
Recommended workflow:
- Add a
payment_statusfield to the entity (dropdown: Pending, Paid, Refund Needed, Refunded) - Staff updates status to
Refund Neededwhen applicable - Finance processes refund externally
- Staff updates status to
Refundedonce complete
Records marked Refunded can be excluded from revenue reporting queries.
Troubleshooting
Common Issues
| Issue | Likely Cause | Solution |
|---|---|---|
| Applicant did not receive payment email | No email on file, or in spam | Verify applicant email; ask them to check spam folder |
| Payment form shows wrong amount (Pattern 1) | Fee field updated after link was sent | Update the field again; automation re-fires with new amount |
| Payment form shows wrong amount (Pattern 2) | Input variable changed after confirmation | Reset confirmation checkbox or issue manual correction |
| Payment link opens wrong record | Record ID mismatch in URL | Verify automation URL includes record_id query parameter |
| Payment shows pending after applicant paid | Provider processing delay | Wait 5-10 minutes; contact payment provider if unresolved |
Related Documentation
- Fee Definitions Configuration — Setting up fee structures and calculation methods
- Payment Provider Integration — Connecting payment processors
- Automation Builder — Creating payment request automations
- Form Builder — Configuring payment forms
Questions? Contact your system administrator or AutoBridge support.