Public Safety

Producing the AB 481 annual report

Collect the six Government Code 7072 items through the year in UAS Dashboard and export the AB 481 annual report as a PDF at year end.

9 min read Updated August 30, 2026For California agency program managers

California Government Code § 7072 requires an agency operating covered equipment — including UAS — to publish an annual military equipment report with six specific contents. UAS Dashboard collects those six items across the year and exports them as one PDF. This article covers what the product derives on its own, what you have to type in, and how to run the export.

It is written for whoever owns the AB 481 filing, usually a program manager or global admin. For the obligations behind the report — ordinance approval, publication, the annual governing-body review — see the AB 481 transparency guide.

Before you start: availability and access

AB 481 support is behind the ab481 feature flag, and that flag is off by default.

This is an Enterprise-instance feature. ab481 is on the enterprise-only list, so it is unavailable on the shared Core plan at every tier — Free, Starter, and Complete alike. It runs only on an isolated Enterprise instance, and we turn it on per instance; there is no settings screen for it in your account. If you do not see the cards described below, contact us.

Two gates, not one. The three admin cards, the Complaints page, and the extra fields on the aircraft dialog appear as soon as the flag is on. The export card on the Reports page has a second condition: your agency state must be CA. Set it in Admin → Organization, in the "Agency state (2-letter)" field. With the state set, the Reports page header also changes from "Reports & Analytics" to "Reports & Compliance."

Roles matter too. The admin cards require a global admin. Supervisors and above can log and edit complaints; deleting one requires a global admin. Running the report requires supervisor or admin.

Where each of the six § 7072 items comes from

Half the report writes itself from your flight and fleet data. The other half exists only because someone entered it.

§ 7072 itemSource in the productDerived or entered
(1) How the equipment was used, and how oftenFlight records and DFR incidents in the periodDerived
(2) Complaints or concerns receivedComplaints pageEntered
(3) Internal audit results, policy violations, actions takenAdmin → AB 481 Annual StatementEntered
(4) Total annual cost by type, with funding sourcesAircraft acquisition cost fields plus AB 481 Program CostsEntered
(5) Quantity possessed of each typeDrone records in EquipmentDerived
(6) Equipment intended for next yearAdmin → AB 481 Planned AcquisitionsEntered

The derived side needs no upkeep beyond good flight data; fleet inventory counts every Drone record at the moment you export, regardless of status. The entered side is unforgiving — nothing appears that a person did not type.

One detail catches people out. Maintenance cost is not rolled up from your maintenance records. It is a typed cost line item with the category maintenance. Log repairs all year without creating that line item and the report shows no maintenance spend.

Entering costs, planned acquisitions, and the annual statement

All three live on the Organization tab in Admin, as separate cards below the branding settings.

AB 481 Program Costs

Open the card with "Manage costs." Each row is one recurring cost for one calendar year: label, category, funding source, year, and amount. Categories are software, storage, training, maintenance, staffing, insurance, and other; funding sources are general_fund, grant, forfeiture, donation, and other.

Aircraft purchase prices do not go here. Enter those on the aircraft itself: open a UAS record and, with the flag on, you get "Acquisition Cost (USD)" and "Funding Source" fields directly after "Purchased." An aircraft counts as an acquisition only when its purchase date falls inside the reporting period, so a wrong Purchased date silently drops the cost from the subtotal.

AB 481 Planned Acquisitions

One row per intended purchase: name, equipment type (aircraft, ground_vehicle, payload, other), quantity, target year, estimated cost, and funding source. Under § 7071 these need governing-body approval before you solicit bids or apply for funding, so add them before an RFP or grant application goes out — not after.

AB 481 Annual Statement

One statement per year. Pick the reporting year, write the internal audit summary, then add violations one at a time — each is a description plus the corrective action taken. The report prints all of it verbatim, and says so plainly when no statement exists for the year.

Logging complaints and concerns

Complaints have their own page at /complaints, under Management → Complaints in the nav. There is no public intake form; complaints arrive through whatever channels your agency already uses, and staff log them here. Use "Log Complaint" and fill in the received date, channel (phone, email, in person, city or county portal, mail, public meeting, other), the unit if one applies, status (open, under review, closed), disposition (sustained, not sustained, unfounded, exonerated, policy failure, no finding, or blank), the response date, a summary, and the action taken.

The Internal notes field is deliberately excluded from the report — put working detail there and keep the summary and action taken clean, because those two print in full. Log complaints as they arrive; reconstructing a year of them in December is how dates and dispositions go wrong.

Making the purpose breakdown match your operations

"Deployments by Purpose" is the closest thing the report has to § 7072(a)(1), and its accuracy depends on two habits.

First, DFR incidents win. When a DFR incident carries a linked flight ID, that flight's purpose becomes DFR: <call type> and the mission-name guess is skipped. Call type is free text with no enum, so whatever your operators type becomes the bucket label — "Burglary in progress" and "burglary ip" are two separate lines. Agree on a call-type vocabulary and fill in "Linked flight ID" on every incident.

