AI Systems · FinGuard · Internal build · public demo

FinGuard let the compliance team own the rules marketing writes against

An internal tool built at PingPong to unblock the queue between marketing and compliance. Submit any public-facing asset, pick where it will run, and get a jurisdiction-matched audit that cites the rule and links its source. Compliance and legal maintain the policies themselves.

The internal build ran at PingPong. The demo that opens here is public, and it runs on seed data with static rule text.

Built for compliance to ownthe rulebook lives outside my code
Internal build, public demothe counts here are seed data
The compliance queue

Marketing approved it in an hour. Then it sat in compliance for a week.

At PingPong, a B2B cross-border payments platform, every public-facing word goes through internal review. Marketing signs off quickly. Compliance has to sign off too, and that is where the timeline lived, because a marketing asset is rarely the most urgent thing on a compliance team's desk.

Compliance had written marketing guidance, and it varied by region. The team applied it from memory and asked a person when unsure, over email, which is where requests get buried. The publishing calendar bent around a queue nobody owned. Nobody was measured on that queue either, so the hour and the week are what the team recalled.

This is a cross-department problem before it is a technology problem, and it is the kind I find worth solving: a small, specific operational failure that the team put at days every month.

Products that exist for this

Compliance suites, AI checkers, a raw chatbot

This is a common enough problem that products exist for it. None of them fit a marketing team sitting inside a regulated payments business.

OptionWhat it gaveWhere it brokeVerdict
Enterprise compliance suites

They watch, archive and attest, and they leave the audit trail regulators expect.

They are built and priced for the compliance department, so marketing cannot self-serve. That is the bottleneck.

Rejected
General AI content checkers

An instant read on any text, with no setup.

They cite nothing, and they know nothing about which jurisdiction the asset is shipping into. A compliance reviewer cannot verify what comes back.

Rejected
A chatbot with the policy pasted in

A good answer on the day you paste it, for the cost of a subscription somebody already has.

The policy goes stale inside the prompt, it logs nothing, and the next person starts from an empty box.

Rejected

All three treat the verdict as the deliverable. Legal wanted the artifact around it: a time-stamped record with the rule and the source attached, which they had been assembling by hand after the fact.

Designed for the reviewer

Built so the compliance team could run it without help

I designed it for the reviewer first. If compliance and risk could not maintain the rules themselves, the tool would drift out of date and the team would go back to email within a month.

So compliance and legal own their own records: they upload the approved company policy, the compliance policy, and the regional variations, and edit them in place. Marketing submits an asset and picks where it will run. The tool matches the asset to the rules for that jurisdiction and channel, and anything needing a human decision notifies the right reviewer, and the shared inbox is out of the path.

Everything lands in one record, which I expected to matter as much as the checking: past approved copy became searchable, so the safest phrasing for a claim could be reused.

The four surfaces

Compliance writes the rule in the product, marketing gets the verdict in seconds

Compliance hub

Submit ad copy, a one-pager or a deck, choose the destination jurisdiction, and get a risk score with the phrases that caused it.

Firm policies

The company's own overlays, each tagged to where it applies: absolute terms, fee disclosure, testimonial wording, capital-at-risk language.

Global atlas

Each jurisdiction carries its rules and their source, from FINRA 2210 and SEC 206(4)-1 to CCPA, NYDFS Part 500 and MiCA. I picked this set for the public demo so the example scope is reproducible. The internal build ran on a payments rulebook.

Audit log

It keeps every submission with its score, verdict and jurisdiction, so the log is the review history.

Findings cite the rule and link to its source, so a compliance reviewer can check the tool. The verdict is advisory throughout: it tells a human where to look and leaves the decision with them.

marketing-compliance-check.vercel.app
FinGuard firm policies screen with policy cards tagged by jurisdiction
FinGuard audit log listing past checks with risk factors, verdicts and jurisdictions
FinGuard global atlas of jurisdictions, each showing its regulations and rule-feed freshness
FinGuard jurisdictional catalog showing FINRA and SEC rules with links to the primary regulatory source
FinGuard batch audit engine with a jurisdiction picker and a document upload area
A verdict, worked through

A flagged phrase comes back with the rule it breaks and a rewrite the marketer can use

Submit a line like "Guaranteed 15% Returns" and the tool returns three things together: the rule it breaks, FINRA 2210, the reason in a sentence a marketer understands, and a rewrite that keeps the intent. In this case "Historically targeted 15% annual returns", which is the same claim with the promise taken out of it.

The score alongside it runs 0 to 100 on risk, so a piece of copy sorts into pass, needs review or fail without anyone arguing about severity. The bet was that returning the rewrite in the same response would end the round trip: a flag on its own sends the draft back into the queue, while a flag with a compliant alternative ends the round trip there.

The rule feed stays current The internal build pulled SEC and FINRA updates on a schedule, and each jurisdiction card carried a freshness stamp; the public demo here ships with static rule text. A rulebook that quietly goes stale is worse than a checklist, because people trust it.
Region is one selector The same campaign gets re-checked against US federal, EU, UK or APAC from a single dropdown. State-level rules sit as their own entries, so California and New York each answer for themselves and a generic US verdict cannot swallow them.
The log is the deliverable It stamps, scores and archives every check, and exports a PDF certification. That artifact used to be assembled by hand after the fact.
What it was built to change

The review turned into a decision at the point of submission

I wanted marketing to stop shipping drafts that were going to come back, and compliance to stop being the first reader of obvious problems. In the product, the handoff is a notification with the flagged lines attached.

It is a small tool, and that is the point. I built it for one operational failure between two departments, and for the non-technical team that had to live in it.

The family it started

The first of these I built, and the one the others grew out of

FinGuard is early work. It was among the first things I web-coded.

The idea it proved, that a rulebook is more useful as structured data than as a document, is the one that carried forward. AdGuard applied it to platform advertising policy, and CreativeOS moved both to where the copy is drafted.

Where it stands

What the public demo does today, and what I am not claiming

The four surfaces are open at a public URL. The change it was built to make is where my evidence stops, so that boundary is named here.

Running

The four surfaces: compliance hub, firm policies, global atlas and audit log. Nine jurisdictions, each carrying its rule text and a link to the source. Batch audit takes PDF, TXT or DOCX, and every check can be exported as a PDF certification. The internal build pulled SEC and FINRA updates on a schedule, and the public demo here ships with static rule text.

Not claimed

I have no post-launch measurement to put against that. The counts in the public demo are seed data, and they say nothing about usage.

What it runs on

Deliberately small, because compliance had to be able to maintain it

There is no vector store and no retrieval layer here on purpose. The rulebook is small, bounded and changes rarely, so matching against records beats embedding them and hoping.

Application

React logoReactThe four surfaces compliance and marketing both work in. TypeScript logoTypeScriptTypes for the rule records and jurisdiction tags. Vite logoViteBuild tooling. Tailwind logoTailwindThe design layer.

Models

Gemini logoGemini FlashMatches submitted copy against the rules for the selected jurisdiction and drafts the compliant rewrite.

Knowledge

Jurisdictional catalogFINRA, SEC, CCPA, NYDFS and MiCA entries, each carrying the rule text and a link to the primary source. Firm policy overlaysThe company’s own directives, editable in the product by the people accountable for them.

Delivery

Vercel logoVercelHosting and the audit endpoint.

Want this kind of tooling on your team?

FinGuard was built inside PingPong, and the version here is a public demo. The part that travels is letting the compliance team maintain the rulebook itself.