Second, mission names drive everything else. With no linked incident, the mission or flight name is matched for keywords: search or missing becomes Search, pursuit becomes Pursuit / Overwatch, train becomes Training, scene or document becomes Scene Documentation, barricad, swat, or tactical becomes Tactical Support, dfr becomes DFR Response, and anything else falls into Other Field Deployment. A large Other Field Deployment count is a naming problem — renaming missions is easier than explaining that bucket to a city council.

Exporting the AB 481 report

Go to Reports and set the date range and, if you are a global admin, the unit filter in the page header — the AB 481 card uses whatever is selected above it. The default range is January 1 of the current year through now. Then use the AB 481 Deployment Report card:

  1. Export PDF produces uas_ab481_report_<from>_<to>.pdf. This is the deliverable.
  2. Export CSV produces uas_deployments_<from>_<to>.csv — flight rows only: flight ID, date, unit, mission, title, purpose, address, RPIC, duration, night flag, aircraft, serial. It contains none of the six § 7072 items.

The PDF sections run in a fixed order: Deployment Summary, Deployments by Purpose, Usage by Aircraft, Deployments by Unit, Monthly Activity, Drone as First Responder (DFR), then the AB 481 block — Fleet Inventory (Quantity Possessed by Type), Complaints & Concerns, Internal Audit & Policy Violations, Annual Cost by Type with "Acquisitions in period" and "Recurring & maintenance costs" subheads, and Planned Acquisitions. Both exports write an audit-log entry.

Export AB 481 reports at All units. Only flights and DFR incidents are unit-scoped. Fleet inventory, complaints, costs, and the statement are agency-wide whichever unit you filter to, so a unit-scoped export mixes one unit's deployment numbers with agency-wide everything else.

The date range shapes more than the flight rows. Recurring cost rows are stored per year, so a partial-year range still pulls whole-year line items. Planned acquisitions come in from the range's start year forward, so this year's plans appear alongside next year's. The annual statement is matched on the range's end year, so a range crossing a year boundary picks up the later year's statement. A clean January 1 to December 31 range lines all three up.

The PDF is a snapshot, not a filed document. There is no year lock, no stored version, and no "filed" state — re-run the export after anyone edits a complaint or a cost row and the numbers change. Keep the PDF you actually file, with the date you filed it, in your records system.

Running the annual cycle

Doing this monthly costs minutes. Doing it in one December sitting costs a week.

  • As it happens: log every complaint the day it arrives, and record disposition and response date when the review closes.
  • As it happens: fill in acquisition cost, funding source, and the Purchased date when you add an aircraft, and put the linked flight ID on every DFR incident.
  • Monthly: add or update cost line items — software, storage, training, maintenance, insurance — and skim recent missions for names that would land in Other Field Deployment.
  • When plans firm up: add planned acquisitions before any solicitation or grant application goes out.
  • At year end: write the annual statement, confirm the fleet list is current, then export the PDF for January 1 to December 31 at All units and retain the copy you file.

What the product does not do

The export covers the § 7072 report contents. It does not cover the rest of AB 481.

  • No use-policy document, and no tracking of the ordinance or its approval and renewal under § 7071.
  • No publication of the policy or the report on your agency website.
  • No submission artifact for the governing body, and no record of the required public meeting.
  • No deadline reminder — nothing tells you the report is due.

Those obligations belong to your agency and its counsel; the AB 481 transparency guide walks through them.

Frequently asked questions

Can we turn on AB 481 reporting ourselves?

No. The ab481 flag defaults to off and is set per instance by us, and the feature is not sold on the shared Core plan at any tier — it requires an isolated Enterprise instance. Once it is on, set your agency state to CA in Admin → Organization to make the export card appear.

Why is maintenance cost zero when we log maintenance all year?

Because the report reads cost line items, not maintenance records. To report maintenance spend, add a row in Admin → AB 481 Program Costs with the category set to maintenance, the right year, an amount, and a funding source. Maintenance logs on aircraft never roll up into the cost section on their own.

Does the CSV export contain the annual report?

No. The CSV is flight rows only — one line per flight with date, unit, mission, purpose, pilot, duration, and aircraft. It contains none of the six § 7072 items: no complaints, no audit statement, no costs, no fleet inventory, no planned acquisitions. The PDF is the deliverable; the CSV is supporting flight data.

Why do most of our deployments show as Other Field Deployment?

That is the fallback bucket when a flight has no linked DFR incident and its mission name matches none of the keywords the report looks for. Rename missions using words like search, pursuit, training, scene, tactical, or DFR, and link DFR incidents to flights — a linked incident overrides the name guess and reports the call type instead.

Can we re-run the report after we file it?

Yes, and it will produce different numbers if any underlying data changed. The export is a live date-ranged query with no year lock and no stored version, and nothing marks a report as filed. Keep the exact PDF you submitted, and treat any later export as a fresh view of current data rather than a copy of what you filed.

Where to go next

Set your agency state and confirm roles in the admin and agency setup article before your first export. The DFR incident tracking article covers linking incidents to flights, and reports and exports covers everything else the Reports page produces.

Ready to set this up in your own instance?

Every workflow in this documentation is available on the free core platform. Agencies that need units, role-based access, DFR tools, and a dedicated instance run on Enterprise.

Product updates only — no spam, unsubscribe anytime.