Compare commits
314 commits
feat/npi-h
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bfdbf8f031 | ||
|
|
f3442872f2 | ||
|
|
48fb9f7fbb | ||
|
|
b350a1367d | ||
|
|
4276adab80 | ||
|
|
7ad4c920c6 | ||
|
|
618fafe1d5 | ||
|
|
ae68edbc58 | ||
|
|
c20edb28cd | ||
|
|
9dd6f53eb2 | ||
|
|
14357a0223 | ||
|
|
a90cdc9066 | ||
|
|
e3f439221a | ||
|
|
60d2572f19 | ||
|
|
f773718e4d | ||
|
|
5546c58bf0 | ||
|
|
3325259af7 | ||
|
|
1e9dcfcfd1 | ||
|
|
62292b96af | ||
|
|
5a3063ecb3 | ||
|
|
2d220a273d | ||
|
|
e414ec4a5f | ||
|
|
297db74fee | ||
|
|
2f0753f00e | ||
|
|
579919197d | ||
|
|
6fce3ec9eb | ||
|
|
1acae2f20c | ||
|
|
0320dc17ba | ||
|
|
4ed1498ef3 | ||
|
|
a430d5e329 | ||
|
|
744f0a89cf | ||
|
|
9e155d214c | ||
|
|
d8e3e40dda | ||
|
|
9a9b0b9130 | ||
|
|
b1629160d5 | ||
|
|
345c22e561 | ||
|
|
0562fd2bd3 | ||
|
|
4f52d12629 | ||
|
|
bc93d93c5b | ||
|
|
b7cce370d7 | ||
|
|
9eeed47c4b | ||
|
|
285a4a087c | ||
|
|
98364009b0 | ||
|
|
433b10ce98 | ||
|
|
707d538847 | ||
|
|
8e5590b492 | ||
|
|
b45332b5f7 | ||
|
|
08f651dc1e | ||
|
|
bd7ba23841 | ||
|
|
b8b6444084 | ||
|
|
a9bbfbf59b | ||
|
|
f293466519 | ||
|
|
60540f949d | ||
|
|
776817c727 | ||
|
|
7828ee4587 | ||
|
|
e18f23634a | ||
|
|
72c69a05c9 | ||
|
|
b40fc7ec36 | ||
|
|
49842bddbb | ||
|
|
3ca960aca5 | ||
|
|
5c3b4291e7 | ||
|
|
1056705cf9 | ||
|
|
5253f16675 | ||
|
|
545e6f7ed7 | ||
|
|
f43957882f | ||
|
|
5c1f239307 | ||
|
|
0083bc1354 | ||
|
|
8af2685d07 | ||
|
|
cf021e2f91 | ||
|
|
f481a1d13c | ||
|
|
40da017b79 | ||
|
|
c36ef07310 | ||
|
|
720197095c | ||
|
|
a82b356921 | ||
|
|
d9ecb94b27 | ||
|
|
8099afc5ab | ||
|
|
1c63e8f4b5 | ||
|
|
2611b5458b | ||
|
|
e379e2b10f | ||
|
|
eed5e4a258 | ||
|
|
a04ecf7df3 | ||
|
|
eba525f83f | ||
|
|
b375385efd | ||
|
|
899b880e7f | ||
|
|
4171f48736 | ||
|
|
466460112b | ||
|
|
4dc5690666 | ||
|
|
c183957939 | ||
|
|
a32a3b05a0 | ||
|
|
2e4388a803 | ||
|
|
4d5901921e | ||
|
|
f7212b3969 | ||
|
|
9c87759501 | ||
|
|
557b45f65d | ||
|
|
1eb29f80be | ||
|
|
c2737f2001 | ||
|
|
1652a3b8bc | ||
|
|
35f204c2b8 | ||
|
|
674979c928 | ||
|
|
ab9491be6a | ||
|
|
147657d82d | ||
|
|
c46efe5730 | ||
|
|
dae9603808 | ||
|
|
ad590aab7c | ||
|
|
01b3e1d234 | ||
|
|
c27cfd3242 | ||
|
|
b125d46663 | ||
|
|
42b433db5a | ||
|
|
a74516a255 | ||
|
|
1d6693adb9 | ||
|
|
ea695d6828 | ||
|
|
861f2fbfd4 | ||
|
|
3e13b722f6 | ||
|
|
aadf9f5bc1 | ||
|
|
bf69960e8c | ||
|
|
6c10c6a6cd | ||
|
|
326aee7714 | ||
|
|
73c27c75b1 | ||
|
|
3df3a08221 | ||
|
|
8e1e2f16bf | ||
|
|
c8e0065729 | ||
|
|
d18de006d8 | ||
|
|
aa498fdfdf | ||
|
|
1f3b36b29e | ||
|
|
bce5db4a09 | ||
|
|
d65f5ea279 | ||
|
|
48fab25840 | ||
|
|
2296566e85 | ||
|
|
b48d0cb799 | ||
|
|
7929413eeb | ||
|
|
ef3b7a96f0 | ||
|
|
ba6f171c9d | ||
|
|
b9b963f87b | ||
|
|
3fbfcbfaab | ||
|
|
fd1522abee | ||
|
|
5fd187a001 | ||
|
|
60e6dc5d19 | ||
|
|
9e40965092 | ||
|
|
2caab6aa69 | ||
|
|
134a2611f6 | ||
|
|
4d3af2aeae | ||
|
|
fdea97e57e | ||
|
|
591e387513 | ||
|
|
1465690832 | ||
|
|
b73edadb89 | ||
|
|
792f5e948f | ||
|
|
a2665c22c2 | ||
|
|
2b361a83a8 | ||
|
|
3d4226e95c | ||
|
|
872154ebf7 | ||
|
|
19bbef3231 | ||
|
|
766e32e555 | ||
|
|
9c7a08f5c9 | ||
|
|
d1a9260854 | ||
|
|
7b69b5c314 | ||
|
|
bb736f6c01 | ||
|
|
16f3dd67e4 | ||
|
|
0dc208ef65 | ||
|
|
9d78783258 | ||
|
|
84a521d388 | ||
|
|
c7c83499d7 | ||
|
|
1c64dc48c2 | ||
|
|
23af463213 | ||
|
|
5e9aec40d1 | ||
|
|
dd4ed3ea38 | ||
|
|
709d00004b | ||
|
|
303235a595 | ||
|
|
3f7ecf9d13 | ||
|
|
ff4ab262a8 | ||
|
|
5237c81385 | ||
|
|
4638fbe3d2 | ||
|
|
921cd1ce3c | ||
|
|
51a287271f | ||
|
|
a648ae6e0a | ||
|
|
6c8c823e5e | ||
|
|
c8c9a04c1d | ||
|
|
773c443079 | ||
|
|
32623d36b8 | ||
|
|
887bf9a14a | ||
|
|
c8a0824143 | ||
|
|
a1db921c71 | ||
|
|
a04146da2b | ||
|
|
7d8a08d9d3 | ||
|
|
1ff8b88ac8 | ||
|
|
983c732baf | ||
|
|
a3aeedd716 | ||
|
|
38739e023c | ||
|
|
96f31e7c31 | ||
|
|
b95ee04752 | ||
|
|
386467bedf | ||
|
|
4447905864 | ||
|
|
71404810c4 | ||
|
|
bd0d8c0e2c | ||
|
|
79c460ef25 | ||
|
|
534f13e480 | ||
|
|
d5e66786a2 | ||
|
|
7e5946d65a | ||
|
|
b28dda7c5a | ||
|
|
09d928a582 | ||
|
|
1fe942c109 | ||
|
|
7708086130 | ||
|
|
6827aafdbc | ||
|
|
058d4d426a | ||
|
|
e87715aee7 | ||
|
|
a6d2f10149 | ||
|
|
1854753c70 | ||
|
|
1c2e263bb7 | ||
|
|
25f4a7503b | ||
|
|
6f361d307d | ||
|
|
9fa2c86f01 | ||
|
|
3dbf5b3bb2 | ||
|
|
8d301a1ab7 | ||
|
|
e2467752dc | ||
|
|
68e6b60951 | ||
|
|
220f301453 | ||
|
|
3c65dd8748 | ||
|
|
9987b1e30d | ||
|
|
b437f66bc8 | ||
|
|
20c11e6180 | ||
|
|
f94ad1682b | ||
|
|
561ad78ea8 | ||
|
|
76c4d55603 | ||
|
|
4c0decd175 | ||
|
|
c0344769a0 | ||
|
|
b5b2e6e6c3 | ||
|
|
bcedf2b318 | ||
|
|
0ccc323af7 | ||
|
|
37393e5bbc | ||
|
|
1b3cbf2fbf | ||
|
|
ee44800934 | ||
|
|
497a4d4409 | ||
|
|
9b9d317916 | ||
|
|
a308aeed6b | ||
|
|
baa40443de | ||
|
|
90bccfda32 | ||
|
|
c6819371d8 | ||
|
|
7c39a858cc | ||
|
|
09b32d6e75 | ||
|
|
b973c6c132 | ||
|
|
2156a5e05f | ||
|
|
a78d60a127 | ||
|
|
9cb10b18e0 | ||
|
|
54b92b1f06 | ||
|
|
feb677f6ce | ||
|
|
c79a7715e1 | ||
|
|
167c4a3847 | ||
|
|
85dc3d5c3b | ||
|
|
4f455475c0 | ||
|
|
42c6b9607f | ||
|
|
0b0ff9d311 | ||
|
|
aa195e6c18 | ||
|
|
19785629d1 | ||
|
|
ada9e01321 | ||
|
|
978b36ad92 | ||
|
|
25cf23dded | ||
|
|
80e07aecbb | ||
|
|
5edc6151cf | ||
|
|
6be066ccc9 | ||
|
|
22d7c72ab3 | ||
|
|
5b78141997 | ||
|
|
022407e807 | ||
|
|
a91d7c8513 | ||
|
|
483f185861 | ||
|
|
a732423f04 | ||
|
|
09e21a6c97 | ||
|
|
2bba28ae6b | ||
|
|
e54459776c | ||
|
|
a4d67bcf9b | ||
|
|
e5db147319 | ||
|
|
dba7632ce2 | ||
|
|
7670608c1a | ||
|
|
a4bad723bc | ||
|
|
f8d2a7f01f | ||
|
|
894d989445 | ||
|
|
aafa76df83 | ||
|
|
28b1af341d | ||
|
|
41df4d9553 | ||
|
|
0b06043437 | ||
|
|
b0a8563a93 | ||
|
|
e6a630ada1 | ||
|
|
f9c294e962 | ||
|
|
7ea18dd3d8 | ||
|
|
138fec17e9 | ||
|
|
258d23bdc6 | ||
|
|
74c1259c9a | ||
|
|
0a40e4874e | ||
|
|
bf4e8c2277 | ||
|
|
7399211271 | ||
|
|
34daa0c1d3 | ||
|
|
7bd2f70de4 | ||
|
|
eea1d02045 | ||
|
|
a56ee01d96 | ||
|
|
3d4269a053 | ||
|
|
6c9956d14c | ||
|
|
9eceb18f3e | ||
|
|
ea0937f723 | ||
|
|
971eb8d9d0 | ||
|
|
0b51d400f9 | ||
|
|
3da7794a85 | ||
|
|
4233c90a4f | ||
|
|
2c4854f2db | ||
|
|
6738a335af | ||
|
|
2aa9e770c9 | ||
|
|
8eea9a694f | ||
|
|
0d212787ef | ||
|
|
53ec011198 | ||
|
|
95698852ce | ||
|
|
2bc86268f7 | ||
|
|
2d3bccd31e | ||
|
|
29c7a421e9 | ||
|
|
5129ebec5c | ||
|
|
3859557506 | ||
|
|
9bcd27db80 | ||
|
|
695c3e2431 |
484 changed files with 36393 additions and 3339 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
|
@ -27,3 +27,8 @@ api/dist/
|
|||
site/dist/
|
||||
site/.astro/
|
||||
mcp/dist/
|
||||
data/hc_warmup*.csv
|
||||
|
||||
# Rendered from monitoring/alertmanager.yml.template by deploy.sh (contains secrets)
|
||||
monitoring/alertmanager.yml
|
||||
docs/justino suit.jpg
|
||||
|
|
|
|||
49
api/migrations/089_paper_filing_batches.sql
Normal file
49
api/migrations/089_paper_filing_batches.sql
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
-- 089: Daily paper-filing batch tracking for the Standard (no-login) CMS filing path.
|
||||
--
|
||||
-- When a provider e-signs a CMS-855 (or CMS-10114), the signed PDF is mailed to
|
||||
-- the destination agency (the provider's MAC for 855s; the NPI Enumerator in
|
||||
-- Fargo for NPPES updates). To save postage and handling we batch all signed,
|
||||
-- not-yet-mailed filings each postal working-day morning, group them by
|
||||
-- destination agency, and mail one Priority Mail envelope per agency.
|
||||
--
|
||||
-- This migration records, per signed filing, which daily batch it went out in,
|
||||
-- so the batch worker is idempotent (never re-mails) and we can audit/track.
|
||||
|
||||
-- A paper-filing batch = one Priority Mail envelope to one destination agency
|
||||
-- on one mailing day.
|
||||
CREATE TABLE IF NOT EXISTS paper_filing_batches (
|
||||
id SERIAL PRIMARY KEY,
|
||||
batch_date DATE NOT NULL, -- the postal working day mailed
|
||||
destination_key TEXT NOT NULL, -- mac_routing key, e.g. noridian_je / npi_enumerator
|
||||
destination_name TEXT NOT NULL DEFAULT '', -- human-readable MAC/agency name
|
||||
destination_address TEXT NOT NULL DEFAULT '', -- full mailing address block
|
||||
item_count INTEGER NOT NULL DEFAULT 0, -- number of filings enclosed
|
||||
cover_sheet_key TEXT, -- MinIO key for the batch cover sheet
|
||||
merged_pdf_key TEXT, -- MinIO key for the merged print job
|
||||
tracking_number TEXT, -- USPS tracking, filled when mailed
|
||||
status TEXT NOT NULL DEFAULT 'prepared'
|
||||
CHECK (status IN ('prepared', 'mailed', 'cancelled')),
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
mailed_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_paper_batch_date ON paper_filing_batches(batch_date);
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_paper_batch_day_dest
|
||||
ON paper_filing_batches(batch_date, destination_key);
|
||||
|
||||
-- Link each signed esign filing to the batch it shipped in. NULL = not yet
|
||||
-- batched (the worker picks these up). Set once -> idempotent (worker skips
|
||||
-- anything already assigned a batch).
|
||||
ALTER TABLE esign_records
|
||||
ADD COLUMN IF NOT EXISTS paper_batch_id INTEGER REFERENCES paper_filing_batches(id);
|
||||
|
||||
-- The destination MAC/agency for this filing, derived from the provider's
|
||||
-- practice state at sign time (snapshot so later routing-table changes don't
|
||||
-- retroactively move historical filings).
|
||||
ALTER TABLE esign_records
|
||||
ADD COLUMN IF NOT EXISTS filing_destination_key TEXT;
|
||||
|
||||
-- Index the work queue: signed, paper-path filings not yet batched.
|
||||
CREATE INDEX IF NOT EXISTS idx_esign_unbatched_signed
|
||||
ON esign_records(status)
|
||||
WHERE status = 'signed' AND paper_batch_id IS NULL;
|
||||
26
api/migrations/090_esign_signature_vector.sql
Normal file
26
api/migrations/090_esign_signature_vector.sql
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
-- 090: Capture the vector (stroke-path) form of a drawn signature.
|
||||
--
|
||||
-- Today esign_records.signature_data holds a base64 PNG of the drawn signature,
|
||||
-- which is fine as a raster copy, but a resolution-independent vector form of the
|
||||
-- strokes is more faithful and reusable for downstream rendering.
|
||||
--
|
||||
-- We store the captured strokes as JSON so the same signing event yields both:
|
||||
-- * signature_data -- base64 PNG (raster copy, audit trail)
|
||||
-- * signature_vector -- stroke paths (high-fidelity vector form)
|
||||
--
|
||||
-- Format (normalized into a 0..1 box, origin top-left, matching canvas capture):
|
||||
-- {
|
||||
-- "v": 1,
|
||||
-- "w": <canvas css width px>, "h": <canvas css height px>,
|
||||
-- "strokes": [ [ {"x":0.12,"y":0.40,"t":12}, ... ], ... ]
|
||||
-- }
|
||||
-- x/y are fractions of the capture box (resolution-independent); t is ms since
|
||||
-- stroke start (optional, for future pressure/speed modeling).
|
||||
|
||||
ALTER TABLE esign_records
|
||||
ADD COLUMN IF NOT EXISTS signature_vector JSONB;
|
||||
|
||||
COMMENT ON COLUMN esign_records.signature_vector IS
|
||||
'Stroke-path (vector) form of a drawn signature (normalized 0..1, origin '
|
||||
'top-left). NULL for typed signatures or signatures captured before this '
|
||||
'column existed.';
|
||||
37
api/migrations/091_admin_todos.sql
Normal file
37
api/migrations/091_admin_todos.sql
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
-- 091: admin_todos — operator fulfillment task queue.
|
||||
--
|
||||
-- Service handlers (npi_provider, mcs150_update, state_trucking, boc3_filing,
|
||||
-- hazmat_phmsa, mailbox_setup, carrier_closeout, ein_application, …) insert a
|
||||
-- row here whenever a filing needs human action. This table was referenced by
|
||||
-- the workers but never had a CREATE migration, so the inserts silently failed
|
||||
-- in any environment without the table. This migration defines it.
|
||||
--
|
||||
-- The shared helper scripts/workers/telegram_notify.create_admin_todo() and the
|
||||
-- inlined INSERTs all use the same column set:
|
||||
-- (title, category, priority, order_number, service_slug, description, data, status)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS admin_todos (
|
||||
id SERIAL PRIMARY KEY,
|
||||
title TEXT NOT NULL,
|
||||
category TEXT NOT NULL DEFAULT 'filing', -- filing, provisioning, review, …
|
||||
priority TEXT NOT NULL DEFAULT 'normal', -- low, normal, high, urgent
|
||||
order_number TEXT, -- e.g. CO-ABCD1234 (nullable for ad-hoc tasks)
|
||||
service_slug TEXT, -- which service generated this task
|
||||
description TEXT NOT NULL DEFAULT '',
|
||||
data JSONB NOT NULL DEFAULT '{}', -- structured intake/context payload
|
||||
status TEXT NOT NULL DEFAULT 'pending'
|
||||
CHECK (status IN ('pending', 'in_progress', 'done', 'cancelled')),
|
||||
assigned_to TEXT, -- operator email/handle (optional)
|
||||
notes TEXT, -- operator working notes
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
completed_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_admin_todos_status ON admin_todos(status) WHERE status IN ('pending', 'in_progress');
|
||||
CREATE INDEX IF NOT EXISTS idx_admin_todos_order ON admin_todos(order_number);
|
||||
CREATE INDEX IF NOT EXISTS idx_admin_todos_priority ON admin_todos(priority);
|
||||
CREATE INDEX IF NOT EXISTS idx_admin_todos_created ON admin_todos(created_at DESC);
|
||||
|
||||
COMMENT ON TABLE admin_todos IS
|
||||
'Operator fulfillment task queue; one row per filing that needs human action.';
|
||||
26
api/migrations/092_esign_sign_consent.sql
Normal file
26
api/migrations/092_esign_sign_consent.sql
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
-- 092: Per-document signing authorization on signature records.
|
||||
--
|
||||
-- On the Standard (no-login) CMS filing path the signer gives an EXPLICIT,
|
||||
-- per-document authorization to use their drawn signature to complete and submit
|
||||
-- the filing on their behalf. These columns capture that authorization at
|
||||
-- signing time, alongside the existing perjury attestation. They are only
|
||||
-- meaningful for drawn signatures on documents that require it
|
||||
-- (metadata.require_sign_consent = true); other docs leave them false/NULL.
|
||||
--
|
||||
-- NB: the column names use the ink_consent* prefix for historical/migration
|
||||
-- compatibility; they store the generic signing authorization described above.
|
||||
--
|
||||
-- Idempotent.
|
||||
|
||||
ALTER TABLE esign_records
|
||||
ADD COLUMN IF NOT EXISTS ink_consent BOOLEAN DEFAULT FALSE,
|
||||
ADD COLUMN IF NOT EXISTS ink_consent_at TIMESTAMPTZ,
|
||||
ADD COLUMN IF NOT EXISTS ink_consent_text TEXT;
|
||||
|
||||
COMMENT ON COLUMN esign_records.ink_consent IS
|
||||
'TRUE when the signer expressly authorized using their drawn signature to '
|
||||
'complete and submit this filing. Captured at signing time.';
|
||||
COMMENT ON COLUMN esign_records.ink_consent_at IS
|
||||
'When the signing authorization was given (signer-side timestamp).';
|
||||
COMMENT ON COLUMN esign_records.ink_consent_text IS
|
||||
'Verbatim authorization language the signer agreed to (for the audit trail).';
|
||||
12
api/migrations/093_mcs150_awaiting_intake_status.sql
Normal file
12
api/migrations/093_mcs150_awaiting_intake_status.sql
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
-- Add 'awaiting_intake' fulfillment status for MCS-150/DOT orders that are
|
||||
-- held waiting on the customer to confirm operational details the FMCSA
|
||||
-- census cannot supply (operation classification, cargo, current mileage,
|
||||
-- email). The worker sets this state and emails a census-pre-filled intake
|
||||
-- link; the order auto-resumes when the customer submits.
|
||||
ALTER TABLE compliance_orders DROP CONSTRAINT IF EXISTS compliance_orders_fulfillment_status_check;
|
||||
ALTER TABLE compliance_orders ADD CONSTRAINT compliance_orders_fulfillment_status_check
|
||||
CHECK (fulfillment_status IS NULL OR fulfillment_status = ANY (ARRAY[
|
||||
'authorization_required','authorization_signed','awaiting_customer_delegation',
|
||||
'awaiting_secure_credentials','awaiting_government_fee_approval','awaiting_insurance_filing',
|
||||
'awaiting_intake','ready_to_file','filed_waiting_state','completed'
|
||||
]));
|
||||
13
api/migrations/094_fmcsa_ifta_reminded.sql
Normal file
13
api/migrations/094_fmcsa_ifta_reminded.sql
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
-- Track IFTA quarterly-return reminder touches per interstate carrier so the
|
||||
-- multi-touch cadence (10/7/4 business days before deadline) never repeats a
|
||||
-- touch and escalates correctly. Reset each new quarter by the IFTA builder.
|
||||
-- ifta_reminded_at : timestamp of the most recent IFTA touch (any)
|
||||
-- ifta_touch_no : highest touch number sent this cycle (1=10d, 2=7d, 3=4d)
|
||||
|
||||
ALTER TABLE fmcsa_carriers
|
||||
ADD COLUMN IF NOT EXISTS ifta_reminded_at TIMESTAMPTZ,
|
||||
ADD COLUMN IF NOT EXISTS ifta_touch_no SMALLINT;
|
||||
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_fmcsa_carriers_ifta_reminded
|
||||
ON fmcsa_carriers (ifta_touch_no)
|
||||
WHERE carrier_operation = 'A';
|
||||
12
api/migrations/095_fmcsa_ifta_self_filed.sql
Normal file
12
api/migrations/095_fmcsa_ifta_self_filed.sql
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
-- "I already filed it" suppression for IFTA quarterly reminders.
|
||||
-- When a carrier clicks the one-click "I already filed it" link in a reminder
|
||||
-- email, we record it here: it stops further touches THIS cycle (the IFTA
|
||||
-- builder excludes self-filed carriers) and gives us DIY-vs-prospect signal.
|
||||
-- Reset each new quarter alongside ifta_reminded_at.
|
||||
|
||||
ALTER TABLE fmcsa_carriers
|
||||
ADD COLUMN IF NOT EXISTS ifta_self_filed_at TIMESTAMPTZ;
|
||||
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_fmcsa_carriers_ifta_self_filed
|
||||
ON fmcsa_carriers (ifta_self_filed_at)
|
||||
WHERE ifta_self_filed_at IS NULL;
|
||||
15
api/migrations/096_fmcsa_ucr_reminder.sql
Normal file
15
api/migrations/096_fmcsa_ucr_reminder.sql
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
-- UCR annual-renewal reminder tracking (mirrors IFTA): per-carrier touch number,
|
||||
-- last-touch timestamp, and "I already did it" self-filed suppression.
|
||||
-- Reset each year by build_ucr_annual_campaign.py.
|
||||
-- ucr_reminded_at : timestamp of the most recent UCR touch
|
||||
-- ucr_touch_no : highest touch number sent this cycle (1=30bd,2=12bd,3=4bd)
|
||||
-- ucr_self_filed_at: clicked "I already registered" -> stop reminding this cycle
|
||||
|
||||
ALTER TABLE fmcsa_carriers
|
||||
ADD COLUMN IF NOT EXISTS ucr_reminded_at TIMESTAMPTZ,
|
||||
ADD COLUMN IF NOT EXISTS ucr_touch_no SMALLINT,
|
||||
ADD COLUMN IF NOT EXISTS ucr_self_filed_at TIMESTAMPTZ;
|
||||
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_fmcsa_carriers_ucr_touch
|
||||
ON fmcsa_carriers (ucr_touch_no)
|
||||
WHERE carrier_operation = 'A';
|
||||
13
api/migrations/097_fmcsa_mx_provider.sql
Normal file
13
api/migrations/097_fmcsa_mx_provider.sql
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
-- Per-MX-operator throttling for the trucking/main warmup pool.
|
||||
-- Sender reputation is tracked by the RECEIVING mail operator (Microsoft 365,
|
||||
-- Google Workspace, Proofpoint, ...), not by recipient domain. The Jun 13-14
|
||||
-- Gmail + Outlook block storm came from hammering Google/MS-Workspace-hosted
|
||||
-- business domains. mx_provider lets the builder exclude those during warmup and
|
||||
-- cap volume per operator (mirrors the HC pool). Populated by mx_tag_carriers.py.
|
||||
|
||||
ALTER TABLE fmcsa_carriers
|
||||
ADD COLUMN IF NOT EXISTS mx_provider TEXT;
|
||||
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_fmcsa_carriers_mx_provider
|
||||
ON fmcsa_carriers (mx_provider)
|
||||
WHERE mx_provider IS NOT NULL;
|
||||
17
api/migrations/098_audit_log_compliance_type.sql
Normal file
17
api/migrations/098_audit_log_compliance_type.sql
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
-- 098: Allow compliance order types in order_audit_log.
|
||||
--
|
||||
-- order_audit_log was created (migration 004) for formation orders only, with a
|
||||
-- CHECK constraint limiting order_type to ('formation','service','quote'). The
|
||||
-- admin compliance-orders dashboard writes audit entries for compliance orders
|
||||
-- (approve-for-submission, intake re-arm), which were rejected by that check and
|
||||
-- surfaced as "Approve failed" 500s. Add the compliance order types.
|
||||
--
|
||||
-- Idempotent: drops and recreates the constraint with the expanded value set.
|
||||
|
||||
ALTER TABLE order_audit_log DROP CONSTRAINT IF EXISTS order_audit_log_order_type_check;
|
||||
|
||||
ALTER TABLE order_audit_log
|
||||
ADD CONSTRAINT order_audit_log_order_type_check
|
||||
CHECK (order_type IN (
|
||||
'formation', 'service', 'quote', 'compliance', 'compliance_batch'
|
||||
));
|
||||
20
api/migrations/099_gov_fee_child_orders.sql
Normal file
20
api/migrations/099_gov_fee_child_orders.sql
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
-- 099: Government-fee child orders for at-cost compliance services.
|
||||
--
|
||||
-- At-cost services (IRP, IFTA, intrastate authority, etc.) collect only our
|
||||
-- SERVICE fee at checkout; the actual government/state fee is variable and
|
||||
-- "billed at cost" afterward. To collect it we create a CHILD compliance_orders
|
||||
-- row (service_fee_cents = 0, gov_fee_cents = the quoted state fee) that flows
|
||||
-- through the EXISTING checkout/payment-picker/webhook machinery unchanged, and
|
||||
-- email the customer a payment link with every payment method + correct
|
||||
-- surcharges. parent_order_number links that child back to the original order so
|
||||
-- the worker can resume filing once the fee is paid.
|
||||
--
|
||||
-- Idempotent.
|
||||
|
||||
ALTER TABLE compliance_orders
|
||||
ADD COLUMN IF NOT EXISTS parent_order_number text;
|
||||
|
||||
-- Look up a parent's gov-fee children quickly (and vice-versa).
|
||||
CREATE INDEX IF NOT EXISTS idx_compliance_orders_parent
|
||||
ON compliance_orders (parent_order_number)
|
||||
WHERE parent_order_number IS NOT NULL;
|
||||
25
api/migrations/100_recurring_subscriptions.sql
Normal file
25
api/migrations/100_recurring_subscriptions.sql
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
-- 100: Recurring (Stripe Subscription) support for compliance services.
|
||||
--
|
||||
-- The OIG/SAM exclusion screening is sold as a $79/month Stripe Subscription
|
||||
-- (catalog billing_interval="month"). We track the Stripe Subscription id so the
|
||||
-- invoice.paid renewal webhook can map a monthly charge back to the order and
|
||||
-- re-run that cycle's screening.
|
||||
--
|
||||
-- The Provider Compliance Bundle ($899/yr) includes only the FIRST OIG/SAM
|
||||
-- screening; bundle buyers are converted to the $79/mo monitoring subscription
|
||||
-- after that first cycle via an automated upsell email. bundle_upsell_sent_at
|
||||
-- dedupes that send.
|
||||
--
|
||||
-- Idempotent. (Mirrors ensureColumns() in api/src/routes/checkout.ts so a fresh
|
||||
-- deploy and this migration converge on the same schema.)
|
||||
|
||||
ALTER TABLE compliance_orders
|
||||
ADD COLUMN IF NOT EXISTS stripe_subscription_id text;
|
||||
|
||||
ALTER TABLE compliance_orders
|
||||
ADD COLUMN IF NOT EXISTS bundle_upsell_sent_at timestamptz;
|
||||
|
||||
-- Map a renewal invoice's subscription back to its order quickly.
|
||||
CREATE INDEX IF NOT EXISTS idx_compliance_orders_subscription
|
||||
ON compliance_orders (stripe_subscription_id)
|
||||
WHERE stripe_subscription_id IS NOT NULL;
|
||||
39
api/migrations/101_mail_reputation_daily.sql
Normal file
39
api/migrations/101_mail_reputation_daily.sql
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
-- Daily mail-reputation snapshots parsed from the postfix logs.
|
||||
--
|
||||
-- WHY: Sender reputation lives at the RECEIVING operator (Microsoft 365, Google,
|
||||
-- Yahoo, ...), not at the recipient domain. The provider portals (SNDS, Postmaster,
|
||||
-- Yahoo CFL) show this but each needs a login and lags 24-48h. Our own postfix logs
|
||||
-- already contain the ground truth in real time: every send to a Microsoft tenant
|
||||
-- returns 250 (accepted) / 451 4.7.500 (throttled, "server busy") / 5xx (rejected),
|
||||
-- and the reject text tells us WHY (reputation 5.7.1, recipient unknown 5.1.1, etc.).
|
||||
-- A 2026-06-19 audit found 80% of Microsoft sends were getting 451 4.7.500 throttles
|
||||
-- on the warming IPs -- exactly the signal we need to watch ease as reputation builds.
|
||||
--
|
||||
-- This table stores ONE row per (log_date, sending_ip, receiver_operator, outcome
|
||||
-- class) so we can chart accepted% / deferred% / reject-reason mix per operator over
|
||||
-- time without re-parsing logs (which rotate fast). Populated by
|
||||
-- scripts/mail_reputation_monitor.py (idempotent upsert per day).
|
||||
|
||||
CREATE TABLE IF NOT EXISTS mail_reputation_daily (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
log_date DATE NOT NULL, -- the calendar day of the log lines (server TZ)
|
||||
sending_ip TEXT NOT NULL, -- our egress IP (207.174.124.94 / .107 / ...)
|
||||
receiver TEXT NOT NULL, -- normalized receiving operator: microsoft|google|yahoo|proofpoint|other
|
||||
outcome TEXT NOT NULL, -- accepted|throttled|reject_reputation|reject_recipient|reject_content|reject_other|deferred_other
|
||||
reason_code TEXT, -- representative enhanced status / code (e.g. 4.7.500, 5.7.1, 5.1.1)
|
||||
msg_count INTEGER NOT NULL DEFAULT 0,
|
||||
sample_text TEXT, -- one representative raw response, for debugging
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
UNIQUE (log_date, sending_ip, receiver, outcome, reason_code)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_mail_rep_daily_date ON mail_reputation_daily (log_date);
|
||||
CREATE INDEX IF NOT EXISTS idx_mail_rep_daily_receiver ON mail_reputation_daily (receiver, log_date);
|
||||
|
||||
COMMENT ON TABLE mail_reputation_daily IS
|
||||
'Daily per-IP per-receiving-operator mail delivery outcome counts parsed from postfix logs (SNDS-equivalent reputation trend, no provider login needed). Populated by scripts/mail_reputation_monitor.py.';
|
||||
COMMENT ON COLUMN mail_reputation_daily.receiver IS
|
||||
'Normalized receiving operator: microsoft|google|yahoo|proofpoint|mimecast|other';
|
||||
COMMENT ON COLUMN mail_reputation_daily.outcome IS
|
||||
'accepted|throttled|reject_reputation|reject_recipient|reject_content|reject_other|deferred_other';
|
||||
66
api/migrations/102_dmarc_aggregate.sql
Normal file
66
api/migrations/102_dmarc_aggregate.sql
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
-- DMARC aggregate (rua) report ingestion.
|
||||
--
|
||||
-- WHY: DMARC aggregate reports (RFC 7489) are the authoritative, cross-operator
|
||||
-- view of who is sending mail AS us (header_from = performancewest.net / its
|
||||
-- subdomains) and whether that mail passes SPF + DKIM alignment. Every major
|
||||
-- receiver (Google, Yahoo, Comcast, Cox, Bell, Mimecast, Cisco ESA, GMX, mail.com,
|
||||
-- ...) emails one zipped/gzipped XML per day to rua=mailto:dmarc@performancewest.net.
|
||||
-- Reading them by hand is hopeless (dozens/day). This turns them into queryable
|
||||
-- per-source-IP / per-domain SPF+DKIM+DMARC pass-fail trends so we can SEE:
|
||||
-- * our own senders (.94 bulk / .107 hcout / .71 transactional / .15 relay) all
|
||||
-- passing alignment (DKIM d=send. selector send, d=root selector mail) -- the
|
||||
-- deliverability fixes this session were exactly about this; and
|
||||
-- * any UNKNOWN IP sending as us that fails -- i.e. spoofing or a forgotten relay,
|
||||
-- which is reputation poison under p=reject.
|
||||
--
|
||||
-- Populated by scripts/dmarc_report_parser.py (IMAP fetch dmarc@ -> unzip -> parse
|
||||
-- XML -> upsert). Idempotent: each report is keyed by (org_name, report_id) and
|
||||
-- re-parsing the same report is a no-op (ON CONFLICT DO NOTHING).
|
||||
|
||||
-- One row per aggregate report (the <report_metadata> + <policy_published>).
|
||||
CREATE TABLE IF NOT EXISTS dmarc_report (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
org_name TEXT NOT NULL, -- reporting operator (google.com, yahoo.com, ...)
|
||||
org_email TEXT, -- contact email from the report
|
||||
report_id TEXT NOT NULL, -- operator's unique report id
|
||||
date_begin TIMESTAMPTZ, -- report window start (from epoch)
|
||||
date_end TIMESTAMPTZ, -- report window end
|
||||
policy_domain TEXT, -- <policy_published><domain>
|
||||
policy_p TEXT, -- published policy: none|quarantine|reject
|
||||
policy_sp TEXT, -- subdomain policy
|
||||
policy_adkim TEXT, -- DKIM alignment mode r|s
|
||||
policy_aspf TEXT, -- SPF alignment mode r|s
|
||||
policy_pct INTEGER, -- % of mail policy applies to
|
||||
received_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
UNIQUE (org_name, report_id)
|
||||
);
|
||||
|
||||
-- One row per <record> inside a report (a distinct source_ip + auth result combo).
|
||||
CREATE TABLE IF NOT EXISTS dmarc_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
report_id BIGINT NOT NULL REFERENCES dmarc_report(id) ON DELETE CASCADE,
|
||||
source_ip TEXT NOT NULL, -- the IP that sent the mail
|
||||
msg_count INTEGER NOT NULL DEFAULT 0, -- messages from this IP in the window
|
||||
disposition TEXT, -- DMARC disposition applied: none|quarantine|reject
|
||||
dkim_aligned TEXT, -- policy_evaluated/dkim: pass|fail
|
||||
spf_aligned TEXT, -- policy_evaluated/spf: pass|fail
|
||||
dmarc_pass BOOLEAN, -- derived: dkim_aligned=pass OR spf_aligned=pass
|
||||
header_from TEXT, -- identifiers/header_from
|
||||
envelope_from TEXT, -- identifiers/envelope_from
|
||||
dkim_domain TEXT, -- auth_results/dkim/domain
|
||||
dkim_selector TEXT, -- auth_results/dkim/selector
|
||||
dkim_result TEXT, -- auth_results/dkim/result (raw)
|
||||
spf_domain TEXT, -- auth_results/spf/domain
|
||||
spf_result TEXT -- auth_results/spf/result (raw)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_dmarc_report_window ON dmarc_report (date_begin);
|
||||
CREATE INDEX IF NOT EXISTS idx_dmarc_report_org ON dmarc_report (org_name);
|
||||
CREATE INDEX IF NOT EXISTS idx_dmarc_record_report ON dmarc_record (report_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_dmarc_record_ip ON dmarc_record (source_ip);
|
||||
CREATE INDEX IF NOT EXISTS idx_dmarc_record_fail ON dmarc_record (dmarc_pass) WHERE dmarc_pass = false;
|
||||
|
||||
COMMENT ON TABLE dmarc_report IS
|
||||
'DMARC aggregate (rua) report headers. One row per operator report, keyed (org_name, report_id). Populated by scripts/dmarc_report_parser.py.';
|
||||
COMMENT ON TABLE dmarc_record IS
|
||||
'Per-source-IP rows inside each DMARC aggregate report: SPF/DKIM alignment + raw auth results. dmarc_pass = dkim_aligned=pass OR spf_aligned=pass.';
|
||||
|
|
@ -99,7 +99,7 @@ function loadConfig(): Config {
|
|||
webhookSecret: optional("STRIPE_WEBHOOK_SECRET", ""),
|
||||
},
|
||||
smtp: {
|
||||
host: optional("SMTP_HOST", "mail.smtp2go.com"),
|
||||
host: optional("SMTP_HOST", "co.carrierone.com"),
|
||||
port: parseInt(optional("SMTP_PORT", "587"), 10),
|
||||
user: optional("SMTP_USER", ""),
|
||||
pass: optional("SMTP_PASS", ""),
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
* - Portal access link emails (JWT-signed links)
|
||||
*
|
||||
* All transactional emails go through Carbonio: co.carrierone.com:587
|
||||
* (SMTP2GO is used only by Listmonk for mass-mail campaigns.)
|
||||
* (Listmonk mass-mail relays through the local Postfix MTA, not this path.)
|
||||
* Env vars: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM
|
||||
*/
|
||||
|
||||
|
|
@ -34,16 +34,47 @@ function getTransporter(): nodemailer.Transporter {
|
|||
return _transporter;
|
||||
}
|
||||
|
||||
// ─── HTML → plaintext (dependency-free) ─────────────────────────────────────
|
||||
// A multipart/alternative (which nodemailer builds when both html+text are
|
||||
// given) with ONLY an HTML part is malformed, and HTML-only mail is a spam
|
||||
// signal. When a caller doesn't supply `text`, derive a readable plaintext
|
||||
// fallback from the HTML so every message ships a proper text/plain part.
|
||||
export function htmlToText(html: string): string {
|
||||
if (!html) return "";
|
||||
let s = html;
|
||||
// Drop non-content blocks entirely.
|
||||
s = s.replace(/<(script|style|head)[\s\S]*?<\/\1>/gi, "");
|
||||
// <a href="url">text</a> -> text (url)
|
||||
s = s.replace(/<a\b[^>]*\bhref\s*=\s*["']?([^"'>\s]+)["']?[^>]*>([\s\S]*?)<\/a>/gi,
|
||||
(_m, url, txt) => {
|
||||
const t = txt.replace(/<[^>]+>/g, "").trim();
|
||||
return t && !url.startsWith("mailto:") && t !== url ? `${t} (${url})` : (t || url);
|
||||
});
|
||||
// List items -> "- item"; block/line breaks -> newlines.
|
||||
s = s.replace(/<li\b[^>]*>/gi, "\n- ");
|
||||
s = s.replace(/<\/(p|div|tr|h[1-6]|li|ul|ol|table)>/gi, "\n");
|
||||
s = s.replace(/<br\s*\/?>/gi, "\n");
|
||||
// Strip remaining tags, unescape common entities, collapse whitespace.
|
||||
s = s.replace(/<[^>]+>/g, "");
|
||||
s = s.replace(/ /gi, " ").replace(/&/gi, "&").replace(/</gi, "<")
|
||||
.replace(/>/gi, ">").replace(/"/gi, '"').replace(/'/gi, "'")
|
||||
.replace(/→/gi, "->").replace(/·/gi, "-").replace(/§/gi, "Section");
|
||||
s = s.replace(/[ \t]+/g, " ").replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n");
|
||||
s = s.split("\n").map((line) => line.trim()).join("\n");
|
||||
return s.trim();
|
||||
}
|
||||
|
||||
// ─── Generic send ─────────────────────────────────────────────────────────────
|
||||
|
||||
export async function sendEmail(opts: { to: string; subject: string; html: string; text?: string }): Promise<void> {
|
||||
export async function sendEmail(opts: { to: string; subject: string; html: string; text?: string; cc?: string }): Promise<void> {
|
||||
const t = getTransporter();
|
||||
await t.sendMail({
|
||||
from: SMTP_FROM,
|
||||
to: opts.to,
|
||||
...(opts.cc ? { cc: opts.cc } : {}),
|
||||
subject: opts.subject,
|
||||
html: opts.html,
|
||||
text: opts.text || "",
|
||||
text: opts.text || htmlToText(opts.html),
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -78,6 +109,20 @@ function htmlEmail(title: string, body: string): string {
|
|||
${body}
|
||||
</td>
|
||||
</tr>
|
||||
<!-- Help / support band: reduces friction & chargebacks by giving an
|
||||
obvious place to get help with any order issue. -->
|
||||
<tr>
|
||||
<td style="padding:0 40px 24px;">
|
||||
<table width="100%" cellpadding="0" cellspacing="0" style="background:#f0f9ff;border:1px solid #bae6fd;border-radius:8px;">
|
||||
<tr><td style="padding:18px 20px;text-align:center;">
|
||||
<p style="margin:0 0 4px;font-family:Arial,sans-serif;font-size:15px;font-weight:700;color:#0c4a6e;">Problem with your order? We're here to help.</p>
|
||||
<p style="margin:0 0 14px;font-family:Arial,sans-serif;font-size:13px;color:#0369a1;line-height:1.5;">Questions, a change, or something not right? Reach our team and we'll make it right, fast.</p>
|
||||
<a href="https://performancewest.net/contact" style="display:inline-block;background:#1e3a5f;color:#ffffff;padding:11px 26px;border-radius:6px;text-decoration:none;font-family:Arial,sans-serif;font-size:14px;font-weight:700;">Get help with your order →</a>
|
||||
<p style="margin:12px 0 0;font-family:Arial,sans-serif;font-size:12px;color:#64748b;">Or email <a href="mailto:info@performancewest.net" style="color:#0369a1;">info@performancewest.net</a> · call <a href="tel:18884110383" style="color:#0369a1;">1-888-411-0383</a></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background:#f4f5f7;border-top:1px solid #e8ecf0;padding:16px 40px;text-align:center;">
|
||||
|
|
|
|||
|
|
@ -1011,6 +1011,48 @@ export async function setWebsiteUserPassword(
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify a customer's password against ERPNext — the single source of truth for
|
||||
* customer credentials. The API portal does NOT keep its own password hash; it
|
||||
* delegates the check here and (on success) mints its own session cookie.
|
||||
*
|
||||
* Uses Frappe's form login endpoint (`/api/method/login`, usr/pwd). That
|
||||
* endpoint resolves the site by the Host header (NOT the X-Frappe-Site-Name
|
||||
* token header), so we must send Host explicitly or Frappe 404s with
|
||||
* "<site> does not exist". A 200 means the password is correct; 401 means it
|
||||
* is not. Network/other errors throw so the caller can fail closed.
|
||||
*
|
||||
* NB: this is a plain credential check — we discard any session cookie ERPNext
|
||||
* returns; the API issues its own `pw_customer` cookie.
|
||||
*/
|
||||
export async function verifyWebsiteUserPassword(
|
||||
email: string,
|
||||
password: string,
|
||||
): Promise<boolean> {
|
||||
const res = await fetch(`${ERPNEXT_URL}/api/method/login`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
// Frappe resolves the site for this endpoint from Host, not the token
|
||||
// site header. Send both so it works regardless of routing.
|
||||
Host: ERPNEXT_SITE_NAME,
|
||||
"X-Frappe-Site-Name": ERPNEXT_SITE_NAME,
|
||||
},
|
||||
body: JSON.stringify({ usr: email, pwd: password }),
|
||||
});
|
||||
|
||||
if (res.status === 200) return true;
|
||||
if (res.status === 401) return false;
|
||||
// 4xx/5xx other than auth failure (e.g. user disabled, site error) — surface
|
||||
// as an error so the route returns a 500 rather than a misleading "bad
|
||||
// password". Read the body for diagnostics.
|
||||
const body = await res.text().catch(() => "");
|
||||
throw new ERPNextError(res.status, {
|
||||
message: `ERPNext login check failed (status ${res.status})`,
|
||||
exception: body.slice(0, 500),
|
||||
} as FrappeErrorResponse);
|
||||
}
|
||||
|
||||
/**
|
||||
* Link a Frappe User to a Customer record (portal_user_name field).
|
||||
* This is required for the ERPNext portal to show the correct customer's data.
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import ticketsRouter from "./routes/tickets.js";
|
|||
import quotesRouter from "./routes/quotes.js";
|
||||
import formationsRouter from "./routes/formations.js";
|
||||
import discountsRouter from "./routes/discounts.js";
|
||||
import iftaRouter from "./routes/ifta.js";
|
||||
import adminRouter from "./routes/admin.js";
|
||||
import webhooksRouter from "./routes/webhooks.js";
|
||||
import identityRouter from "./routes/identity.js";
|
||||
|
|
@ -92,6 +93,7 @@ app.use(ticketsRouter);
|
|||
app.use(quotesRouter);
|
||||
app.use(formationsRouter);
|
||||
app.use(discountsRouter);
|
||||
app.use(iftaRouter);
|
||||
app.use(adminRouter);
|
||||
app.use(webhooksRouter);
|
||||
app.use(refundsRouter);
|
||||
|
|
|
|||
|
|
@ -39,3 +39,26 @@ export function requireAdmin(req: Request, res: Response, next: NextFunction): v
|
|||
res.status(401).json({ error: "Invalid or expired token." });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify admin JWT from EITHER the Authorization header OR a `?token=` query
|
||||
* param. Needed for endpoints opened directly by the browser (e.g. a PDF in a
|
||||
* new tab / <iframe>), where custom request headers cannot be set. The token is
|
||||
* the same short-lived admin JWT; only use this for read-only document streams.
|
||||
*/
|
||||
export function requireAdminQueryOrHeader(req: Request, res: Response, next: NextFunction): void {
|
||||
const header = req.headers.authorization;
|
||||
const headerTok = header && header.startsWith("Bearer ") ? header.slice(7) : null;
|
||||
const queryTok = typeof req.query.token === "string" ? req.query.token : null;
|
||||
const token = headerTok || queryTok;
|
||||
if (!token) {
|
||||
res.status(401).json({ error: "Authentication required." });
|
||||
return;
|
||||
}
|
||||
try {
|
||||
req.admin = jwt.verify(token, JWT_SECRET) as AdminPayload;
|
||||
next();
|
||||
} catch {
|
||||
res.status(401).json({ error: "Invalid or expired token." });
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Router } from "express";
|
||||
import bcrypt from "bcryptjs";
|
||||
import { pool } from "../db.js";
|
||||
import { requireAdmin, signAdminToken } from "../middleware/admin-auth.js";
|
||||
import { requireAdmin, requireAdminQueryOrHeader, signAdminToken } from "../middleware/admin-auth.js";
|
||||
import { submitLimiter } from "../middleware/rate-limit.js";
|
||||
|
||||
const router = Router();
|
||||
|
|
@ -301,4 +301,578 @@ router.get("/api/v1/admin/audit", requireAdmin, async (req, res) => {
|
|||
}
|
||||
});
|
||||
|
||||
// =====================================================================
|
||||
// Compliance Orders (telecom / DOT / healthcare service fulfillment)
|
||||
//
|
||||
// The legacy admin SPA only manages formation_orders. Compliance service
|
||||
// orders (compliance_orders) had no admin surface at all -- you couldn't see
|
||||
// what was paid, what was stuck on intake, or approve a prepared filing for
|
||||
// submission. These endpoints back the /admin/compliance-orders page.
|
||||
// =====================================================================
|
||||
|
||||
/** GET /api/v1/admin/compliance-orders — list, grouped by batch, with filters. */
|
||||
router.get("/api/v1/admin/compliance-orders", requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const payment = (req.query.payment as string) || "";
|
||||
const fulfillment = (req.query.fulfillment as string) || "";
|
||||
const intake = (req.query.intake as string) || ""; // 'incomplete' | 'complete'
|
||||
const q = ((req.query.q as string) || "").trim().toLowerCase();
|
||||
const limit = Math.min(parseInt(req.query.limit as string, 10) || 200, 500);
|
||||
|
||||
const where: string[] = ["1=1"];
|
||||
const params: any[] = [];
|
||||
let i = 1;
|
||||
|
||||
if (payment) { where.push(`co.payment_status = $${i++}`); params.push(payment); }
|
||||
if (fulfillment === "none") { where.push(`co.fulfillment_status IS NULL`); }
|
||||
else if (fulfillment) { where.push(`co.fulfillment_status = $${i++}`); params.push(fulfillment); }
|
||||
if (intake === "incomplete") { where.push(`COALESCE(co.intake_data_validated, FALSE) = FALSE`); }
|
||||
else if (intake === "complete") { where.push(`co.intake_data_validated = TRUE`); }
|
||||
if (q) {
|
||||
where.push(`(lower(co.customer_email) LIKE $${i} OR lower(co.customer_name) LIKE $${i} OR lower(co.order_number) LIKE $${i} OR lower(COALESCE(co.batch_id,'')) LIKE $${i})`);
|
||||
params.push(`%${q}%`); i++;
|
||||
}
|
||||
|
||||
params.push(limit);
|
||||
const { rows } = await pool.query(
|
||||
`SELECT co.order_number, co.batch_id, co.service_slug, co.service_name,
|
||||
co.customer_email, co.customer_name, co.customer_phone,
|
||||
co.payment_status, co.payment_method, co.paid_at,
|
||||
co.service_fee_cents, co.gov_fee_cents, co.surcharge_cents, co.discount_cents,
|
||||
co.fulfillment_status, co.fulfillment_status_at,
|
||||
COALESCE(co.intake_data_validated, FALSE) AS intake_data_validated,
|
||||
co.intake_reminder_count, co.intake_reminder_last_at,
|
||||
co.erpnext_sales_order, co.created_at
|
||||
FROM compliance_orders co
|
||||
WHERE ${where.join(" AND ")}
|
||||
ORDER BY co.created_at DESC
|
||||
LIMIT $${i}`,
|
||||
params,
|
||||
);
|
||||
|
||||
// Group multi-service batches (batch_id) into a single card; standalone
|
||||
// orders (no batch_id) become their own one-item group keyed by order_number.
|
||||
type Grp = {
|
||||
group_id: string;
|
||||
is_batch: boolean;
|
||||
customer_name: string;
|
||||
customer_email: string;
|
||||
customer_phone: string | null;
|
||||
payment_status: string;
|
||||
payment_method: string | null;
|
||||
paid_at: string | null;
|
||||
created_at: string;
|
||||
total_cents: number;
|
||||
intake_all_complete: boolean;
|
||||
intake_any_incomplete: boolean;
|
||||
max_reminder_count: number;
|
||||
last_reminded_at: string | null;
|
||||
services: any[];
|
||||
};
|
||||
const groups = new Map<string, Grp>();
|
||||
for (const r of rows as any[]) {
|
||||
const key = r.batch_id || r.order_number;
|
||||
let g = groups.get(key);
|
||||
if (!g) {
|
||||
g = {
|
||||
group_id: key,
|
||||
is_batch: !!r.batch_id,
|
||||
customer_name: r.customer_name,
|
||||
customer_email: r.customer_email,
|
||||
customer_phone: r.customer_phone,
|
||||
payment_status: r.payment_status,
|
||||
payment_method: r.payment_method,
|
||||
paid_at: r.paid_at,
|
||||
created_at: r.created_at,
|
||||
total_cents: 0,
|
||||
intake_all_complete: true,
|
||||
intake_any_incomplete: false,
|
||||
max_reminder_count: 0,
|
||||
last_reminded_at: null,
|
||||
services: [],
|
||||
};
|
||||
groups.set(key, g);
|
||||
}
|
||||
g.total_cents += Number(r.service_fee_cents || 0) + Number(r.gov_fee_cents || 0)
|
||||
+ Number(r.surcharge_cents || 0) - Number(r.discount_cents || 0);
|
||||
if (!r.intake_data_validated) { g.intake_all_complete = false; g.intake_any_incomplete = true; }
|
||||
g.max_reminder_count = Math.max(g.max_reminder_count, Number(r.intake_reminder_count || 0));
|
||||
if (r.intake_reminder_last_at && (!g.last_reminded_at || r.intake_reminder_last_at > g.last_reminded_at)) {
|
||||
g.last_reminded_at = r.intake_reminder_last_at;
|
||||
}
|
||||
g.services.push({
|
||||
order_number: r.order_number,
|
||||
service_slug: r.service_slug,
|
||||
service_name: r.service_name || r.service_slug,
|
||||
fulfillment_status: r.fulfillment_status,
|
||||
fulfillment_status_at: r.fulfillment_status_at,
|
||||
intake_data_validated: r.intake_data_validated,
|
||||
erpnext_sales_order: r.erpnext_sales_order,
|
||||
ready_to_approve: r.fulfillment_status === "ready_to_file",
|
||||
});
|
||||
}
|
||||
|
||||
res.json({ groups: Array.from(groups.values()) });
|
||||
} catch (err) {
|
||||
console.error("[admin/compliance-orders] Error:", err);
|
||||
res.status(500).json({ error: "Could not load compliance orders." });
|
||||
}
|
||||
});
|
||||
|
||||
/** GET /api/v1/admin/compliance-orders/stats — queue overview counts. */
|
||||
router.get("/api/v1/admin/compliance-orders/stats", requireAdmin, async (_req, res) => {
|
||||
try {
|
||||
const { rows } = await pool.query(`
|
||||
SELECT
|
||||
COUNT(*) FILTER (WHERE payment_status = 'paid') AS paid,
|
||||
COUNT(*) FILTER (WHERE payment_status = 'pending_payment') AS pending_payment,
|
||||
COUNT(*) FILTER (WHERE payment_status = 'paid' AND COALESCE(intake_data_validated, FALSE) = FALSE) AS paid_intake_incomplete,
|
||||
COUNT(*) FILTER (WHERE fulfillment_status = 'ready_to_file') AS ready_to_file,
|
||||
COUNT(*) FILTER (WHERE fulfillment_status = 'awaiting_intake') AS awaiting_intake,
|
||||
COUNT(*) FILTER (WHERE fulfillment_status = 'completed') AS completed,
|
||||
COUNT(*) AS total
|
||||
FROM compliance_orders
|
||||
`);
|
||||
res.json(rows[0]);
|
||||
} catch (err) {
|
||||
console.error("[admin/compliance-orders/stats] Error:", err);
|
||||
res.status(500).json({ error: "Could not load stats." });
|
||||
}
|
||||
});
|
||||
|
||||
/** GET /api/v1/admin/compliance-orders/:order_number — single order full detail. */
|
||||
router.get("/api/v1/admin/compliance-orders/:order_number", requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const { rows } = await pool.query(
|
||||
`SELECT co.*, te.legal_name AS entity_name, te.frn AS entity_frn
|
||||
FROM compliance_orders co
|
||||
LEFT JOIN telecom_entities te ON te.id = co.telecom_entity_id
|
||||
WHERE co.order_number = $1`,
|
||||
[req.params.order_number],
|
||||
);
|
||||
if (rows.length === 0) { res.status(404).json({ error: "Order not found." }); return; }
|
||||
const order = rows[0];
|
||||
const audit = await pool.query(
|
||||
`SELECT * FROM order_audit_log
|
||||
WHERE order_number = $1 AND order_type IN ('compliance', 'compliance_batch')
|
||||
ORDER BY created_at DESC`,
|
||||
[order.order_number],
|
||||
);
|
||||
res.json({ order, audit_log: audit.rows });
|
||||
} catch (err) {
|
||||
console.error("[admin/compliance-orders/:id] Error:", err);
|
||||
res.status(500).json({ error: "Could not load order." });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/v1/admin/compliance-orders/:order_number/approve
|
||||
* Approve a prepared filing held at fulfillment_status='ready_to_file' and
|
||||
* dispatch the worker to actually submit it to the government system.
|
||||
*/
|
||||
router.post("/api/v1/admin/compliance-orders/:order_number/approve", requireAdmin, async (req, res) => {
|
||||
const id = req.params.order_number;
|
||||
try {
|
||||
const { rows } = await pool.query(
|
||||
`SELECT order_number, service_slug, fulfillment_status,
|
||||
COALESCE(intake_data_validated, FALSE) AS intake_data_validated
|
||||
FROM compliance_orders WHERE order_number = $1`,
|
||||
[id],
|
||||
);
|
||||
const order = rows[0];
|
||||
if (!order) { res.status(404).json({ error: "Order not found." }); return; }
|
||||
if (order.fulfillment_status !== "ready_to_file") {
|
||||
res.status(409).json({
|
||||
error: `Order is not awaiting submission approval (status=${order.fulfillment_status ?? "none"}).`,
|
||||
});
|
||||
return;
|
||||
}
|
||||
// Safety gate: never let an order be filed while its intake is still
|
||||
// incomplete (e.g. an admin-assisted service parked at ready_to_file before
|
||||
// the customer finished intake). The caller must pass {force:true} to
|
||||
// override, which is logged in the audit trail.
|
||||
if (!order.intake_data_validated && req.body?.force !== true) {
|
||||
res.status(409).json({
|
||||
error: "Intake is not complete for this order. Review the documents and resend the intake reminder, or pass force to override.",
|
||||
code: "intake_incomplete",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Flip status + write the audit row atomically. Previously these were two
|
||||
// separate pool.query calls, so a failure on the audit insert (e.g. an
|
||||
// order_type CHECK violation) left the status changed but un-dispatched and
|
||||
// returned a 500 -- the order silently fell out of ready_to_file without
|
||||
// being filed. A transaction keeps them all-or-nothing.
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
await client.query("BEGIN");
|
||||
await client.query(
|
||||
`UPDATE compliance_orders
|
||||
SET fulfillment_status = 'authorization_signed', fulfillment_status_at = now(), updated_at = now()
|
||||
WHERE order_number = $1`,
|
||||
[id],
|
||||
);
|
||||
await client.query(
|
||||
`INSERT INTO order_audit_log (order_type, order_id, order_number, action, from_status, to_status, actor_type, actor_id, actor_name, note)
|
||||
VALUES ('compliance', 0, $1, 'approved_for_submission', 'ready_to_file', 'authorization_signed', 'admin', $2, $3, $4)`,
|
||||
[id, req.admin!.id, req.admin!.username,
|
||||
(req.body?.note as string)
|
||||
|| (order.intake_data_validated
|
||||
? "Approved + dispatched for government submission"
|
||||
: "Approved + dispatched (intake-incomplete override)")],
|
||||
);
|
||||
await client.query("COMMIT");
|
||||
} catch (txErr) {
|
||||
await client.query("ROLLBACK").catch(() => {});
|
||||
throw txErr;
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
|
||||
const workerUrl = process.env.WORKER_URL || "http://workers:8090";
|
||||
let dispatched = false;
|
||||
try {
|
||||
const r = await fetch(`${workerUrl}/jobs`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
action: "process_compliance_service",
|
||||
order_name: id,
|
||||
order_number: id,
|
||||
service_slug: order.service_slug,
|
||||
admin_approved: true,
|
||||
}),
|
||||
});
|
||||
dispatched = r.ok;
|
||||
} catch (err) {
|
||||
console.error(`[admin/compliance-orders] approve dispatch failed for ${id}:`, err);
|
||||
}
|
||||
res.json({ success: true, order_number: id, dispatched });
|
||||
} catch (err) {
|
||||
console.error(`[admin/compliance-orders] approve error for ${id}:`, err);
|
||||
res.status(500).json({ error: "Approve failed." });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/v1/admin/compliance-orders/:order_number/rearm-intake
|
||||
* Re-arm the daily intake reminder for a paid+incomplete order whose reminders
|
||||
* went quiet (clears intake_reminder_last_at so the next daily run nudges it).
|
||||
* Optionally resets the count back to 0 with { reset_count: true }.
|
||||
*/
|
||||
router.post("/api/v1/admin/compliance-orders/:order_number/rearm-intake", requireAdmin, async (req, res) => {
|
||||
const id = req.params.order_number;
|
||||
try {
|
||||
const resetCount = req.body?.reset_count === true;
|
||||
const { rows } = await pool.query(
|
||||
`SELECT order_number, batch_id, payment_status,
|
||||
COALESCE(intake_data_validated, FALSE) AS intake_data_validated
|
||||
FROM compliance_orders WHERE order_number = $1`,
|
||||
[id],
|
||||
);
|
||||
const order = rows[0];
|
||||
if (!order) { res.status(404).json({ error: "Order not found." }); return; }
|
||||
if (order.payment_status !== "paid") {
|
||||
res.status(409).json({ error: "Only paid orders can be re-armed." });
|
||||
return;
|
||||
}
|
||||
if (order.intake_data_validated) {
|
||||
res.status(409).json({ error: "Intake is already complete for this order." });
|
||||
return;
|
||||
}
|
||||
|
||||
// Re-arm the whole batch when this order belongs to one, so a multi-service
|
||||
// customer gets a single consolidated nudge (matches the worker grouping).
|
||||
const filter = order.batch_id
|
||||
? { clause: "batch_id = $1", val: order.batch_id }
|
||||
: { clause: "order_number = $1", val: id };
|
||||
const updated = await pool.query(
|
||||
`UPDATE compliance_orders
|
||||
SET intake_reminder_last_at = NULL
|
||||
${resetCount ? ", intake_reminder_count = 0" : ""},
|
||||
updated_at = now()
|
||||
WHERE ${filter.clause}
|
||||
AND payment_status = 'paid'
|
||||
AND COALESCE(intake_data_validated, FALSE) = FALSE
|
||||
RETURNING order_number`,
|
||||
[filter.val],
|
||||
);
|
||||
await pool.query(
|
||||
`INSERT INTO order_audit_log (order_type, order_id, order_number, action, actor_type, actor_id, actor_name, note)
|
||||
VALUES ('compliance', 0, $1, 'intake_reminder_rearmed', 'admin', $2, $3, $4)`,
|
||||
[id, req.admin!.id, req.admin!.username,
|
||||
`Re-armed intake reminder for ${updated.rowCount} order(s)${resetCount ? " (count reset to 0)" : ""}`],
|
||||
);
|
||||
res.json({ success: true, rearmed: updated.rowCount });
|
||||
} catch (err) {
|
||||
console.error(`[admin/compliance-orders] rearm-intake error for ${id}:`, err);
|
||||
res.status(500).json({ error: "Re-arm failed." });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /api/v1/admin/compliance-orders/:order_number/mark-filed
|
||||
* Advance an order's fulfillment_status after a human has handled it. Used for
|
||||
* admin-assisted services (UCR, MC authority, etc.) that have no automated
|
||||
* filing path: once you've filed it on the government portal, mark it
|
||||
* filed_waiting_state (submitted, awaiting the agency) or completed (done).
|
||||
* body: { status: 'filed_waiting_state' | 'completed', note?, confirmation? }
|
||||
*/
|
||||
router.post("/api/v1/admin/compliance-orders/:order_number/mark-filed", requireAdmin, async (req, res) => {
|
||||
const id = req.params.order_number;
|
||||
const ALLOWED = new Set(["filed_waiting_state", "completed"]);
|
||||
try {
|
||||
const status = String(req.body?.status || "");
|
||||
if (!ALLOWED.has(status)) {
|
||||
res.status(400).json({ error: "status must be filed_waiting_state or completed." });
|
||||
return;
|
||||
}
|
||||
const { rows } = await pool.query(
|
||||
`SELECT order_number, fulfillment_status FROM compliance_orders WHERE order_number = $1`,
|
||||
[id],
|
||||
);
|
||||
const order = rows[0];
|
||||
if (!order) { res.status(404).json({ error: "Order not found." }); return; }
|
||||
|
||||
const confirmation = (req.body?.confirmation as string) || "";
|
||||
const note = (req.body?.note as string)
|
||||
|| `Marked ${status} by admin${confirmation ? ` (confirmation: ${confirmation})` : ""}`;
|
||||
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
await client.query("BEGIN");
|
||||
await client.query(
|
||||
`UPDATE compliance_orders
|
||||
SET fulfillment_status = $2, fulfillment_status_at = now(), updated_at = now()
|
||||
WHERE order_number = $1`,
|
||||
[id, status],
|
||||
);
|
||||
// Record the confirmation number into intake_data.filing_status when given.
|
||||
if (confirmation) {
|
||||
await client.query(
|
||||
`UPDATE compliance_orders
|
||||
SET intake_data = jsonb_set(
|
||||
jsonb_set(COALESCE(intake_data, '{}'::jsonb), '{filing_status}',
|
||||
COALESCE(intake_data->'filing_status', '{}'::jsonb)),
|
||||
'{filing_status,manual_confirmation}', to_jsonb($2::text))
|
||||
WHERE order_number = $1`,
|
||||
[id, confirmation],
|
||||
);
|
||||
}
|
||||
await client.query(
|
||||
`INSERT INTO order_audit_log (order_type, order_id, order_number, action, from_status, to_status, actor_type, actor_id, actor_name, note)
|
||||
VALUES ('compliance', 0, $1, 'marked_filed', $2, $3, 'admin', $4, $5, $6)`,
|
||||
[id, order.fulfillment_status, status, req.admin!.id, req.admin!.username, note],
|
||||
);
|
||||
await client.query("COMMIT");
|
||||
} catch (txErr) {
|
||||
await client.query("ROLLBACK").catch(() => {});
|
||||
throw txErr;
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
res.json({ success: true, order_number: id, status });
|
||||
} catch (err) {
|
||||
console.error(`[admin/compliance-orders] mark-filed error for ${id}:`, err);
|
||||
res.status(500).json({ error: "Mark-filed failed." });
|
||||
}
|
||||
});
|
||||
|
||||
// ── Document discovery + viewing ─────────────────────────────────────────────
|
||||
//
|
||||
// Every prepared/signed filing PDF lives in MinIO. We surface them so you can
|
||||
// review the actual document (e.g. the signed MCS-150 / authorization) before
|
||||
// approving an order for government submission. Keys come from three places:
|
||||
// 1. esign_records — the unsigned + signed e-sign PDFs per order
|
||||
// 2. intake_data.filing_status — pdf_minio_path / attested_pdf / evidence/*
|
||||
// 3. compliance_orders cols — engagement_letter_minio_key, rmd_packet_minio_paths
|
||||
//
|
||||
// Browsers can't open MinIO's IP-allowlisted public host, so instead of handing
|
||||
// out presigned URLs we STREAM the object through the API (JWT-gated). The
|
||||
// stream endpoint accepts the token via ?token= so it works in a new tab.
|
||||
|
||||
const WORKER_URL_ADMIN = process.env.WORKER_URL || "http://workers:8090";
|
||||
|
||||
// Slugs that actually generate an MCS-150 PDF (mirrors MCS150_FORM_SLUGS in
|
||||
// scripts/workers/services/mcs150_update.py). Other admin-assisted DOT services
|
||||
// routed to the same handler (UCR, MC authority, audit prep, ETA, etc.) never
|
||||
// produce that form, even though the shared filing_status carries a phantom
|
||||
// pdf_minio_path.
|
||||
const FORM_PRODUCING_SLUGS = new Set<string>([
|
||||
"mcs150-update",
|
||||
"dot-registration",
|
||||
"usdot-reactivation",
|
||||
"dot-full-compliance",
|
||||
]);
|
||||
|
||||
/** Ask the worker for a presigned (internal minio:9000) GET URL. */
|
||||
async function presignInternal(key: string): Promise<string | null> {
|
||||
if (!key) return null;
|
||||
try {
|
||||
const r = await fetch(`${WORKER_URL_ADMIN}/jobs/presign`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ key, expires: 600, method: "GET" }),
|
||||
});
|
||||
if (!r.ok) return null;
|
||||
const data = (await r.json()) as { url?: string };
|
||||
return data.url || null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/** Collect every known MinIO document key for an order (deduped, labeled). */
|
||||
async function collectOrderDocuments(orderNumber: string): Promise<Array<{ label: string; key: string }>> {
|
||||
const docs: Array<{ label: string; key: string }> = [];
|
||||
const seen = new Set<string>();
|
||||
const add = (label: string, key: unknown) => {
|
||||
if (typeof key === "string" && key && !seen.has(key)) {
|
||||
seen.add(key);
|
||||
docs.push({ label, key });
|
||||
}
|
||||
};
|
||||
|
||||
// 1. Order row: intake_data filing artifacts + per-order document columns.
|
||||
const ord = await pool.query(
|
||||
`SELECT service_slug, intake_data, engagement_letter_minio_key, rmd_packet_minio_paths
|
||||
FROM compliance_orders WHERE order_number = $1`,
|
||||
[orderNumber],
|
||||
);
|
||||
if (ord.rows.length) {
|
||||
const o = ord.rows[0];
|
||||
const slug = (o.service_slug as string) || "";
|
||||
const intake = (o.intake_data && typeof o.intake_data === "object" ? o.intake_data : {}) as Record<string, any>;
|
||||
const fs = (intake.filing_status && typeof intake.filing_status === "object" ? intake.filing_status : {}) as Record<string, any>;
|
||||
// The shared dot-compliance-remediation pipeline seeds a filing_status with a
|
||||
// template pdf_minio_path on EVERY order in a batch, but only services that
|
||||
// actually produce an MCS-150 form ever generate that PDF. For admin-assisted
|
||||
// services (UCR, MC authority, audit prep, etc.) it's a phantom that never
|
||||
// exists, so only surface the prepared-filing artifacts for form producers.
|
||||
if (FORM_PRODUCING_SLUGS.has(slug)) {
|
||||
add("Prepared filing PDF", fs.pdf_minio_path);
|
||||
add("Attested PDF (faxed)", fs.attested_pdf);
|
||||
}
|
||||
// Submission evidence: durable MinIO copies written by the worker after a
|
||||
// government submission. NOTE: fs.screenshot_path is a worker-local temp
|
||||
// path (not a MinIO key) -- the durable copy lives in fs.evidence, so we use
|
||||
// that. Skip evidence entries that aren't object keys (e.g. fax_log_id).
|
||||
if (fs.evidence && typeof fs.evidence === "object") {
|
||||
const EVIDENCE_LABELS: Record<string, string> = {
|
||||
confirmation_screenshot: "Filing confirmation screenshot",
|
||||
pre_submit_screenshot: "Pre-submission screenshot",
|
||||
attested_pdf_minio: "Attested filing PDF",
|
||||
};
|
||||
for (const [k, v] of Object.entries(fs.evidence as Record<string, any>)) {
|
||||
if (k === "fax_log_id") continue; // an ID, not a file
|
||||
add(EVIDENCE_LABELS[k] || ("Evidence: " + k.replace(/_/g, " ")), v);
|
||||
}
|
||||
}
|
||||
add("Engagement letter", o.engagement_letter_minio_key);
|
||||
const rmd = o.rmd_packet_minio_paths;
|
||||
if (Array.isArray(rmd)) rmd.forEach((k, i) => add(`RMD packet ${i + 1}`, k));
|
||||
else if (rmd && typeof rmd === "object") for (const [k, v] of Object.entries(rmd)) add("RMD: " + k, v);
|
||||
}
|
||||
|
||||
// 2. e-sign records: the unsigned doc and (once signed) the signed doc.
|
||||
const es = await pool.query(
|
||||
`SELECT document_type, status, document_minio_key, signed_document_minio_key
|
||||
FROM esign_records WHERE order_number = $1 ORDER BY created_at`,
|
||||
[orderNumber],
|
||||
);
|
||||
for (const r of es.rows as any[]) {
|
||||
const t = (r.document_type || "document").replace(/[-_]/g, " ");
|
||||
if (r.signed_document_minio_key) add(`Signed ${t}`, r.signed_document_minio_key);
|
||||
add(`${r.status === "signed" ? "Unsigned" : "Pending"} ${t}`, r.document_minio_key);
|
||||
}
|
||||
|
||||
return docs;
|
||||
}
|
||||
|
||||
/** GET /api/v1/admin/compliance-orders/:order_number/documents — list viewable PDFs. */
|
||||
router.get("/api/v1/admin/compliance-orders/:order_number/documents", requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const exists = await pool.query("SELECT 1 FROM compliance_orders WHERE order_number = $1", [req.params.order_number]);
|
||||
if (exists.rows.length === 0) { res.status(404).json({ error: "Order not found." }); return; }
|
||||
const docs = await collectOrderDocuments(req.params.order_number);
|
||||
// Verify each object actually exists in storage. A key can be recorded in
|
||||
// the DB before (or without) the object ever being uploaded -- e.g. a
|
||||
// template pdf_minio_path, or a stray esign_records row from the shared
|
||||
// remediation pipeline. We DROP non-existent objects so the UI only ever
|
||||
// lists documents you can actually open; the empty state explains the rest.
|
||||
const checked = await Promise.all(docs.map(async (d) => {
|
||||
let present = false;
|
||||
try {
|
||||
const url = await presignInternal(d.key);
|
||||
if (url) {
|
||||
// The presigned URL is signed for GET, so a HEAD request fails the
|
||||
// signature check. Use a 1-byte ranged GET to confirm existence
|
||||
// cheaply without downloading the whole object.
|
||||
const probe = await fetch(url, { headers: { Range: "bytes=0-0" } });
|
||||
present = probe.ok; // 200 or 206
|
||||
}
|
||||
} catch { /* treat as missing */ }
|
||||
const lower = d.key.toLowerCase();
|
||||
const isImage = lower.endsWith(".png") || lower.endsWith(".jpg") || lower.endsWith(".jpeg") || lower.endsWith(".gif") || lower.endsWith(".webp");
|
||||
return { ...d, exists: present, is_image: isImage };
|
||||
}));
|
||||
const available = checked.filter((d) => d.exists);
|
||||
res.json({ order_number: req.params.order_number, documents: available });
|
||||
} catch (err) {
|
||||
console.error("[admin/compliance-orders/documents] Error:", err);
|
||||
res.status(500).json({ error: "Could not list documents." });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /api/v1/admin/compliance-orders/:order_number/document?key=...&token=...
|
||||
* Stream a single MinIO object through the API (JWT-gated via header or ?token).
|
||||
* The key MUST be one we discovered for this order — prevents arbitrary-object
|
||||
* reads from a valid admin token.
|
||||
*/
|
||||
router.get("/api/v1/admin/compliance-orders/:order_number/document", requireAdminQueryOrHeader, async (req, res) => {
|
||||
try {
|
||||
const key = typeof req.query.key === "string" ? req.query.key : "";
|
||||
if (!key) { res.status(400).json({ error: "key required" }); return; }
|
||||
|
||||
const docs = await collectOrderDocuments(req.params.order_number);
|
||||
if (!docs.some((d) => d.key === key)) {
|
||||
res.status(403).json({ error: "Key does not belong to this order." });
|
||||
return;
|
||||
}
|
||||
|
||||
const url = await presignInternal(key);
|
||||
if (!url) { res.status(502).json({ error: "Could not generate object URL." }); return; }
|
||||
|
||||
const upstream = await fetch(url);
|
||||
if (upstream.status === 404) {
|
||||
res.status(404).json({ error: "Document not found in storage (it may not have been generated yet)." });
|
||||
return;
|
||||
}
|
||||
if (!upstream.ok || !upstream.body) {
|
||||
res.status(502).json({ error: `Object fetch failed (${upstream.status}).` });
|
||||
return;
|
||||
}
|
||||
|
||||
// Infer a sensible content type; default to PDF (almost all are).
|
||||
const lower = key.toLowerCase();
|
||||
const ct = lower.endsWith(".pdf") ? "application/pdf"
|
||||
: lower.endsWith(".png") ? "image/png"
|
||||
: lower.endsWith(".jpg") || lower.endsWith(".jpeg") ? "image/jpeg"
|
||||
: lower.endsWith(".xlsx") ? "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
: upstream.headers.get("content-type") || "application/octet-stream";
|
||||
res.setHeader("Content-Type", ct);
|
||||
res.setHeader("Content-Disposition", `inline; filename="${key.split("/").pop() || "document"}"`);
|
||||
const len = upstream.headers.get("content-length");
|
||||
if (len) res.setHeader("Content-Length", len);
|
||||
|
||||
const buf = Buffer.from(await upstream.arrayBuffer());
|
||||
res.end(buf);
|
||||
} catch (err) {
|
||||
console.error("[admin/compliance-orders/document] Error:", err);
|
||||
res.status(500).json({ error: "Could not stream document." });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -226,17 +226,34 @@ router.post("/api/v1/canada-crtc/orders", submitLimiter, async (req, res) => {
|
|||
: company_type === "numbered_tradename" ? TRADE_NAME_SERVICE_FEE
|
||||
: 0;
|
||||
|
||||
// Discount code (applies to service fee only, not gov fees)
|
||||
// Discount code (applies to service fee only, not gov fees).
|
||||
// Enforce active + start/expiry windows + global usage limit + scope
|
||||
// server-side so promotional expiry (e.g. "expires Friday") is honored at
|
||||
// checkout, not just in the front-end validator. Mirrors GET
|
||||
// /api/v1/discount/:code in routes/discounts.ts.
|
||||
let discountCents = 0;
|
||||
if (discount_code) {
|
||||
const dcResult = await pool.query("SELECT * FROM discount_codes WHERE code = $1 AND active = TRUE", [discount_code.toUpperCase()]);
|
||||
if (dcResult.rows.length > 0) {
|
||||
const dc = dcResult.rows[0];
|
||||
const discountableAmount = SERVICE_FEE + typeAddon; // discount applies to full service fee
|
||||
if (dc.discount_type === "percent") {
|
||||
discountCents = Math.round((discountableAmount * dc.discount_value) / 100);
|
||||
const now = new Date();
|
||||
const notStarted = dc.starts_at && new Date(dc.starts_at) > now;
|
||||
const expired = dc.expires_at && new Date(dc.expires_at) < now;
|
||||
const usedUp = dc.max_uses !== null && dc.current_uses >= dc.max_uses;
|
||||
const outOfScope = (() => {
|
||||
if (!dc.applies_to) return false; // NULL = all services
|
||||
const allowed = String(dc.applies_to).split(",").map((s: string) => s.trim().toLowerCase());
|
||||
return !allowed.includes("canada-crtc");
|
||||
})();
|
||||
if (notStarted || expired || usedUp || outOfScope) {
|
||||
console.warn(`[canada-crtc] discount ${dc.code} rejected at checkout`, { notStarted, expired, usedUp, outOfScope });
|
||||
} else {
|
||||
discountCents = Math.min(dc.discount_value, discountableAmount);
|
||||
const discountableAmount = SERVICE_FEE + typeAddon; // discount applies to full service fee
|
||||
if (dc.discount_type === "percent") {
|
||||
discountCents = Math.round((discountableAmount * dc.discount_value) / 100);
|
||||
} else {
|
||||
discountCents = Math.min(dc.discount_value, discountableAmount);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ async function ensureColumns(): Promise<void> {
|
|||
await pool.query(`ALTER TABLE formation_orders ADD COLUMN IF NOT EXISTS stripe_session_id TEXT`);
|
||||
await pool.query(`ALTER TABLE formation_orders ADD COLUMN IF NOT EXISTS payment_status TEXT DEFAULT 'pending_payment'`);
|
||||
await pool.query(`ALTER TABLE formation_orders ADD COLUMN IF NOT EXISTS paid_at TIMESTAMPTZ`);
|
||||
await pool.query(`ALTER TABLE formation_orders ADD COLUMN IF NOT EXISTS erpnext_sales_order TEXT`);
|
||||
await pool.query(`ALTER TABLE bundle_orders ADD COLUMN IF NOT EXISTS stripe_session_id TEXT`);
|
||||
await pool.query(`ALTER TABLE bundle_orders ADD COLUMN IF NOT EXISTS payment_method TEXT`);
|
||||
await pool.query(`ALTER TABLE bundle_orders ADD COLUMN IF NOT EXISTS surcharge_pct NUMERIC`);
|
||||
|
|
@ -103,6 +104,12 @@ async function ensureColumns(): Promise<void> {
|
|||
try {
|
||||
await pool.query(`ALTER TABLE compliance_orders ADD COLUMN IF NOT EXISTS paypal_order_id TEXT`);
|
||||
await pool.query(`ALTER TABLE compliance_orders ADD COLUMN IF NOT EXISTS crypto_details JSONB`);
|
||||
// Recurring services (e.g. OIG/SAM monthly monitoring) track the Stripe
|
||||
// Subscription so renewal webhooks (invoice.paid) can map back to the order.
|
||||
await pool.query(`ALTER TABLE compliance_orders ADD COLUMN IF NOT EXISTS stripe_subscription_id TEXT`);
|
||||
// Bundle buyers get the first OIG/SAM screening included, then an automated
|
||||
// upsell to the $79/mo monitoring subscription — this dedupes that send.
|
||||
await pool.query(`ALTER TABLE compliance_orders ADD COLUMN IF NOT EXISTS bundle_upsell_sent_at TIMESTAMPTZ`);
|
||||
} catch { /* table may not exist yet */ }
|
||||
schemaMigrated = true;
|
||||
}
|
||||
|
|
@ -166,19 +173,21 @@ async function findOrCreateCustomer(
|
|||
}
|
||||
|
||||
/**
|
||||
* Ensure a compliance customer has an ERPNext portal account and persist the
|
||||
* Ensure a paid customer has an ERPNext portal account and persist the
|
||||
* `portal_user_created` flag on their order rows.
|
||||
*
|
||||
* ERPNext (portal.performancewest.net) is the single customer portal. Normal
|
||||
* ERPNext (portal.performancewest.net) is the SINGLE source of truth for the
|
||||
* customer portal — login, password, and the customer/order records. Normal
|
||||
* Stripe checkout provisions the Website User up-front via findOrCreateCustomer,
|
||||
* but PayPal / crypto / remediation-pipeline orders reach handlePaymentComplete
|
||||
* without ever creating one — leaving those customers unable to log in. This
|
||||
* runs in that shared post-payment path so EVERY paid compliance order gets a
|
||||
* portal account regardless of how it was created or paid. Fully idempotent:
|
||||
* ensureWebsiteUser no-ops if the User already exists, and we only flip the
|
||||
* flag (which gates the delivery worker's set-password invite) the first time.
|
||||
* runs in that shared post-payment path so EVERY paid order (compliance,
|
||||
* canada_crtc, formation) gets an ERPNext Customer + Website User regardless of
|
||||
* how it was created or paid. Fully idempotent: ensureWebsiteUser no-ops if the
|
||||
* User already exists, and we only flip the flag (which gates the delivery
|
||||
* worker's set-password invite) the first time.
|
||||
*/
|
||||
async function ensureCompliancePortalUser(
|
||||
async function ensurePortalUser(
|
||||
orderId: string,
|
||||
orderType: string,
|
||||
rows: Record<string, unknown>[],
|
||||
|
|
@ -187,16 +196,47 @@ async function ensureCompliancePortalUser(
|
|||
if (!first) return;
|
||||
const email = ((first.customer_email as string) || "").toLowerCase().trim();
|
||||
const name = (first.customer_name as string) || email.split("@")[0] || "Customer";
|
||||
// Company: compliance_orders has no customer_company column; it lives in
|
||||
// intake_data. Fall back gracefully across order types.
|
||||
let company: string | null = (first.customer_company as string) || null;
|
||||
if (!company && first.intake_data) {
|
||||
try {
|
||||
const intake = typeof first.intake_data === "string"
|
||||
? JSON.parse(first.intake_data as string)
|
||||
: (first.intake_data as Record<string, unknown>);
|
||||
company = (intake.company as string) || (intake.legal_name as string)
|
||||
|| (intake.entity_name as string) || null;
|
||||
} catch { /* ignore */ }
|
||||
}
|
||||
if (!email) return;
|
||||
|
||||
// Skip obviously non-deliverable placeholder addresses so we never create a
|
||||
// dead portal account or fire a set-password invite into the void. (e.g. the
|
||||
// FMCSA-census "synthetic@pipeline.com" placeholder used when no real email
|
||||
// was found.) These orders need a real email before onboarding.
|
||||
const domain = email.split("@")[1] || "";
|
||||
if (domain === "pipeline.com" || email.startsWith("synthetic@")) {
|
||||
console.warn(`[checkout] Skipping portal provisioning for ${orderId}: placeholder email ${email}`);
|
||||
return;
|
||||
// (No address suppression here. `synthetic@pipeline.com` is a real customer
|
||||
// address (EarthLink/pipeline.com), not a placeholder -- provisioning + email
|
||||
// proceed normally. Only RFC-reserved test domains are rejected upstream at
|
||||
// order creation (emailError in compliance-orders.ts).)
|
||||
|
||||
// ── Portal profile row (Postgres `customers`) ───────────────────────
|
||||
// ERPNext is the single source of truth for portal passwords (see
|
||||
// portal-auth.ts). This Postgres `customers` row is just the PG-side
|
||||
// profile + order-linking record (customer_id FK) and carries NO password.
|
||||
// We create it here so the customer can immediately register/reset (which
|
||||
// writes the password to ERPNext) and so order routes that join on
|
||||
// customer_id work. The Stripe path historically relied on the customer
|
||||
// self-registering; PayPal/crypto orders reach here directly and otherwise
|
||||
// had NO customers row, which is why PayPal customers could not log in or
|
||||
// reset their password. Idempotent. See docs / Paul Wilson incident
|
||||
// 2026-06-09.
|
||||
try {
|
||||
await pool.query(
|
||||
`INSERT INTO customers (email, name, company)
|
||||
VALUES ($1, $2, $3)
|
||||
ON CONFLICT (email) DO UPDATE SET
|
||||
name = COALESCE(customers.name, EXCLUDED.name),
|
||||
company = COALESCE(customers.company, EXCLUDED.company)`,
|
||||
[email, name, company],
|
||||
);
|
||||
} catch (custErr) {
|
||||
console.warn("[checkout] Could not upsert portal customers row:", custErr);
|
||||
}
|
||||
|
||||
// Provision the ERPNext Website User (idempotent) and link to the Customer.
|
||||
|
|
@ -209,7 +249,11 @@ async function ensureCompliancePortalUser(
|
|||
if (portalUserCreated) {
|
||||
const table = orderType === "compliance_batch" || orderType === "compliance"
|
||||
? "compliance_orders"
|
||||
: null;
|
||||
: orderType === "canada_crtc"
|
||||
? "canada_crtc_orders"
|
||||
: orderType === "formation"
|
||||
? "formation_orders"
|
||||
: null;
|
||||
if (table) {
|
||||
try {
|
||||
if (orderType === "compliance_batch") {
|
||||
|
|
@ -243,6 +287,123 @@ const CDR_STUDY_GRANTING_SLUGS = new Set([
|
|||
"cdr-analysis",
|
||||
]);
|
||||
|
||||
/**
|
||||
* Create the ERPNext Sales Order for a compliance / compliance_batch order on
|
||||
* payment completion. Idempotent: skips if the order(s) already have
|
||||
* erpnext_sales_order set. Called from handlePaymentComplete so EVERY payment
|
||||
* method (Stripe webhook, PayPal, crypto) creates the SO -- previously only the
|
||||
* /checkout/create-session path did, so webhook-confirmed card orders had no SO
|
||||
* and the workers logged "Sales Order not found 404".
|
||||
*/
|
||||
export async function ensureComplianceSalesOrder(
|
||||
orderId: string,
|
||||
orderType: string,
|
||||
rows: Record<string, unknown>[],
|
||||
paymentMethod: string,
|
||||
): Promise<void> {
|
||||
if (orderType !== "compliance" && orderType !== "compliance_batch") return;
|
||||
if (!rows.length) return;
|
||||
|
||||
// Already created? (any row carrying the SO id) -> idempotent skip.
|
||||
if (rows.some(r => r.erpnext_sales_order)) return;
|
||||
|
||||
const first = rows[0];
|
||||
const email = ((first.customer_email as string) || "").toLowerCase().trim();
|
||||
const name = (first.customer_name as string) || email.split("@")[0] || "Customer";
|
||||
// NOTE: unlike portal provisioning, we do NOT skip the FMCSA-census placeholder
|
||||
// email here -- a Sales Order is internal bookkeeping (not an outbound email),
|
||||
// and some real customers genuinely use that address. We only need a non-empty
|
||||
// email to attach an ERPNext Customer.
|
||||
if (!email) return;
|
||||
|
||||
const { customerName: erpnextCustomer } = await findOrCreateCustomer(email, name);
|
||||
if (!erpnextCustomer) return;
|
||||
|
||||
const { COMPLIANCE_SERVICES } = await import("./compliance-orders.js");
|
||||
const surchargePct = Number(first.surcharge_pct || 0);
|
||||
let surchargeCents = 0;
|
||||
let discountCents = 0;
|
||||
|
||||
const lineItems = rows.map((o: Record<string, any>) => {
|
||||
const info = COMPLIANCE_SERVICES[(o.service_slug as string) || ""];
|
||||
surchargeCents += Number(o.surcharge_cents || 0);
|
||||
discountCents += Number(o.discount_cents || 0);
|
||||
const items: Array<{ item_code: string; description: string; qty: number; rate: number }> = [{
|
||||
item_code: info?.erpnext_item || "COMPLIANCE-SERVICE",
|
||||
description: (o.service_name as string) || info?.name || "Compliance Service",
|
||||
qty: 1,
|
||||
rate: toDollars((o.service_fee_cents as number) || 0),
|
||||
}];
|
||||
const govCents = (o.gov_fee_cents as number) || 0;
|
||||
if (govCents > 0) {
|
||||
items.push({
|
||||
item_code: "GOVERNMENT-FILING-FEE",
|
||||
description: (o.gov_fee_label as string) || "Government filing fee",
|
||||
qty: 1,
|
||||
rate: toDollars(govCents),
|
||||
});
|
||||
}
|
||||
return items;
|
||||
}).flat();
|
||||
|
||||
if (surchargeCents > 0) {
|
||||
lineItems.push({
|
||||
item_code: "PAYMENT-PROCESSING-FEE",
|
||||
description: `${GATEWAY_LABELS[paymentMethod] || paymentMethod} surcharge`,
|
||||
qty: 1,
|
||||
rate: toDollars(surchargeCents),
|
||||
});
|
||||
}
|
||||
|
||||
const so = (await createResource("Sales Order", {
|
||||
customer: erpnextCustomer,
|
||||
delivery_date: new Date(Date.now() + 30 * 86400000).toISOString().split("T")[0],
|
||||
custom_external_order_id: orderId,
|
||||
custom_order_type: "compliance",
|
||||
custom_payment_gateway: GATEWAY_LABELS[paymentMethod] || paymentMethod,
|
||||
custom_surcharge_pct: surchargePct,
|
||||
workflow_state: "Received",
|
||||
items: lineItems,
|
||||
// Reflect the promo/bundle discount so the SO grand total matches what the
|
||||
// customer actually paid (line items are full price; discount applied here).
|
||||
...(discountCents > 0 ? { apply_discount_on: "Grand Total", discount_amount: toDollars(discountCents) } : {}),
|
||||
}).catch(async (e: unknown) => {
|
||||
// Resilience: if a service's ERPNext Item is missing, the SO would 404.
|
||||
// Retry once with every line item remapped to the generic COMPLIANCE-SERVICE
|
||||
// item so a missing catalog Item never strands a paid order's SO. (The
|
||||
// catalog Item should still be created; this is a safety net.)
|
||||
const msg = String((e as { body?: { _server_messages?: string } })?.body?._server_messages || e);
|
||||
if (/not found/i.test(msg)) {
|
||||
console.warn(`[checkout] SO item missing for ${orderId}, retrying with generic item:`, msg.slice(0, 120));
|
||||
const fallback = lineItems.map(li => ({ ...li, item_code: "COMPLIANCE-SERVICE" }));
|
||||
return createResource("Sales Order", {
|
||||
customer: erpnextCustomer,
|
||||
delivery_date: new Date(Date.now() + 30 * 86400000).toISOString().split("T")[0],
|
||||
custom_external_order_id: orderId,
|
||||
custom_order_type: "compliance",
|
||||
custom_payment_gateway: GATEWAY_LABELS[paymentMethod] || paymentMethod,
|
||||
custom_surcharge_pct: surchargePct,
|
||||
workflow_state: "Received",
|
||||
items: fallback,
|
||||
...(discountCents > 0 ? { apply_discount_on: "Grand Total", discount_amount: toDollars(discountCents) } : {}),
|
||||
});
|
||||
}
|
||||
throw e;
|
||||
})) as { name: string };
|
||||
|
||||
try {
|
||||
await callMethod("frappe.client.submit", { doc: { doctype: "Sales Order", name: so.name } });
|
||||
} catch { /* submit may fail if workflow doesn't require it */ }
|
||||
|
||||
// Link the SO back to the order row(s): batch by batch_id, single by order_number.
|
||||
if (orderType === "compliance_batch") {
|
||||
await pool.query(`UPDATE compliance_orders SET erpnext_sales_order = $1 WHERE batch_id = $2`, [so.name, orderId]);
|
||||
} else {
|
||||
await pool.query(`UPDATE compliance_orders SET erpnext_sales_order = $1 WHERE order_number = $2`, [so.name, orderId]);
|
||||
}
|
||||
console.log(`[checkout] Created ERPNext Sales Order ${so.name} for ${orderType} ${orderId} (${lineItems.length} line items)`);
|
||||
}
|
||||
|
||||
async function grantCDRStudyAccess(
|
||||
order: Record<string, unknown>,
|
||||
order_id: string,
|
||||
|
|
@ -748,8 +909,30 @@ router.post("/api/v1/checkout/create-session", async (req, res) => {
|
|||
// For batch orders, total discount comes from the orderData; for single orders, from the order row
|
||||
const discount_cents = (orderData as any).discount_cents ?? (order.discount_cents as number) ?? 0;
|
||||
|
||||
// ── Recurring (subscription) gate ─────────────────────────────────────
|
||||
// A service flagged billing_interval in the catalog is sold as a Stripe
|
||||
// Subscription (mode:"subscription"), not a one-time charge. Only methods
|
||||
// that can do off-session recurring charges (card/ACH) are permitted, and
|
||||
// only single compliance orders (no batches) can be recurring.
|
||||
const { COMPLIANCE_SERVICES: CATALOG } = await import("./compliance-orders.js");
|
||||
const recurringSlug = (order.service_slug as string) || "";
|
||||
const recurringSvc = order_type === "compliance" ? CATALOG[recurringSlug] : undefined;
|
||||
const billingInterval = recurringSvc?.billing_interval; // "month" | "year" | undefined
|
||||
const allowedMethods = recurringSvc?.allowed_methods; // restricts methods if set
|
||||
if (allowedMethods && !allowedMethods.includes(payment_method as any)) {
|
||||
res.status(400).json({
|
||||
error: `${recurringSvc?.name || "This service"} can only be paid by ${allowedMethods.join(" or ")}.`,
|
||||
code: "METHOD_NOT_ALLOWED",
|
||||
allowed_methods: allowedMethods,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// ── Server-side surcharge (applied to post-discount amount) ───────────
|
||||
const surcharge_pct = GATEWAY_SURCHARGES[payment_method] ?? 0;
|
||||
// Recurring services bill a clean flat amount ($79/mo) — Stripe subscription
|
||||
// line items all recur, so a one-time surcharge line is not representable;
|
||||
// absorb the ~3% card fee instead. ACH is 0% anyway.
|
||||
const surcharge_pct = billingInterval ? 0 : (GATEWAY_SURCHARGES[payment_method] ?? 0);
|
||||
const surcharge_cents = Math.round(((base_cents - discount_cents) * surcharge_pct) / 100);
|
||||
const total_cents = base_cents + surcharge_cents - discount_cents;
|
||||
|
||||
|
|
@ -965,6 +1148,184 @@ router.post("/api/v1/checkout/create-session", async (req, res) => {
|
|||
}
|
||||
}
|
||||
|
||||
// ── Create ERPNext Sales Order (compliance BATCH) ───────────────────────
|
||||
// A batch (CB-XXXX) is one customer paying for several services at once, so
|
||||
// it becomes ONE Sales Order with a line item per service (plus the
|
||||
// processing-fee line). Previously batches created no SO at all, so trucking
|
||||
// new-carrier orders (which always use the batch path) never reached ERPNext.
|
||||
if (order_type === "compliance_batch" && erpnextCustomer) {
|
||||
try {
|
||||
const { COMPLIANCE_SERVICES } = await import("./compliance-orders.js");
|
||||
const { rows: batchRows } = await pool.query(
|
||||
`SELECT * FROM compliance_orders WHERE batch_id = $1 ORDER BY created_at`,
|
||||
[order_id],
|
||||
);
|
||||
|
||||
const lineItems = batchRows.map((o: Record<string, any>) => {
|
||||
const info = COMPLIANCE_SERVICES[(o.service_slug as string) || ""];
|
||||
const svcCents = (o.service_fee_cents as number) || 0;
|
||||
const govCents = (o.gov_fee_cents as number) || 0;
|
||||
const items: Array<{ item_code: string; description: string; qty: number; rate: number }> = [{
|
||||
item_code: info?.erpnext_item || "COMPLIANCE-SERVICE",
|
||||
description: (o.service_name as string) || info?.name || "Compliance Service",
|
||||
qty: 1,
|
||||
rate: toDollars(svcCents),
|
||||
}];
|
||||
if (govCents > 0) {
|
||||
items.push({
|
||||
item_code: "GOVERNMENT-FILING-FEE",
|
||||
description: (o.gov_fee_label as string) || "Government filing fee",
|
||||
qty: 1,
|
||||
rate: toDollars(govCents),
|
||||
});
|
||||
}
|
||||
return items;
|
||||
}).flat();
|
||||
|
||||
if (surcharge_cents > 0) {
|
||||
lineItems.push({
|
||||
item_code: "PAYMENT-PROCESSING-FEE",
|
||||
description: `${GATEWAY_LABELS[payment_method] || payment_method} ${surcharge_pct}%`,
|
||||
qty: 1,
|
||||
rate: toDollars(surcharge_cents),
|
||||
});
|
||||
}
|
||||
|
||||
const so = (await createResource("Sales Order", {
|
||||
customer: erpnextCustomer,
|
||||
delivery_date: new Date(Date.now() + 30 * 86400000).toISOString().split("T")[0],
|
||||
custom_external_order_id: order_id,
|
||||
custom_order_type: "compliance",
|
||||
custom_payment_gateway: GATEWAY_LABELS[payment_method] || payment_method,
|
||||
custom_surcharge_pct: surcharge_pct,
|
||||
workflow_state: "Received",
|
||||
items: lineItems,
|
||||
})) as { name: string };
|
||||
|
||||
try {
|
||||
await callMethod("frappe.client.submit", { doc: { doctype: "Sales Order", name: so.name } });
|
||||
} catch { /* submit may fail if workflow doesn't require it */ }
|
||||
|
||||
await pool.query(
|
||||
`UPDATE compliance_orders SET erpnext_sales_order = $1 WHERE batch_id = $2`,
|
||||
[so.name, order_id],
|
||||
);
|
||||
|
||||
console.log(`[checkout] Created ERPNext Sales Order ${so.name} for batch ${order_id} (${lineItems.length} line items)`);
|
||||
} catch (soErr) {
|
||||
console.warn("[checkout] Batch Sales Order creation failed (non-blocking):", soErr);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Create ERPNext Sales Order (US business formation) ──────────────────
|
||||
if (order_type === "formation" && erpnextCustomer) {
|
||||
try {
|
||||
const pgOrder = orderData.order as Record<string, any>;
|
||||
const entityType = (pgOrder.entity_type as string) || "LLC";
|
||||
const stateCode = (pgOrder.state_code as string) || "";
|
||||
const stateFeeCents = (pgOrder.state_fee_cents as number) || 0;
|
||||
|
||||
const so = (await createResource("Sales Order", {
|
||||
customer: erpnextCustomer,
|
||||
delivery_date: new Date(Date.now() + 30 * 86400000).toISOString().split("T")[0],
|
||||
custom_external_order_id: order_id,
|
||||
custom_order_type: "formation",
|
||||
custom_payment_gateway: GATEWAY_LABELS[payment_method] || payment_method,
|
||||
custom_surcharge_pct: surcharge_pct,
|
||||
workflow_state: "Received",
|
||||
items: [{
|
||||
item_code: "BUSINESS-FORMATION",
|
||||
description: `${entityType} Formation${stateCode ? ` — ${stateCode}` : ""}`,
|
||||
qty: 1,
|
||||
rate: toDollars((pgOrder.service_fee_cents as number) || base_cents - stateFeeCents - surcharge_cents),
|
||||
}, ...(stateFeeCents > 0 ? [{
|
||||
item_code: "STATE-FILING-FEE",
|
||||
description: `${stateCode} state filing fee (government fee)`,
|
||||
qty: 1,
|
||||
rate: toDollars(stateFeeCents),
|
||||
}] : []), ...(surcharge_cents > 0 ? [{
|
||||
item_code: "PAYMENT-PROCESSING-FEE",
|
||||
description: `${GATEWAY_LABELS[payment_method] || payment_method} ${surcharge_pct}%`,
|
||||
qty: 1,
|
||||
rate: toDollars(surcharge_cents),
|
||||
}] : [])],
|
||||
})) as { name: string };
|
||||
|
||||
try {
|
||||
await callMethod("frappe.client.submit", { doc: { doctype: "Sales Order", name: so.name } });
|
||||
} catch { /* submit may fail if workflow doesn't require it */ }
|
||||
|
||||
await pool.query(
|
||||
`UPDATE formation_orders SET erpnext_sales_order = $1 WHERE order_number = $2`,
|
||||
[so.name, order_id],
|
||||
);
|
||||
|
||||
console.log(`[checkout] Created ERPNext Sales Order ${so.name} for formation ${order_id}`);
|
||||
} catch (soErr) {
|
||||
console.warn("[checkout] Formation Sales Order creation failed (non-blocking):", soErr);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Create ERPNext Sales Order (FCC carrier / ISP registration) ─────────
|
||||
if (order_type === "fcc_carrier_registration" && erpnextCustomer) {
|
||||
try {
|
||||
const pgOrder = orderData.order as Record<string, any>;
|
||||
const items: Array<Record<string, unknown>> = [{
|
||||
item_code: "FCC-CARRIER-REGISTRATION",
|
||||
description: "FCC Carrier / ISP Registration",
|
||||
qty: 1,
|
||||
rate: toDollars((pgOrder.service_fee_cents as number) || 129900),
|
||||
}];
|
||||
const formationFee = ((pgOrder.formation_fee_cents as number) || 0) + ((pgOrder.state_fee_cents as number) || 0);
|
||||
if (formationFee > 0) {
|
||||
items.push({
|
||||
item_code: "BUSINESS-FORMATION",
|
||||
description: `Business Formation (${pgOrder.formation_state || "?"} ${((pgOrder.entity_type as string) || "LLC").toUpperCase()})`,
|
||||
qty: 1,
|
||||
rate: toDollars(formationFee),
|
||||
});
|
||||
}
|
||||
if (pgOrder.include_stir_shaken) {
|
||||
items.push({ item_code: "STIR-SHAKEN", description: "STIR/SHAKEN Implementation", qty: 1, rate: toDollars(49900) });
|
||||
}
|
||||
if (pgOrder.include_ocn) {
|
||||
items.push({ item_code: "NECA-OCN", description: "NECA OCN Registration", qty: 1, rate: toDollars(265000) });
|
||||
}
|
||||
const pucCents = (pgOrder.puc_fee_cents as number) || 0;
|
||||
if (pucCents > 0) {
|
||||
const stateCount = ((pgOrder.state_puc_states as string[]) || []).length;
|
||||
items.push({ item_code: "STATE-PUC-REGISTRATION", description: `State PUC Registration (${stateCount} state${stateCount !== 1 ? "s" : ""})`, qty: 1, rate: toDollars(pucCents) });
|
||||
}
|
||||
if (surcharge_cents > 0) {
|
||||
items.push({ item_code: "PAYMENT-PROCESSING-FEE", description: `${GATEWAY_LABELS[payment_method] || payment_method} ${surcharge_pct}%`, qty: 1, rate: toDollars(surcharge_cents) });
|
||||
}
|
||||
|
||||
const so = (await createResource("Sales Order", {
|
||||
customer: erpnextCustomer,
|
||||
delivery_date: new Date(Date.now() + 30 * 86400000).toISOString().split("T")[0],
|
||||
custom_external_order_id: order_id,
|
||||
custom_order_type: "fcc_carrier_registration",
|
||||
custom_payment_gateway: GATEWAY_LABELS[payment_method] || payment_method,
|
||||
custom_surcharge_pct: surcharge_pct,
|
||||
workflow_state: "Received",
|
||||
items,
|
||||
})) as { name: string };
|
||||
|
||||
try {
|
||||
await callMethod("frappe.client.submit", { doc: { doctype: "Sales Order", name: so.name } });
|
||||
} catch { /* submit may fail if workflow doesn't require it */ }
|
||||
|
||||
await pool.query(
|
||||
`UPDATE fcc_carrier_registrations SET erpnext_sales_order = $1 WHERE order_number = $2`,
|
||||
[so.name, order_id],
|
||||
);
|
||||
|
||||
console.log(`[checkout] Created ERPNext Sales Order ${so.name} for fcc_carrier_registration ${order_id}`);
|
||||
} catch (soErr) {
|
||||
console.warn("[checkout] FCC Sales Order creation failed (non-blocking):", soErr);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Create Stripe Checkout Session ─────────────────────────────────────
|
||||
const STRIPE_PAYMENT_METHOD_MAP: Record<string, Stripe.Checkout.SessionCreateParams.PaymentMethodType[]> = {
|
||||
card: ["card"],
|
||||
|
|
@ -1145,36 +1506,68 @@ router.post("/api/v1/checkout/create-session", async (req, res) => {
|
|||
...(payment_method === "ach" ? { setup_future_usage: "off_session" } : {}),
|
||||
};
|
||||
|
||||
const session = await stripe.checkout.sessions.create({
|
||||
mode: "payment",
|
||||
payment_method_types: paymentMethodTypes,
|
||||
line_items: allLineItems,
|
||||
...(discounts ? { discounts } : {}),
|
||||
customer_email: customer_email || undefined,
|
||||
success_url: `${DOMAIN}/order/success?session_id={CHECKOUT_SESSION_ID}&order_id=${order_id}&order_type=${order_type}`,
|
||||
cancel_url: `${DOMAIN}/order/cancelled?order_id=${order_id}&order_type=${order_type}${order.expedited ? "&expedited=1" : ""}`,
|
||||
metadata: {
|
||||
order_id,
|
||||
order_type,
|
||||
payment_method,
|
||||
customer_email: customer_email || "",
|
||||
customer_name: customer_name || "",
|
||||
...(erpnextCustomer ? { erpnext_customer: erpnextCustomer } : {}),
|
||||
const sharedMetadata = {
|
||||
order_id,
|
||||
order_type,
|
||||
payment_method,
|
||||
customer_email: customer_email || "",
|
||||
customer_name: customer_name || "",
|
||||
...(erpnextCustomer ? { erpnext_customer: erpnextCustomer } : {}),
|
||||
};
|
||||
|
||||
// ACH via Financial Connections: collect bank account details only.
|
||||
// (We intentionally do NOT request the 'balances' permission — see note
|
||||
// below; it requires activating that Stripe product and otherwise errors.)
|
||||
const achPaymentMethodOptions: Stripe.Checkout.SessionCreateParams.PaymentMethodOptions = {
|
||||
us_bank_account: {
|
||||
financial_connections: { permissions: ["payment_method"] },
|
||||
verification_method: "instant",
|
||||
},
|
||||
payment_intent_data: paymentIntentData,
|
||||
// ACH via Plaid: verify account balance before accepting payment
|
||||
...(payment_method === "ach" ? {
|
||||
payment_method_options: {
|
||||
us_bank_account: {
|
||||
financial_connections: {
|
||||
permissions: ["payment_method", "balances"],
|
||||
prefetch: ["balances"],
|
||||
},
|
||||
verification_method: "instant",
|
||||
};
|
||||
|
||||
let session: Stripe.Checkout.Session;
|
||||
if (billingInterval) {
|
||||
// ── Recurring (Subscription) checkout ──────────────────────────────
|
||||
// Convert the one-time line items into recurring prices. No surcharge
|
||||
// line (absorbed above) so every line recurs cleanly at billingInterval.
|
||||
const recurringLineItems: Stripe.Checkout.SessionCreateParams.LineItem[] =
|
||||
stripeLineItems.map((li: any) => ({
|
||||
quantity: li.quantity ?? 1,
|
||||
price_data: {
|
||||
currency: "usd",
|
||||
product_data: li.price_data.product_data,
|
||||
unit_amount: li.price_data.unit_amount,
|
||||
recurring: { interval: billingInterval },
|
||||
},
|
||||
},
|
||||
} : {}),
|
||||
});
|
||||
}));
|
||||
|
||||
session = await stripe.checkout.sessions.create({
|
||||
mode: "subscription",
|
||||
payment_method_types: paymentMethodTypes,
|
||||
line_items: recurringLineItems,
|
||||
customer_email: customer_email || undefined,
|
||||
success_url: `${DOMAIN}/order/success?session_id={CHECKOUT_SESSION_ID}&order_id=${order_id}&order_type=${order_type}`,
|
||||
cancel_url: `${DOMAIN}/order/cancelled?order_id=${order_id}&order_type=${order_type}`,
|
||||
metadata: sharedMetadata,
|
||||
// Stamp metadata onto the Subscription too, so renewal invoices
|
||||
// (invoice.paid) can be mapped back to this order downstream.
|
||||
subscription_data: { metadata: sharedMetadata },
|
||||
...(payment_method === "ach" ? { payment_method_options: achPaymentMethodOptions } : {}),
|
||||
});
|
||||
} else {
|
||||
session = await stripe.checkout.sessions.create({
|
||||
mode: "payment",
|
||||
payment_method_types: paymentMethodTypes,
|
||||
line_items: allLineItems,
|
||||
...(discounts ? { discounts } : {}),
|
||||
customer_email: customer_email || undefined,
|
||||
success_url: `${DOMAIN}/order/success?session_id={CHECKOUT_SESSION_ID}&order_id=${order_id}&order_type=${order_type}`,
|
||||
cancel_url: `${DOMAIN}/order/cancelled?order_id=${order_id}&order_type=${order_type}${order.expedited ? "&expedited=1" : ""}`,
|
||||
metadata: sharedMetadata,
|
||||
payment_intent_data: paymentIntentData,
|
||||
...(payment_method === "ach" ? { payment_method_options: achPaymentMethodOptions } : {}),
|
||||
});
|
||||
}
|
||||
|
||||
// (Sales Order already created above, before gateway split)
|
||||
|
||||
|
|
@ -1188,17 +1581,40 @@ router.post("/api/v1/checkout/create-session", async (req, res) => {
|
|||
};
|
||||
const table = tableMap[order_type];
|
||||
if (table) {
|
||||
// For batch orders, update by batch_id; otherwise by order_number
|
||||
// For batch orders, update by batch_id; otherwise by order_number.
|
||||
const whereCol = order_type === "compliance_batch" ? "batch_id" : "order_number";
|
||||
await pool.query(
|
||||
`UPDATE ${table}
|
||||
SET stripe_session_id = $1,
|
||||
payment_method = $2,
|
||||
surcharge_pct = $3,
|
||||
surcharge_cents = $4
|
||||
WHERE ${whereCol} = $5`,
|
||||
[session.id, payment_method, surcharge_pct, surcharge_cents, order_id],
|
||||
);
|
||||
if (order_type === "compliance_batch") {
|
||||
// A batch has ONE surcharge for the whole order, but it is stored per
|
||||
// row. Writing the full surcharge_cents to every row makes anything that
|
||||
// SUMS the per-row field (e.g. the Telegram order notification) over-
|
||||
// count by Nx. Split the single surcharge across the rows so the per-row
|
||||
// values sum to the true total (remainder on the first row).
|
||||
const { rows: brows } = await pool.query(
|
||||
`SELECT order_number FROM ${table} WHERE batch_id = $1 ORDER BY created_at`,
|
||||
[order_id],
|
||||
);
|
||||
const n = brows.length || 1;
|
||||
const per = Math.floor(surcharge_cents / n);
|
||||
const remainder = surcharge_cents - per * n;
|
||||
for (let i = 0; i < brows.length; i++) {
|
||||
const rowSurcharge = per + (i === 0 ? remainder : 0);
|
||||
await pool.query(
|
||||
`UPDATE ${table}
|
||||
SET stripe_session_id = $1, payment_method = $2,
|
||||
surcharge_pct = $3, surcharge_cents = $4
|
||||
WHERE order_number = $5`,
|
||||
[session.id, payment_method, surcharge_pct, rowSurcharge, brows[i].order_number],
|
||||
);
|
||||
}
|
||||
} else {
|
||||
await pool.query(
|
||||
`UPDATE ${table}
|
||||
SET stripe_session_id = $1, payment_method = $2,
|
||||
surcharge_pct = $3, surcharge_cents = $4
|
||||
WHERE ${whereCol} = $5`,
|
||||
[session.id, payment_method, surcharge_pct, surcharge_cents, order_id],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`[checkout] Stripe session ${session.id} created for ${order_type} ${order_id}`);
|
||||
|
|
@ -1323,6 +1739,21 @@ export async function handlePaymentComplete(
|
|||
const paymentMethod = (order.payment_method as string) || "card";
|
||||
console.log(`[checkout] Payment confirmed: ${order_type} ${order_id} via ${paymentMethod}`);
|
||||
|
||||
// Prefer the payment gateway's recorded total when available. This keeps
|
||||
// downstream notifications honest even if older rows still carry stale
|
||||
// per-line surcharge values from before the batch-surcharge split fix.
|
||||
let actualPaidCents: number | null = null;
|
||||
if (stripe && session_id && !session_id.startsWith("crypto-")) {
|
||||
try {
|
||||
const session = await stripe.checkout.sessions.retrieve(session_id);
|
||||
if (typeof session.amount_total === "number") {
|
||||
actualPaidCents = session.amount_total;
|
||||
}
|
||||
} catch (stripeErr) {
|
||||
console.warn(`[checkout] Could not retrieve Stripe session ${session_id} for notification totals:`, stripeErr);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Telegram order notification ──────────────────────────────────────
|
||||
try {
|
||||
const botToken = process.env.TELEGRAM_BOT_TOKEN;
|
||||
|
|
@ -1343,7 +1774,11 @@ export async function handlePaymentComplete(
|
|||
surchargeCents += Number(r.surcharge_cents || 0);
|
||||
serviceNames.push((r.service_name as string) || (r.service_slug as string) || "");
|
||||
}
|
||||
const totalCents = subtotalCents - discountCents + surchargeCents;
|
||||
const totalCents = actualPaidCents ?? (subtotalCents - discountCents + surchargeCents);
|
||||
const derivedSurchargeCents = totalCents - subtotalCents + discountCents;
|
||||
if (derivedSurchargeCents >= 0) {
|
||||
surchargeCents = derivedSurchargeCents;
|
||||
}
|
||||
const totalDollars = (totalCents / 100).toFixed(2);
|
||||
|
||||
const serviceLine = serviceNames.length <= 1
|
||||
|
|
@ -1363,11 +1798,18 @@ export async function handlePaymentComplete(
|
|||
const idLine = dotNumber ? `DOT#: ${dotNumber}\n`
|
||||
: frn ? `FRN: ${frn}\n`
|
||||
: "";
|
||||
// Campaign-source hint: an order carrying the daily campaign coupon (or any
|
||||
// discount code) almost certainly came from an email campaign. Surface it so
|
||||
// you can see the IFTA/UCR/CLIA/cold-email pipelines actually converting.
|
||||
const srcLine = order.discount_code
|
||||
? `Source: campaign (code ${order.discount_code})\n`
|
||||
: "";
|
||||
const msg = `💰 NEW ORDER\n\n`
|
||||
+ `Customer: ${customerName}\n`
|
||||
+ `Email: ${customerEmail}\n`
|
||||
+ idLine
|
||||
+ serviceLine
|
||||
+ srcLine
|
||||
+ subtotalLine
|
||||
+ discountLine
|
||||
+ surchargeLine
|
||||
|
|
@ -1391,6 +1833,39 @@ export async function handlePaymentComplete(
|
|||
// reporting year. Non-fatal — the customer still sees ingestion
|
||||
// counts even without a grant.
|
||||
if (order_type === "compliance" || order_type === "compliance_batch") {
|
||||
// ── Government-fee child order paid → resume the parent's filing ──────
|
||||
// At-cost services (IRP/IFTA/intrastate) bill the state fee via a child
|
||||
// order (parent_order_number set). When that child is paid, re-dispatch the
|
||||
// PARENT to the worker with gov_fee_paid=true so it proceeds to file. The
|
||||
// child itself needs none of the normal compliance post-processing.
|
||||
const parentNo = (order.parent_order_number as string) || "";
|
||||
if (parentNo) {
|
||||
try {
|
||||
const { rows: prows } = await pool.query(
|
||||
"SELECT service_slug FROM compliance_orders WHERE order_number = $1",
|
||||
[parentNo],
|
||||
);
|
||||
const parentSlug = prows[0]?.service_slug || "";
|
||||
const workerUrl = process.env.WORKER_URL || "http://workers:8090";
|
||||
await fetch(`${workerUrl}/jobs`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
action: "process_compliance_service",
|
||||
order_name: parentNo,
|
||||
order_number: parentNo,
|
||||
service_slug: parentSlug,
|
||||
client_approved: true, // authorization already signed earlier
|
||||
gov_fee_paid: true,
|
||||
}),
|
||||
});
|
||||
console.log(`[checkout] Gov-fee ${order_id} paid → re-dispatched parent ${parentNo} to file`);
|
||||
} catch (e) {
|
||||
console.error(`[checkout] Failed to resume parent after gov-fee ${order_id}:`, e);
|
||||
}
|
||||
return; // child order needs no further compliance processing
|
||||
}
|
||||
|
||||
try {
|
||||
await grantCDRStudyAccess(order, order_id);
|
||||
} catch (grantErr) {
|
||||
|
|
@ -1411,10 +1886,23 @@ export async function handlePaymentComplete(
|
|||
// come straight here and would otherwise skip it (this was the cause of
|
||||
// customers who paid via PayPal being unable to log in). Idempotent.
|
||||
try {
|
||||
await ensureCompliancePortalUser(order_id, order_type, updated.rows);
|
||||
await ensurePortalUser(order_id, order_type, updated.rows);
|
||||
} catch (portalErr) {
|
||||
console.error("[checkout] Compliance portal-user provisioning failed (non-fatal):", portalErr);
|
||||
}
|
||||
|
||||
// ── Create the ERPNext Sales Order (idempotent) ──────────────────────
|
||||
// The /checkout/create-session endpoint creates the SO for flows that
|
||||
// confirm there, but card payments confirm via the Stripe WEBHOOK -> this
|
||||
// function, which previously did NOT create the SO. Result: every webhook-
|
||||
// confirmed compliance order had erpnext_sales_order=NULL and the workers
|
||||
// logged "Sales Order ... not found 404" and fell back to building from PG.
|
||||
// Create it here for all payment methods. Skips if one already exists.
|
||||
try {
|
||||
await ensureComplianceSalesOrder(order_id, order_type, updated.rows, paymentMethod);
|
||||
} catch (soErr) {
|
||||
console.error("[checkout] Compliance Sales Order creation failed (non-fatal):", soErr);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Umami analytics — server-side payment event ─────────────────────────
|
||||
|
|
@ -1447,6 +1935,17 @@ export async function handlePaymentComplete(
|
|||
if (order_type === "canada_crtc") {
|
||||
const soName = (order.erpnext_sales_order as string) || null;
|
||||
|
||||
// Ensure the customer has an ERPNext portal account (the single source of
|
||||
// truth for login/password). create-session provisions it up-front for
|
||||
// card/ACH, but PayPal / crypto / webhook-confirmed orders reach here
|
||||
// directly and would otherwise skip it — the same gap that left PayPal
|
||||
// compliance customers unable to log in. Idempotent. See ensurePortalUser.
|
||||
try {
|
||||
await ensurePortalUser(order_id, order_type, updated.rows);
|
||||
} catch (portalErr) {
|
||||
console.error("[checkout] CRTC portal-user provisioning failed (non-fatal):", portalErr);
|
||||
}
|
||||
|
||||
// PayPal: funds are instant — advance directly to "Client Selection"
|
||||
// Stripe card/ACH/Klarna: advance to "Awaiting Funds" — balance.available webhook handles next step
|
||||
// Crypto: advance to "Awaiting Funds" — manual admin step later
|
||||
|
|
@ -1604,10 +2103,13 @@ export async function handlePaymentComplete(
|
|||
|
||||
// Create Sales Invoice
|
||||
try {
|
||||
// Calculate batch total (sum of all line items minus discounts)
|
||||
const batchTotalCents = (batchRows.rows as any[]).reduce((sum, bo) => {
|
||||
// Calculate the actual paid amount for the batch: service + gov fees
|
||||
// - discounts + surcharge. Older versions passed only the pre-
|
||||
// surcharge total, which understated the Payment Entry amount.
|
||||
const batchBaseCents = (batchRows.rows as any[]).reduce((sum, bo) => {
|
||||
return sum + (bo.service_fee_cents || 0) + (bo.gov_fee_cents || 0) - (bo.discount_cents || 0);
|
||||
}, 0);
|
||||
const batchTotalCents = batchBaseCents + ((Number(order.surcharge_cents) || 0));
|
||||
const invName = await createInvoiceFromSalesOrder({
|
||||
salesOrderName: soName,
|
||||
paymentGateway: paymentMethod,
|
||||
|
|
@ -2152,58 +2654,78 @@ export async function sendComplianceIntakeEmail(
|
|||
</p>
|
||||
</div>` : "";
|
||||
|
||||
// CMS filing-method section for PECOS / NPPES orders. We offer two service
|
||||
// tiers and let the provider pick the one that's easiest for them:
|
||||
// (1) Standard filing — they review + sign one certification, we submit to
|
||||
// their MAC. Zero account setup. Default for reval/enrollment.
|
||||
// (2) Expedited filing — faster/same-day-trackable via CMS I&A surrogate access.
|
||||
// NPPES-only services (reactivation, update) are web-only, so surrogate access
|
||||
// is the only path for those. We never ask for the provider's password.
|
||||
// CMS filing for PECOS / NPPES orders. We file everything for the provider;
|
||||
// the ONLY client-facing choice is the optional surrogate question, framed
|
||||
// positively. We NEVER expose the mechanics (paper, CMS-855/10114, MAC, Fargo)
|
||||
// and we NEVER tell them "the alternative is paper". If they grant I&A
|
||||
// Surrogate access we file online same-day; if not, we file it for them via our
|
||||
// Standard path silently. Same price either way — surrogate is just faster for
|
||||
// us (fewer steps, lets us bulk-file). We never ask for their password.
|
||||
const npiConfirmUrl = `${SITE_DOMAIN}/order/success?action=ia_surrogacy&order_id=${orderId}`;
|
||||
// Which ordered services support the standard (no-account) filing path
|
||||
// vs. are NPPES-web-only (surrogate access required).
|
||||
const STANDARD_FILING_SLUGS = new Set<string>(["npi-revalidation", "medicare-enrollment", "provider-compliance-bundle"]);
|
||||
const NPPES_ONLY_SLUGS = new Set<string>(["npi-reactivation", "nppes-update"]);
|
||||
const hasStandardFiling = npiAccessOrders.some(o => STANDARD_FILING_SLUGS.has(o.service_slug as string));
|
||||
const hasNppesOnly = npiAccessOrders.some(o => NPPES_ONLY_SLUGS.has(o.service_slug as string));
|
||||
|
||||
const standardFilingBlock = hasStandardFiling ? `
|
||||
<p style="margin:0 0 6px;font-size:13px;font-weight:700;color:#115e59;">Standard filing — no account needed</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#134e4a;line-height:1.5;">
|
||||
We complete the correct CMS-855 for you. You review and sign the certification
|
||||
from a secure link we send (takes about a minute), and we submit it to your
|
||||
Medicare Administrative Contractor (MAC) and track it to confirmation. Nothing
|
||||
for you to set up.
|
||||
</p>` : "";
|
||||
// Did the provider opt in to granting CMS I&A Surrogate access on the intake
|
||||
// form? If yes, surface the how-to prominently (it confirms the step they
|
||||
// committed to). If no / undecided, we still make it available, but collapsed
|
||||
// behind a "Show me how" expander and placed lower so it doesn't nag someone
|
||||
// who already chose to let us handle everything.
|
||||
const grantedSurrogate = String(intake.surrogate_access || "").toLowerCase() === "yes";
|
||||
|
||||
const surrogacyHeading = hasStandardFiling
|
||||
? `Expedited filing — CMS I&A surrogate access`
|
||||
: `Grant CMS I&A surrogate access`;
|
||||
|
||||
const npiSection = hasNpiAccess ? `
|
||||
<div style="background:#ccfbf1;border:1px solid #5eead4;border-radius:8px;padding:16px 20px;margin:20px 0;">
|
||||
<p style="margin:0 0 10px;font-size:14px;font-weight:700;color:#115e59;">Action Required: Choose How We File</p>
|
||||
${standardFilingBlock}
|
||||
<p style="margin:0 0 6px;font-size:13px;font-weight:700;color:#115e59;">${surrogacyHeading}</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#134e4a;line-height:1.5;">
|
||||
${hasNppesOnly ? "NPPES updates and reactivations are online-only, so this is required for those. " : ""}You add us as a
|
||||
<strong>Surrogate</strong> in CMS Identity & Access (I&A) — you never share your password.
|
||||
We then file in PECOS / NPPES under our own credentials and capture the tracking ID the same day.
|
||||
</p>
|
||||
const surrogateSteps = `
|
||||
<ol style="margin:0 0 12px;padding-left:20px;font-size:13px;color:#134e4a;line-height:1.7;">
|
||||
<li>Log in to <a href="https://nppes.cms.hhs.gov/IAWeb/login.do" style="color:#0f766e;">CMS I&A (I&A System)</a></li>
|
||||
<li>Log in to <a href="https://nppes.cms.hhs.gov/IAWeb/login.do" style="color:#0f766e;">CMS Identity & Access (I&A)</a></li>
|
||||
<li>Go to <strong>My Connections → Add Surrogate</strong></li>
|
||||
<li>Add surrogate organization: <strong>Performance West Inc.</strong> (email <strong>filings@performancewest.net</strong>)</li>
|
||||
<li>Grant access to <strong>PECOS</strong> and <strong>NPPES</strong> for your NPI, then approve our request</li>
|
||||
<li>Grant access for your NPI, then approve our request</li>
|
||||
</ol>
|
||||
<p style="margin:12px 0;text-align:center;">
|
||||
<a href="${npiConfirmUrl}" style="display:inline-block;background:#0f766e;color:#ffffff;font-weight:700;padding:12px 28px;border-radius:8px;text-decoration:none;font-size:14px;">
|
||||
I've granted surrogate access →
|
||||
</a>
|
||||
</p>`;
|
||||
|
||||
const npiSection = !hasNpiAccess ? "" : grantedSurrogate ? `
|
||||
<div style="background:#ccfbf1;border:1px solid #5eead4;border-radius:8px;padding:16px 20px;margin:20px 0;">
|
||||
<p style="margin:0 0 10px;font-size:14px;font-weight:700;color:#115e59;">We're handling your filing</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#134e4a;line-height:1.5;">
|
||||
You're all set — we prepare and submit your filing and track it to
|
||||
confirmation. The only thing we may need from you is a quick signature on
|
||||
a secure link we'll send.
|
||||
</p>
|
||||
<p style="margin:0 0 6px;font-size:13px;font-weight:700;color:#115e59;">You chose to grant Surrogate access — here's how (takes ~2 minutes)</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#134e4a;line-height:1.5;">
|
||||
This lets us file faster. You never share your password; you simply
|
||||
authorize us as a Surrogate for your NPI.
|
||||
</p>
|
||||
${surrogateSteps}
|
||||
<p style="margin:8px 0 0;font-size:12px;color:#115e59;text-align:center;">
|
||||
${hasStandardFiling ? "Prefer standard filing? Just reply to this email and we'll send your CMS-855 to sign — no further action needed from you here." : "Clicking this notifies our team so we can begin your filing."}
|
||||
Changed your mind? No problem — we'll handle your filing without it.
|
||||
</p>
|
||||
</div>` : `
|
||||
<div style="background:#ccfbf1;border:1px solid #5eead4;border-radius:8px;padding:16px 20px;margin:20px 0;">
|
||||
<p style="margin:0 0 10px;font-size:14px;font-weight:700;color:#115e59;">We're handling your filing</p>
|
||||
<p style="margin:0;font-size:13px;color:#134e4a;line-height:1.5;">
|
||||
You're all set — we prepare and submit your filing and track it to
|
||||
confirmation. The only thing we may need from you is a quick signature on
|
||||
a secure link we'll send. <strong>Nothing else to do.</strong>
|
||||
</p>
|
||||
</div>`;
|
||||
|
||||
// Optional speed-up block, shown lower in the email ONLY when they didn't
|
||||
// already grant access. Collapsed behind a "Show me how" expander.
|
||||
const npiSpeedupSection = (hasNpiAccess && !grantedSurrogate) ? `
|
||||
<div style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:8px;padding:16px 20px;margin:20px 0;">
|
||||
<p style="margin:0 0 6px;font-size:13px;font-weight:700;color:#115e59;">Optional: want it filed even faster?</p>
|
||||
<p style="margin:0 0 10px;font-size:13px;color:#134e4a;line-height:1.5;">
|
||||
If you can electronically grant us <strong>CMS I&A Surrogate access</strong>,
|
||||
we can process your filing right away. It's never required — we'll file
|
||||
it for you either way, at the same price. You never share your password.
|
||||
</p>
|
||||
<details style="margin:0;">
|
||||
<summary style="cursor:pointer;color:#0f766e;font-weight:700;font-size:13px;">Show me how →</summary>
|
||||
<div style="margin-top:10px;">
|
||||
${surrogateSteps}
|
||||
</div>
|
||||
</details>
|
||||
</div>` : "";
|
||||
|
||||
// Fully admin-assisted services with NO customer intake form. State-level
|
||||
|
|
@ -2291,6 +2813,8 @@ export async function sendComplianceIntakeEmail(
|
|||
|
||||
${intakeSection}
|
||||
|
||||
${npiSpeedupSection}
|
||||
|
||||
<h2 style="margin:24px 0 8px;font-size:16px;font-weight:700;color:#111827;">What to Expect</h2>
|
||||
${isDotOnly ? `
|
||||
<p style="margin:0 0 4px;font-size:14px;color:#374151;"><span style="color:#1e3a5f;font-weight:600;">1.</span> Our team is already working on your filing.</p>
|
||||
|
|
|
|||
|
|
@ -12,501 +12,32 @@
|
|||
import { Router } from "express";
|
||||
import { pool } from "../db.js";
|
||||
import { randomBytes } from "crypto";
|
||||
import { COMPLIANCE_SERVICES } from "../service-catalog.js";
|
||||
import { requireAdmin } from "../middleware/admin-auth.js";
|
||||
|
||||
const router = Router();
|
||||
|
||||
// ── Email validation ────────────────────────────────────────────────────────
|
||||
// Reject malformed addresses AND known non-deliverable placeholders (e.g. the
|
||||
// FMCSA-census "synthetic@pipeline.com" used when no real email was found) at
|
||||
// order-creation time, so we never seed an order/portal account with an
|
||||
// address we can't actually reach.
|
||||
// Reject malformed addresses AND RFC-reserved non-deliverable test domains, so
|
||||
// we never seed an order/portal account with an address we can't reach. NOTE:
|
||||
// `pipeline.com` is a REAL (EarthLink) domain with deliverable mailboxes and is
|
||||
// NOT a placeholder -- a customer (Paul Wilson) uses synthetic@pipeline.com as
|
||||
// his genuine address, confirmed reachable. Only example.com/test.com are
|
||||
// reserved test domains.
|
||||
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
const PLACEHOLDER_EMAIL_DOMAINS = new Set(["pipeline.com", "example.com", "test.com"]);
|
||||
const PLACEHOLDER_EMAIL_DOMAINS = new Set(["example.com", "test.com", "invalid"]);
|
||||
|
||||
function emailError(raw: unknown): string | null {
|
||||
const email = String(raw || "").trim().toLowerCase();
|
||||
if (!email) return "customer_email is required.";
|
||||
if (!EMAIL_RE.test(email)) return "customer_email is not a valid email address.";
|
||||
const domain = email.split("@")[1] || "";
|
||||
if (email.startsWith("synthetic@") || PLACEHOLDER_EMAIL_DOMAINS.has(domain)) {
|
||||
if (PLACEHOLDER_EMAIL_DOMAINS.has(domain)) {
|
||||
return "customer_email appears to be a placeholder; a real email address is required.";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// ── Service catalog (prices in cents) ──────────────────────────────────────
|
||||
const COMPLIANCE_SERVICES: Record<
|
||||
string,
|
||||
{ name: string; price_cents: number; gov_fee_cents?: number; gov_fee_label?: string; erpnext_item: string; discountable: boolean }
|
||||
> = {
|
||||
"fcc-compliance-checkup": {
|
||||
name: "FCC Carrier Compliance Checkup",
|
||||
price_cents: 79900,
|
||||
erpnext_item: "FCC-COMPLIANCE-CHECKUP",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-499a": {
|
||||
name: "FCC Form 499-A Filing",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "FCC-499A",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-499a-zero": {
|
||||
name: "FCC Form 499-A Filing (Zero Revenue)",
|
||||
price_cents: 17900,
|
||||
erpnext_item: "FCC-499A-ZERO",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-499a-499q": {
|
||||
name: "FCC Form 499-A + 499-Q Bundle",
|
||||
price_cents: 59900,
|
||||
erpnext_item: "FCC-499A-499Q",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-full-compliance": {
|
||||
name: "FCC Full Compliance Bundle",
|
||||
price_cents: 149900,
|
||||
erpnext_item: "FCC-FULL-COMPLIANCE",
|
||||
discountable: true,
|
||||
},
|
||||
"cpni-certification": {
|
||||
name: "CPNI Annual Certification",
|
||||
price_cents: 19900,
|
||||
erpnext_item: "CPNI-CERT",
|
||||
discountable: true,
|
||||
},
|
||||
"rmd-filing": {
|
||||
name: "RMD Registration / Recertification",
|
||||
price_cents: 24900,
|
||||
gov_fee_cents: 10000,
|
||||
gov_fee_label: "FCC RMD filing fee",
|
||||
erpnext_item: "RMD-FILING",
|
||||
discountable: true,
|
||||
},
|
||||
"stir-shaken": {
|
||||
name: "STIR/SHAKEN Implementation Assistance",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "STIR-SHAKEN",
|
||||
discountable: true,
|
||||
},
|
||||
"dc-agent": {
|
||||
name: "D.C. Registered Agent (Annual)",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "DC-AGENT",
|
||||
discountable: false,
|
||||
},
|
||||
// BDC filings — the FCC retired Form 477 in Dec 2022 and folded voice
|
||||
// subscription data into BDC. Broadband-only and voice-only SKUs let
|
||||
// carriers pay for just what they need; bdc-filing remains as a bundle.
|
||||
"bdc-broadband": {
|
||||
name: "BDC Broadband Deployment Filing",
|
||||
price_cents: 24900,
|
||||
erpnext_item: "BDC-BROADBAND",
|
||||
discountable: true,
|
||||
},
|
||||
"bdc-voice": {
|
||||
name: "BDC Voice Subscription Filing (formerly Form 477 Voice)",
|
||||
price_cents: 19900,
|
||||
erpnext_item: "BDC-VOICE",
|
||||
discountable: true,
|
||||
},
|
||||
"bdc-filing": {
|
||||
name: "BDC Filing (Broadband + Voice)",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "BDC-FILING",
|
||||
discountable: true,
|
||||
},
|
||||
// New-carrier entry point — register in CORES + obtain FRN
|
||||
"cores-frn-registration": {
|
||||
name: "CORES / FRN Registration",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "CORES-FRN",
|
||||
discountable: true,
|
||||
},
|
||||
// 499-A New Filer Registration (distinct from the annual revenue filing)
|
||||
"fcc-499-initial": {
|
||||
name: "Form 499 Initial Registration",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "FCC-499-INITIAL",
|
||||
discountable: true,
|
||||
},
|
||||
// CALEA System Security & Integrity plan (47 USC 229)
|
||||
"calea-ssi": {
|
||||
name: "CALEA SSI Plan",
|
||||
price_cents: 79900,
|
||||
erpnext_item: "CALEA-SSI",
|
||||
discountable: true,
|
||||
},
|
||||
// 47 CFR § 63.11 Foreign Carrier Affiliation Notification
|
||||
"fcc-63-11-notification": {
|
||||
name: "Foreign Carrier Affiliation Notification (47 CFR § 63.11)",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "FCC-63-11",
|
||||
discountable: true,
|
||||
},
|
||||
// One-click onboarding for a brand-new carrier (composes 5 filings)
|
||||
"new-carrier-bundle": {
|
||||
name: "New Carrier Onboarding Bundle (FRN + 499 Initial + RMD + CPNI + CALEA)",
|
||||
price_cents: 179900,
|
||||
erpnext_item: "NEW-CARRIER-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// NECA OCN registration — required for VoIP/IPES carriers that need
|
||||
// their own Operating Company Number for STIR/SHAKEN signing, LRN
|
||||
// assignments, or direct numbering authority. NECA charges $550
|
||||
// standard / $675 expedited; we pass through + margin for prep work.
|
||||
"ocn-registration": {
|
||||
name: "NECA OCN + Sponsoring CLEC Agreement",
|
||||
price_cents: 265000,
|
||||
erpnext_item: "OCN-REGISTRATION",
|
||||
discountable: false,
|
||||
},
|
||||
"fcc-499q": {
|
||||
name: "FCC Form 499-Q Quarterly Filing",
|
||||
price_cents: 0, // included in 499-A+Q bundle — not sold standalone
|
||||
erpnext_item: "FCC-499Q",
|
||||
discountable: false,
|
||||
},
|
||||
"fcc-499a-discontinuance": {
|
||||
name: "Form 499-A Discontinuance Filing",
|
||||
price_cents: 29900,
|
||||
erpnext_item: "499A-DISCONTINUANCE",
|
||||
discountable: false,
|
||||
},
|
||||
// Standalone CDR Traffic Study — customers who want the classified
|
||||
// study (unlocks the current reporting year) without buying the
|
||||
// full 499-A filing service. Either slug unlocks the study via the
|
||||
// cdr_study_access_grants paywall hook.
|
||||
"cdr-analysis": {
|
||||
name: "CDR Traffic Study (Annual)",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "CDR-ANALYSIS",
|
||||
discountable: true,
|
||||
},
|
||||
// CDR storage / processing tiers. Annual subscription; renew alongside
|
||||
// the filing. Each tier is additive — customer picks the smallest tier
|
||||
// that covers their worst of (storage bytes, classified rows).
|
||||
"cdr-storage-tier1": {
|
||||
name: "CDR Storage Tier 1 (50 GB / 50M calls)",
|
||||
price_cents: 9900,
|
||||
erpnext_item: "CDR-STORAGE-TIER1",
|
||||
discountable: false,
|
||||
},
|
||||
"cdr-storage-tier2": {
|
||||
name: "CDR Storage Tier 2 (250 GB / 250M calls)",
|
||||
price_cents: 29900,
|
||||
erpnext_item: "CDR-STORAGE-TIER2",
|
||||
discountable: false,
|
||||
},
|
||||
"cdr-storage-tier3": {
|
||||
name: "CDR Storage Tier 3 (1 TB / 1B calls)",
|
||||
price_cents: 79900,
|
||||
erpnext_item: "CDR-STORAGE-TIER3",
|
||||
discountable: false,
|
||||
},
|
||||
// ── Foreign qualification (Certificate of Authority) ─────────────────
|
||||
// Per-state fees are added on top of these flat service fees at order
|
||||
// time (state fee + NWRA RA wholesale, looked up from jurisdictions +
|
||||
// state_filing_fees). Handler fans out one filing per selected state.
|
||||
//
|
||||
// Pricing model:
|
||||
// - `foreign-qualification-single`: flat service fee ($149) + state
|
||||
// fee + optional NWRA RA. One state per order.
|
||||
// - `foreign-qualification-multi`: discounted per-state service fee
|
||||
// ($99) + state fees + RAs. For FCC carriers filing across their
|
||||
// operating territory.
|
||||
"foreign-qualification-single": {
|
||||
name: "Foreign Qualification (One State)",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "FOREIGN-QUAL-SINGLE",
|
||||
discountable: true,
|
||||
},
|
||||
"foreign-qualification-multi": {
|
||||
name: "Foreign Qualification (Multi-State)",
|
||||
price_cents: 9900, // per-state service fee
|
||||
erpnext_item: "FOREIGN-QUAL-MULTI",
|
||||
discountable: true,
|
||||
},
|
||||
// State PUC/PSC Registration — $399 per-state service fee + state
|
||||
// filing fees. Bond procurement coordinated separately.
|
||||
"state-puc": {
|
||||
name: "State PUC/PSC Registration",
|
||||
price_cents: 39900, // per-state service fee
|
||||
erpnext_item: "STATE-PUC",
|
||||
discountable: true,
|
||||
},
|
||||
// ── DOT / FMCSA Motor Carrier Services ──────────────────────────────
|
||||
"mcs150-update": {
|
||||
name: "MCS-150 Biennial Update",
|
||||
price_cents: 3900,
|
||||
erpnext_item: "MCS150-UPDATE",
|
||||
discountable: true,
|
||||
},
|
||||
"boc3-filing": {
|
||||
name: "BOC-3 Process Agent Filing",
|
||||
price_cents: 8900,
|
||||
erpnext_item: "BOC3-FILING",
|
||||
discountable: false, // passthrough cost — $25 to Process Agent LLC
|
||||
},
|
||||
"ucr-registration": {
|
||||
name: "UCR Annual Registration",
|
||||
price_cents: 3900,
|
||||
gov_fee_cents: 4600, // minimum tier ($46 for 0-2 power units)
|
||||
gov_fee_label: "UCR registration fee (tier-based, minimum shown)",
|
||||
erpnext_item: "UCR-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"dot-registration": {
|
||||
name: "New USDOT Number Registration",
|
||||
price_cents: 8900,
|
||||
erpnext_item: "DOT-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"mc-authority": {
|
||||
name: "MC Operating Authority Application",
|
||||
price_cents: 19900, // $199 + $300 FMCSA gov fee
|
||||
gov_fee_cents: 30000, // $300 FMCSA application fee
|
||||
gov_fee_label: "FMCSA operating authority application fee",
|
||||
erpnext_item: "MC-AUTHORITY",
|
||||
discountable: false, // $300 FMCSA gov fee makes this non-discountable
|
||||
},
|
||||
"usdot-reactivation": {
|
||||
name: "USDOT Number Reactivation",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "USDOT-REACTIVATION",
|
||||
discountable: true,
|
||||
},
|
||||
"emergency-temporary-authority": {
|
||||
name: "Emergency Temporary Authority (ETA)",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "EMERGENCY-TEMP-AUTH",
|
||||
discountable: false, // urgent service, premium pricing
|
||||
},
|
||||
"dot-drug-alcohol": {
|
||||
name: "DOT Drug & Alcohol Compliance Program",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "DOT-DRUG-ALCOHOL",
|
||||
discountable: true, // instant PDF binder we generate — our own deliverable, no passthrough cost
|
||||
},
|
||||
"dot-audit-prep": {
|
||||
name: "New Entrant Safety Audit Preparation",
|
||||
price_cents: 39900,
|
||||
erpnext_item: "DOT-AUDIT-PREP",
|
||||
discountable: true,
|
||||
},
|
||||
"dot-full-compliance": {
|
||||
name: "DOT Full Compliance Bundle",
|
||||
price_cents: 39900, // $399 — includes MCS-150+BOC-3+UCR+D&A+Audit ($775 individual)
|
||||
erpnext_item: "DOT-FULL-COMPLIANCE",
|
||||
discountable: true,
|
||||
},
|
||||
"carrier-closeout": {
|
||||
name: "Trucking Wrap-Up (USDOT Shutdown)",
|
||||
price_cents: 19900, // $199 — final MCS-150 (out of business) + MC revoke + UCR cancel + state account closures
|
||||
erpnext_item: "CARRIER-CLOSEOUT",
|
||||
discountable: true,
|
||||
},
|
||||
"entity-dissolution": {
|
||||
name: "Business Entity Dissolution (LLC/Corp)",
|
||||
price_cents: 4900, // $49 add-on to the wrap-up — LLC/Corp dissolution + final report; state filing fees billed separately
|
||||
gov_fee_label: "State dissolution filing fee (varies by state, billed at cost)",
|
||||
erpnext_item: "ENTITY-DISSOLUTION",
|
||||
discountable: true,
|
||||
},
|
||||
// ── State-Level Trucking Compliance ──────────────────────────────────
|
||||
// For these services the price_cents is our flat SERVICE fee only. The
|
||||
// actual state government charges (apportioned IRP registration, IFTA decal
|
||||
// fees, weight-distance/HUT account setup, permit/decal costs) vary by the
|
||||
// carrier's fleet weight, mileage, and base state, so they are passed
|
||||
// through AT COST and billed separately once the state issues the invoice —
|
||||
// we never mark them up. The gov_fee_label is shown to the customer at
|
||||
// checkout so the pass-through is disclosed up front.
|
||||
"irp-registration": {
|
||||
name: "IRP Registration Assistance",
|
||||
price_cents: 10900, // + state fees (apportioned registration billed at cost)
|
||||
gov_fee_label: "Apportioned IRP registration & plate fees (state, by jurisdictions + weight, billed at cost)",
|
||||
erpnext_item: "IRP-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"ifta-application": {
|
||||
name: "IFTA Application + Decals",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "IFTA license & decal fees (state, billed at cost)",
|
||||
erpnext_item: "IFTA-APPLICATION",
|
||||
discountable: true,
|
||||
},
|
||||
"ifta-quarterly": {
|
||||
name: "IFTA Quarterly Filing",
|
||||
price_cents: 10900,
|
||||
gov_fee_label: "IFTA taxes due (remitted to the state at cost based on your mileage)",
|
||||
erpnext_item: "IFTA-QUARTERLY",
|
||||
discountable: true,
|
||||
},
|
||||
"or-weight-mile-tax": {
|
||||
name: "Oregon Weight-Mile Tax Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "Oregon weight-mile tax account & bond/deposit (state, billed at cost)",
|
||||
erpnext_item: "OR-WEIGHT-MILE-TAX",
|
||||
discountable: true,
|
||||
},
|
||||
"ny-hut-registration": {
|
||||
name: "NY Highway Use Tax Registration",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "NY HUT certificate & decal fees (state, billed at cost)",
|
||||
erpnext_item: "NY-HUT-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"ky-kyu-registration": {
|
||||
name: "KY Weight-Distance Tax Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "KYU weight-distance account fees (state, billed at cost)",
|
||||
erpnext_item: "KY-KYU-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"nm-weight-distance": {
|
||||
name: "NM Weight-Distance Tax Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "NM weight-distance permit & account fees (state, billed at cost)",
|
||||
erpnext_item: "NM-WEIGHT-DISTANCE",
|
||||
discountable: true,
|
||||
},
|
||||
"ct-highway-use-fee": {
|
||||
name: "CT Highway Use Fee Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "CT Highway Use Fee registration (state, billed at cost)",
|
||||
erpnext_item: "CT-HIGHWAY-USE-FEE",
|
||||
discountable: true,
|
||||
},
|
||||
"ca-mcp-carb": {
|
||||
name: "California MCP + CARB Compliance",
|
||||
price_cents: 22900, // $229 + state fees (CA is more complex: MCP + CARB)
|
||||
gov_fee_label: "CA MCP permit fee + CARB/Clean Truck Check fees (state, by fleet size, billed at cost)",
|
||||
erpnext_item: "CA-MCP-CARB",
|
||||
discountable: true,
|
||||
},
|
||||
"state-dot-registration": {
|
||||
name: "State DOT Registration",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "State DOT/intrastate registration fee (state, billed at cost)",
|
||||
erpnext_item: "STATE-DOT-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"intrastate-authority": {
|
||||
name: "Intrastate Operating Authority",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "State intrastate authority filing fee (state, billed at cost)",
|
||||
erpnext_item: "INTRASTATE-AUTHORITY",
|
||||
discountable: true,
|
||||
},
|
||||
"osow-permit": {
|
||||
name: "Oversize/Overweight Permit",
|
||||
price_cents: 10900, // + state permit fees
|
||||
gov_fee_label: "State oversize/overweight permit fees (per trip/route, billed at cost)",
|
||||
erpnext_item: "OSOW-PERMIT",
|
||||
discountable: true,
|
||||
},
|
||||
"state-trucking-bundle": {
|
||||
name: "State Compliance Bundle",
|
||||
price_cents: 49900, // $499 — IRP+IFTA+weight tax+intrastate ($796 individual)
|
||||
gov_fee_label: "State registration, decal & tax fees for each included filing (billed at cost)",
|
||||
erpnext_item: "STATE-TRUCKING-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// ── Hazmat / Emissions ───────────────────────────────────────────────
|
||||
"hazmat-phmsa": {
|
||||
name: "PHMSA Hazmat Registration",
|
||||
price_cents: 14900, // $149 admin-assisted; PHMSA gov fee billed at cost
|
||||
gov_fee_label: "PHMSA registration fee ($25 + $250-$3,000 processing, by business size, billed at cost)",
|
||||
erpnext_item: "HAZMAT-PHMSA",
|
||||
discountable: true,
|
||||
},
|
||||
"state-emissions": {
|
||||
name: "State Clean-Truck / Emissions Compliance",
|
||||
price_cents: 10900, // $109 + state fees — NY/CO/MD/NJ/MA clean-truck / ACT advisory + registration assist
|
||||
erpnext_item: "STATE-EMISSIONS",
|
||||
discountable: true,
|
||||
},
|
||||
|
||||
// ── Corporate / Entity Services ──
|
||||
"annual-report-filing": {
|
||||
name: "Annual Report / Franchise Tax Filing",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "ANNUAL-REPORT",
|
||||
discountable: true,
|
||||
},
|
||||
"registered-agent": {
|
||||
name: "Registered Agent Service (1 Year)",
|
||||
price_cents: 9900,
|
||||
erpnext_item: "REGISTERED-AGENT",
|
||||
discountable: true,
|
||||
},
|
||||
"entity-reinstatement": {
|
||||
name: "Entity Reinstatement",
|
||||
price_cents: 29900,
|
||||
erpnext_item: "ENTITY-REINSTATEMENT",
|
||||
discountable: true,
|
||||
},
|
||||
"virtual-mailbox": {
|
||||
name: "Virtual Mailbox (1 Year)",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "VIRTUAL-MAILBOX",
|
||||
discountable: true,
|
||||
},
|
||||
"ein-application": {
|
||||
name: "EIN Application (IRS SS-4)",
|
||||
price_cents: 7900,
|
||||
erpnext_item: "EIN-APPLICATION",
|
||||
discountable: true,
|
||||
},
|
||||
"entity-upgrade-bundle": {
|
||||
name: "Entity Upgrade Package (Sole Prop → LLC)",
|
||||
price_cents: 59900,
|
||||
erpnext_item: "ENTITY-UPGRADE-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// ── Healthcare / NPI compliance ──────────────────────────────────────
|
||||
// CMS/NPPES provider compliance. Handlers are review-staged (a human
|
||||
// files in PECOS/NPPES) — same safety default as the FCC auto-filing
|
||||
// toggle. HIPAA is intentionally out of scope (separate specialty).
|
||||
// Flagship = npi-revalidation (CMS 5-yr Medicare revalidation, dateable
|
||||
// overdue signal from the free CMS revalidation list).
|
||||
"npi-revalidation": {
|
||||
name: "Medicare PECOS Revalidation Filing",
|
||||
price_cents: 39900,
|
||||
erpnext_item: "NPI-REVALIDATION",
|
||||
discountable: true,
|
||||
},
|
||||
"npi-reactivation": {
|
||||
name: "NPI Reactivation",
|
||||
price_cents: 24900,
|
||||
erpnext_item: "NPI-REACTIVATION",
|
||||
discountable: true,
|
||||
},
|
||||
"nppes-update": {
|
||||
name: "NPPES Data Update / Attestation",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "NPPES-UPDATE",
|
||||
discountable: true,
|
||||
},
|
||||
"medicare-enrollment": {
|
||||
name: "Medicare Enrollment (PECOS)",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "MEDICARE-ENROLLMENT",
|
||||
discountable: true,
|
||||
},
|
||||
"oig-sam-screening": {
|
||||
name: "OIG/SAM Exclusion Screening (Annual)",
|
||||
price_cents: 9900,
|
||||
erpnext_item: "OIG-SAM-SCREENING",
|
||||
discountable: false,
|
||||
},
|
||||
"provider-compliance-bundle": {
|
||||
name: "Provider Compliance Bundle (Annual)",
|
||||
price_cents: 69900,
|
||||
erpnext_item: "PROVIDER-COMPLIANCE-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
};
|
||||
|
||||
// ── Intake validation map ─────────────────────────────────────────────
|
||||
//
|
||||
|
|
@ -651,6 +182,10 @@ const REQUIRED_FIELDS: Record<string, FieldSpec> = {
|
|||
"foreign-qualification-single": { required: ["legal_name", "home_state_code", "entity_type", "target_states"], soft: ["ein"] },
|
||||
"foreign-qualification-multi": { required: ["legal_name", "home_state_code", "entity_type", "target_states"], soft: ["ein"] },
|
||||
|
||||
// ── Business name reservation (binding hold; admin-assisted filing) ──
|
||||
"name-reservation-tx": { required: ["entity_name", "entity_type"], soft: ["entity_name_alt"] },
|
||||
"name-reservation-nv": { required: ["entity_name", "entity_type"], soft: ["entity_name_alt"] },
|
||||
|
||||
// ── DOT / FMCSA Motor Carrier Services ───────────────────────────────
|
||||
// All collected via the unified dot-intake step (DOTIntakeStep.astro).
|
||||
"mcs150-update": { required: ["dot_number", "legal_name", "address_street", "address_city", "address_state", "address_zip", "phone", "email", "signer_name", "signer_title", "power_units", "drivers", "carrier_operation", "interstate_intrastate", "hazmat"], soft: ["mc_number", "ein", "annual_miles", "cargo_types"] },
|
||||
|
|
@ -710,7 +245,16 @@ const BUNDLE_COMPONENTS: Record<string, string[]> = {
|
|||
"ct-highway-use-fee", "ca-mcp-carb", "state-dot-registration",
|
||||
"intrastate-authority",
|
||||
],
|
||||
// Telecom VoIP onboarding bundle: composes the FCC filings a brand-new
|
||||
// carrier needs (FRN, 499 Initial, RMD, CPNI, CALEA). (Previously this listed
|
||||
// TRUCKING component slugs by mistake -- a copy/paste error from the DOT
|
||||
// bundle below.)
|
||||
"new-carrier-bundle": [
|
||||
"cores-frn-registration", "fcc-499-initial", "rmd-filing",
|
||||
"cpni-certification", "calea-ssi",
|
||||
],
|
||||
// Trucking/DOT new-carrier starter bundle components.
|
||||
"dot-new-carrier-bundle": [
|
||||
"dot-registration", "mc-authority", "boc3-filing",
|
||||
"mcs150-update", "dot-drug-alcohol", "ucr-registration",
|
||||
],
|
||||
|
|
@ -2182,7 +1726,6 @@ router.post("/api/v1/compliance-orders/:id/usac-delegation", async (req, res) =>
|
|||
const id = req.params.id;
|
||||
|
||||
try {
|
||||
// Support both batch ID (CB-) and order number (CO-)
|
||||
const whereCol = id.startsWith("CB-") ? "batch_id" : "order_number";
|
||||
const result = await pool.query(
|
||||
`UPDATE compliance_orders
|
||||
|
|
@ -2216,5 +1759,171 @@ router.post("/api/v1/compliance-orders/:id/usac-delegation", async (req, res) =>
|
|||
}
|
||||
});
|
||||
|
||||
// ── POST /api/v1/compliance-orders/:id/sc-insurance ──────────────────────────
|
||||
// SC intrastate Certificate of Compliance (COC) flow. The carrier answers a
|
||||
// one-click yes/no from their email: does their insurer have / can they file a
|
||||
// Form E (SC intrastate liability) with SCDMV?
|
||||
// have=yes -> record it; the worker proceeds to bill the $25 COC fee + file.
|
||||
// have=no -> record it + open a broker-referral ticket so we connect them
|
||||
// with an insurer that writes SC intrastate liability.
|
||||
// Stored in intake_data.sc_coc_insurance so no schema change is needed.
|
||||
router.post("/api/v1/compliance-orders/:id/sc-insurance", async (req, res) => {
|
||||
const id = req.params.id;
|
||||
const have = String((req.query.have ?? req.body?.have ?? "")).toLowerCase();
|
||||
if (have !== "yes" && have !== "no") {
|
||||
res.status(400).json({ error: "have must be 'yes' or 'no'." });
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const { rows } = await pool.query(
|
||||
`UPDATE compliance_orders
|
||||
SET intake_data = jsonb_set(
|
||||
jsonb_set(COALESCE(intake_data, '{}'::jsonb),
|
||||
'{sc_coc_insurance}', to_jsonb($2::text)),
|
||||
'{sc_coc_insurance_at}', to_jsonb(now()::text)),
|
||||
updated_at = NOW()
|
||||
WHERE order_number = $1
|
||||
RETURNING order_number, service_slug, customer_email, customer_name,
|
||||
intake_data->>'entity_name' AS entity_name`,
|
||||
[id, have],
|
||||
);
|
||||
if (rows.length === 0) {
|
||||
res.status(404).json({ error: "Order not found." });
|
||||
return;
|
||||
}
|
||||
const o = rows[0];
|
||||
console.log(`[compliance-orders] SC COC insurance answer for ${id}: ${have}`);
|
||||
|
||||
// NO -> open a broker-referral support ticket so ops connects them.
|
||||
if (have === "no") {
|
||||
try {
|
||||
await pool.query(
|
||||
`INSERT INTO tickets (category, subject, message, email, name, page, ip_address)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7)`,
|
||||
[
|
||||
"insurance_lead",
|
||||
`SC intrastate insurance referral — ${o.entity_name || o.customer_name || o.order_number}`,
|
||||
`Carrier needs an insurer that writes SC intrastate liability and can file a Form E with SCDMV.\n\n`
|
||||
+ `Order: ${o.order_number}\nService: ${o.service_slug}\n`
|
||||
+ `Customer: ${o.customer_name || ""} <${o.customer_email || ""}>\n\n`
|
||||
+ `They answered NO to "does your insurer have/can file a Form E for SC intrastate?" `
|
||||
+ `Connect them with a broker for SC intrastate trucking liability, then resume the COC filing.`,
|
||||
o.customer_email || null,
|
||||
o.customer_name || null,
|
||||
`sc-insurance:${o.order_number}`,
|
||||
(req as any).clientIp || req.ip || "",
|
||||
],
|
||||
);
|
||||
} catch (tErr) {
|
||||
console.error("[compliance-orders] SC insurance referral ticket failed:", tErr);
|
||||
}
|
||||
// Telegram alert (best-effort)
|
||||
try {
|
||||
const botToken = process.env.TELEGRAM_BOT_TOKEN;
|
||||
const chatId = process.env.TELEGRAM_CHAT_ID;
|
||||
if (botToken && chatId) {
|
||||
fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
chat_id: chatId,
|
||||
text: `🛟 SC intrastate insurance referral needed\n${o.entity_name || o.customer_name || ""} (${o.order_number})\nCustomer has no Form E — connect them with a broker.`,
|
||||
}),
|
||||
}).catch(() => {});
|
||||
}
|
||||
} catch {}
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
have,
|
||||
message:
|
||||
have === "yes"
|
||||
? "Thank you! We'll complete your SCDMV Certificate of Compliance and confirm your Form E is on file. You'll get a payment link for the $25 state fee shortly."
|
||||
: "No problem — we'll connect you with an insurance broker who can write SC intrastate liability and file your Form E. We'll be in touch within one business day.",
|
||||
});
|
||||
|
||||
// YES -> re-dispatch the worker so it proceeds to bill the $25 COC fee + file.
|
||||
if (have === "yes") {
|
||||
const workerUrl = process.env.WORKER_URL || "http://workers:8090";
|
||||
setImmediate(async () => {
|
||||
try {
|
||||
await fetch(`${workerUrl}/jobs`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
action: "process_compliance_service",
|
||||
order_name: o.order_number,
|
||||
order_number: o.order_number,
|
||||
service_slug: o.service_slug,
|
||||
}),
|
||||
});
|
||||
console.log(`[compliance-orders] Worker re-dispatched after SC insurance YES: ${o.order_number}`);
|
||||
} catch (err) {
|
||||
console.warn(`[compliance-orders] Worker dispatch failed for ${o.order_number}:`, err);
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
console.error("[compliance-orders] SC insurance answer error:", err);
|
||||
res.status(500).json({ error: "Could not record your answer. Please try again." });
|
||||
}
|
||||
});
|
||||
|
||||
// ── POST /api/v1/admin/compliance-orders/:id/approve-submit ──────────────────
|
||||
// Admin verification gate: an order that has been prepared + (if needed) signed
|
||||
// is held at fulfillment_status='ready_to_file'. The admin reviews the prepared
|
||||
// filing and calls this to APPROVE it, which re-dispatches the worker with
|
||||
// admin_approved=true so it proceeds to the actual government submission. We
|
||||
// never submit to a government system until an admin has cleared this gate.
|
||||
router.post("/api/v1/admin/compliance-orders/:id/approve-submit", requireAdmin, async (req, res) => {
|
||||
const id = req.params.id;
|
||||
try {
|
||||
const { rows } = await pool.query(
|
||||
`SELECT order_number, service_slug, fulfillment_status
|
||||
FROM compliance_orders WHERE order_number = $1`,
|
||||
[id],
|
||||
);
|
||||
const order = rows[0];
|
||||
if (!order) {
|
||||
return res.status(404).json({ error: "Order not found" });
|
||||
}
|
||||
if (order.fulfillment_status !== "ready_to_file") {
|
||||
return res.status(409).json({
|
||||
error: `Order is not awaiting submission approval (status=${order.fulfillment_status ?? "none"})`,
|
||||
});
|
||||
}
|
||||
|
||||
await pool.query(
|
||||
`UPDATE compliance_orders SET fulfillment_status = 'authorization_signed',
|
||||
fulfillment_status_at = now() WHERE order_number = $1`,
|
||||
[id],
|
||||
);
|
||||
const workerUrl = process.env.WORKER_URL || "http://workers:8090";
|
||||
let dispatched = false;
|
||||
try {
|
||||
const r = await fetch(`${workerUrl}/jobs`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
action: "process_compliance_service",
|
||||
order_name: id,
|
||||
order_number: id,
|
||||
service_slug: order.service_slug,
|
||||
admin_approved: true,
|
||||
}),
|
||||
});
|
||||
dispatched = r.ok;
|
||||
} catch (err) {
|
||||
console.error(`[compliance-orders] approve-submit dispatch failed for ${id}:`, err);
|
||||
}
|
||||
console.log(`[compliance-orders] Admin approved + dispatched submission for ${id} (${order.service_slug})`);
|
||||
res.json({ success: true, order_number: id, dispatched });
|
||||
} catch (err) {
|
||||
console.error(`[compliance-orders] approve-submit error for ${id}:`, err);
|
||||
res.status(500).json({ error: "Approve-submit failed" });
|
||||
}
|
||||
});
|
||||
|
||||
export { COMPLIANCE_SERVICES, REQUIRED_FIELDS, BUNDLE_COMPONENTS, MUTUALLY_EXCLUSIVE_GROUPS };
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -973,8 +973,14 @@ router.get("/api/v1/dot/census", async (req, res) => {
|
|||
phy_zip: c.phy_zip || null,
|
||||
power_units: c.nbr_power_unit ?? null,
|
||||
drivers: c.driver_total ?? null,
|
||||
total_drivers: c.driver_total ?? null,
|
||||
for_hire: c.authorized_for_hire || false,
|
||||
carrier_operation: c.carrier_operation || null,
|
||||
// Normalized interstate/intrastate code (A/B/C) if the stored value
|
||||
// encodes it, for the intake prefill.
|
||||
carrier_operation_code: (typeof c.carrier_operation === "string"
|
||||
&& /^[ABC]$/i.test(c.carrier_operation.trim()))
|
||||
? c.carrier_operation.trim().toUpperCase() : null,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("[dot-census] Error:", err);
|
||||
|
|
|
|||
59
api/src/routes/esign-sign-consent.ts
Normal file
59
api/src/routes/esign-sign-consent.ts
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
/**
|
||||
* Pure helpers for the signing-authorization gate (DB-free, unit-tested).
|
||||
*
|
||||
* On the Standard (no-login) CMS filing path the signer must give an EXPLICIT,
|
||||
* per-document authorization to use their signature to complete and submit the
|
||||
* filing on their behalf. These helpers decide when that authorization is
|
||||
* required and whether it was satisfied, so the route and the signing page agree
|
||||
* on one source of truth. Client-facing copy stays generic and never describes
|
||||
* any internal fulfillment mechanics.
|
||||
*/
|
||||
|
||||
/** Verbatim authorization the signer must agree to before drawing a signature on
|
||||
* a Standard-path document.
|
||||
*
|
||||
* Client-safe and legally explicit: authorizes Performance West to use THIS
|
||||
* signer's OWN drawn signature ONE TIME on THIS single document and submit it on
|
||||
* their behalf. The "only once / this one form / not reused" language reassures
|
||||
* the signer the signature is not stored for reuse. Stored verbatim with the
|
||||
* signature for the audit trail.
|
||||
*/
|
||||
export const SIGN_CONSENT_TEXT =
|
||||
"I authorize Performance West Inc. to use my signature, exactly as I draw it " +
|
||||
"below, to complete and submit this single filing on my behalf. My signature " +
|
||||
"will be used solely to complete this filing and will not be reused for any " +
|
||||
"other document or purpose. The signature applied will be my own signature, " +
|
||||
"made with my authorization and with the intent to sign this document.";
|
||||
|
||||
/** Does this document require the per-document signing authorization?
|
||||
* (metadata.require_sign_consent). */
|
||||
export function requiresSignConsent(documentMetadata: unknown): boolean {
|
||||
return !!documentMetadata
|
||||
&& typeof documentMetadata === "object"
|
||||
&& (documentMetadata as Record<string, unknown>).require_sign_consent === true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this signing attempt REQUIRE the signing authorization?
|
||||
* Only a DRAWN signature on a consent-required document needs it (a typed
|
||||
* signature is exempt).
|
||||
*/
|
||||
export function signConsentRequired(
|
||||
documentMetadata: unknown,
|
||||
signatureType: "drawn" | "typed" | string | undefined,
|
||||
): boolean {
|
||||
return requiresSignConsent(documentMetadata) && signatureType === "drawn";
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the authorization satisfied for this attempt? True when not required, or
|
||||
* when required and the signer explicitly gave it (sign_consent === true).
|
||||
*/
|
||||
export function signConsentSatisfied(
|
||||
documentMetadata: unknown,
|
||||
signatureType: "drawn" | "typed" | string | undefined,
|
||||
signConsent: unknown,
|
||||
): boolean {
|
||||
if (!signConsentRequired(documentMetadata, signatureType)) return true;
|
||||
return signConsent === true;
|
||||
}
|
||||
127
api/src/routes/ifta.ts
Normal file
127
api/src/routes/ifta.ts
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
import { Router } from "express";
|
||||
import crypto from "crypto";
|
||||
import { pool } from "../db.js";
|
||||
|
||||
const router = Router();
|
||||
|
||||
// HMAC secret for the one-click "I already filed it" link. Reuses an existing
|
||||
// server secret so the token is unguessable but verifiable without DB state.
|
||||
const SECRET = process.env.ADMIN_JWT_SECRET
|
||||
|| process.env.CUSTOMER_JWT_SECRET
|
||||
|| process.env.APPROVE_FILE_TOKEN
|
||||
|| "pw-ifta-filed-fallback-secret";
|
||||
|
||||
/** Deterministic token for a DOT number (so the email can embed it, and we can
|
||||
* verify it on click without storing per-link state). */
|
||||
export function iftaFiledToken(dot: string): string {
|
||||
return crypto.createHmac("sha256", SECRET)
|
||||
.update(`ifta-filed:${dot}`)
|
||||
.digest("hex")
|
||||
.slice(0, 24);
|
||||
}
|
||||
|
||||
function page(title: string, body: string): string {
|
||||
return `<!doctype html><html><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>${title}</title></head>
|
||||
<body style="margin:0;font-family:-apple-system,system-ui,sans-serif;background:#eef0f3">
|
||||
<div style="max-width:520px;margin:48px auto;background:#fff;border-radius:12px;padding:32px;text-align:center;box-shadow:0 10px 30px rgba(0,0,0,.08)">
|
||||
<img src="https://performancewest.net/images/logo.png" alt="Performance West" style="height:40px;margin-bottom:16px">
|
||||
${body}
|
||||
<p style="margin-top:24px;font-size:12px;color:#94a3b8">Performance West Inc. · (888) 411-0383</p>
|
||||
</div></body></html>`;
|
||||
}
|
||||
|
||||
/**
|
||||
* One-click "I already filed it" for IFTA quarterly reminders.
|
||||
* GET /api/v1/ifta/filed?dot=1234567&t=<token>
|
||||
* Records the suppression (stops further touches this cycle) + gives us
|
||||
* DIY-vs-prospect signal. Idempotent.
|
||||
*/
|
||||
router.get("/api/v1/ifta/filed", async (req, res) => {
|
||||
const dot = String(req.query.dot || "").trim();
|
||||
const token = String(req.query.t || "").trim();
|
||||
|
||||
res.set("Content-Type", "text/html; charset=utf-8");
|
||||
|
||||
if (!dot || !token) {
|
||||
res.status(400).send(page("Invalid link",
|
||||
`<h2 style="color:#b91c1c">That link looks incomplete.</h2>
|
||||
<p style="color:#475569">If you already filed your IFTA return, you can ignore the reminders. Questions? Call (888) 411-0383.</p>`));
|
||||
return;
|
||||
}
|
||||
|
||||
// constant-time token check
|
||||
const expected = iftaFiledToken(dot);
|
||||
const ok = token.length === expected.length
|
||||
&& crypto.timingSafeEqual(Buffer.from(token), Buffer.from(expected));
|
||||
if (!ok) {
|
||||
res.status(403).send(page("Invalid link",
|
||||
`<h2 style="color:#b91c1c">We couldn't verify that link.</h2>
|
||||
<p style="color:#475569">If you already filed your IFTA return, you can ignore the reminders. Questions? Call (888) 411-0383.</p>`));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await pool.query(
|
||||
`UPDATE fmcsa_carriers
|
||||
SET ifta_self_filed_at = COALESCE(ifta_self_filed_at, now())
|
||||
WHERE dot_number = $1`,
|
||||
[dot],
|
||||
);
|
||||
} catch (err) {
|
||||
console.error("[ifta/filed] db error:", err);
|
||||
// Still show success to the user; the suppression is best-effort.
|
||||
}
|
||||
|
||||
res.send(page("Thanks - you're all set",
|
||||
`<h2 style="color:#0f766e">Got it - thanks for letting us know.</h2>
|
||||
<p style="color:#475569;line-height:1.6">We'll stop reminding you about this quarter's IFTA return for DOT #${dot}.
|
||||
We'll check back when your next quarterly return comes due.</p>
|
||||
<p style="color:#475569;line-height:1.6">Want us to handle next quarter's filing so you don't have to?
|
||||
<a href="https://performancewest.net/order/ifta-quarterly" style="color:#0f766e;font-weight:700">See how it works →</a></p>`));
|
||||
});
|
||||
|
||||
/**
|
||||
* One-click "I already did it" for UCR annual reminders.
|
||||
* GET /api/v1/ucr/filed?dot=1234567&t=<token> (same HMAC token scheme as IFTA)
|
||||
*/
|
||||
router.get("/api/v1/ucr/filed", async (req, res) => {
|
||||
const dot = String(req.query.dot || "").trim();
|
||||
const token = String(req.query.t || "").trim();
|
||||
res.set("Content-Type", "text/html; charset=utf-8");
|
||||
|
||||
if (!dot || !token) {
|
||||
res.status(400).send(page("Invalid link",
|
||||
`<h2 style="color:#b91c1c">That link looks incomplete.</h2>
|
||||
<p style="color:#475569">If you already registered your UCR, you can ignore the reminders. Questions? Call (888) 411-0383.</p>`));
|
||||
return;
|
||||
}
|
||||
const expected = iftaFiledToken(dot); // shared token scheme
|
||||
const ok = token.length === expected.length
|
||||
&& crypto.timingSafeEqual(Buffer.from(token), Buffer.from(expected));
|
||||
if (!ok) {
|
||||
res.status(403).send(page("Invalid link",
|
||||
`<h2 style="color:#b91c1c">We couldn't verify that link.</h2>
|
||||
<p style="color:#475569">If you already registered your UCR, you can ignore the reminders. Questions? Call (888) 411-0383.</p>`));
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await pool.query(
|
||||
`UPDATE fmcsa_carriers
|
||||
SET ucr_self_filed_at = COALESCE(ucr_self_filed_at, now())
|
||||
WHERE dot_number = $1`,
|
||||
[dot],
|
||||
);
|
||||
} catch (err) {
|
||||
console.error("[ucr/filed] db error:", err);
|
||||
}
|
||||
res.send(page("Thanks - you're all set",
|
||||
`<h2 style="color:#0f766e">Got it - thanks for letting us know.</h2>
|
||||
<p style="color:#475569;line-height:1.6">We'll stop reminding you about this year's UCR for DOT #${dot}.
|
||||
We'll check back when next year's registration opens.</p>
|
||||
<p style="color:#475569;line-height:1.6">Want us to handle next year's UCR so you don't have to?
|
||||
<a href="https://performancewest.net/order/ucr-registration" style="color:#0f766e;font-weight:700">See how it works →</a></p>`));
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
|
@ -35,6 +35,56 @@ async function nppesFetch(params: Record<string, string>): Promise<any> {
|
|||
}
|
||||
}
|
||||
|
||||
// Live, authoritative CMS "Revalidation Due Date List" lookup by NPI. This is
|
||||
// the same public .gov dataset the provider can check themselves at
|
||||
// data.cms.gov/tools/medicare-revalidation-list, so it is the strongest proof
|
||||
// the due date is real (not from our database). Returns null on miss/error so
|
||||
// callers fall back to the local companion table.
|
||||
const CMS_REVAL_API =
|
||||
"https://data.cms.gov/data-api/v1/dataset/3746498e-874d-45d8-9c69-68603cafea60/data";
|
||||
|
||||
interface CmsRevalRecord {
|
||||
revalidation_due_date: string | null;
|
||||
adjusted_due_date: string | null;
|
||||
enrollment_type: string | null;
|
||||
specialty: string | null;
|
||||
enrollment_state: string | null;
|
||||
legal_name: string | null;
|
||||
source: "cms_live";
|
||||
}
|
||||
|
||||
async function cmsRevalFetch(npi: string): Promise<CmsRevalRecord | null> {
|
||||
const controller = new AbortController();
|
||||
const timer = setTimeout(() => controller.abort(), 6000);
|
||||
try {
|
||||
const qs = `filter[National Provider Identifier]=${encodeURIComponent(npi)}`;
|
||||
const resp = await fetch(`${CMS_REVAL_API}?${qs}`, {
|
||||
signal: controller.signal,
|
||||
headers: { Accept: "application/json" },
|
||||
});
|
||||
clearTimeout(timer);
|
||||
if (!resp.ok) return null;
|
||||
const rows = (await resp.json()) as any[];
|
||||
if (!Array.isArray(rows) || rows.length === 0) return null;
|
||||
// Prefer the row with a concrete (non-TBD) due date.
|
||||
const norm = (v: any) => (typeof v === "string" && v && v.toUpperCase() !== "TBD" ? v : null);
|
||||
const row =
|
||||
rows.find((r) => norm(r["Adjusted Due Date"]) || norm(r["Revalidation Due Date"])) || rows[0];
|
||||
return {
|
||||
revalidation_due_date: norm(row["Revalidation Due Date"]),
|
||||
adjusted_due_date: norm(row["Adjusted Due Date"]),
|
||||
enrollment_type: row["Enrollment Type"] || null,
|
||||
specialty: row["Enrollment Specialty"] || null,
|
||||
enrollment_state: row["Enrollment State Code"] || null,
|
||||
legal_name: row["Organization Name"] || [row["First Name"], row["Last Name"]].filter(Boolean).join(" ") || null,
|
||||
source: "cms_live",
|
||||
};
|
||||
} catch {
|
||||
clearTimeout(timer);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
type CheckStatus = "green" | "yellow" | "red" | "unknown";
|
||||
|
||||
interface ComplianceCheck {
|
||||
|
|
@ -98,8 +148,11 @@ router.get("/api/v1/npi/lookup", async (req, res) => {
|
|||
const locationAddr = (result.addresses || []).find((a: any) => a.address_purpose === "LOCATION") || (result.addresses || [])[0] || null;
|
||||
const practiceState = locationAddr?.state || null;
|
||||
|
||||
// 2) Companion data joins (best-effort; tables may be empty pre-load)
|
||||
const [revalRes, exclRes, optoutRes] = await Promise.all([
|
||||
// 2) Companion data joins. Revalidation comes LIVE from the public CMS
|
||||
// Revalidation Due Date List (authoritative + provider-verifiable); the
|
||||
// local table is a fallback only (it may be empty pre-load).
|
||||
const [cmsReval, revalRes, exclRes, optoutRes] = await Promise.all([
|
||||
cmsRevalFetch(rawNpi),
|
||||
pool.query(
|
||||
`SELECT revalidation_due_date, adjusted_due_date, enrollment_type, specialty, enrollment_state
|
||||
FROM npi_revalidation_due WHERE npi = $1 ORDER BY id LIMIT 1`,
|
||||
|
|
@ -119,7 +172,13 @@ router.get("/api/v1/npi/lookup", async (req, res) => {
|
|||
).catch(() => ({ rows: [] as any[] })),
|
||||
]);
|
||||
|
||||
const reval = revalRes.rows[0] || null;
|
||||
// Prefer live CMS data; fall back to the local companion table.
|
||||
const reval = cmsReval || revalRes.rows[0] || null;
|
||||
const revalSource: "cms_live" | "local" | null = cmsReval
|
||||
? "cms_live"
|
||||
: revalRes.rows[0]
|
||||
? "local"
|
||||
: null;
|
||||
const excl = exclRes.rows[0] || null;
|
||||
const optout = optoutRes.rows[0] || null;
|
||||
|
||||
|
|
@ -289,6 +348,16 @@ router.get("/api/v1/npi/lookup", async (req, res) => {
|
|||
enumeration_date: enumerationDate ? fmtDate(enumerationDate) : null,
|
||||
last_updated: lastUpdated ? fmtDate(lastUpdated) : null,
|
||||
checks,
|
||||
// Verification proof: the revalidation due date (when present) is from the
|
||||
// live public CMS dataset the provider can check themselves.
|
||||
revalidation: reval
|
||||
? {
|
||||
due_date: (reval.adjusted_due_date || reval.revalidation_due_date) ?? null,
|
||||
source: revalSource,
|
||||
cms_legal_name: (reval as any).legal_name ?? null,
|
||||
verify_url: "https://data.cms.gov/tools/medicare-revalidation-list",
|
||||
}
|
||||
: null,
|
||||
summary: {
|
||||
red: redCount,
|
||||
yellow: yellowCount,
|
||||
|
|
|
|||
72
api/src/routes/order-timeline-status.ts
Normal file
72
api/src/routes/order-timeline-status.ts
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
/**
|
||||
* Pure live-progress derivation for the order timeline.
|
||||
*
|
||||
* Kept free of DB/config imports so it can be unit-tested in isolation and
|
||||
* reused. The route (order-timeline.ts) imports applyLiveStatus from here.
|
||||
*
|
||||
* We translate real signals (payment, e-signature, fulfillment_status) into
|
||||
* per-step "completed | in_progress | pending" so the client portal shows true
|
||||
* progress rather than a static template.
|
||||
*/
|
||||
|
||||
/** Step-name matchers used to find phase boundaries within any timeline. */
|
||||
export const SIGNATURE_STEP_RE = /signature|e-?sign/i;
|
||||
export const FILED_STEP_RE = /filed|filing|submitted|application filed|registration/i;
|
||||
|
||||
// fulfillment_status values that mean "the filing has been submitted to the agency".
|
||||
export const FILED_STATUSES = new Set<string>([
|
||||
"filed_waiting_state",
|
||||
"ready_to_file", // queued for ops to file — treat prep+signature as done
|
||||
]);
|
||||
// fulfillment_status values that mean "fully done".
|
||||
export const COMPLETED_STATUSES = new Set<string>(["completed", "complete"]);
|
||||
|
||||
export interface ProgressSignals {
|
||||
paid: boolean;
|
||||
signed: boolean;
|
||||
fulfillmentStatus: string | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recompute each step's status from live signals. Returns a new step array.
|
||||
*
|
||||
* We resolve a "reached index" — the index of the furthest step we can prove is
|
||||
* done — then mark everything up to it completed, the next in_progress, the
|
||||
* rest pending. We never regress a step that the static definition already
|
||||
* marked completed.
|
||||
*/
|
||||
export function applyLiveStatus<T extends { name: string; status: string }>(
|
||||
steps: T[],
|
||||
sig: ProgressSignals,
|
||||
): T[] {
|
||||
const sigIdx = steps.findIndex((s) => SIGNATURE_STEP_RE.test(s.name));
|
||||
const filedIdx = steps.findIndex((s) => FILED_STEP_RE.test(s.name));
|
||||
const confirmIdx = steps.length - 1; // last step is always the terminal one
|
||||
|
||||
let reached = -1;
|
||||
|
||||
// Payment confirmed → at minimum "Order Received" (index 0) is done.
|
||||
if (sig.paid) reached = Math.max(reached, 0);
|
||||
|
||||
// Signature captured → the signature step (and everything before it) is done.
|
||||
if (sig.signed && sigIdx >= 0) reached = Math.max(reached, sigIdx);
|
||||
|
||||
// Filing submitted to agency → the "Filed" step (and everything before) done.
|
||||
if (sig.fulfillmentStatus && FILED_STATUSES.has(sig.fulfillmentStatus) && filedIdx >= 0) {
|
||||
reached = Math.max(reached, filedIdx);
|
||||
}
|
||||
|
||||
// Fully completed → everything done.
|
||||
if (sig.fulfillmentStatus && COMPLETED_STATUSES.has(sig.fulfillmentStatus)) {
|
||||
reached = confirmIdx;
|
||||
}
|
||||
|
||||
return steps.map((step, i) => {
|
||||
const staticallyDone = step.status === "completed";
|
||||
let status: "pending" | "in_progress" | "completed";
|
||||
if (i <= reached || staticallyDone) status = "completed";
|
||||
else if (i === reached + 1) status = "in_progress";
|
||||
else status = "pending";
|
||||
return { ...step, status };
|
||||
});
|
||||
}
|
||||
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
import { Router, type Request, type Response } from "express";
|
||||
import { pool } from "../db.js";
|
||||
import { applyLiveStatus } from "./order-timeline-status.js";
|
||||
|
||||
const router = Router();
|
||||
|
||||
|
|
@ -98,6 +99,45 @@ const SERVICE_TIMELINES: Record<string, TimelineStep[]> = {
|
|||
{ name: "BOC-3 Update", description: "Updating process agent filing", business_days: 8, status: "pending" },
|
||||
{ name: "Complete", description: "All filings updated under your new entity", business_days: 10, status: "pending" },
|
||||
],
|
||||
// ── Healthcare / CMS provider filings ────────────────────────────────────
|
||||
// These submit a signed form to CMS; the WET_SIGNATURE_BUFFER is applied to
|
||||
// the post-signature steps (see the buffer logic below).
|
||||
"nppes-update": [
|
||||
{ name: "Order Received", description: "Payment confirmed, order in queue", business_days: 0, status: "completed" },
|
||||
{ name: "Document Preparation", description: "Preparing your NPI update for filing", business_days: 1, status: "pending" },
|
||||
{ name: "Signature Required", description: "Review and sign the certification", business_days: 1, status: "pending" },
|
||||
{ name: "Filed with CMS", description: "Your signed update is submitted to CMS", business_days: 2, status: "pending" },
|
||||
{ name: "CMS Confirmation", description: "CMS processes the update (typically 1-2 weeks)", business_days: 10, status: "pending" },
|
||||
],
|
||||
"npi-reactivation": [
|
||||
{ name: "Order Received", description: "Payment confirmed, order in queue", business_days: 0, status: "completed" },
|
||||
{ name: "Document Preparation", description: "Preparing your NPI reactivation", business_days: 1, status: "pending" },
|
||||
{ name: "Signature Required", description: "Review and sign the certification", business_days: 1, status: "pending" },
|
||||
{ name: "Filed with CMS", description: "Your signed reactivation is submitted to CMS", business_days: 2, status: "pending" },
|
||||
{ name: "CMS Confirmation", description: "CMS processes the reactivation (typically 1-2 weeks)", business_days: 10, status: "pending" },
|
||||
],
|
||||
"npi-revalidation": [
|
||||
{ name: "Order Received", description: "Payment confirmed, order in queue", business_days: 0, status: "completed" },
|
||||
{ name: "Document Preparation", description: "Preparing your Medicare revalidation", business_days: 1, status: "pending" },
|
||||
{ name: "Signature Required", description: "Review and sign the certification", business_days: 1, status: "pending" },
|
||||
{ name: "Filed with CMS", description: "Your signed revalidation is submitted to CMS", business_days: 2, status: "pending" },
|
||||
{ name: "CMS Confirmation", description: "CMS/MAC processes the revalidation", business_days: 15, status: "pending" },
|
||||
],
|
||||
"medicare-enrollment": [
|
||||
{ name: "Order Received", description: "Payment confirmed, order in queue", business_days: 0, status: "completed" },
|
||||
{ name: "Document Preparation", description: "Preparing your Medicare enrollment", business_days: 1, status: "pending" },
|
||||
{ name: "Signature Required", description: "Review and sign the certification", business_days: 1, status: "pending" },
|
||||
{ name: "Filed with CMS", description: "Your signed enrollment is submitted to CMS", business_days: 2, status: "pending" },
|
||||
{ name: "CMS Confirmation", description: "CMS/MAC processes the enrollment", business_days: 15, status: "pending" },
|
||||
],
|
||||
"provider-compliance-bundle": [
|
||||
{ name: "Order Received", description: "Payment confirmed, order in queue", business_days: 0, status: "completed" },
|
||||
{ name: "Document Preparation", description: "Preparing your provider compliance filings", business_days: 1, status: "pending" },
|
||||
{ name: "Signature Required", description: "Review and sign the certification(s)", business_days: 1, status: "pending" },
|
||||
{ name: "Filed with CMS", description: "Your signed filings are submitted to CMS", business_days: 2, status: "pending" },
|
||||
{ name: "Screening Complete", description: "OIG/SAM screening completed (no action needed from you)", business_days: 2, status: "pending" },
|
||||
{ name: "CMS Confirmation", description: "CMS/MAC processes your filings", business_days: 15, status: "pending" },
|
||||
],
|
||||
};
|
||||
|
||||
// Default timeline for services without a specific definition
|
||||
|
|
@ -107,45 +147,117 @@ const DEFAULT_TIMELINE: TimelineStep[] = [
|
|||
{ name: "Complete", description: "Filing completed and delivered", business_days: 5, status: "pending" },
|
||||
];
|
||||
|
||||
// Services whose Standard path requires extra fulfillment handling on a mailed
|
||||
// CMS form and therefore needs a small ETA buffer so we always have time to
|
||||
// produce and mail the completed original. Revisit the buffer once that
|
||||
// fulfillment step is in steady-state.
|
||||
const WET_SIGNATURE_BUFFER_DAYS = 2;
|
||||
const WET_SIGNATURE_SLUGS = new Set<string>([
|
||||
"nppes-update",
|
||||
"npi-reactivation",
|
||||
"npi-revalidation",
|
||||
"medicare-enrollment",
|
||||
"provider-compliance-bundle",
|
||||
]);
|
||||
|
||||
// ── Live-progress derivation ──────────────────────────────────────────────
|
||||
// applyLiveStatus (pure, DB-free, unit-tested in order-timeline-status.ts)
|
||||
// overrides each step's static status from real signals (payment, e-signature,
|
||||
// fulfillment_status) so the client portal shows true progress.
|
||||
|
||||
router.get("/api/v1/order-timeline/:order_id", async (req: Request, res: Response) => {
|
||||
try {
|
||||
const orderId = req.params.order_id;
|
||||
|
||||
// Try single order first, then batch
|
||||
let orders: Record<string, unknown>[] = [];
|
||||
const single = await pool.query(
|
||||
"SELECT order_number, service_slug, service_name, created_at, payment_status FROM compliance_orders WHERE order_number = $1",
|
||||
[orderId],
|
||||
);
|
||||
if (single.rows.length > 0) {
|
||||
orders = single.rows as Record<string, unknown>[];
|
||||
} else {
|
||||
// Try as batch_id
|
||||
const batch = await pool.query(
|
||||
"SELECT order_number, service_slug, service_name, created_at, payment_status FROM compliance_orders WHERE batch_id = $1 ORDER BY created_at",
|
||||
[orderId],
|
||||
);
|
||||
orders = batch.rows as Record<string, unknown>[];
|
||||
// Try single order first, then batch. We select fulfillment_status when
|
||||
// present (column may not exist on older DBs — fall back gracefully).
|
||||
const COLS = "order_number, service_slug, service_name, created_at, payment_status, fulfillment_status";
|
||||
const COLS_FALLBACK = "order_number, service_slug, service_name, created_at, payment_status";
|
||||
|
||||
async function loadOrders(): Promise<Record<string, unknown>[]> {
|
||||
const trySelect = async (cols: string) => {
|
||||
const single = await pool.query(
|
||||
`SELECT ${cols} FROM compliance_orders WHERE order_number = $1`,
|
||||
[orderId],
|
||||
);
|
||||
if (single.rows.length > 0) return single.rows as Record<string, unknown>[];
|
||||
const batch = await pool.query(
|
||||
`SELECT ${cols} FROM compliance_orders WHERE batch_id = $1 ORDER BY created_at`,
|
||||
[orderId],
|
||||
);
|
||||
return batch.rows as Record<string, unknown>[];
|
||||
};
|
||||
try {
|
||||
return await trySelect(COLS);
|
||||
} catch {
|
||||
// fulfillment_status column not present yet — retry without it.
|
||||
return await trySelect(COLS_FALLBACK);
|
||||
}
|
||||
}
|
||||
|
||||
const orders = await loadOrders();
|
||||
|
||||
if (orders.length === 0) {
|
||||
res.status(404).json({ error: "Order not found." });
|
||||
return;
|
||||
}
|
||||
|
||||
// Which of these orders have a signed e-signature on file? One query for
|
||||
// all order_numbers in the batch. Defensive: a missing table must not break
|
||||
// the timeline (clients still see estimated dates).
|
||||
const orderNumbers = orders.map((o) => o.order_number as string);
|
||||
const signedSet = new Set<string>();
|
||||
try {
|
||||
const sig = await pool.query(
|
||||
"SELECT DISTINCT order_number FROM esign_records WHERE order_number = ANY($1) AND status = 'signed'",
|
||||
[orderNumbers],
|
||||
);
|
||||
for (const r of sig.rows as Record<string, unknown>[]) {
|
||||
signedSet.add(r.order_number as string);
|
||||
}
|
||||
} catch {
|
||||
// esign_records absent — treat all as unsigned.
|
||||
}
|
||||
|
||||
const timelines = orders.map((order) => {
|
||||
const slug = order.service_slug as string;
|
||||
const startDate = new Date(order.created_at as string);
|
||||
const steps = (SERVICE_TIMELINES[slug] || DEFAULT_TIMELINE).map((step) => ({
|
||||
...step,
|
||||
estimated_date: addBusinessDays(startDate, step.business_days).toISOString().split("T")[0],
|
||||
}));
|
||||
// These services get a buffer on every step from the signature onward,
|
||||
// so we always have time to produce and mail the completed original form.
|
||||
const isWetSig = WET_SIGNATURE_SLUGS.has(slug);
|
||||
let pastSignature = false;
|
||||
const dated = (SERVICE_TIMELINES[slug] || DEFAULT_TIMELINE).map((step) => {
|
||||
if (isWetSig && /signature/i.test(step.name)) {
|
||||
pastSignature = true;
|
||||
}
|
||||
const buffer = isWetSig && pastSignature ? WET_SIGNATURE_BUFFER_DAYS : 0;
|
||||
return {
|
||||
...step,
|
||||
estimated_date: addBusinessDays(startDate, step.business_days + buffer)
|
||||
.toISOString()
|
||||
.split("T")[0],
|
||||
};
|
||||
});
|
||||
|
||||
// Overlay live progress so the portal reflects reality, not just dates.
|
||||
const paymentStatus = String(order.payment_status || "").toLowerCase();
|
||||
const steps = applyLiveStatus(dated, {
|
||||
paid: paymentStatus === "paid" || paymentStatus === "completed",
|
||||
signed: signedSet.has(order.order_number as string),
|
||||
fulfillmentStatus: (order.fulfillment_status as string) || null,
|
||||
});
|
||||
|
||||
// The current step is the first in_progress one, else the last completed.
|
||||
const inProgress = steps.find((s) => s.status === "in_progress");
|
||||
const lastCompleted = [...steps].reverse().find((s) => s.status === "completed");
|
||||
const currentStep = (inProgress || lastCompleted || steps[0]).name;
|
||||
|
||||
return {
|
||||
order_number: order.order_number,
|
||||
service_slug: slug,
|
||||
service_name: order.service_name,
|
||||
steps,
|
||||
current_step: currentStep,
|
||||
estimated_completion: steps[steps.length - 1].estimated_date,
|
||||
};
|
||||
});
|
||||
|
|
|
|||
|
|
@ -10,13 +10,18 @@
|
|||
*/
|
||||
|
||||
import { Router, Request, Response } from "express";
|
||||
import bcrypt from "bcryptjs";
|
||||
import crypto from "crypto";
|
||||
import nodemailer from "nodemailer";
|
||||
import { pool } from "../db.js";
|
||||
|
||||
const SITE_URL = process.env.SITE_URL || "https://performancewest.net";
|
||||
const RESET_TTL_MINUTES = 30;
|
||||
// Password-RESET window for an existing account (security-sensitive): 2 hours.
|
||||
const RESET_TTL_MINUTES = 120;
|
||||
// Onboarding / first-password window for a NEW customer who hasn't engaged yet
|
||||
// (e.g. set-password invites): 7 days, so the link doesn't expire before they
|
||||
// get to it. These customers paid and just need to get in; a short window
|
||||
// strands them.
|
||||
export const ONBOARDING_TTL_MINUTES = 7 * 24 * 60;
|
||||
|
||||
async function sendEmail(opts: { to: string; subject: string; html: string; text: string }) {
|
||||
const t = nodemailer.createTransport({
|
||||
|
|
@ -35,11 +40,66 @@ import {
|
|||
import {
|
||||
ensureWebsiteUser,
|
||||
setWebsiteUserPassword,
|
||||
verifyWebsiteUserPassword,
|
||||
linkUserToCustomer,
|
||||
} from "../erpnext-client.js";
|
||||
|
||||
const router = Router();
|
||||
|
||||
// ── ERPNext is the single source of truth for customer passwords ─────────────
|
||||
//
|
||||
// Historically this file kept a bcrypt `customers.password_hash` AND ERPNext
|
||||
// kept its own Website User password — two stores that drifted, so a customer
|
||||
// could have a password in one and not the other (and the portal at
|
||||
// portal.performancewest.net validates against ERPNext while this API used the
|
||||
// PG hash). We now delegate ALL password operations to ERPNext:
|
||||
//
|
||||
// register / reset -> setWebsiteUserPassword (writes ERPNext)
|
||||
// login -> verifyWebsiteUserPassword (checks ERPNext)
|
||||
//
|
||||
// Legacy customers who only ever had a Postgres bcrypt password can no longer
|
||||
// log in directly — they use /forgot-password to set a password in ERPNext.
|
||||
// The leftover `customers.password_hash` is no longer read for auth; it only
|
||||
// still serves as a "this email already has an account" takeover guard in
|
||||
// /register until the column is dropped.
|
||||
//
|
||||
// The `customers` table remains the PG-side profile + order-linking record
|
||||
// (customer_id FK).
|
||||
|
||||
/** Ensure a password-less `customers` profile row exists; return its id. */
|
||||
async function ensureCustomerProfile(
|
||||
email: string,
|
||||
name?: string | null,
|
||||
): Promise<number> {
|
||||
const result = await pool.query<{ id: number }>(
|
||||
`INSERT INTO customers (email, name)
|
||||
VALUES ($1, $2)
|
||||
ON CONFLICT (email) DO UPDATE SET
|
||||
name = COALESCE(EXCLUDED.name, customers.name),
|
||||
updated_at = NOW()
|
||||
RETURNING id`,
|
||||
[email, name?.trim() || null],
|
||||
);
|
||||
return result.rows[0].id;
|
||||
}
|
||||
|
||||
/** Find the ERPNext Customer doc name for this email, if any (best-effort). */
|
||||
async function findErpCustomerName(email: string): Promise<string | undefined> {
|
||||
try {
|
||||
const { getResource } = await import("../erpnext-client.js");
|
||||
const existing = (await getResource(
|
||||
"Customer",
|
||||
undefined,
|
||||
{ email_id: email },
|
||||
["name"],
|
||||
1,
|
||||
)) as Array<{ name: string }>;
|
||||
return existing[0]?.name;
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// ── POST /api/v1/auth/register ────────────────────────────────────────────────
|
||||
router.post("/register", async (req: Request, res: Response) => {
|
||||
const { email, password, name } = req.body as { email?: string; password?: string; name?: string };
|
||||
|
|
@ -54,44 +114,61 @@ router.post("/register", async (req: Request, res: Response) => {
|
|||
const normalizedEmail = email.trim().toLowerCase();
|
||||
|
||||
try {
|
||||
// Check if already registered
|
||||
const existing = await pool.query(
|
||||
`SELECT id FROM customers WHERE email = $1 AND password_hash IS NOT NULL`,
|
||||
[normalizedEmail]
|
||||
);
|
||||
if (existing.rows.length > 0) {
|
||||
// Already-registered check. Treat the account as existing if EITHER:
|
||||
// (a) an ERPNext Website User has actually logged in before, OR
|
||||
// (b) a legacy bcrypt password still exists in Postgres (pre-migration).
|
||||
// A Website User with no last_login and no PG hash is just a checkout stub,
|
||||
// so we still allow setting the first password there.
|
||||
const { getResource } = await import("../erpnext-client.js");
|
||||
const [users, legacy] = await Promise.all([
|
||||
getResource(
|
||||
"User",
|
||||
undefined,
|
||||
{ name: normalizedEmail },
|
||||
["name", "last_login"],
|
||||
1,
|
||||
).catch(() => []) as Promise<Array<{ name: string; last_login: string | null }>>,
|
||||
pool.query<{ password_hash: string | null }>(
|
||||
`SELECT password_hash FROM customers WHERE email = $1`,
|
||||
[normalizedEmail],
|
||||
),
|
||||
]);
|
||||
const hasErpLogin = users.length > 0 && !!users[0].last_login;
|
||||
const hasLegacyPassword = !!legacy.rows[0]?.password_hash;
|
||||
if (hasErpLogin || hasLegacyPassword) {
|
||||
return res.status(409).json({ error: "An account with this email already exists. Please log in." });
|
||||
}
|
||||
|
||||
const hash = await bcrypt.hash(password, 12);
|
||||
// ERPNext is the password authority: create the Website User if needed,
|
||||
// then set the password there.
|
||||
const fullName = name?.trim() || normalizedEmail.split("@")[0];
|
||||
await ensureWebsiteUser(normalizedEmail, fullName);
|
||||
await setWebsiteUserPassword(normalizedEmail, password);
|
||||
const erpCustomerName = await findErpCustomerName(normalizedEmail);
|
||||
if (erpCustomerName) await linkUserToCustomer(erpCustomerName, normalizedEmail);
|
||||
|
||||
const result = await pool.query<{ id: number; name: string | null }>(
|
||||
`INSERT INTO customers (email, name, password_hash)
|
||||
VALUES ($1, $2, $3)
|
||||
ON CONFLICT (email) DO UPDATE SET
|
||||
password_hash = EXCLUDED.password_hash,
|
||||
name = COALESCE(EXCLUDED.name, customers.name),
|
||||
updated_at = NOW()
|
||||
RETURNING id, name`,
|
||||
[normalizedEmail, name?.trim() || null, hash]
|
||||
);
|
||||
|
||||
const customer = result.rows[0];
|
||||
// Maintain the PG profile row (no password stored here anymore).
|
||||
const customerId = await ensureCustomerProfile(normalizedEmail, name);
|
||||
|
||||
// Backfill existing orders
|
||||
await pool.query(
|
||||
`UPDATE canada_crtc_orders SET customer_id = $1 WHERE customer_email = $2 AND customer_id IS NULL`,
|
||||
[customer.id, normalizedEmail]
|
||||
[customerId, normalizedEmail]
|
||||
);
|
||||
await pool.query(
|
||||
`UPDATE orders SET customer_id = $1 WHERE email = $2 AND customer_id IS NULL`,
|
||||
[customer.id, normalizedEmail]
|
||||
[customerId, normalizedEmail]
|
||||
);
|
||||
|
||||
issueCustomerCookie(res, { customerId: customer.id, email: normalizedEmail });
|
||||
res.json({ success: true, customer: { id: customer.id, email: normalizedEmail, name: customer.name } });
|
||||
} catch (err) {
|
||||
issueCustomerCookie(res, { customerId, email: normalizedEmail });
|
||||
res.json({ success: true, customer: { id: customerId, email: normalizedEmail, name: fullName } });
|
||||
} catch (err: any) {
|
||||
console.error("[portal-auth] register error:", err);
|
||||
// Surface ERPNext password-strength errors to the user.
|
||||
const serverMsg = err?.body?._server_messages || err?.message || "";
|
||||
if (/password/i.test(serverMsg)) {
|
||||
return res.status(400).json({ error: "Password is too weak. Use a mix of uppercase, lowercase, numbers, and symbols." });
|
||||
}
|
||||
res.status(500).json({ error: "Registration failed. Please try again." });
|
||||
}
|
||||
});
|
||||
|
|
@ -107,34 +184,30 @@ router.post("/login", async (req: Request, res: Response) => {
|
|||
const normalizedEmail = email.trim().toLowerCase();
|
||||
|
||||
try {
|
||||
const result = await pool.query<{ id: number; name: string | null; password_hash: string | null }>(
|
||||
`SELECT id, name, password_hash FROM customers WHERE email = $1`,
|
||||
[normalizedEmail]
|
||||
);
|
||||
|
||||
const customer = result.rows[0];
|
||||
|
||||
if (!customer || !customer.password_hash) {
|
||||
// Account exists from a prior order but no password set yet
|
||||
if (customer && !customer.password_hash) {
|
||||
return res.status(401).json({ error: "No password set for this account. Please register to set one.", code: "NO_PASSWORD" });
|
||||
}
|
||||
return res.status(401).json({ error: "Invalid email or password" });
|
||||
}
|
||||
|
||||
const valid = await bcrypt.compare(password, customer.password_hash);
|
||||
// Delegate the credential check to ERPNext (single source of truth).
|
||||
// Legacy customers who only had a Postgres bcrypt password no longer have a
|
||||
// usable credential here — they reset via /forgot-password, which writes the
|
||||
// new password to ERPNext.
|
||||
const valid = await verifyWebsiteUserPassword(normalizedEmail, password);
|
||||
if (!valid) {
|
||||
return res.status(401).json({ error: "Invalid email or password" });
|
||||
}
|
||||
|
||||
// Ensure a PG profile row exists so routes that join on customer_id work.
|
||||
const customerId = await ensureCustomerProfile(normalizedEmail);
|
||||
const profile = await pool.query<{ name: string | null }>(
|
||||
`SELECT name FROM customers WHERE id = $1`,
|
||||
[customerId]
|
||||
);
|
||||
|
||||
// Backfill existing orders
|
||||
await pool.query(
|
||||
`UPDATE canada_crtc_orders SET customer_id = $1 WHERE customer_email = $2 AND customer_id IS NULL`,
|
||||
[customer.id, normalizedEmail]
|
||||
[customerId, normalizedEmail]
|
||||
);
|
||||
|
||||
issueCustomerCookie(res, { customerId: customer.id, email: normalizedEmail });
|
||||
res.json({ success: true, customer: { id: customer.id, email: normalizedEmail, name: customer.name } });
|
||||
issueCustomerCookie(res, { customerId, email: normalizedEmail });
|
||||
res.json({ success: true, customer: { id: customerId, email: normalizedEmail, name: profile.rows[0]?.name ?? null } });
|
||||
} catch (err) {
|
||||
console.error("[portal-auth] login error:", err);
|
||||
res.status(500).json({ error: "Login failed. Please try again." });
|
||||
|
|
@ -180,12 +253,27 @@ router.post("/forgot-password", async (req: Request, res: Response) => {
|
|||
res.json({ success: true, message: "If an account exists, a reset link has been sent." });
|
||||
|
||||
try {
|
||||
const result = await pool.query<{ id: number; name: string | null }>(
|
||||
let customer = (await pool.query<{ id: number; name: string | null }>(
|
||||
`SELECT id, name FROM customers WHERE email = $1`,
|
||||
[normalizedEmail]
|
||||
);
|
||||
const customer = result.rows[0];
|
||||
if (!customer) return; // silent — response already sent
|
||||
)).rows[0];
|
||||
|
||||
// No PG profile row yet — but the customer may exist in ERPNext (the
|
||||
// password authority). If a Website User exists there, create the profile
|
||||
// row so we can mint a reset token. Otherwise stay silent (no account).
|
||||
if (!customer) {
|
||||
const { getResource } = await import("../erpnext-client.js");
|
||||
const users = (await getResource(
|
||||
"User",
|
||||
undefined,
|
||||
{ name: normalizedEmail },
|
||||
["name", "full_name"],
|
||||
1,
|
||||
).catch(() => [])) as Array<{ name: string; full_name: string | null }>;
|
||||
if (users.length === 0) return; // silent — response already sent
|
||||
const id = await ensureCustomerProfile(normalizedEmail, users[0].full_name);
|
||||
customer = { id, name: users[0].full_name };
|
||||
}
|
||||
|
||||
const token = crypto.randomBytes(32).toString("hex");
|
||||
const expiresAt = new Date(Date.now() + RESET_TTL_MINUTES * 60 * 1000);
|
||||
|
|
@ -246,24 +334,31 @@ router.post("/reset-password", async (req: Request, res: Response) => {
|
|||
if (row.used_at) return res.status(400).json({ error: "This reset link has already been used." });
|
||||
if (new Date() > row.expires_at) return res.status(400).json({ error: "This reset link has expired. Please request a new one." });
|
||||
|
||||
const hash = await bcrypt.hash(password, 12);
|
||||
|
||||
await pool.query(`UPDATE customers SET password_hash = $1, updated_at = NOW() WHERE id = $2`, [hash, row.customer_id]);
|
||||
await pool.query(`UPDATE password_reset_tokens SET used_at = NOW() WHERE id = $1`, [row.id]);
|
||||
|
||||
// Fetch customer and issue session cookie so they're logged in immediately
|
||||
// Fetch the customer so we know which ERPNext user to update.
|
||||
const custResult = await pool.query<{ id: number; email: string; name: string | null }>(
|
||||
`SELECT id, email, name FROM customers WHERE id = $1`,
|
||||
[row.customer_id]
|
||||
);
|
||||
const customer = custResult.rows[0];
|
||||
if (customer) {
|
||||
issueCustomerCookie(res, { customerId: customer.id, email: customer.email });
|
||||
}
|
||||
if (!customer) return res.status(400).json({ error: "Account not found for this reset link." });
|
||||
|
||||
res.json({ success: true, customer: customer ? { id: customer.id, email: customer.email, name: customer.name } : null });
|
||||
} catch (err) {
|
||||
// ERPNext is the password authority. Create the Website User if it somehow
|
||||
// doesn't exist yet, then set the new password there.
|
||||
await ensureWebsiteUser(customer.email, customer.name || customer.email.split("@")[0]);
|
||||
await setWebsiteUserPassword(customer.email, password);
|
||||
|
||||
await pool.query(`UPDATE password_reset_tokens SET used_at = NOW() WHERE id = $1`, [row.id]);
|
||||
|
||||
// Issue session cookie so they're logged in immediately
|
||||
issueCustomerCookie(res, { customerId: customer.id, email: customer.email });
|
||||
|
||||
res.json({ success: true, customer: { id: customer.id, email: customer.email, name: customer.name } });
|
||||
} catch (err: any) {
|
||||
console.error("[portal-auth] reset-password error:", err);
|
||||
const serverMsg = err?.body?._server_messages || err?.message || "";
|
||||
if (/password/i.test(serverMsg)) {
|
||||
return res.status(400).json({ error: "Password is too weak. Use a mix of uppercase, lowercase, numbers, and symbols." });
|
||||
}
|
||||
res.status(500).json({ error: "Password reset failed. Please try again." });
|
||||
}
|
||||
});
|
||||
|
|
@ -353,20 +448,7 @@ router.post("/set-erpnext-password", async (req: Request, res: Response) => {
|
|||
}
|
||||
|
||||
// Find the ERPNext customer name so we can link the user
|
||||
let erpCustomerName: string | undefined;
|
||||
try {
|
||||
const { getResource } = await import("../erpnext-client.js");
|
||||
const existing = (await getResource(
|
||||
"Customer",
|
||||
undefined,
|
||||
{ email_id: normalizedEmail },
|
||||
["name"],
|
||||
1,
|
||||
)) as Array<{ name: string }>;
|
||||
if (existing.length > 0) erpCustomerName = existing[0].name;
|
||||
} catch {
|
||||
// Non-fatal — continue without linking
|
||||
}
|
||||
const erpCustomerName = await findErpCustomerName(normalizedEmail);
|
||||
|
||||
// Set ERPNext Website User password (the only account system)
|
||||
const fullName = customer_name?.trim() || normalizedEmail.split("@")[0];
|
||||
|
|
@ -376,6 +458,9 @@ router.post("/set-erpnext-password", async (req: Request, res: Response) => {
|
|||
await linkUserToCustomer(erpCustomerName, normalizedEmail);
|
||||
}
|
||||
|
||||
// Keep the PG profile row in sync so portal session routes have a record.
|
||||
await ensureCustomerProfile(normalizedEmail, customer_name);
|
||||
|
||||
res.json({ success: true, created: true });
|
||||
} catch (err: any) {
|
||||
console.error("[portal-auth] set-erpnext-password error:", err);
|
||||
|
|
|
|||
|
|
@ -22,6 +22,11 @@
|
|||
import { Router, type Request, type Response } from "express";
|
||||
import { pool } from "../db.js";
|
||||
import { requirePortalAuth } from "../middleware/portalAuth.js";
|
||||
import {
|
||||
SIGN_CONSENT_TEXT,
|
||||
requiresSignConsent,
|
||||
signConsentSatisfied,
|
||||
} from "./esign-sign-consent.js";
|
||||
|
||||
const router = Router();
|
||||
const WORKER_URL = process.env.WORKER_URL || "http://workers:8090";
|
||||
|
|
@ -93,12 +98,19 @@ router.get("/api/v1/portal/esign", requirePortalAuth, async (req: Request, res:
|
|||
// Pull order number for subtitle (e.g. "CO-ABC12345")
|
||||
const metadata = rec.document_metadata || {};
|
||||
|
||||
// Standard-path documents require an explicit, per-document authorization to
|
||||
// use the signer's drawn signature to complete and submit the filing. The
|
||||
// signing page surfaces and collects it BEFORE capturing the signature.
|
||||
const requireSignConsent = requiresSignConsent(metadata);
|
||||
|
||||
res.json({
|
||||
document_title: rec.document_title,
|
||||
entity_name: rec.entity_name,
|
||||
order_number: rec.order_number,
|
||||
document_url: documentUrl,
|
||||
requires_perjury: rec.requires_perjury || false,
|
||||
require_sign_consent: requireSignConsent,
|
||||
sign_consent_text: requireSignConsent ? SIGN_CONSENT_TEXT : null,
|
||||
metadata,
|
||||
});
|
||||
} catch (err) {
|
||||
|
|
@ -116,10 +128,11 @@ router.get("/api/v1/portal/esign", requirePortalAuth, async (req: Request, res:
|
|||
router.post("/api/v1/portal/esign", requirePortalAuth, async (req: Request, res: Response) => {
|
||||
const { order_id: orderNumber, order_type: documentType, email } = req.portalAuth!;
|
||||
|
||||
const { signature, agreed_at, user_agent } = req.body as {
|
||||
signature?: { type: "drawn" | "typed"; image_b64?: string; name?: string };
|
||||
const { signature, agreed_at, user_agent, sign_consent } = req.body as {
|
||||
signature?: { type: "drawn" | "typed"; image_b64?: string; name?: string; vector?: any };
|
||||
agreed_at?: string;
|
||||
user_agent?: string;
|
||||
sign_consent?: boolean;
|
||||
};
|
||||
|
||||
// Validate signature
|
||||
|
|
@ -146,7 +159,8 @@ router.post("/api/v1/portal/esign", requirePortalAuth, async (req: Request, res:
|
|||
try {
|
||||
// Find the pending record
|
||||
const { rows } = await pool.query(
|
||||
`SELECT id, order_number, document_type, status, requires_perjury
|
||||
`SELECT id, order_number, document_type, status, requires_perjury,
|
||||
document_metadata, signed_at
|
||||
FROM esign_records
|
||||
WHERE order_number = $1
|
||||
AND document_type = $2
|
||||
|
|
@ -169,34 +183,76 @@ router.post("/api/v1/portal/esign", requirePortalAuth, async (req: Request, res:
|
|||
return;
|
||||
}
|
||||
|
||||
// Signing-authorization gate: Standard-path documents require an explicit,
|
||||
// per-document authorization to use the signer's drawn signature to complete
|
||||
// and submit the filing. A typed signature is exempt.
|
||||
const requireSignConsent = requiresSignConsent(rec.document_metadata);
|
||||
if (!signConsentSatisfied(rec.document_metadata, signature.type, sign_consent)) {
|
||||
res.status(400).json({
|
||||
error: "Please confirm the authorization to use your signature to complete this filing.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Store the signature
|
||||
const sigData = signature.type === "drawn"
|
||||
? signature.image_b64!.replace(/^data:image\/png;base64,/, "")
|
||||
: signature.name!.trim();
|
||||
|
||||
// Sanitize the optional vector (stroke paths) — bound the size so a hostile
|
||||
// client can't store an enormous JSON blob. Only kept for drawn signatures.
|
||||
let sigVector: string | null = null;
|
||||
if (signature.type === "drawn" && signature.vector && Array.isArray(signature.vector.strokes)) {
|
||||
const v = signature.vector;
|
||||
const strokeCount = v.strokes.length;
|
||||
const pointCount = v.strokes.reduce((n: number, s: any) => n + (Array.isArray(s) ? s.length : 0), 0);
|
||||
if (strokeCount > 0 && strokeCount <= 500 && pointCount > 0 && pointCount <= 20000) {
|
||||
sigVector = JSON.stringify({
|
||||
v: 1,
|
||||
w: Number(v.w) || 0,
|
||||
h: Number(v.h) || 0,
|
||||
strokes: v.strokes,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const clientIp = (req as any).clientIp || req.ip || "";
|
||||
const signedAt = new Date().toISOString();
|
||||
|
||||
// Record the signing authorization (only meaningful when this document
|
||||
// requires it and the signer drew their signature). NB: the DB columns remain
|
||||
// named ink_consent* for migration compatibility; they store the generic
|
||||
// signing authorization.
|
||||
const signConsentGiven = requireSignConsent && signature.type === "drawn" && sign_consent === true;
|
||||
|
||||
await pool.query(
|
||||
`UPDATE esign_records
|
||||
SET status = 'signed',
|
||||
signature_type = $1,
|
||||
signature_data = $2,
|
||||
signer_email = $3,
|
||||
signer_ip = $4,
|
||||
signer_user_agent = $5,
|
||||
signed_at = $6,
|
||||
perjury_agreed = $7,
|
||||
signature_vector = $3,
|
||||
signer_email = $4,
|
||||
signer_ip = $5,
|
||||
signer_user_agent = $6,
|
||||
signed_at = $7,
|
||||
perjury_agreed = $8,
|
||||
ink_consent = $9,
|
||||
ink_consent_at = $10,
|
||||
ink_consent_text = $11,
|
||||
updated_at = NOW()
|
||||
WHERE id = $8`,
|
||||
WHERE id = $12`,
|
||||
[
|
||||
signature.type,
|
||||
sigData,
|
||||
sigVector,
|
||||
email,
|
||||
clientIp,
|
||||
user_agent || "",
|
||||
signedAt,
|
||||
rec.requires_perjury ? true : false,
|
||||
signConsentGiven,
|
||||
signConsentGiven ? signedAt : null,
|
||||
signConsentGiven ? SIGN_CONSENT_TEXT : null,
|
||||
rec.id,
|
||||
],
|
||||
);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ router.get("/me", async (req: Request, res: Response) => {
|
|||
`SELECT order_number, batch_id, service_slug, service_name,
|
||||
service_fee_cents, discount_cents, discount_code,
|
||||
surcharge_cents, payment_status, payment_method,
|
||||
fulfillment_status,
|
||||
created_at, paid_at
|
||||
FROM compliance_orders
|
||||
WHERE customer_email = $1
|
||||
|
|
|
|||
|
|
@ -423,6 +423,24 @@ router.post(
|
|||
break;
|
||||
}
|
||||
|
||||
// Subscription checkout: record the Stripe Subscription id on the order
|
||||
// so renewal invoices (invoice.paid) can map back to it. The session's
|
||||
// first invoice is paid here; renewals come via invoice.paid.
|
||||
if (session.mode === "subscription" && session.subscription) {
|
||||
const subId = typeof session.subscription === "string"
|
||||
? session.subscription
|
||||
: session.subscription.id;
|
||||
try {
|
||||
await pool.query(
|
||||
`UPDATE compliance_orders SET stripe_subscription_id = $1 WHERE order_number = $2`,
|
||||
[subId, order_id],
|
||||
);
|
||||
console.log(`[webhooks/stripe] Recorded subscription ${subId} on order ${order_id}`);
|
||||
} catch (e) {
|
||||
console.error(`[webhooks/stripe] Failed to record subscription ${subId} on ${order_id}:`, e);
|
||||
}
|
||||
}
|
||||
|
||||
if (session.payment_status === "paid") {
|
||||
await handlePaymentComplete(order_id, order_type, session.id);
|
||||
} else {
|
||||
|
|
@ -487,6 +505,50 @@ router.post(
|
|||
break;
|
||||
}
|
||||
|
||||
case "invoice.paid": {
|
||||
// Recurring subscription charge cleared (OIG/SAM monthly monitoring).
|
||||
// The FIRST invoice is also covered by checkout.session.completed, so
|
||||
// skip billing_reason "subscription_create" to avoid double-fulfilling;
|
||||
// act only on the renewal cycles ("subscription_cycle").
|
||||
const inv = event.data.object as Stripe.Invoice;
|
||||
const billingReason = inv.billing_reason || "";
|
||||
const subId = invoiceSubscriptionId(inv);
|
||||
if (billingReason !== "subscription_cycle") {
|
||||
console.log(`[webhooks/stripe] invoice.paid (${billingReason}) sub=${subId} — first cycle handled by checkout.session.completed, skipping`);
|
||||
break;
|
||||
}
|
||||
if (!subId) {
|
||||
console.warn("[webhooks/stripe] invoice.paid with no subscription id", inv.id);
|
||||
break;
|
||||
}
|
||||
await handleSubscriptionRenewal(subId, inv);
|
||||
break;
|
||||
}
|
||||
|
||||
case "invoice.payment_failed": {
|
||||
// A renewal charge failed (expired card, NSF). Stripe will retry per
|
||||
// the dunning settings; alert admin and the customer.
|
||||
const inv = event.data.object as Stripe.Invoice;
|
||||
const subId = invoiceSubscriptionId(inv);
|
||||
console.warn(`[webhooks/stripe] invoice.payment_failed sub=${subId} amount=${inv.amount_due}`);
|
||||
if (subId) {
|
||||
handleSubscriptionPaymentFailed(subId, inv).catch(err =>
|
||||
console.error("[webhooks/stripe] subscription payment-failed handler error:", err),
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "customer.subscription.deleted": {
|
||||
// Subscription cancelled (by customer, by us, or after dunning gave up).
|
||||
const sub = event.data.object as Stripe.Subscription;
|
||||
console.log(`[webhooks/stripe] subscription cancelled: ${sub.id}`);
|
||||
handleSubscriptionCancelled(sub).catch(err =>
|
||||
console.error("[webhooks/stripe] subscription-cancel handler error:", err),
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
// Ignore unhandled event types
|
||||
break;
|
||||
|
|
@ -732,6 +794,147 @@ async function handlePaymentFailure(orderId: string, reason: string): Promise<vo
|
|||
}
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
// Subscription lifecycle (recurring services, e.g. OIG/SAM monthly monitoring)
|
||||
// ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
/**
|
||||
* Extract the Stripe Subscription id from an Invoice, tolerant of API version.
|
||||
* As of API 2026-03-25 the subscription link moved under
|
||||
* invoice.parent.subscription_details.subscription and the top-level
|
||||
* invoice.subscription field was removed; older versions (incl. the account
|
||||
* default 2024-12-18.acacia that the unpinned live endpoint follows) still send
|
||||
* the top-level field. We read whichever is present.
|
||||
*/
|
||||
function invoiceSubscriptionId(inv: Stripe.Invoice): string | null {
|
||||
// New API (>= 2026-03-25.dahlia): invoice.parent.subscription_details.subscription
|
||||
const modern = inv.parent?.subscription_details?.subscription;
|
||||
if (modern) return typeof modern === "string" ? modern : modern.id;
|
||||
// Legacy API (<= 2025): top-level invoice.subscription. The live webhook
|
||||
// endpoint has NO pinned api_version, so it follows the account default
|
||||
// (currently 2024-12-18.acacia) which delivers this older shape. We must read
|
||||
// both or recurring renewals silently fail to map back to an order.
|
||||
const legacy = (inv as unknown as { subscription?: string | { id: string } }).subscription;
|
||||
if (legacy) return typeof legacy === "string" ? legacy : legacy.id;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Look up the compliance order backing a Stripe subscription. Subscriptions are
|
||||
* recorded on compliance_orders.stripe_subscription_id at checkout completion.
|
||||
*/
|
||||
async function findOrderBySubscription(subId: string): Promise<Record<string, any> | null> {
|
||||
try {
|
||||
const r = await pool.query(
|
||||
`SELECT order_number, service_slug, service_name, customer_email, customer_name,
|
||||
erpnext_sales_order, intake_data, service_fee_cents
|
||||
FROM compliance_orders
|
||||
WHERE stripe_subscription_id = $1
|
||||
ORDER BY created_at DESC LIMIT 1`,
|
||||
[subId],
|
||||
);
|
||||
return r.rows[0] ?? null;
|
||||
} catch (e) {
|
||||
console.error(`[subscription] order lookup failed for ${subId}:`, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A recurring charge cleared (renewal cycle). Re-run the screening for that
|
||||
* cycle and email the customer the fresh report. This is the value the
|
||||
* subscriber pays for each month.
|
||||
*/
|
||||
async function handleSubscriptionRenewal(subId: string, inv: Stripe.Invoice): Promise<void> {
|
||||
const order = await findOrderBySubscription(subId);
|
||||
if (!order) {
|
||||
console.warn(`[subscription] renewal for ${subId} — no matching order, skipping fulfillment`);
|
||||
return;
|
||||
}
|
||||
const orderId = order.order_number as string;
|
||||
const slug = order.service_slug as string;
|
||||
console.log(`[subscription] renewal cycle for ${orderId} (${slug}) — dispatching re-screen`);
|
||||
|
||||
// Re-dispatch the service handler for this cycle. The handler re-runs the
|
||||
// OIG/SAM screening against the current LEIE + SAM data and emails the report.
|
||||
const dispatch = await dispatchToWorker("process_compliance_service", {
|
||||
order_name: order.erpnext_sales_order || orderId,
|
||||
order_number: orderId,
|
||||
service_slug: slug,
|
||||
recurring_cycle: true,
|
||||
invoice_id: inv.id,
|
||||
});
|
||||
if (!dispatch.ok) {
|
||||
console.error(`[subscription] worker dispatch failed for renewal ${orderId}`);
|
||||
// Alert admin so the cycle isn't silently missed
|
||||
await sendEmail({
|
||||
to: ADMIN_EMAIL,
|
||||
subject: `⚠️ Subscription renewal fulfillment failed — ${orderId}`,
|
||||
html: `<p>Renewal charge cleared for subscription <code>${subId}</code> (order ${orderId}, ${slug}) but the worker dispatch failed. Re-run the screening manually.</p>`,
|
||||
}).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A renewal charge failed. Stripe retries on its dunning schedule; we alert
|
||||
* admin and (on the first failure) nudge the customer to update their method.
|
||||
*/
|
||||
async function handleSubscriptionPaymentFailed(subId: string, inv: Stripe.Invoice): Promise<void> {
|
||||
const order = await findOrderBySubscription(subId);
|
||||
const orderId = (order?.order_number as string) || "unknown";
|
||||
const customerEmail = (order?.customer_email as string) || "";
|
||||
const attempt = inv.attempt_count || 1;
|
||||
|
||||
await sendEmail({
|
||||
to: ADMIN_EMAIL,
|
||||
subject: `⚠️ Subscription renewal failed — ${orderId} (attempt ${attempt})`,
|
||||
html: `<p>Renewal charge failed for subscription <code>${subId}</code> (order ${orderId}).</p>
|
||||
<p>Amount due: $${((inv.amount_due || 0) / 100).toFixed(2)} — Stripe attempt ${attempt}.</p>
|
||||
<p>Stripe will retry automatically. If retries are exhausted the subscription cancels.</p>`,
|
||||
}).catch(() => {});
|
||||
|
||||
// Customer-facing nudge only on first failure (avoid spamming on each retry).
|
||||
if (attempt === 1 && customerEmail) {
|
||||
const updateUrl = inv.hosted_invoice_url || `https://${process.env.DOMAIN || "performancewest.net"}/contact`;
|
||||
await sendEmail({
|
||||
to: customerEmail,
|
||||
subject: "Action needed: your monthly screening payment didn't go through",
|
||||
html: `<p>Hi ${(order?.customer_name as string) || "there"},</p>
|
||||
<p>We couldn't process this month's payment for your OIG/SAM exclusion monitoring.
|
||||
To keep your screening active and your audit record current, please update your
|
||||
payment details:</p>
|
||||
<p><a href="${updateUrl}" style="display:inline-block;background:#10b981;color:#fff;font-weight:700;padding:12px 28px;border-radius:8px;text-decoration:none;">Update payment</a></p>
|
||||
<p>If you have any questions, reply to this email or call (888) 411-0383.</p>
|
||||
<p>Performance West</p>`,
|
||||
}).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscription cancelled (customer, admin, or dunning gave up). Mark the order
|
||||
* so monthly fulfillment stops and the portal reflects the cancellation.
|
||||
*/
|
||||
async function handleSubscriptionCancelled(sub: Stripe.Subscription): Promise<void> {
|
||||
const order = await findOrderBySubscription(sub.id);
|
||||
const orderId = (order?.order_number as string) || "unknown";
|
||||
try {
|
||||
await pool.query(
|
||||
`UPDATE compliance_orders
|
||||
SET payment_status = 'cancelled',
|
||||
notes = COALESCE(notes, '') || $2
|
||||
WHERE stripe_subscription_id = $1`,
|
||||
[sub.id, `\nSubscription cancelled: ${new Date().toISOString()}`],
|
||||
);
|
||||
} catch (e) {
|
||||
console.error(`[subscription] cancel update failed for ${sub.id}:`, e);
|
||||
}
|
||||
await sendEmail({
|
||||
to: ADMIN_EMAIL,
|
||||
subject: `Subscription cancelled — ${orderId}`,
|
||||
html: `<p>Subscription <code>${sub.id}</code> (order ${orderId}) was cancelled. Monthly screening will stop.</p>`,
|
||||
}).catch(() => {});
|
||||
}
|
||||
|
||||
async function handleACHDispute(paymentIntentId: string, reason: string, amountCents: number): Promise<void> {
|
||||
try {
|
||||
// Try to find the order across tables using Stripe session/PI references
|
||||
|
|
|
|||
570
api/src/service-catalog.ts
Normal file
570
api/src/service-catalog.ts
Normal file
|
|
@ -0,0 +1,570 @@
|
|||
/**
|
||||
* Canonical compliance service catalog -- SINGLE SOURCE OF TRUTH for pricing.
|
||||
*
|
||||
* This is the authority: checkout charges order.service_fee_cents which is set
|
||||
* from this catalog at order-creation time. The public site does NOT keep its
|
||||
* own copy; site/src/lib/service-catalog.generated.ts is generated from this
|
||||
* file by scripts/gen-service-catalog.mjs (run automatically before site build),
|
||||
* and intake_manifest.ts re-exports it as SERVICE_META. To change a price, edit
|
||||
* ONLY this file.
|
||||
*
|
||||
* Keep slug set in sync with:
|
||||
* - api/src/routes/compliance-orders.ts REQUIRED_FIELDS (intake validation)
|
||||
* - scripts/workers/services/__init__.py SERVICE_HANDLERS (fulfillment)
|
||||
*/
|
||||
|
||||
export interface ComplianceService {
|
||||
name: string;
|
||||
price_cents: number;
|
||||
gov_fee_cents?: number;
|
||||
gov_fee_label?: string;
|
||||
erpnext_item: string;
|
||||
discountable: boolean;
|
||||
/**
|
||||
* Recurring billing. When set, checkout builds a Stripe Subscription
|
||||
* (mode:"subscription") that charges price_cents every interval instead of a
|
||||
* one-time payment. Only payment methods that support off-session recurring
|
||||
* charges are allowed for these (see allowed_methods).
|
||||
*/
|
||||
billing_interval?: "month" | "year";
|
||||
/**
|
||||
* Restrict the payment methods offered for this service. Omit = all methods
|
||||
* (card, ach, paypal, klarna, crypto). Recurring services MUST list only
|
||||
* methods that can do off-session charges: ["card","ach"] — PayPal/Klarna/
|
||||
* crypto here are one-time only and cannot back a subscription.
|
||||
*/
|
||||
allowed_methods?: ("card" | "ach" | "paypal" | "klarna" | "crypto")[];
|
||||
}
|
||||
|
||||
export const COMPLIANCE_SERVICES: Record<string, ComplianceService> = {
|
||||
"fcc-compliance-checkup": {
|
||||
name: "FCC Carrier Compliance Checkup",
|
||||
price_cents: 79900,
|
||||
erpnext_item: "FCC-COMPLIANCE-CHECKUP",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-499a": {
|
||||
name: "FCC Form 499-A Filing",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "FCC-499A",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-499a-zero": {
|
||||
name: "FCC Form 499-A Filing (Zero Revenue)",
|
||||
price_cents: 17900,
|
||||
erpnext_item: "FCC-499A-ZERO",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-499a-499q": {
|
||||
name: "FCC Form 499-A + 499-Q Bundle",
|
||||
price_cents: 59900,
|
||||
erpnext_item: "FCC-499A-499Q",
|
||||
discountable: true,
|
||||
},
|
||||
"fcc-full-compliance": {
|
||||
name: "FCC Full Compliance Bundle",
|
||||
price_cents: 149900,
|
||||
erpnext_item: "FCC-FULL-COMPLIANCE",
|
||||
discountable: true,
|
||||
},
|
||||
"cpni-certification": {
|
||||
name: "CPNI Annual Certification",
|
||||
price_cents: 19900,
|
||||
erpnext_item: "CPNI-CERT",
|
||||
discountable: true,
|
||||
},
|
||||
"rmd-filing": {
|
||||
name: "RMD Registration / Recertification",
|
||||
price_cents: 24900,
|
||||
gov_fee_cents: 10000,
|
||||
gov_fee_label: "FCC RMD filing fee",
|
||||
erpnext_item: "RMD-FILING",
|
||||
discountable: true,
|
||||
},
|
||||
"stir-shaken": {
|
||||
name: "STIR/SHAKEN Implementation Assistance",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "STIR-SHAKEN",
|
||||
discountable: true,
|
||||
},
|
||||
"dc-agent": {
|
||||
name: "D.C. Registered Agent (Annual)",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "DC-AGENT",
|
||||
discountable: false,
|
||||
},
|
||||
// BDC filings — the FCC retired Form 477 in Dec 2022 and folded voice
|
||||
// subscription data into BDC. Broadband-only and voice-only SKUs let
|
||||
// carriers pay for just what they need; bdc-filing remains as a bundle.
|
||||
"bdc-broadband": {
|
||||
name: "BDC Broadband Deployment Filing",
|
||||
price_cents: 24900,
|
||||
erpnext_item: "BDC-BROADBAND",
|
||||
discountable: true,
|
||||
},
|
||||
"bdc-voice": {
|
||||
name: "BDC Voice Subscription Filing (formerly Form 477 Voice)",
|
||||
price_cents: 19900,
|
||||
erpnext_item: "BDC-VOICE",
|
||||
discountable: true,
|
||||
},
|
||||
"bdc-filing": {
|
||||
name: "BDC Filing (Broadband + Voice)",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "BDC-FILING",
|
||||
discountable: true,
|
||||
},
|
||||
// New-carrier entry point — register in CORES + obtain FRN
|
||||
"cores-frn-registration": {
|
||||
name: "CORES / FRN Registration",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "CORES-FRN",
|
||||
discountable: true,
|
||||
},
|
||||
// 499-A New Filer Registration (distinct from the annual revenue filing)
|
||||
"fcc-499-initial": {
|
||||
name: "Form 499 Initial Registration",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "FCC-499-INITIAL",
|
||||
discountable: true,
|
||||
},
|
||||
// CALEA System Security & Integrity plan (47 USC 229)
|
||||
"calea-ssi": {
|
||||
name: "CALEA SSI Plan",
|
||||
price_cents: 79900,
|
||||
erpnext_item: "CALEA-SSI",
|
||||
discountable: true,
|
||||
},
|
||||
// 47 CFR § 63.11 Foreign Carrier Affiliation Notification
|
||||
"fcc-63-11-notification": {
|
||||
name: "Foreign Carrier Affiliation Notification (47 CFR § 63.11)",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "FCC-63-11",
|
||||
discountable: true,
|
||||
},
|
||||
// One-click onboarding for a brand-new carrier (composes 5 filings)
|
||||
"new-carrier-bundle": {
|
||||
name: "New Carrier Onboarding Bundle (FRN + 499 Initial + RMD + CPNI + CALEA)",
|
||||
price_cents: 179900,
|
||||
erpnext_item: "NEW-CARRIER-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// Trucking/DOT brand-new-carrier starter bundle (composes the FMCSA filings a
|
||||
// new motor carrier needs to start operating). DISTINCT from the telecom
|
||||
// new-carrier-bundle above -- they are different verticals and must not share
|
||||
// a slug (doing so charged trucking customers the telecom product/price and
|
||||
// showed "FCC" on their receipt). Components in BUNDLE_COMPONENTS.
|
||||
"dot-new-carrier-bundle": {
|
||||
name: "New Carrier Starter Bundle (USDOT + MC Authority + BOC-3 + MCS-150 + Drug & Alcohol)",
|
||||
price_cents: 59900,
|
||||
gov_fee_cents: 30000,
|
||||
gov_fee_label: "FMCSA registration fees (USDOT + operating authority, billed at cost)",
|
||||
erpnext_item: "DOT-NEW-CARRIER-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// NECA OCN registration — required for VoIP/IPES carriers that need
|
||||
// their own Operating Company Number for STIR/SHAKEN signing, LRN
|
||||
// assignments, or direct numbering authority. NECA charges $550
|
||||
// standard / $675 expedited; we pass through + margin for prep work.
|
||||
"ocn-registration": {
|
||||
name: "NECA OCN + Sponsoring CLEC Agreement",
|
||||
price_cents: 265000,
|
||||
erpnext_item: "OCN-REGISTRATION",
|
||||
discountable: false,
|
||||
},
|
||||
"fcc-499q": {
|
||||
name: "FCC Form 499-Q Quarterly Filing",
|
||||
price_cents: 0, // included in 499-A+Q bundle — not sold standalone
|
||||
erpnext_item: "FCC-499Q",
|
||||
discountable: false,
|
||||
},
|
||||
"fcc-499a-discontinuance": {
|
||||
name: "Form 499-A Discontinuance Filing",
|
||||
price_cents: 29900,
|
||||
erpnext_item: "499A-DISCONTINUANCE",
|
||||
discountable: false,
|
||||
},
|
||||
// Standalone CDR Traffic Study — customers who want the classified
|
||||
// study (unlocks the current reporting year) without buying the
|
||||
// full 499-A filing service. Either slug unlocks the study via the
|
||||
// cdr_study_access_grants paywall hook.
|
||||
"cdr-analysis": {
|
||||
name: "CDR Traffic Study (Annual)",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "CDR-ANALYSIS",
|
||||
discountable: true,
|
||||
},
|
||||
// CDR storage / processing tiers. Annual subscription; renew alongside
|
||||
// the filing. Each tier is additive — customer picks the smallest tier
|
||||
// that covers their worst of (storage bytes, classified rows).
|
||||
"cdr-storage-tier1": {
|
||||
name: "CDR Storage Tier 1 (50 GB / 50M calls)",
|
||||
price_cents: 9900,
|
||||
erpnext_item: "CDR-STORAGE-TIER1",
|
||||
discountable: false,
|
||||
},
|
||||
"cdr-storage-tier2": {
|
||||
name: "CDR Storage Tier 2 (250 GB / 250M calls)",
|
||||
price_cents: 29900,
|
||||
erpnext_item: "CDR-STORAGE-TIER2",
|
||||
discountable: false,
|
||||
},
|
||||
"cdr-storage-tier3": {
|
||||
name: "CDR Storage Tier 3 (1 TB / 1B calls)",
|
||||
price_cents: 79900,
|
||||
erpnext_item: "CDR-STORAGE-TIER3",
|
||||
discountable: false,
|
||||
},
|
||||
// ── Foreign qualification (Certificate of Authority) ─────────────────
|
||||
// Per-state fees are added on top of these flat service fees at order
|
||||
// time (state fee + NWRA RA wholesale, looked up from jurisdictions +
|
||||
// state_filing_fees). Handler fans out one filing per selected state.
|
||||
//
|
||||
// Pricing model:
|
||||
// - `foreign-qualification-single`: flat service fee ($149) + state
|
||||
// fee + optional NWRA RA. One state per order.
|
||||
// - `foreign-qualification-multi`: discounted per-state service fee
|
||||
// ($99) + state fees + RAs. For FCC carriers filing across their
|
||||
// operating territory.
|
||||
"foreign-qualification-single": {
|
||||
name: "Foreign Qualification (One State)",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "FOREIGN-QUAL-SINGLE",
|
||||
discountable: true,
|
||||
},
|
||||
"foreign-qualification-multi": {
|
||||
name: "Foreign Qualification (Multi-State)",
|
||||
price_cents: 9900, // per-state service fee
|
||||
erpnext_item: "FOREIGN-QUAL-MULTI",
|
||||
discountable: true,
|
||||
},
|
||||
// ── Business name reservation ────────────────────────────────────────
|
||||
// Sell the binding Name RESERVATION (the SOS holds the name for a fixed
|
||||
// window), not a non-binding "search". State fee passed through at cost.
|
||||
// Free instant pre-check on the order form stays free (lead magnet).
|
||||
// See docs/name-reservation-product.md.
|
||||
"name-reservation-tx": {
|
||||
name: "Texas Name Reservation (Form 501, 120 days)",
|
||||
price_cents: 7900, // flat service fee
|
||||
gov_fee_cents: 4000, // TX SOS name reservation fee
|
||||
gov_fee_label: "Texas SOS name reservation fee (Form 501)",
|
||||
erpnext_item: "NAME-RESERVATION",
|
||||
discountable: true,
|
||||
},
|
||||
"name-reservation-nv": {
|
||||
name: "Nevada Name Reservation (90 days)",
|
||||
price_cents: 7900, // flat service fee
|
||||
gov_fee_cents: 2500, // NV SOS name reservation fee
|
||||
gov_fee_label: "Nevada SOS name reservation fee",
|
||||
erpnext_item: "NAME-RESERVATION",
|
||||
discountable: true,
|
||||
},
|
||||
// Business entity formation (used by the trucking new-carrier flow when the
|
||||
// carrier needs to form an LLC/corp before registering). Formation is also
|
||||
// available via the dedicated /order/formation flow; these catalog entries
|
||||
// let the new-carrier batch include formation as a line item.
|
||||
"llc-formation": {
|
||||
name: "LLC Formation",
|
||||
price_cents: 19900,
|
||||
erpnext_item: "LLC-FORMATION",
|
||||
discountable: true,
|
||||
},
|
||||
"corp-formation": {
|
||||
name: "Corporation Formation",
|
||||
price_cents: 24900,
|
||||
erpnext_item: "CORP-FORMATION",
|
||||
discountable: true,
|
||||
},
|
||||
// State PUC/PSC Registration — $399 per-state service fee + state
|
||||
// filing fees. Bond procurement coordinated separately.
|
||||
"state-puc": {
|
||||
name: "State PUC/PSC Registration",
|
||||
price_cents: 39900, // per-state service fee
|
||||
erpnext_item: "STATE-PUC",
|
||||
discountable: true,
|
||||
},
|
||||
// ── DOT / FMCSA Motor Carrier Services ──────────────────────────────
|
||||
"mcs150-update": {
|
||||
name: "MCS-150 Biennial Update",
|
||||
price_cents: 7900,
|
||||
erpnext_item: "MCS150-UPDATE",
|
||||
discountable: true,
|
||||
},
|
||||
"boc3-filing": {
|
||||
name: "BOC-3 Process Agent Filing",
|
||||
price_cents: 8900,
|
||||
erpnext_item: "BOC3-FILING",
|
||||
discountable: false, // passthrough cost — $25 to Process Agent LLC
|
||||
},
|
||||
"ucr-registration": {
|
||||
name: "UCR Annual Registration",
|
||||
price_cents: 3900,
|
||||
gov_fee_cents: 4600, // minimum tier ($46 for 0-2 power units)
|
||||
gov_fee_label: "UCR registration fee (tier-based, minimum shown)",
|
||||
erpnext_item: "UCR-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"dot-registration": {
|
||||
name: "New USDOT Number Registration",
|
||||
price_cents: 8900,
|
||||
erpnext_item: "DOT-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"mc-authority": {
|
||||
name: "MC Operating Authority Application",
|
||||
price_cents: 19900, // $199 + $300 FMCSA gov fee
|
||||
gov_fee_cents: 30000, // $300 FMCSA application fee
|
||||
gov_fee_label: "FMCSA operating authority application fee",
|
||||
erpnext_item: "MC-AUTHORITY",
|
||||
discountable: false, // $300 FMCSA gov fee makes this non-discountable
|
||||
},
|
||||
"usdot-reactivation": {
|
||||
name: "USDOT Number Reactivation",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "USDOT-REACTIVATION",
|
||||
discountable: true,
|
||||
},
|
||||
"emergency-temporary-authority": {
|
||||
name: "Emergency Temporary Authority (ETA)",
|
||||
price_cents: 49900,
|
||||
erpnext_item: "EMERGENCY-TEMP-AUTH",
|
||||
discountable: false, // urgent service, premium pricing
|
||||
},
|
||||
"dot-drug-alcohol": {
|
||||
name: "DOT Drug & Alcohol Compliance Program",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "DOT-DRUG-ALCOHOL",
|
||||
discountable: true, // instant PDF binder we generate — our own deliverable, no passthrough cost
|
||||
},
|
||||
"dot-audit-prep": {
|
||||
name: "New Entrant Safety Audit Preparation",
|
||||
price_cents: 39900,
|
||||
erpnext_item: "DOT-AUDIT-PREP",
|
||||
discountable: true,
|
||||
},
|
||||
"dot-full-compliance": {
|
||||
name: "DOT Full Compliance Bundle",
|
||||
price_cents: 39900, // $399 — includes MCS-150+BOC-3+UCR+D&A+Audit ($775 individual)
|
||||
erpnext_item: "DOT-FULL-COMPLIANCE",
|
||||
discountable: true,
|
||||
},
|
||||
"carrier-closeout": {
|
||||
name: "Trucking Wrap-Up (USDOT Shutdown)",
|
||||
price_cents: 19900, // $199 — final MCS-150 (out of business) + MC revoke + UCR cancel + state account closures
|
||||
erpnext_item: "CARRIER-CLOSEOUT",
|
||||
discountable: true,
|
||||
},
|
||||
"entity-dissolution": {
|
||||
name: "Business Entity Dissolution (LLC/Corp)",
|
||||
price_cents: 4900, // $49 add-on to the wrap-up — LLC/Corp dissolution + final report; state filing fees billed separately
|
||||
gov_fee_label: "State dissolution filing fee (varies by state, billed at cost)",
|
||||
erpnext_item: "ENTITY-DISSOLUTION",
|
||||
discountable: true,
|
||||
},
|
||||
// ── State-Level Trucking Compliance ──────────────────────────────────
|
||||
// For these services the price_cents is our flat SERVICE fee only. The
|
||||
// actual state government charges (apportioned IRP registration, IFTA decal
|
||||
// fees, weight-distance/HUT account setup, permit/decal costs) vary by the
|
||||
// carrier's fleet weight, mileage, and base state, so they are passed
|
||||
// through AT COST and billed separately once the state issues the invoice —
|
||||
// we never mark them up. The gov_fee_label is shown to the customer at
|
||||
// checkout so the pass-through is disclosed up front.
|
||||
"irp-registration": {
|
||||
name: "IRP Registration Assistance",
|
||||
price_cents: 10900, // + state fees (apportioned registration billed at cost)
|
||||
gov_fee_label: "Apportioned IRP registration & plate fees (state, by jurisdictions + weight, billed at cost)",
|
||||
erpnext_item: "IRP-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"ifta-application": {
|
||||
name: "IFTA Application + Decals",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "IFTA license & decal fees (state, billed at cost)",
|
||||
erpnext_item: "IFTA-APPLICATION",
|
||||
discountable: true,
|
||||
},
|
||||
"ifta-quarterly": {
|
||||
name: "IFTA Quarterly Filing",
|
||||
price_cents: 10900,
|
||||
gov_fee_label: "IFTA taxes due (remitted to the state at cost based on your mileage)",
|
||||
erpnext_item: "IFTA-QUARTERLY",
|
||||
discountable: true,
|
||||
},
|
||||
"or-weight-mile-tax": {
|
||||
name: "Oregon Weight-Mile Tax Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "Oregon weight-mile tax account & bond/deposit (state, billed at cost)",
|
||||
erpnext_item: "OR-WEIGHT-MILE-TAX",
|
||||
discountable: true,
|
||||
},
|
||||
"ny-hut-registration": {
|
||||
name: "NY Highway Use Tax Registration",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "NY HUT certificate & decal fees (state, billed at cost)",
|
||||
erpnext_item: "NY-HUT-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"ky-kyu-registration": {
|
||||
name: "KY Weight-Distance Tax Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "KYU weight-distance account fees (state, billed at cost)",
|
||||
erpnext_item: "KY-KYU-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"nm-weight-distance": {
|
||||
name: "NM Weight-Distance Tax Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "NM weight-distance permit & account fees (state, billed at cost)",
|
||||
erpnext_item: "NM-WEIGHT-DISTANCE",
|
||||
discountable: true,
|
||||
},
|
||||
"ct-highway-use-fee": {
|
||||
name: "CT Highway Use Fee Setup",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "CT Highway Use Fee registration (state, billed at cost)",
|
||||
erpnext_item: "CT-HIGHWAY-USE-FEE",
|
||||
discountable: true,
|
||||
},
|
||||
"ca-mcp-carb": {
|
||||
name: "California MCP + CARB Compliance",
|
||||
price_cents: 22900, // $229 + state fees (CA is more complex: MCP + CARB)
|
||||
gov_fee_label: "CA MCP permit fee + CARB/Clean Truck Check fees (state, by fleet size, billed at cost)",
|
||||
erpnext_item: "CA-MCP-CARB",
|
||||
discountable: true,
|
||||
},
|
||||
"state-dot-registration": {
|
||||
name: "State DOT Registration",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "State DOT/intrastate registration fee (state, billed at cost)",
|
||||
erpnext_item: "STATE-DOT-REGISTRATION",
|
||||
discountable: true,
|
||||
},
|
||||
"intrastate-authority": {
|
||||
name: "Intrastate Operating Authority",
|
||||
price_cents: 10900, // + state fees
|
||||
gov_fee_label: "State intrastate authority filing fee (state, billed at cost)",
|
||||
erpnext_item: "INTRASTATE-AUTHORITY",
|
||||
discountable: true,
|
||||
},
|
||||
"osow-permit": {
|
||||
name: "Oversize/Overweight Permit",
|
||||
price_cents: 10900, // + state permit fees
|
||||
gov_fee_label: "State oversize/overweight permit fees (per trip/route, billed at cost)",
|
||||
erpnext_item: "OSOW-PERMIT",
|
||||
discountable: true,
|
||||
},
|
||||
"state-trucking-bundle": {
|
||||
name: "State Compliance Bundle",
|
||||
price_cents: 49900, // $499 — IRP+IFTA+weight tax+intrastate ($796 individual)
|
||||
gov_fee_label: "State registration, decal & tax fees for each included filing (billed at cost)",
|
||||
erpnext_item: "STATE-TRUCKING-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// ── Hazmat / Emissions ───────────────────────────────────────────────
|
||||
"hazmat-phmsa": {
|
||||
name: "PHMSA Hazmat Registration",
|
||||
price_cents: 14900, // $149 admin-assisted; PHMSA gov fee billed at cost
|
||||
gov_fee_label: "PHMSA registration fee ($25 + $250-$3,000 processing, by business size, billed at cost)",
|
||||
erpnext_item: "HAZMAT-PHMSA",
|
||||
discountable: true,
|
||||
},
|
||||
"state-emissions": {
|
||||
name: "State Clean-Truck / Emissions Compliance",
|
||||
price_cents: 10900, // $109 + state fees — NY/CO/MD/NJ/MA clean-truck / ACT advisory + registration assist
|
||||
erpnext_item: "STATE-EMISSIONS",
|
||||
discountable: true,
|
||||
},
|
||||
|
||||
// ── Corporate / Entity Services ──
|
||||
"annual-report-filing": {
|
||||
name: "Annual Report / Franchise Tax Filing",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "ANNUAL-REPORT",
|
||||
discountable: true,
|
||||
},
|
||||
"registered-agent": {
|
||||
name: "Registered Agent Service (1 Year)",
|
||||
price_cents: 9900,
|
||||
erpnext_item: "REGISTERED-AGENT",
|
||||
discountable: true,
|
||||
},
|
||||
"entity-reinstatement": {
|
||||
name: "Entity Reinstatement",
|
||||
price_cents: 29900,
|
||||
erpnext_item: "ENTITY-REINSTATEMENT",
|
||||
discountable: true,
|
||||
},
|
||||
"virtual-mailbox": {
|
||||
name: "Virtual Mailbox (1 Year)",
|
||||
price_cents: 14900,
|
||||
erpnext_item: "VIRTUAL-MAILBOX",
|
||||
discountable: true,
|
||||
},
|
||||
"ein-application": {
|
||||
name: "EIN Application (IRS SS-4)",
|
||||
price_cents: 7900,
|
||||
erpnext_item: "EIN-APPLICATION",
|
||||
discountable: true,
|
||||
},
|
||||
"entity-upgrade-bundle": {
|
||||
name: "Entity Upgrade Package (Sole Prop → LLC)",
|
||||
price_cents: 59900,
|
||||
erpnext_item: "ENTITY-UPGRADE-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
// ── Healthcare / NPI compliance ──────────────────────────────────────
|
||||
// CMS/NPPES provider compliance. Handlers are review-staged (a human
|
||||
// files in PECOS/NPPES) — same safety default as the FCC auto-filing
|
||||
// toggle. HIPAA is intentionally out of scope (separate specialty).
|
||||
// Flagship = npi-revalidation (CMS 5-yr Medicare revalidation, dateable
|
||||
// overdue signal from the free CMS revalidation list).
|
||||
"npi-revalidation": {
|
||||
name: "Medicare PECOS Revalidation Filing",
|
||||
price_cents: 59900,
|
||||
erpnext_item: "NPI-REVALIDATION",
|
||||
discountable: true,
|
||||
},
|
||||
"npi-reactivation": {
|
||||
name: "NPI Reactivation",
|
||||
price_cents: 44900,
|
||||
erpnext_item: "NPI-REACTIVATION",
|
||||
discountable: true,
|
||||
},
|
||||
"nppes-update": {
|
||||
name: "NPPES Data Update / Attestation",
|
||||
price_cents: 34900,
|
||||
erpnext_item: "NPPES-UPDATE",
|
||||
discountable: true,
|
||||
},
|
||||
"clia-renewal": {
|
||||
name: "CLIA Certificate Renewal",
|
||||
price_cents: 44900,
|
||||
erpnext_item: "CLIA-RENEWAL",
|
||||
discountable: true,
|
||||
},
|
||||
"medicare-enrollment": {
|
||||
name: "Medicare Enrollment (PECOS)",
|
||||
price_cents: 69900,
|
||||
erpnext_item: "MEDICARE-ENROLLMENT",
|
||||
discountable: true,
|
||||
},
|
||||
"oig-sam-screening": {
|
||||
name: "OIG/SAM Exclusion Screening (Monthly Monitoring)",
|
||||
price_cents: 7900,
|
||||
erpnext_item: "OIG-SAM-SCREENING",
|
||||
discountable: false,
|
||||
// Federal exclusion screening is a MONTHLY obligation (OIG SAB) — sell it as
|
||||
// recurring monitoring, not a one-time annual run. Recurring requires an
|
||||
// off-session-capable rail, so only card + ACH (PayPal/Klarna/crypto can't
|
||||
// back a subscription).
|
||||
billing_interval: "month",
|
||||
allowed_methods: ["card", "ach"],
|
||||
},
|
||||
"provider-compliance-bundle": {
|
||||
name: "Provider Compliance Bundle (Annual)",
|
||||
price_cents: 89900,
|
||||
erpnext_item: "PROVIDER-COMPLIANCE-BUNDLE",
|
||||
discountable: true,
|
||||
},
|
||||
};
|
||||
|
||||
58
api/test/test_esign_sign_consent.ts
Normal file
58
api/test/test_esign_sign_consent.ts
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* Unit tests for the signing-authorization gate (pure logic, no DB).
|
||||
* Run: npx tsx api/test/test_esign_sign_consent.ts
|
||||
*/
|
||||
import assert from "node:assert";
|
||||
import {
|
||||
SIGN_CONSENT_TEXT,
|
||||
requiresSignConsent,
|
||||
signConsentRequired,
|
||||
signConsentSatisfied,
|
||||
} from "../src/routes/esign-sign-consent.js";
|
||||
|
||||
let pass = 0;
|
||||
const ok = (name: string, cond: boolean) => {
|
||||
assert.ok(cond, name);
|
||||
pass++;
|
||||
};
|
||||
|
||||
// --- requiresSignConsent ---
|
||||
ok("meta true", requiresSignConsent({ require_sign_consent: true }) === true);
|
||||
ok("meta false", requiresSignConsent({ require_sign_consent: false }) === false);
|
||||
ok("meta missing", requiresSignConsent({}) === false);
|
||||
ok("meta null", requiresSignConsent(null) === false);
|
||||
ok("meta undefined", requiresSignConsent(undefined) === false);
|
||||
ok("meta string-truthy not enough", requiresSignConsent({ require_sign_consent: "true" }) === false);
|
||||
|
||||
// --- signConsentRequired: only DRAWN on consent-required docs ---
|
||||
ok("required: drawn + flag", signConsentRequired({ require_sign_consent: true }, "drawn") === true);
|
||||
ok("not required: typed + flag", signConsentRequired({ require_sign_consent: true }, "typed") === false);
|
||||
ok("not required: drawn + no flag", signConsentRequired({ require_sign_consent: false }, "drawn") === false);
|
||||
ok("not required: drawn + no meta", signConsentRequired({}, "drawn") === false);
|
||||
ok("not required: undefined type", signConsentRequired({ require_sign_consent: true }, undefined) === false);
|
||||
|
||||
// --- signConsentSatisfied ---
|
||||
// exempt cases (consent not required) are always satisfied regardless of flag
|
||||
ok("satisfied: typed exempt", signConsentSatisfied({ require_sign_consent: true }, "typed", undefined) === true);
|
||||
ok("satisfied: no-flag drawn exempt", signConsentSatisfied({ require_sign_consent: false }, "drawn", undefined) === true);
|
||||
ok("satisfied: no-meta drawn exempt", signConsentSatisfied({}, "drawn", false) === true);
|
||||
// required cases: must have sign_consent === true
|
||||
ok("blocked: drawn+flag, no consent", signConsentSatisfied({ require_sign_consent: true }, "drawn", undefined) === false);
|
||||
ok("blocked: drawn+flag, consent false", signConsentSatisfied({ require_sign_consent: true }, "drawn", false) === false);
|
||||
ok("blocked: drawn+flag, consent truthy-but-not-true", signConsentSatisfied({ require_sign_consent: true }, "drawn", "true") === false);
|
||||
ok("blocked: drawn+flag, consent 1 (not strict true)", signConsentSatisfied({ require_sign_consent: true }, "drawn", 1) === false);
|
||||
ok("allowed: drawn+flag, consent true", signConsentSatisfied({ require_sign_consent: true }, "drawn", true) === true);
|
||||
|
||||
// --- consent text: client-safe, never describes fulfillment mechanics ---
|
||||
const banned = ["ink", "plotter", "machine", "paper", "print", "CMS", "855", "10114", "MAC", "Baltimore", "PO Box", "robot", "reproduce"];
|
||||
for (const w of banned) {
|
||||
ok(`consent text omits "${w}"`, !SIGN_CONSENT_TEXT.toLowerCase().includes(w.toLowerCase()));
|
||||
}
|
||||
// --- consent text: legally required reassurances present ---
|
||||
ok("consent says 'single filing'", SIGN_CONSENT_TEXT.includes("single filing"));
|
||||
ok("consent says 'not be reused'", SIGN_CONSENT_TEXT.includes("will not be reused"));
|
||||
ok("consent says 'my own signature'", SIGN_CONSENT_TEXT.includes("my own signature"));
|
||||
ok("consent says 'intent to sign'", SIGN_CONSENT_TEXT.includes("intent to sign"));
|
||||
ok("consent says 'on my behalf'", SIGN_CONSENT_TEXT.includes("on my behalf"));
|
||||
|
||||
console.log(`\nesign signing-authorization: ${pass} checks passed`);
|
||||
92
api/test/test_timeline_status.ts
Normal file
92
api/test/test_timeline_status.ts
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
/**
|
||||
* Verifies applyLiveStatus: the live-progress overlay used by the client
|
||||
* portal order timeline. Run: npx tsx api/test/test_timeline_status.ts
|
||||
*/
|
||||
import { applyLiveStatus } from "../src/routes/order-timeline-status.js";
|
||||
|
||||
type Step = { name: string; description: string; business_days: number; status: string };
|
||||
|
||||
const npiSteps: Step[] = [
|
||||
{ name: "Order Received", description: "", business_days: 0, status: "completed" },
|
||||
{ name: "Document Preparation", description: "", business_days: 1, status: "pending" },
|
||||
{ name: "Signature Required", description: "", business_days: 1, status: "pending" },
|
||||
{ name: "Filed with CMS", description: "", business_days: 2, status: "pending" },
|
||||
{ name: "CMS Confirmation", description: "", business_days: 10, status: "pending" },
|
||||
];
|
||||
|
||||
let failures = 0;
|
||||
function check(label: string, got: string[], want: string[]) {
|
||||
const ok = JSON.stringify(got) === JSON.stringify(want);
|
||||
if (!ok) {
|
||||
failures++;
|
||||
console.error(`FAIL: ${label}\n got: ${got.join(",")}\n want: ${want.join(",")}`);
|
||||
} else {
|
||||
console.log(`ok: ${label}`);
|
||||
}
|
||||
}
|
||||
const statuses = (s: Step[]) => s.map((x) => x.status);
|
||||
|
||||
// 1. Unpaid, nothing reached → only the statically-completed step 0 is done.
|
||||
check(
|
||||
"unpaid",
|
||||
statuses(applyLiveStatus(npiSteps, { paid: false, signed: false, fulfillmentStatus: null })),
|
||||
["completed", "pending", "pending", "pending", "pending"],
|
||||
);
|
||||
|
||||
// 2. Paid only → Order Received done, prep in progress
|
||||
check(
|
||||
"paid only",
|
||||
statuses(applyLiveStatus(npiSteps, { paid: true, signed: false, fulfillmentStatus: null })),
|
||||
["completed", "in_progress", "pending", "pending", "pending"],
|
||||
);
|
||||
|
||||
// 3. Paid + signed → through Signature done, Filed in progress
|
||||
check(
|
||||
"paid+signed",
|
||||
statuses(applyLiveStatus(npiSteps, { paid: true, signed: true, fulfillmentStatus: null })),
|
||||
["completed", "completed", "completed", "in_progress", "pending"],
|
||||
);
|
||||
|
||||
// 4. Paid + signed + filed → through Filed done, Confirmation in progress
|
||||
check(
|
||||
"paid+signed+filed",
|
||||
statuses(applyLiveStatus(npiSteps, { paid: true, signed: true, fulfillmentStatus: "filed_waiting_state" })),
|
||||
["completed", "completed", "completed", "completed", "in_progress"],
|
||||
);
|
||||
|
||||
// 5. Completed → everything done
|
||||
check(
|
||||
"completed",
|
||||
statuses(applyLiveStatus(npiSteps, { paid: true, signed: true, fulfillmentStatus: "completed" })),
|
||||
["completed", "completed", "completed", "completed", "completed"],
|
||||
);
|
||||
|
||||
// 6. ready_to_file without explicit signed → still advances to Filed step
|
||||
check(
|
||||
"ready_to_file",
|
||||
statuses(applyLiveStatus(npiSteps, { paid: true, signed: false, fulfillmentStatus: "ready_to_file" })),
|
||||
["completed", "completed", "completed", "completed", "in_progress"],
|
||||
);
|
||||
|
||||
// 7. A timeline with no signature step (e.g. boc3) still works off paid + fulfillment
|
||||
const boc3: Step[] = [
|
||||
{ name: "Order Received", description: "", business_days: 0, status: "completed" },
|
||||
{ name: "Process Agent Filing", description: "", business_days: 1, status: "pending" },
|
||||
{ name: "FMCSA Registration", description: "", business_days: 3, status: "pending" },
|
||||
];
|
||||
check(
|
||||
"boc3 paid",
|
||||
statuses(applyLiveStatus(boc3, { paid: true, signed: false, fulfillmentStatus: null })),
|
||||
["completed", "in_progress", "pending"],
|
||||
);
|
||||
check(
|
||||
"boc3 filed",
|
||||
statuses(applyLiveStatus(boc3, { paid: true, signed: false, fulfillmentStatus: "filed_waiting_state" })),
|
||||
["completed", "completed", "in_progress"], // "Process Agent Filing" matches FILED_STEP_RE
|
||||
);
|
||||
|
||||
if (failures > 0) {
|
||||
console.error(`\n${failures} test(s) failed`);
|
||||
process.exit(1);
|
||||
}
|
||||
console.log("\nAll timeline status tests passed");
|
||||
113
api/tests/recurring-subscription.test.ts
Normal file
113
api/tests/recurring-subscription.test.ts
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
/**
|
||||
* Recurring-subscription logic tests (run with: npx tsx tests/recurring-subscription.test.ts)
|
||||
*
|
||||
* Validates the catalog-driven recurring gating and the pure helpers used by
|
||||
* checkout.ts (method gating, surcharge suppression, recurring line-item build)
|
||||
* and webhooks.ts (invoice -> subscription id extraction). These mirror the
|
||||
* exact logic in the routes so a regression in the rules is caught without a
|
||||
* live Stripe call. The end-to-end Stripe test-mode run is a separate manual
|
||||
* step (documented in docs/billing.md).
|
||||
*/
|
||||
import { COMPLIANCE_SERVICES, type ComplianceService } from "../src/service-catalog.js";
|
||||
|
||||
let passed = 0;
|
||||
let failed = 0;
|
||||
function check(name: string, cond: boolean) {
|
||||
if (cond) { passed++; console.log(` ok ${name}`); }
|
||||
else { failed++; console.error(`FAIL ${name}`); }
|
||||
}
|
||||
|
||||
// ── 1. Catalog: OIG/SAM is recurring, $79/mo, card+ACH only ────────────────
|
||||
const oig = COMPLIANCE_SERVICES["oig-sam-screening"];
|
||||
check("oig-sam exists", !!oig);
|
||||
check("oig-sam price is $79 (7900c)", oig.price_cents === 7900);
|
||||
check("oig-sam billing_interval=month", oig.billing_interval === "month");
|
||||
check("oig-sam allowed_methods = card,ach", JSON.stringify(oig.allowed_methods) === JSON.stringify(["card", "ach"]));
|
||||
check("oig-sam not discountable", oig.discountable === false);
|
||||
check("oig-sam name says Monthly Monitoring", /Monthly Monitoring/.test(oig.name));
|
||||
|
||||
// ── 2. Recurring services MUST only allow off-session-capable methods ───────
|
||||
const OFF_SESSION_OK = new Set(["card", "ach"]);
|
||||
for (const [slug, svc] of Object.entries(COMPLIANCE_SERVICES) as [string, ComplianceService][]) {
|
||||
if (svc.billing_interval) {
|
||||
check(`recurring '${slug}' declares allowed_methods`, Array.isArray(svc.allowed_methods) && svc.allowed_methods.length > 0);
|
||||
const allOk = (svc.allowed_methods || []).every(m => OFF_SESSION_OK.has(m));
|
||||
check(`recurring '${slug}' methods are all off-session-capable`, allOk);
|
||||
}
|
||||
}
|
||||
|
||||
// ── 3. One-time services keep mode:payment (no billing_interval) ────────────
|
||||
check("npi-revalidation is one-time", !COMPLIANCE_SERVICES["npi-revalidation"].billing_interval);
|
||||
check("provider-compliance-bundle is one-time (annual $899)",
|
||||
!COMPLIANCE_SERVICES["provider-compliance-bundle"].billing_interval &&
|
||||
COMPLIANCE_SERVICES["provider-compliance-bundle"].price_cents === 89900);
|
||||
|
||||
// ── 4. Method-gating rule (mirrors checkout.ts METHOD_NOT_ALLOWED) ──────────
|
||||
function methodAllowed(svc: ComplianceService | undefined, method: string): boolean {
|
||||
const allowed = svc?.allowed_methods;
|
||||
return !allowed || allowed.includes(method as any);
|
||||
}
|
||||
check("oig rejects paypal", !methodAllowed(oig, "paypal"));
|
||||
check("oig rejects klarna", !methodAllowed(oig, "klarna"));
|
||||
check("oig rejects crypto", !methodAllowed(oig, "crypto"));
|
||||
check("oig accepts card", methodAllowed(oig, "card"));
|
||||
check("oig accepts ach", methodAllowed(oig, "ach"));
|
||||
check("unrestricted service accepts paypal", methodAllowed(COMPLIANCE_SERVICES["npi-revalidation"], "paypal"));
|
||||
|
||||
// ── 5. Surcharge suppression for recurring (mirrors checkout.ts) ────────────
|
||||
const GATEWAY_SURCHARGES: Record<string, number> = { card: 3.0, ach: 0.0, paypal: 3.0, klarna: 6.0, crypto: 0.0 };
|
||||
function surchargePct(billingInterval: string | undefined, method: string): number {
|
||||
return billingInterval ? 0 : (GATEWAY_SURCHARGES[method] ?? 0);
|
||||
}
|
||||
check("recurring card surcharge is 0 (absorbed)", surchargePct("month", "card") === 0);
|
||||
check("one-time card surcharge is 3%", surchargePct(undefined, "card") === 3.0);
|
||||
|
||||
// ── 6. Recurring line-item builder (mirrors checkout.ts mapping) ────────────
|
||||
type LI = { quantity?: number; price_data: { product_data: { name: string }; unit_amount: number } };
|
||||
function toRecurring(items: LI[], interval: "month" | "year") {
|
||||
return items.map(li => ({
|
||||
quantity: li.quantity ?? 1,
|
||||
price_data: {
|
||||
currency: "usd" as const,
|
||||
product_data: li.price_data.product_data,
|
||||
unit_amount: li.price_data.unit_amount,
|
||||
recurring: { interval },
|
||||
},
|
||||
}));
|
||||
}
|
||||
const built = toRecurring([{ price_data: { product_data: { name: oig.name }, unit_amount: oig.price_cents } }], "month");
|
||||
check("recurring line item has recurring.interval=month", built[0].price_data.recurring.interval === "month");
|
||||
check("recurring line item keeps $79 unit_amount", built[0].price_data.unit_amount === 7900);
|
||||
check("recurring line item defaults quantity=1", built[0].quantity === 1);
|
||||
|
||||
// ── 7. invoiceSubscriptionId extraction (mirrors webhooks.ts; version-tolerant)
|
||||
function invoiceSubscriptionId(inv: any): string | null {
|
||||
// New API (>= 2026-03-25.dahlia)
|
||||
const modern = inv?.parent?.subscription_details?.subscription;
|
||||
if (modern) return typeof modern === "string" ? modern : modern.id;
|
||||
// Legacy API (<= 2025, incl. account default 2024-12-18.acacia on the
|
||||
// unpinned live endpoint): top-level invoice.subscription
|
||||
const legacy = inv?.subscription;
|
||||
if (legacy) return typeof legacy === "string" ? legacy : legacy.id;
|
||||
return null;
|
||||
}
|
||||
check("subId from string field", invoiceSubscriptionId({ parent: { subscription_details: { subscription: "sub_123" } } }) === "sub_123");
|
||||
check("subId from object field", invoiceSubscriptionId({ parent: { subscription_details: { subscription: { id: "sub_456" } } } }) === "sub_456");
|
||||
check("subId from legacy top-level string (acacia)", invoiceSubscriptionId({ subscription: "sub_legacy" }) === "sub_legacy");
|
||||
check("subId from legacy top-level object", invoiceSubscriptionId({ subscription: { id: "sub_legacy2" } }) === "sub_legacy2");
|
||||
check("subId prefers modern over legacy", invoiceSubscriptionId({ subscription: "sub_old", parent: { subscription_details: { subscription: "sub_new" } } }) === "sub_new");
|
||||
check("subId null when no parent", invoiceSubscriptionId({ id: "in_1" }) === null);
|
||||
check("subId null for one-time invoice", invoiceSubscriptionId({ parent: { type: "quote_details" } }) === null);
|
||||
|
||||
// ── 8. Renewal-cycle gating (mirrors webhooks.ts invoice.paid) ─────────────
|
||||
function shouldFulfillRenewal(billingReason: string): boolean {
|
||||
// First invoice (subscription_create) is handled by checkout.session.completed;
|
||||
// only subscription_cycle should re-dispatch fulfillment.
|
||||
return billingReason === "subscription_cycle";
|
||||
}
|
||||
check("first invoice (subscription_create) NOT re-fulfilled", !shouldFulfillRenewal("subscription_create"));
|
||||
check("renewal cycle IS re-fulfilled", shouldFulfillRenewal("subscription_cycle"));
|
||||
check("manual invoice NOT re-fulfilled", !shouldFulfillRenewal("manual"));
|
||||
|
||||
console.log(`\n${passed} passed, ${failed} failed`);
|
||||
process.exit(failed === 0 ? 0 : 1);
|
||||
57
data/corporate_campaigns/otc_reincorporation.html
Normal file
57
data/corporate_campaigns/otc_reincorporation.html
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background:#1a2744;padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo.png" alt="Performance West" style="height:42px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:21px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Still incorporated in {{ .Subscriber.Attribs.state_inc_name }}?</h1>
|
||||
<p style="color:#94a3b8;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">A note for {{ .Subscriber.Attribs.company }} ({{ .Subscriber.Attribs.ticker }})</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 16px;line-height:1.6;">To the corporate / finance team at <strong>{{ .Subscriber.Attribs.company }}</strong>,</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 16px;">A growing number of public companies are <strong>redomesticating out of {{ .Subscriber.Attribs.state_inc_name }} to Texas</strong> — driven by the new Texas Business Court (specialized corporate bench, live 2024), the Texas Stock Exchange, and Texas's lower ongoing cost (no annual franchise tax for most entities under the revenue threshold, versus Delaware's franchise tax that can run into five figures for public companies).</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0;"><tr><td style="background:#f0f9ff;border:1px solid #bae6fd;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#075985;font-weight:700;">What a reincorporation actually involves</h3>
|
||||
<div style="font-size:13px;color:#0c4a6e;line-height:1.8;">
|
||||
• Plan of conversion / domestication + Texas certificate of formation<br>
|
||||
• Board + shareholder approvals and the SEC disclosure around it<br>
|
||||
• A Texas <strong>registered agent</strong> and (if you keep operations elsewhere) foreign qualification<br>
|
||||
• Winding down the old-state franchise-tax / annual-report obligations
|
||||
</div>
|
||||
</td></tr></table>
|
||||
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">We handle the filing mechanics end to end — fixed fees, no billable hours — and coordinate with your counsel on the corporate approvals. If a move is not on the table this year, we also handle the everyday items that keep your entity in good standing: <strong>registered agent, annual reports, franchise tax, and foreign qualification</strong> in any state you operate.</p>
|
||||
|
||||
{{ if .Subscriber.Attribs.coupon_code }}
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0;"><tr><td style="background:#fff7ed;border:2px solid #f97316;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:13px;font-weight:700;color:#9a3412;letter-spacing:.04em;margin:0 0 6px">{{ .Subscriber.Attribs.coupon_pct }}% OFF OUR SERVICE FEE - THIS WEEK</p>
|
||||
<p style="font-size:14px;color:#9a3412;margin:0 0 4px">Use code <strong style="font-size:16px;letter-spacing:.08em">{{ .Subscriber.Attribs.coupon_code }}</strong> on any filing.</p>
|
||||
<p style="font-size:12px;color:#b91c1c;font-weight:700;margin:0">Expires {{ .Subscriber.Attribs.coupon_expires }}. Applies to our service fee; state filing fees are separate.</p>
|
||||
</td></tr></table>
|
||||
{{ end }}
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#eff6ff;border:2px solid #2563eb;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#1e3a8a;margin:0 0 12px;font-weight:600;">Want a straight answer on whether a Texas reincorporation pencils out for {{ .Subscriber.Attribs.ticker }}?</p>
|
||||
<a href="{{ .Subscriber.Attribs.lp_link }}" style="display:inline-block;padding:14px 36px;background:#2563eb;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">See options & pricing →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f8fafc;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Prefer to talk it through?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. We are a corporate compliance firm; we are not your attorney and this is not legal advice — we handle the filings and coordinate with your counsel.
|
||||
</td></tr></table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West Inc. is a corporate filing/compliance firm, not a law firm. This message is general information, not legal advice.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
117
data/hc_campaigns/hc_clia_renewal.html
Normal file
117
data/hc_campaigns/hc_clia_renewal.html
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:21px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Your CLIA certificate is coming up for renewal</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Let's get it filed before it lapses</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 16px;line-height:1.6;">Hi {{ .Subscriber.Name }},</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 16px;">Whoever last handled the lab certification for <strong>{{ .Subscriber.Attribs.practice }}</strong> may have moved on — CLIA certificates run on a 2-year cycle, and renewal deadlines are easy to miss when staff change.</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">That is exactly what we keep an eye on, so it does not become your problem. Here is where your certificate stands:</p>
|
||||
|
||||
<!-- Official-record card: CLIA data is from the public CMS POS file. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · CMS CLIA Laboratory File</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">CLIA number</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.clia }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Laboratory</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Certificate expires</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">{{ .Subscriber.Attribs.clia_expiry }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">{{ .Subscriber.Attribs.clia_status }}</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Provider of Services File - Clinical Laboratories (data.cms.gov), refreshed quarterly.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">If a CLIA certificate lapses, you cannot legally perform or bill for laboratory testing until it is reinstated — which can interrupt patient care and revenue. <strong>Starting now is the best way to make sure your renewal is filed and processed in time</strong> — CMS can take several weeks to process, so the earlier we begin, the more buffer you have against government processing delays.</p>
|
||||
|
||||
<!-- How it works -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">We do the work — you barely lift a finger</h3>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We prepare and file your CLIA renewal (CMS Form 116) and track it through to confirmation. <strong>You never share a password and you never have to chase a government portal.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">No matter who handled it before, we will make sure it gets done right.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Verify-it-yourself -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 18px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Want to confirm it yourself?</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up CLIA number <strong>{{ .Subscriber.Attribs.clia }}</strong> on the public CMS QCOR laboratory lookup and you will see the same expiration date shown above.</p>
|
||||
<a href="https://qcor.cms.gov/main.jsp" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS QCOR ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">Let us take the CLIA renewal off your plate — the sooner we start, the better.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We submit most filings within 1-2 business days, then track it through CMS processing to confirmation.</p>
|
||||
<a href="https://performancewest.net/order/clia-renewal?clia={{ .Subscriber.Attribs.clia }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-clia-renewal" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Renew my CLIA certificate →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions, or want to hand off your lab filings going forward?</strong> Just reply to this email or call <strong>(888) 411-0383</strong>. We are a dedicated healthcare compliance firm and we are happy to be the people who keep track of this for you.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we handle this for you and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Trust signals + true social proof -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
102
data/hc_campaigns/hc_compliance_bundle.html
Normal file
102
data/hc_campaigns/hc_compliance_bundle.html
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:22px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Provider Compliance Review</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Annual compliance, done for you</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 18px;line-height:1.5;">Hi {{ .Subscriber.Name }},</p>
|
||||
<h2 style="font-size:19px;margin:0 0 14px;color:#0f172a;line-height:1.3;">Stop chasing deadlines — we'll handle the whole year</h2>
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">Between revalidation, NPPES attestation, and exclusion screening, provider compliance is a moving target for <strong>{{ .Subscriber.Attribs.practice }}</strong> (NPI {{ .Subscriber.Attribs.npi }}).</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #6ee7b7;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#065f46;font-weight:700;">What's included</h3>
|
||||
<div style="font-size:13px;color:#065f46;line-height:1.7;">Revalidation monitoring & filing, NPPES updates/attestation, and your <strong>first OIG/SAM exclusion screening</strong> — one flat annual price, all tracked, all documented. Continue monthly exclusion monitoring afterward (optional, cancel anytime).</div>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Detail row -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:10px 0;color:#6b7280;">NPI</td><td style="padding:10px 0;font-weight:600;text-align:right;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:10px 0;color:#6b7280;">Practice</td><td style="padding:10px 0;font-weight:600;text-align:right;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- Verify-it-yourself: the bundle monitors public government sources end to
|
||||
end, so the provider can confirm every input we watch. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 22px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">We monitor the official government sources — see them yourself.</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Everything in the bundle is grounded in public CMS, NPPES, and exclusion data for NPI <strong>{{ .Subscriber.Attribs.npi }}</strong>. We watch all of it year-round so nothing slips:</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;margin:0 6px 6px 0;padding:9px 16px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:12px;">CMS Revalidation ↗</a>
|
||||
<a href="https://npiregistry.cms.hhs.gov/search" style="display:inline-block;margin:0 6px 6px 0;padding:9px 16px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:12px;">NPPES ↗</a>
|
||||
<a href="https://exclusions.oig.hhs.gov/" style="display:inline-block;margin:0 6px 6px 0;padding:9px 16px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:12px;">OIG LEIE ↗</a>
|
||||
<a href="https://sam.gov/search/?index=ex" style="display:inline-block;margin:0 0 6px 0;padding:9px 16px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:12px;">SAM.gov ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">One annual bundle covers your core CMS obligations.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We watch the deadlines so you never miss one.</p>
|
||||
<a href="https://performancewest.net/order/provider-compliance-bundle?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-compliance-bundle" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Get the compliance bundle →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. Performance West is a dedicated healthcare compliance firm — we handle the CMS/NPPES paperwork so you can focus on patients.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we handle this for you and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
<!-- Trust signals (data-safety + guarantee — relevant when sharing provider info) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
122
data/hc_campaigns/hc_npi_reactivation.html
Normal file
122
data/hc_campaigns/hc_npi_reactivation.html
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:22px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Provider Enrollment Check</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Make sure your Medicare enrollment is still active</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 18px;line-height:1.5;">Hi {{ .Subscriber.Name }},</p>
|
||||
<h2 style="font-size:19px;margin:0 0 14px;color:#0f172a;line-height:1.3;">Your enrollment looks deactivated — let's fix it fast</h2>
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">Our compliance monitoring suggests the enrollment for <strong>{{ .Subscriber.Attribs.practice }}</strong> (NPI {{ .Subscriber.Attribs.npi }}) <strong>may be deactivated or inactive</strong> — it is worth confirming on the official sources below.</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #6ee7b7;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#065f46;font-weight:700;">Why it matters</h3>
|
||||
<div style="font-size:13px;color:#065f46;line-height:1.7;">A deactivated enrollment means Medicare claims are being <strong>rejected</strong>. Reactivation restores your billing privileges — the sooner it's filed, the less revenue you lose.</div>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Official-record card: NPPES is the public source of record for an NPI.
|
||||
Deactivation itself is not a single public dataset, so the status row is
|
||||
labeled as our compliance flag, not as an NPPES field, to stay accurate. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · NPPES NPI Registry</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Registered to</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Enrollment status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">FLAGGED DEACTIVATED / INACTIVE</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">NPI record source: NPPES NPI Registry (npiregistry.cms.hhs.gov). Enrollment status flagged by our compliance monitoring — confirm via the official sources below.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- Pricing reassurance (no number in email; shown on the order page) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;padding:14px 18px;">
|
||||
<p style="margin:0;font-size:13px;color:#475569;line-height:1.6;font-family:Inter,system-ui,sans-serif;">Simple, <strong>flat fee — shown up front</strong> before you pay anything. No logins, no hourly billing, no surprises.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Verify-it-yourself: deactivation status is not a single public dataset,
|
||||
but it almost always traces to a lapsed revalidation (public on the CMS
|
||||
Revalidation list) and shows in the NPPES registry, both of which the
|
||||
provider can check. Framed honestly: confirm it on the official sources. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 22px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Confirm your status on the official sources.</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Most deactivations follow a lapsed revalidation. Look up your NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the public CMS Revalidation list and the NPPES registry, or check whether your recent Medicare claims are paying — if they’re being rejected, your enrollment is the likely cause.</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;margin:0 6px 6px 0;padding:10px 18px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">CMS Revalidation list ↗</a>
|
||||
<a href="https://npiregistry.cms.hhs.gov/search" style="display:inline-block;margin:0 0 6px 0;padding:10px 18px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">NPPES registry ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">We handle the CMS-855 reactivation end to end.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We verify every field against current CMS requirements.</p>
|
||||
<a href="https://performancewest.net/order/npi-reactivation?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-npi-reactivation" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Reactivate my enrollment →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. Performance West is a dedicated healthcare compliance firm — we handle the CMS/NPPES paperwork so you can focus on patients.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we handle this for you and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
<!-- Trust signals (data-safety + guarantee — relevant when sharing provider info) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
122
data/hc_campaigns/hc_nppes_outdated.html
Normal file
122
data/hc_campaigns/hc_nppes_outdated.html
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:22px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Free NPI Compliance Check</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">NPPES · Medicare revalidation · OIG/SAM exclusions · NPI status</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 18px;line-height:1.5;">Hi {{ .Subscriber.Name }},</p>
|
||||
<h2 style="font-size:19px;margin:0 0 14px;color:#0f172a;line-height:1.3;">We pulled the public records for NPI {{ .Subscriber.Attribs.npi }} — here’s a free check</h2>
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">{{ if .Subscriber.Attribs.nppes_last_updated }}As a quick example, the public NPPES NPI Registry shows the record for <strong>{{ .Subscriber.Attribs.practice }}</strong> was <strong>last updated on {{ .Subscriber.Attribs.nppes_last_updated }}</strong> — about <strong>{{ .Subscriber.Attribs.nppes_years_stale }} years ago</strong>. That’s usually fine, but it’s only one of several things payers and CMS check. {{ else }}Your NPI touches several public government records — NPPES, the Medicare revalidation list, and the federal exclusion lists — and any one of them being off can hold up your payments. {{ end }}Our free tool runs your NPI against those public sources in one place — <strong>no signup, no cost</strong> — and tells you exactly where you stand.</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#0f766e;font-weight:700;">Your free check covers:</p>
|
||||
<div style="font-size:13px;color:#134e4a;line-height:1.9;">
|
||||
✅ <strong>NPI status</strong> — active or deactivated in NPPES<br>
|
||||
✅ <strong>Medicare revalidation</strong> — due date from the live CMS list (deactivation risk)<br>
|
||||
✅ <strong>OIG / SAM exclusions</strong> — screened against the federal exclusion lists<br>
|
||||
✅ <strong>NPPES record currency</strong> — last-updated date & what may be stale
|
||||
</div>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #6ee7b7;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#065f46;font-weight:700;">Why it matters</h3>
|
||||
<div style="font-size:13px;color:#065f46;line-height:1.7;">Payers, clearinghouses, and CMS pull from NPPES. A stale address, taxonomy, or contact can cause <strong>claim denials, mail you never receive, and failed credentialing</strong>. CMS requires you to correct your NPPES record within 30 days of any change.</div>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Official-record card: NPPES is fully public, so this mirrors the registry.
|
||||
Only shown when we have the real Last Updated date for this NPI. -->
|
||||
{{ if .Subscriber.Attribs.nppes_last_updated }}
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · NPPES NPI Registry</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Registered to</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Last updated</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b45309;">{{ .Subscriber.Attribs.nppes_last_updated }} · ~{{ .Subscriber.Attribs.nppes_years_stale }} yrs ago</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: NPPES NPI Registry (npiregistry.cms.hhs.gov), public “Last Updated” field for this NPI. CMS requires NPPES to be corrected within 30 days of any change — review your record on the official registry below.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
{{ end }}
|
||||
|
||||
<!-- Free-first reassurance: the check is free; a fix is optional + flat-fee. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;padding:14px 18px;">
|
||||
<p style="margin:0;font-size:13px;color:#475569;line-height:1.6;font-family:Inter,system-ui,sans-serif;">The check is <strong>completely free</strong>. If it turns up something you’d like us to handle, we’ll quote a <strong>flat fee, shown up front</strong> — no logins, no hourly billing, no obligation.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">Run your free compliance check — takes about 30 seconds.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">Your NPI is pre-filled. No signup, no cost — just your results.</p>
|
||||
<a href="https://performancewest.net/tools/npi-compliance-check?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-npi-check" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Run my free NPI check →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. Performance West is a dedicated healthcare compliance firm — the check is free, and if you want help we handle the CMS/NPPES paperwork so you can focus on patients.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we handle this for you and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
<!-- Trust signals (data-safety + guarantee — relevant when sharing provider info) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
102
data/hc_campaigns/hc_oig_screening.html
Normal file
102
data/hc_campaigns/hc_oig_screening.html
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:22px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Exclusion Screening Notice</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Monthly OIG/SAM exclusion screening</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 18px;line-height:1.5;">Hi {{ .Subscriber.Name }},</p>
|
||||
<h2 style="font-size:19px;margin:0 0 14px;color:#0f172a;line-height:1.3;">One excluded individual can cost you everything</h2>
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">Federal rules require practices that bill Medicare/Medicaid to screen employees and vendors against the <strong>OIG LEIE</strong> and <strong>SAM</strong> exclusion lists — and to document it.</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #6ee7b7;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#065f46;font-weight:700;">Why it matters</h3>
|
||||
<div style="font-size:13px;color:#065f46;line-height:1.7;">Employing or contracting an excluded party triggers <strong>civil monetary penalties up to $20,000 per claim</strong> plus repayment. Most practices have <strong>no documented screening process</strong>.</div>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Detail row -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:10px 0;color:#6b7280;">NPI</td><td style="padding:10px 0;font-weight:600;text-align:right;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:10px 0;color:#6b7280;">Practice</td><td style="padding:10px 0;font-weight:600;text-align:right;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- Verify-it-yourself: the OIG LEIE and SAM exclusion lists are public and
|
||||
free to search. We screen against the very same official sources, so the
|
||||
provider can see exactly what we check. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 22px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">We screen against the official government lists — check them yourself.</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">The OIG LEIE and SAM.gov exclusion databases are public. Search your providers and staff against the same sources we monitor monthly:</p>
|
||||
<a href="https://exclusions.oig.hhs.gov/" style="display:inline-block;margin:0 6px 6px 0;padding:10px 18px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Search OIG LEIE ↗</a>
|
||||
<a href="https://sam.gov/search/?index=ex" style="display:inline-block;margin:0 0 6px 0;padding:10px 18px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Search SAM.gov ↗</a>
|
||||
<p style="margin:8px 0 0;font-size:11px;color:#64748b;line-height:1.5;">A one-time self-search isn’t the same as the documented, recurring screening CMS expects — that’s what we provide.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">We run and document your OIG/SAM exclusion screening.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">Monthly checks with an audit-ready record — cancel anytime.</p>
|
||||
<a href="https://performancewest.net/order/oig-sam-screening?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-oig-screening" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Set up exclusion screening →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. Performance West is a dedicated healthcare compliance firm — we handle the CMS/NPPES paperwork so you can focus on patients.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we handle this for you and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
<!-- Trust signals (data-safety + guarantee — relevant when sharing provider info) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS, Medicare, the OIG, or SAM.gov.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
101
data/hc_campaigns/hc_revalidation_due_soon.html
Normal file
101
data/hc_campaigns/hc_revalidation_due_soon.html
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:22px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Medicare Revalidation Reminder</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Your CMS revalidation deadline is coming up</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 18px;line-height:1.5;">Hi {{ .Subscriber.Name }},</p>
|
||||
<h2 style="font-size:19px;margin:0 0 14px;color:#0f172a;line-height:1.3;">Get ahead of your revalidation deadline</h2>
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">CMS records indicate the Medicare enrollment revalidation for <strong>{{ .Subscriber.Attribs.practice }}</strong> (NPI {{ .Subscriber.Attribs.npi }}) is <strong>coming due</strong>. Handling it now — before the deadline — keeps your billing privileges uninterrupted.</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #6ee7b7;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#065f46;font-weight:700;">Why act before the date</h3>
|
||||
<div style="font-size:13px;color:#065f46;line-height:1.7;">If a revalidation lapses, CMS can <strong>deactivate your Medicare billing privileges</strong> — claims stop paying and you may have to re-enroll, losing your effective date and any retroactive billing. Filing ahead of the deadline avoids that risk entirely.</div>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Official CMS record card: data is straight from the CMS Revalidation Due
|
||||
Date List (verified to match by NPI), presented as a clearly-labeled data
|
||||
readout. NOT a CMS screenshot / not impersonating CMS. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#0ea5e9 0,#0ea5e9 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · CMS Medicare Revalidation Due Date List</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Provider / NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Enrolled as</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Revalidation due date</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b45309;">{{ .Subscriber.Attribs.reval_due_date }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b45309;">DUE SOON · in {{ .Subscriber.Attribs.days_until }} days</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Revalidation Due Date List (data.cms.gov), refreshed monthly.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- Verify-it-yourself: nothing is more convincing than the government's own site -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 22px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Don’t take our word for it — check the official CMS record.</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up your NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the U.S. government’s public Medicare Revalidation List and you’ll see the same due date above.</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS.gov ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Pricing reassurance (no number in email; shown on the order page) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;padding:14px 18px;">
|
||||
<p style="margin:0;font-size:13px;color:#475569;line-height:1.6;font-family:Inter,system-ui,sans-serif;">Simple, <strong>flat fee — shown up front</strong> before you pay anything. No logins, no hourly billing, no surprises.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Convenience: no password / no login / no 2FA: we do the work, you just e-sign -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">No logins, no 2FA codes, no headaches</h3>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We complete the entire revalidation for you and track it through to confirmation. <strong>You never share your password and you never have to log in or chase a two-factor code.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">That's it. We handle the rest and keep you posted until it's confirmed.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">We file your PECOS revalidation for you, well before the deadline.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">Most filings submitted within 1-2 business days.</p>
|
||||
<a href="https://performancewest.net/order/npi-revalidation?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-reval-due-soon" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Start my revalidation →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. Performance West is a dedicated healthcare compliance firm — we handle the CMS/NPPES paperwork so you can focus on patients.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Trust signals (data-safety + guarantee — relevant when sharing provider info) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
101
data/hc_campaigns/hc_revalidation_overdue.html
Normal file
101
data/hc_campaigns/hc_revalidation_overdue.html
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:22px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Medicare Revalidation Alert</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Your CMS revalidation deadline has passed</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 18px;line-height:1.5;">Hi {{ .Subscriber.Name }},</p>
|
||||
<h2 style="font-size:19px;margin:0 0 14px;color:#0f172a;line-height:1.3;">Your Medicare billing privileges are at risk</h2>
|
||||
<p style="font-size:14px;line-height:1.7;margin:0 0 18px;">CMS records indicate the Medicare enrollment revalidation for <strong>{{ .Subscriber.Attribs.practice }}</strong> (NPI {{ .Subscriber.Attribs.npi }}) is <strong>past due</strong>.</p>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #6ee7b7;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#065f46;font-weight:700;">What this means</h3>
|
||||
<div style="font-size:13px;color:#065f46;line-height:1.7;">If you do not revalidate, CMS will <strong>deactivate your Medicare billing privileges</strong> — claims stop paying and you must re-enroll from scratch, losing your effective date and any retroactive billing.</div>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Official CMS record card: the data is straight from the CMS Revalidation
|
||||
Due Date List (verified to match by NPI), presented as a clearly-labeled
|
||||
data readout. NOT a CMS screenshot / not impersonating CMS. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · CMS Medicare Revalidation Due Date List</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Provider / NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Enrolled as</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Revalidation due date</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">{{ .Subscriber.Attribs.reval_due_date }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">PAST DUE · {{ .Subscriber.Attribs.days_overdue }} days overdue</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Revalidation Due Date List (data.cms.gov), refreshed monthly.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- Verify-it-yourself: nothing is more convincing than the government's own site -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 22px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Don’t take our word for it — check the official CMS record.</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up your NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the U.S. government’s public Medicare Revalidation List and you’ll see the same due date above.</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS.gov ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Pricing reassurance (no number in email; shown on the order page) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;padding:14px 18px;">
|
||||
<p style="margin:0;font-size:13px;color:#475569;line-height:1.6;font-family:Inter,system-ui,sans-serif;">Simple, <strong>flat fee — shown up front</strong> before you pay anything. No logins, no hourly billing, no surprises.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Convenience: no password / no login / no 2FA: we do the work, you just e-sign -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">No logins, no 2FA codes, no headaches</h3>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We complete the entire revalidation for you and track it through to confirmation. <strong>You never share your password and you never have to log in or chase a two-factor code.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">That's it. We handle the rest and keep you posted until it's confirmed.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">We file your PECOS revalidation for you, before the clock runs out.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">Most filings submitted within 1-2 business days.</p>
|
||||
<a href="https://performancewest.net/order/npi-revalidation?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-reval-overdue" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Start my revalidation →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions?</strong> Reply to this email or call <strong>(888) 411-0383</strong>. Performance West is a dedicated healthcare compliance firm — we handle the CMS/NPPES paperwork so you can focus on patients.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Trust signals (data-safety + guarantee — relevant when sharing provider info) -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
117
data/hc_campaigns/hc_revalidation_overdue_personal.html
Normal file
117
data/hc_campaigns/hc_revalidation_overdue_personal.html
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:21px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Your Medicare revalidation is past due</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">Let's get it filed before your billing privileges are affected</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 16px;line-height:1.6;">Hi {{ .Subscriber.Name }},</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 16px;">Whoever last handled the Medicare enrollment for <strong>{{ .Subscriber.Attribs.practice }}</strong> may have moved on — front-office and billing staff turn over often, and revalidation deadlines are the kind of thing that quietly fall through the cracks when they do.</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">That is exactly what we keep an eye on, so it does not become your problem. Here is where your enrollment stands right now:</p>
|
||||
|
||||
<!-- CMS record card: data straight from the CMS Revalidation Due Date List -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · CMS Medicare Revalidation Due Date List</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Provider / NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Enrolled as</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Revalidation due date</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">{{ .Subscriber.Attribs.reval_due_date }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Status</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#b91c1c;">PAST DUE · {{ .Subscriber.Attribs.days_overdue }} days overdue</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Revalidation Due Date List (data.cms.gov), refreshed monthly.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">Because the deadline has already passed, this is time-sensitive: when a revalidation stays unfiled, CMS deactivates Medicare billing privileges — claims stop paying and the provider has to re-enroll from scratch, losing the original effective date. <strong>The good news is it is still fixable, and the sooner we file, the better your chances of avoiding a gap.</strong> CMS can take several weeks to process, so the earlier we begin, the more room there is to get you current before any disruption.</p>
|
||||
|
||||
<!-- How it works -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">We do the work — you barely lift a finger</h3>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We complete the full PECOS revalidation and track it through to confirmation. <strong>You never share a password and you never have to log in or chase a two-factor code.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">No matter who handled it before, we will make sure it gets done right.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Verify-it-yourself -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 18px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Want to confirm the date yourself?</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the public CMS Medicare Revalidation List and you will see the same due date shown above.</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS.gov ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">Let us get your past-due revalidation filed right away.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We submit most filings within 1-2 business days, then track it through CMS processing to confirmation.</p>
|
||||
<a href="https://performancewest.net/order/npi-revalidation?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-reval-overdue-personal" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Handle my revalidation →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions, or want to hand off your filings going forward?</strong> Just reply to this email or call <strong>(888) 411-0383</strong>. We are a dedicated healthcare compliance firm and we are happy to be the people who keep track of this for you.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we file your revalidation and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Trust signals + true social proof -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
116
data/hc_campaigns/hc_revalidation_personal.html
Normal file
116
data/hc_campaigns/hc_revalidation_personal.html
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:21px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Making sure nothing slips through the cracks</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">A quick note about your Medicare enrollment</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 16px;line-height:1.6;">Hi {{ .Subscriber.Name }},</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 16px;">Whoever last handled the Medicare enrollment for <strong>{{ .Subscriber.Attribs.practice }}</strong> may have moved on — front-office and billing staff turn over often, and revalidation deadlines are the kind of thing that quietly fall through the cracks when they do.</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">That is exactly what we keep an eye on, so it does not become your problem. Here is where your enrollment stands right now:</p>
|
||||
|
||||
<!-- CMS record card: data straight from the CMS Revalidation Due Date List -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · CMS Medicare Revalidation Due Date List</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Provider / NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Enrolled as</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Revalidation due date</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f766e;">{{ .Subscriber.Attribs.reval_due_date }}</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Revalidation Due Date List (data.cms.gov), refreshed monthly.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">If a revalidation is missed, CMS deactivates Medicare billing privileges — claims stop paying and the provider has to re-enroll from scratch, losing the original effective date. It is avoidable, and we handle it start to finish. <strong>Starting now is the best way to make sure everything is in order well before your due date</strong> — CMS can take several weeks to process a revalidation, so the earlier we begin, the more buffer you have against government processing delays.</p>
|
||||
|
||||
<!-- How it works -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">We do the work — you barely lift a finger</h3>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We complete the full PECOS revalidation and track it through to confirmation. <strong>You never share a password and you never have to log in or chase a two-factor code.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">No matter who handled it before, we will make sure it gets done right.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Verify-it-yourself -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 18px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Want to confirm the date yourself?</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the public CMS Medicare Revalidation List and you will see the same due date shown above.</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS.gov ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">Let us take revalidation off your plate — the sooner we start, the better.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We submit most filings within 1-2 business days, then track it through CMS processing to confirmation.</p>
|
||||
<a href="https://performancewest.net/order/npi-revalidation?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-reval-personal" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Handle my revalidation →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions, or want to hand off your filings going forward?</strong> Just reply to this email or call <strong>(888) 411-0383</strong>. We are a dedicated healthcare compliance firm and we are happy to be the people who keep track of this for you.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Personal guarantee from the founder: photo links to the About page so
|
||||
readers can confirm a real person stands behind the work. -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#f8fafc;border:1px solid #e2e8f0;border-left:4px solid #0f766e;border-radius:10px;padding:20px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="92" valign="top" style="padding-right:16px;">
|
||||
<a href="https://performancewest.net/about">
|
||||
<img src="https://performancewest.net/images/justin-hannah.jpg" alt="Justin Hannah, Founder of Performance West" width="76" height="76" style="width:76px;height:76px;border-radius:50%;display:block;border:2px solid #0f766e;" />
|
||||
</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p style="margin:0 0 10px;font-size:14px;color:#1f2937;line-height:1.7;font-style:italic;">“If we file your revalidation and you are not completely satisfied, I will personally make it right. You will not pay billable hours, and you will not be left chasing a government portal on your own. That is my promise.”</p>
|
||||
<p style="margin:0;">
|
||||
<a href="https://performancewest.net/about" style="text-decoration:none;">
|
||||
<img src="https://performancewest.net/images/justin-signature-v2.png" alt="Justin Hannah" width="150" style="width:150px;height:auto;display:block;margin:0 0 2px;" />
|
||||
</a>
|
||||
<span style="font-size:13px;font-weight:700;color:#0f172a;">Justin Hannah</span><br>
|
||||
<span style="font-size:12px;color:#64748b;">Founder & Principal Consultant, Performance West Inc.</span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Trust signals + true social proof -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
92
data/hc_campaigns/hc_revalidation_turnover.html
Normal file
92
data/hc_campaigns/hc_revalidation_turnover.html
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style>@media only screen and (max-width:600px){.pw-wrap{width:100%!important;border-radius:0!important;}.pw-pad{padding:24px 16px!important;}}body,table,td,p,a{-webkit-text-size-adjust:100%;}table{border-collapse:collapse!important;}img{border:0;}</style></head><body style="margin:0;padding:0;background:#eef0f3;">
|
||||
<center>
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#eef0f3;"><tr><td style="padding:24px 10px;">
|
||||
<table role="presentation" class="pw-wrap" width="620" cellpadding="0" cellspacing="0" style="margin:0 auto;border-radius:10px;overflow:hidden;background:#fff;">
|
||||
|
||||
<!-- Header -->
|
||||
<tr><td style="background-color:#0f766e;background:linear-gradient(135deg,#0f766e 0%,#14b8a6 100%);padding:26px 28px;">
|
||||
<img src="https://performancewest.net/images/logo-white.png" alt="Performance West" style="height:44px;margin-bottom:10px;display:block" />
|
||||
<h1 style="color:#fff;margin:0;font-size:21px;font-weight:700;font-family:Inter,system-ui,sans-serif;">Making sure nothing slips through the cracks</h1>
|
||||
<p style="color:#ccfbf1;margin:6px 0 0;font-size:13px;font-family:Inter,system-ui,sans-serif;">A quick note about your Medicare enrollment</p>
|
||||
</td></tr>
|
||||
|
||||
<!-- Body -->
|
||||
<tr><td class="pw-pad" style="padding:28px;font-family:Inter,system-ui,sans-serif;color:#1f2937;">
|
||||
<p style="font-size:15px;margin:0 0 16px;line-height:1.6;">Hi {{ .Subscriber.Name }},</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 16px;">Whoever last handled the Medicare enrollment for <strong>{{ .Subscriber.Attribs.practice }}</strong> may have moved on — front-office and billing staff turn over often, and revalidation deadlines are the kind of thing that quietly fall through the cracks when they do.</p>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">That is exactly what we keep an eye on, so it does not become your problem. Here is where your enrollment stands right now:</p>
|
||||
|
||||
<!-- CMS record card: data straight from the CMS Revalidation Due Date List -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:6px 0 22px;">
|
||||
<tr><td style="border:1px solid #cbd5e1;border-radius:10px;overflow:hidden;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr><td style="background:#2563eb;background-image:repeating-linear-gradient(45deg,#ef4444 0,#ef4444 14px,#ffffff 14px,#ffffff 28px,#2563eb 28px,#2563eb 42px,#ffffff 42px,#ffffff 56px);padding:0;">
|
||||
<p style="margin:0;padding:11px 16px;background:rgba(15,23,42,0.58);font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:#ffffff;font-weight:700;text-align:center;">Official record · CMS Medicare Revalidation Due Date List</p>
|
||||
</td></tr>
|
||||
<tr><td style="background:#f8fafc;padding:6px 16px 14px;">
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="font-size:13px;">
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Provider / NPI</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.npi }}</td></tr>
|
||||
<tr style="border-bottom:1px solid #e5e7eb;"><td style="padding:9px 0;color:#64748b;">Enrolled as</td><td style="padding:9px 0;font-weight:600;text-align:right;color:#0f172a;">{{ .Subscriber.Attribs.practice }}</td></tr>
|
||||
<tr><td style="padding:9px 0;color:#64748b;">Revalidation due date</td><td style="padding:9px 0;font-weight:700;text-align:right;color:#0f766e;">{{ .Subscriber.Attribs.reval_due_date }}</td></tr>
|
||||
</table>
|
||||
<p style="margin:10px 0 0;font-size:11px;color:#94a3b8;line-height:1.5;">Source: CMS Revalidation Due Date List (data.cms.gov), refreshed monthly.</p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<p style="font-size:14px;line-height:1.75;margin:0 0 18px;">If a revalidation is missed, CMS deactivates Medicare billing privileges — claims stop paying and the provider has to re-enroll from scratch, losing the original effective date. It is avoidable, and we handle it start to finish. <strong>Starting now is the best way to make sure everything is in order well before your due date</strong> — CMS can take several weeks to process a revalidation, so the earlier we begin, the more buffer you have against government processing delays.</p>
|
||||
|
||||
<!-- How it works -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0fdfa;border:1px solid #99f6e4;border-radius:10px;padding:18px;">
|
||||
<h3 style="margin:0 0 10px;font-size:15px;color:#0f766e;font-weight:700;">We do the work — you barely lift a finger</h3>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0 0 10px;">We complete the full PECOS revalidation and track it through to confirmation. <strong>You never share a password and you never have to log in or chase a two-factor code.</strong> The only thing we may need is a one-minute e-signature on a secure link.</p>
|
||||
<p style="font-size:13px;color:#134e4a;line-height:1.7;margin:0;">No matter who handled it before, we will make sure it gets done right.</p>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Verify-it-yourself -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:14px 0 18px;"><tr><td style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:16px;">
|
||||
<p style="margin:0 0 6px;font-size:13px;color:#1e3a8a;font-weight:700;">Want to confirm the date yourself?</p>
|
||||
<p style="margin:0 0 12px;font-size:13px;color:#1e40af;line-height:1.6;">Look up NPI <strong>{{ .Subscriber.Attribs.npi }}</strong> on the public CMS Medicare Revalidation List and you will see the same due date shown above.</p>
|
||||
<a href="https://data.cms.gov/tools/medicare-revalidation-list" style="display:inline-block;padding:10px 22px;background:#fff;border:1px solid #1d4ed8;color:#1d4ed8;font-weight:700;border-radius:8px;text-decoration:none;font-size:13px;">Verify on CMS.gov ↗</a>
|
||||
</td></tr></table>
|
||||
|
||||
<!-- CTA -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:22px 0;"><tr><td style="background:#ecfdf5;border:2px solid #10b981;border-radius:10px;padding:18px;text-align:center;">
|
||||
<p style="font-size:14px;color:#065f46;margin:0 0 6px;font-weight:600;">Let us take revalidation off your plate — the sooner we start, the better.</p>
|
||||
<p style="font-size:12px;color:#047857;margin:0 0 14px;">We submit most filings within 1-2 business days, then track it through CMS processing to confirmation.</p>
|
||||
<a href="https://performancewest.net/order/npi-revalidation?npi={{ .Subscriber.Attribs.npi }}&utm_source=listmonk&utm_medium=email&utm_campaign=hc-reval-turnover" style="display:inline-block;padding:14px 40px;background:#10b981;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;">Handle my revalidation →</a>
|
||||
</td></tr></table>
|
||||
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:18px 0;"><tr><td style="background:#f0f4f8;border-radius:8px;padding:16px;font-size:13px;color:#374151;line-height:1.6;">
|
||||
<strong>Questions, or want to hand off your filings going forward?</strong> Just reply to this email or call <strong>(888) 411-0383</strong>. We are a dedicated healthcare compliance firm and we are happy to be the people who keep track of this for you.
|
||||
</td></tr></table>
|
||||
|
||||
<!-- Trust signals + true social proof -->
|
||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:20px 0 6px;border-top:1px solid #e5e7eb;padding-top:14px;">
|
||||
<tr>
|
||||
<td align="center" style="padding:10px 4px;font-family:Inter,system-ui,sans-serif;">
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🛡️ SOC 2 Type II hosting</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">✅ HIPAA & PCI compliant</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">🔒 256-bit TLS encrypted</span>
|
||||
<span style="display:inline-block;margin:0 8px;font-size:11px;font-weight:600;color:#0f766e;">💳 Secure payment by Stripe</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding:4px;font-family:Inter,system-ui,sans-serif;font-size:12px;color:#4b5563;">
|
||||
<strong style="color:#047857;">100% satisfaction guarantee</strong> · fixed pricing, no billable hours · trusted by providers nationwide
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr><td style="padding:16px 28px;background:#f8fafc;border-top:1px solid #e5e7eb;font-size:11px;color:#9ca3af;text-align:center;">
|
||||
<p style="margin:0 0 8px;">Performance West is an independent compliance firm, not affiliated with CMS or Medicare.</p>
|
||||
<p style="margin:0;">Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001 · <a href="https://performancewest.net" style="color:#6b7280;">performancewest.net</a></p>
|
||||
<p style="margin:6px 0 0;"><a href="{{ UnsubscribeURL }}" style="color:#6b7280;">Unsubscribe</a></p>
|
||||
</td></tr>
|
||||
|
||||
</table></td></tr></table></center></body></html>
|
||||
862
data/otc_leads.csv
Normal file
862
data/otc_leads.csv
Normal file
|
|
@ -0,0 +1,862 @@
|
|||
cik,name,short_name,display_name,ticker,all_tickers,exchange,state_of_incorporation,incorporation_desc,is_us_domestic,sic,sic_desc,entity_type,filer_category,filer_size_bucket,biz_street1,biz_street2,biz_city,biz_state,biz_zip,mail_street1,mail_city,mail_state,mail_zip,phone,website,investor_website,ein,former_names,last_filing_date,last_filing_form,is_active
|
||||
1599407,1847 Holdings LLC,1847 Holdings,1847 Holdings LLC,LBRA,LBRA,OTC,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,590 MADISON AVENUE,21ST FLOOR,NEW YORK,NY,10022,590 MADISON AVENUE,NEW YORK,NY,10022,212-521-4052,,,383922937,,2026-06-04,S-8,Y
|
||||
1748680,1WS Credit Income Fund,1WS Credit Income Fund,1WS Credit Income Fund,OWSCX,OWSCX,,DE,DE,Y,,,other,,smaller_reporting_<75M,"299 PARK AVENUE, 25TH FLOOR",,NEW YORK,NY,10171,"299 PARK AVENUE, 25TH FLOOR",NEW YORK,NY,10171,212-377-4810,,,000000000,,2026-05-07,40-17G,Y
|
||||
1893219,"Abpro Holdings, Inc.",Abpro Holdings,"Abpro Holdings, Inc.",ABPO,ABPO|ABPWW,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating, / Emerging growth company,smaller_reporting_<75M,"6 ST JOHNS LANE, FLOOR 5",,NEW YORK,NY,10013,"6 ST JOHNS LANE, FLOOR 5",NEW YORK,NY,10013,248-890-7200,,,871013956,Atlantic Coastal Acquisition Corp. II,2026-06-04,8-K,Y
|
||||
1850767,Accustem Sciences Inc.,Accustem Sciences,Accustem Sciences Inc.,ACUT,ACUT,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"5 PENN PLAZA, 19TH FLOOR",#1954,NEW YORK,NY,10001,"5 PENN PLAZA, 19TH FLOOR",NEW YORK,NY,10001,442070661000,,,000000000,AccuStem Sciences Ltd,2026-05-15,10-Q,Y
|
||||
1141284,ACTELIS NETWORKS INC,Actelis Networks,Actelis Networks Inc,ASNS,ASNS,OTC,DE,DE,Y,3669,"Communications Equipment, NEC",operating, / Emerging growth company,smaller_reporting_<75M,4039 CLIPPER COURT,,FREMONT,CA,94538,4039 CLIPPER COURT,FREMONT,CA,94538,510-545-1040,,,522160309,,2026-05-20,4,Y
|
||||
1938571,"ADAPTIN BIO, INC.",Adaptin Bio,"Adaptin Bio, Inc.",APTN,APTN,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,3540 TORINGDON WAY,"SUITE 200, #250",CHARLOTTE,NC,28277,3540 TORINGDON WAY,CHARLOTTE,NC,28277,(888) 609-1498,,,881566415,Unite Acquisition 1 Corp.,2026-05-18,424B3,Y
|
||||
2105139,ADI GLOBAL DISTRIBUTION INC.,Adi Global Distribution,Adi Global Distribution Inc.,ADIG,ADIG,,DE,DE,Y,5072,Wholesale-Hardware,other,,smaller_reporting_<75M,251 LITTLE FALLS DRIVE,,WILMINGTON,DE,19808,"275 BROADHOLLOW ROAD, SUITE 400",MELVILLE,NY,11747,302-636-5400,,,413033245,,2026-06-04,10-12B/A,Y
|
||||
849401,"ADM TRONICS UNLIMITED, INC.",Adm Tronics Unlimited,"Adm Tronics Unlimited, Inc.",ADMT,ADMT,OTC,DE,DE,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,224 S PEGASUS AVE,,NORTHVALE,NJ,07647,224 S PEGASUS AVE,NORTHVALE,NJ,07647,2017676040,,,221896032,ADM TRONICS UNLIMITED INC/DE,2026-02-13,10-Q,Y
|
||||
352991,ADVANCED OXYGEN TECHNOLOGIES INC,Advanced Oxygen Technologies,Advanced Oxygen Technologies Inc,AOXY,AOXY,OTC,DE,DE,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ADVANCED OXYGEN TECHNOLOGIES, INC.","C/O CROSSFIELD, INC. PO BOX 189",RANDOLPH,VT,05060,"ADVANCED OXYGEN TECHNOLOGIES, INC.",RANDOLPH,VT,05060,212-727-7085,,,911143622,,2026-05-12,10-Q,Y
|
||||
2084227,"Advasa Holdings, Inc.",Advasa Holdings,"Advasa Holdings, Inc.",ADBT,ADBT,,DE,DE,Y,7372,Services-Prepackaged Software,other,,smaller_reporting_<75M,"4TH FLOOR AKASAKA K TOWER,",1-2-7 MOTO AKASAKA,MINATO-KU,,107-0051,"4TH FLOOR AKASAKA K TOWER,",MINATO-KU,,107-0051,81-03-6868-5538,,,000000000,,2026-04-29,S-1/A,Y
|
||||
1744494,"ADVENT TECHNOLOGIES HOLDINGS, INC.",Advent Technologies Holdings,"Advent Technologies Holdings, Inc.",ADNH,ADNH,OTC,DE,DE,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,500 RUTHERFORD AVENUE,SUITE 102,BOSTON,MA,02129,500 RUTHERFORD AVENUE,BOSTON,MA,02129,857-264-7035,,,830982969,AMCI Acquisition Corp.,2026-05-15,8-K,Y
|
||||
764630,"AETERNUM HEALTH, INC.",Aeternum Health,"Aeternum Health, Inc.",AETN,AETN,OTC,DE,DE,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5291 NE ELAM YOUNG PKWY,SUITE 160,HILLSBORO,OR,97124,5291 NE ELAM YOUNG PKWY,HILLSBORO,OR,97124,(503) 892-7345,,,061120072,SHOREPOWER TECHNOLOGIES INC.|UNITED STATES BASKETBALL LEAGUE INC,2026-05-19,10-Q,Y
|
||||
1964979,"ALLURION TECHNOLOGIES, INC.",Allurion Technologies,"Allurion Technologies, Inc.",ALUR,ALUR|ALURW,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating, / Emerging growth company,smaller_reporting_<75M,11 HURON DR STE 200,,NATICK,MA,01760,11 HURON DR STE 200,NATICK,MA,01760,508-647-4000,,,000000000,"ALLURION TECHNOLOGIES HOLDINGS, INC.",2026-05-27,8-K,Y
|
||||
1616736,Alpha Investment Inc.,Alpha Investment,Alpha Investment Inc.,GGBY,GGBY,OTC,DE,DE,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1000 5TH STREET,SUITE 200,MIAMI BEACH,FL,33139,1000 5TH STREET,MIAMI BEACH,FL,33139,(305) 704-3294,,,900998139,"Gogo Baby, Inc.",2025-09-02,8-K,Y
|
||||
1852016,AltEnergy Acquisition Corp,AltEnergy Acquisition,AltEnergy Acquisition Corp,AEAE,AEAE|AEAEU|AEAEW,OTC,DE,DE,Y,3714,Motor Vehicle Parts & Accessories,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,137 ROWAYTON AVENUE,SUITE 400,ROWAYTON,CT,06853,137 ROWAYTON AVENUE,ROWAYTON,CT,06853,2032953343,,,862157013,,2026-05-21,SCHEDULE 13G/A,Y
|
||||
1496254,Alternative Strategies Income Fund,Alternative Strategies Income Fund,Alternative Strategies Income Fund,LTAFX,LTAFX|LTCFX,,DE,DE,Y,,,other,,smaller_reporting_<75M,225 PICTORIA DRIVE,SUITE 450,CINCINNATI,OH,45246,17645 WRIGHT STREET,OMAHA,NE,68130,212-409-2680,,,000000000,Alternative Strategies Fund|Ladenburg Thalmann Alternative Strategies Fund,2026-05-28,NPORT-P,Y
|
||||
775057,ALTEX INDUSTRIES INC,Altex Industries,Altex Industries Inc,ALTX,ALTX,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,700 COLORADO BLVD,#273,DENVER,CO,80206-4084,700 COLORADO BLVD,DENVER,CO,80206-4084,3032659312,,,840989164,,2026-05-01,10-Q,Y
|
||||
2078570,"AMATUHI HOLDINGS, INC.",Amatuhi Holdings,"Amatuhi Holdings, Inc.",AMTU,AMTU,,DE,DE,Y,1520,General Bldg Contractors - Residential Bldgs,other,,smaller_reporting_<75M,"10TH FLOOR, NISSEKI YOKOHAMA BUILDING,","1-8, SAKURAGICHO 1-CHOME, NAKA-KU,","YOKOHAMA-SHI, KANAGAWA-KEN",,231-0062,"10TH FLOOR, NISSEKI YOKOHAMA BUILDING,","YOKOHAMA-SHI, KANAGAWA-KEN",,231-0062,81-045-263-8670,,,393087053,,2026-05-01,AW,Y
|
||||
1487718,"AMERICAN BATTERY MATERIALS, INC.",American Battery Materials,"American Battery Materials, Inc.",BLTH,BLTH,OTC,DE,DE,Y,1400,Mining & Quarrying of Nonmetallic Minerals (No Fuels),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,500 WEST PUTNAM AVENUE,SUITE 400,GREENWICH,CT,06830,500 WEST PUTNAM AVENUE,GREENWICH,CT,06830,800-998-7962,,,223956444,"BOXSCORE BRANDS, INC.|U-Vend, Inc.|INTERNET MEDIA SERVICES, INC.",2026-05-26,S-1/A,Y
|
||||
1815974,"Anebulo Pharmaceuticals, Inc.",Anebulo Pharmaceuticals,"Anebulo Pharmaceuticals, Inc.",ANEB,ANEB,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"C/O ANEBULO PHARMACEUTICALS, INC.","1017 RANCH ROAD 620 SOUTH, SUITE 107",LAKEWAY,TX,78734,"C/O ANEBULO PHARMACEUTICALS, INC.",LAKEWAY,TX,78734,737 203 5270,,,851170950,,2026-03-02,15-12G,Y
|
||||
1716885,Angel Oak Strategic Credit Fund,Angel Oak Strategic Credit Fund,Angel Oak Strategic Credit Fund,ASCIX,ASCIX,,DE,DE,Y,,,other,,smaller_reporting_<75M,"ANGEL OAK CAPITAL ADVISORS, LLC","980 HAMMOND DRIVE, SUITE 200",ATLANTA,GA,30328,"ANGEL OAK CAPITAL ADVISORS, LLC",ATLANTA,GA,30328,404-953-4900,,,000000000,,2026-05-29,486BPOS,Y
|
||||
879911,"APPLIED ENERGETICS, INC.",Applied Energetics,"Applied Energetics, Inc.",AERG,AERG|AERGP,OTC,DE,DE,Y,3812,"Search, Detection, Navigation, Guidance, Aeronautical Sys",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9070 S. RITA ROAD,SUITE 1500,TUCSON,AZ,85747,9070 S. RITA ROAD,TUCSON,AZ,85747,520-628-7415,,,770262908,"IONATRON, INC.|US HOME & GARDEN INC",2026-06-03,4,Y
|
||||
1070050,AppTech Payments Corp.,AppTech Payments,AppTech Payments Corp.,APCX,APCX|APCXW,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5876 OWENS AVENUE,SUITE 100,CARLSBAD,CA,92008,5876 OWENS AVENUE,CARLSBAD,CA,92008,(760) 707-5955,,,650847995,"AppTech Payments Corp.|AppTech Corp.|Natural Nutrition Inc.|CSI Business Finance, Inc.|HEALTH EXPRESS USA INC",2026-06-04,4,Y
|
||||
1923734,Ark7 Properties Plus LLC,Ark7 Properties Plus,Ark7 Properties Plus LLC,AKPPS,,OTC,DE,DE,Y,6500,Real Estate,other,,smaller_reporting_<75M,1 FERRY BUILDING,STE 201,SAN FRANCISCO,CA,94111,1 FERRY BUILDING,SAN FRANCISCO,CA,94111,415-275-0701,,,881359905,,2026-05-14,1-K,Y
|
||||
2032732,"Arrived Homes 5, LLC",Arrived Homes 5,"Arrived Homes 5, LLC",AEHGS,AEHGS|ALOIS|AVPKS|AVSBS,OTC,DE,DE,Y,6500,Real Estate,other,,smaller_reporting_<75M,1700 WESTLAKE AVE N,SUITE 200,SEATTLE,WA,98109,1 W MOUNTAIN ST,FAYETTEVILLE,AR,72701,8142774833,,,993997278,,2026-05-28,QUALIF,Y
|
||||
863110,ARTESIAN RESOURCES CORP,Artesian Resources,Artesian Resources Corp,ARTNB,ARTNA|ARTNB,OTC,DE,DE,Y,4941,Water Supply,operating,Non-accelerated filer,smaller_reporting_<75M,664 CHURCHMANS RD,,NEWARK,DE,19702,664 CHURCHMANS RD,NEWARK,DE,19702,3024536900,,,510002090,,2026-05-20,4,Y
|
||||
1756390,"Ascend Wellness Holdings, Inc.",Ascend Wellness Holdings,"Ascend Wellness Holdings, Inc.",AAWH,AAWH,OTC,DE,DE,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,174 NJ-17,,ROCHELLE PARK,NJ,07662,174 NJ-17,ROCHELLE PARK,NJ,07662,(646) 661-7600,,,830602006,"Ascend Wellness Holdings, Inc|Ascend Wellness Holdings, LLC",2026-05-13,10-Q,Y
|
||||
926617,Aspira Women's Health Inc.,Aspira Women's Health,Aspira Women's Health Inc.,AWHL,AWHL,OTC,DE,DE,Y,2835,In Vitro & In Vivo Diagnostic Substances,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12117 BEE CAVES ROAD BUILDING THREE,SUITE 100,AUSTIN,TX,78738,12117 BEE CAVES ROAD BUILDING THREE,AUSTIN,TX,78738,512-519-0400,,,330595156,"VERMILLION, INC.|CIPHERGEN BIOSYSTEMS INC",2026-06-09,8-K,Y
|
||||
1642122,"Associated Capital Group, Inc.",Associated Capital Group,"Associated Capital Group, Inc.",ACGP,ACGP,OTC,DE,DE,Y,6211,"Security Brokers, Dealers & Flotation Companies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,191 MASON STREET,,GREENWICH,CT,06830,191 MASON STREET,GREENWICH,CT,06830,914-921-5135,,,,"Gabelli Securities Group, Inc.",2026-03-03,4,Y
|
||||
1882198,Athena Technology Acquisition Corp. II,Athena Technology Acquisition Corp. II,Athena Technology Acquisition Corp. II,ATEK,ATEK|ATEKU|ATEKW,OTC,DE,DE,Y,4955,Hazardous Waste Management,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,442 5TH AVENUE,,NEW YORK,NY,10018,442 5TH AVENUE,NEW YORK,NY,10018,970-925-1572,,,872447308,,2026-05-22,DEF 14A,Y
|
||||
2101833,ATII Holdings Inc.,ATII Holdings,ATII Holdings Inc.,NANO,,,DE,DE,Y,6770,Blank Checks,other,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2093 PHILADELPHIA PIKE #1968,,CLAYMONT,DE,19703,2093 PHILADELPHIA PIKE #1968,CLAYMONT,DE,19703,725-312-2430,,,000000000,,2026-05-08,425,Y
|
||||
1605888,ATLANTIC INTERNATIONAL CORP.,Atlantic International,Atlantic International Corp.,SQLLW,ATLN|SQLLW,OTC,DE,DE,Y,7363,Services-Help Supply Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,270 SYLVAN AVENUE,SUITE 2230,ENGLEWOOD CLIFFS,NJ,07632,270 SYLVAN AVENUE,ENGLEWOOD CLIFFS,NJ,07632,2018994470,,,465319744,"SeqLL, Inc.",2026-05-27,424B3,Y
|
||||
1963088,"AtlasClear Holdings, Inc.",AtlasClear Holdings,"AtlasClear Holdings, Inc.",ATCHW,ATCH|ATCHW,OTC,DE,DE,Y,6199,Finance Services,operating, / Emerging growth company,smaller_reporting_<75M,"2203 LOIS AVE., STE. 814",,TAMPA,FL,33607,"2203 LOIS AVE., STE. 814",TAMPA,FL,33607,813-257-9366,,,000000000,"Calculator New Pubco, Inc.",2026-06-08,S-3,Y
|
||||
826253,AURA SYSTEMS INC,Aura Systems,Aura Systems Inc,AUSI,AUSI,OTC,DE,DE,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,10541 ASHDALE STREET,,STANTON,CA,90680,10541 ASHDALE STREET,STANTON,CA,90680,3106435300,,,954106894,,2026-06-03,NT 10-K,Y
|
||||
2092446,Avalanche Treasury Corp,Avalanche Treasury,Avalanche Treasury Corp,AVAT,AVAT,,DE,DE,Y,6199,Finance Services,other,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,251 LITTLE FALLS DRIVE,,WILMINGTON,DE,19808,251 LITTLE FALLS DRIVE,WILMINGTON,DE,19808,(800) 927-9800,,,000000000,,2026-05-29,424B3,Y
|
||||
1644963,"AVENUE THERAPEUTICS, INC.",Avenue Therapeutics,"Avenue Therapeutics, Inc.",ATXI,ATXI,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1111 KANE CONCOURSE,SUITE 301,BAY HARBOR ISLANDS,FL,33154,1111 KANE CONCOURSE,BAY HARBOR ISLANDS,FL,33154,781-652-4500,,,474113275,,2026-05-08,10-Q,Y
|
||||
1762303,"AVITA Medical, Inc.",AVITA Medical,"AVITA Medical, Inc.",AVHHL,RCEL|AVHHL,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,28159 AVENUE STANFORD,SUITE 220,VALENCIA,CA,91355,28159 AVENUE STANFORD,VALENCIA,CA,91355,661-568-1317,,,202578762,"Avita Therapeutics, Inc.|Avita Medical, Ltd.",2026-06-08,8-K,Y
|
||||
1021917,"Awaysis Capital, Inc.",Awaysis Capital,"Awaysis Capital, Inc.",AWCA,AWCA,OTC,DE,DE,Y,6512,Opeators of Nonresidential Buildings,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3400 LAKESIDE DR,SUITE 100,MIRAMAR,FL,33027,3400 LAKESIDE DR,MIRAMAR,FL,33027,954-931-9244,,,270514566,"JV GROUP, INC.|ASPI, INC.|ASPEON INC|JAVELIN SYSTEMS INC",2026-05-15,10-Q,Y
|
||||
1123596,"BAB, INC.",Bab,"Bab, Inc.",BABB,BABB,OTC,DE,DE,Y,5812,Retail-Eating Places,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,500 LAKE COOK ROAD,SUITE 475,DEERFIELD,IL,60015,500 LAKE COOK ROAD,DEERFIELD,IL,60015,847 948-7520,,,364389547,BAB INC,2026-06-04,8-K,Y
|
||||
1632121,"Balance Labs, Inc.",Balance Labs,"Balance Labs, Inc.",BLNC,BLNC,OTC,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1111 LINCOLN ROAD,4TH FLOOR,MIAMI,FL,33139,407 LINCOLN ROAD,MIAMI BEACH,FL,33139,(305) 907-7600,,,471146785,,2026-05-15,10-Q,Y
|
||||
1826889,"Beachbody Company, Inc.",Beachbody Company,"Beachbody Company, Inc.",BODYW,BODI|BODYW,OTC,DE,DE,Y,5960,Retail-Nonstore Retailers,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,400 CONTINENTAL BLVD,SUITE 400,EL SEGUNDO,CA,90245,400 CONTINENTAL BLVD,EL SEGUNDO,CA,90245,3109850200,,,000000000,Forest Road Acquisition Corp.,2026-06-04,4,Y
|
||||
2094256,"BEACON TOPCO, INC.",Beacon Topco,"Beacon Topco, Inc.",CLYD,CLYD,,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"20400 CENTURY BOULEVARD, SUITE 210",,GERMANTOWN,MD,20874,"20400 CENTURY BOULEVARD, SUITE 210",GERMANTOWN,MD,20874,4439170966,,,000000000,,2026-06-05,10-Q,Y
|
||||
1059213,BEXIL INVESTMENT TRUST,Bexil Investment Trust,Bexil Investment Trust,BXSY,BXSY,OTC,DE,DE,Y,,,other,,smaller_reporting_<75M,17 OLD DREWSVILLE ROAD,,WALPOLE,NH,,17 OLD DREWSVILLE ROAD,WALPOLE,NH,,2127850900,,,510382212,"DIVIDEND & INCOME FUND|DIVIDEND & INCOME FUND, INC.|CHARTWELL DIVIDEND & INCOME FUND INC",2026-05-28,NPORT-P,Y
|
||||
1130166,"Bio Green Med Solution, Inc.",Bio Green Med Solution,"Bio Green Med Solution, Inc.",BGMSP,BGMS|BGMSP,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,200 CONNELL DRIVE,SUITE 1500,BERKELEY HEIGHTS,NJ,07922,200 CONNELL DRIVE,BERKELEY HEIGHTS,NJ,07922,908-517-7330,,,911766850,"Cyclacel Pharmaceuticals, Inc.|XCYTE THERAPIES INC",2026-06-04,425,Y
|
||||
1019034,BIO KEY INTERNATIONAL INC,Bio Key International,Bio Key International Inc,BKYI,BKYI,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,101 CRAWFORDS CORNER RD,SUITE 4116,HOLMDEL,NJ,07733,101 CRAWFORDS CORNER RD,HOLMDEL,NJ,07733,7323591100,,,411761861,SAC TECHNOLOGIES INC,2026-05-18,NT 10-Q,Y
|
||||
1575142,"BIOADAPTIVES, INC.",Bioadaptives,"Bioadaptives, Inc.",BDPT,BDPT,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2620 REGATTA DRIVE,SUITE 102,LAS VEGAS,NV,89128,2620 REGATTA DRIVE,LAS VEGAS,NV,89128,(702) 659-8829,,,462592228,APEX 8 Inc.,2026-06-03,4,Y
|
||||
880242,"BIOLARGO, INC.",Biolargo,"Biolargo, Inc.",BLGO,BLGO,OTC,DE,DE,Y,2800,Chemicals & Allied Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,14921 CHESTNUT ST.,,WESTMINSTER,CA,92683,14921 CHESTNUT ST.,WESTMINSTER,CA,92683,888 400-2863,,,650159115,NUWAY MEDICAL INC|NUWAY ENERGY INC|LATIN AMERICAN CASINOS INC,2026-05-15,10-Q,Y
|
||||
2097508,"Blockfusion Data Centers, Inc.",Blockfusion Data Centers,"Blockfusion Data Centers, Inc.",BLDC,BLDC,,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,other,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"447 BROADWAY, 2ND FLOOR, #538",,NEW YORK,NY,10013,"447 BROADWAY, 2ND FLOOR, #538",NEW YORK,NY,10013,646-732-4427,,,395104456,,2026-05-01,S-4/A,Y
|
||||
793306,BLUE DOLPHIN ENERGY CO,Blue Dolphin Energy,Blue Dolphin Energy Co,BDCO,BDCO,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,801 TRAVIS SUITE 2100,,HOUSTON,TX,77002-5729,801 TRAVIS SUITE 2100,HOUSTON,TX,77002-5729,713-568-4725,,,731268729,,2026-05-29,4,Y
|
||||
1730773,Blue Star Foods Corp.,Blue Star Foods,Blue Star Foods Corp.,BSFC,BSFC,OTC,DE,DE,Y,2092,Prepared Fresh or Frozen Fish & Seafoods,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3330 CLEMATIS STREET,SUITE 217,WEST PALM BEACH,FL,33401,3330 CLEMATIS STREET,WEST PALM BEACH,FL,33401,800-341-2684,,,824270040,"AG ACQUISITION GROUP II, INC.",2026-05-22,10-K,Y
|
||||
2041531,Bodhi Tree Biotechnology Inc,Bodhi Tree Biotechnology,Bodhi Tree Biotechnology Inc,BDTB,BDTB,OTC,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"4125 BLACKHAWK PLAZA CIRCLE, SUITE 172",,DANVILLE,CA,94506,"4125 BLACKHAWK PLAZA CIRCLE, SUITE 172",DANVILLE,CA,94506,(925)406-4528,,,934908449,,2026-05-14,10-Q,Y
|
||||
1499961,"BOLLINGER INNOVATIONS, INC.",Bollinger Innovations,"Bollinger Innovations, Inc.",BINI,BINI,OTC,DE,DE,Y,3711,Motor Vehicles & Passenger Car Bodies,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1405 PIONEER STREET,,BREA,CA,92821,1405 PIONEER STREET,BREA,CA,92821,7146131900,,,901025599,"MULLEN AUTOMOTIVE INC.|Net Element, Inc.|Net Element International, Inc.|Cazador Acquisition Corp Ltd.",2026-02-17,SCHEDULE 13G/A,Y
|
||||
1841125,"Bolt Projects Holdings, Inc.",Bolt Projects Holdings,"Bolt Projects Holdings, Inc.",BSLK,BSLK|BSLKW,OTC,DE,DE,Y,2860,Industrial Organic Chemicals,operating, / Emerging growth company,smaller_reporting_<75M,"2261 MARKET STREET, SUITE 5447",,SAN FRANCISCO,CA,94114,"2261 MARKET STREET, SUITE 5447",SAN FRANCISCO,CA,94114,6192484062,,,861256660,Golden Arrow Merger Corp.,2026-03-12,15-12G,Y
|
||||
1137883,BRAINSTORM CELL THERAPEUTICS INC.,Brainstorm Cell Therapeutics,Brainstorm Cell Therapeutics Inc.,BCLI,BCLI,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1325 AVENUE OF AMERICAS,28TH FLOOR,NEW YORK,NY,10019,1325 AVENUE OF AMERICAS,NEW YORK,NY,10019,201-488-0460,,,207273918,BRAINSTORM CELL THERAPEUTICS INC|GOLDEN HAND RESOURCES INC|WIZBANG TECHNOLOGIES INC,2026-06-03,3,Y
|
||||
1976870,BRB Foods Inc.,BRB Foods,BRB Foods Inc.,BRBF,BRBF,,DE,DE,Y,2000,Food and Kindred Products,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,8 THE GREEN STE #3,,DOVER,DE,19901,RUA DOUTOR EDUARDO DE SOUZA ARANHA,"SAO PAULO, SP",,,55 11 4040-5766,,,921196935,BRB Foods Ltd,2026-05-18,NT 10-Q,Y
|
||||
2083583,"BSTR Holdings, Inc.",BSTR Holdings,"BSTR Holdings, Inc.",BSTR,BSTR,,DE,DE,Y,6199,Finance Services,other,,smaller_reporting_<75M,THE CORPORATION SERVICES COMPANY,251 LITTLE FALLS DRIVE,WILMINGTON,DE,19808,THE CORPORATION SERVICES COMPANY,WILMINGTON,DE,19808,(212) 938-5000,,,000000000,,2026-06-08,424B3,Y
|
||||
724445,BURZYNSKI RESEARCH INSTITUTE INC,Burzynski Research Institute,Burzynski Research Institute Inc,BZYR,BZYR,OTC,DE,DE,Y,2835,In Vitro & In Vivo Diagnostic Substances,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12000 RICHMOND AVE,,HOUSTON,TX,77082,9432 KATY FREEWAY,HOUSTON,TX,77055,(713) 335-5697,,,760136810,,2026-05-12,8-K,Y
|
||||
15847,BUTLER NATIONAL CORP,Butler National,Butler National Corp,BUKS,BUKS,OTC,DE,DE,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,ONE AERO PLAZA,,NEW CENTURY,KS,66031,ONE AERO PLAZA,NEW CENTURY,KS,66031,9137809595,,,410834293,,2026-06-01,8-K,Y
|
||||
2080841,BW Industrial Holdings Inc.,BW Industrial Holdings,BW Industrial Holdings Inc.,BWGC,BWGC,,DE,DE,Y,1540,General Bldg Contractors - Nonresidential Bldgs,other,,smaller_reporting_<75M,"2825 WILCREST DRIVE, SUITE 421",,HOUSTON,TX,,"2825 WILCREST DRIVE, SUITE 421",HOUSTON,TX,,832-627-6852,,,814516346,,2026-03-23,FWP,Y
|
||||
1801417,byNordic Acquisition Corp,byNordic Acquisition,byNordic Acquisition Corp,BYNO,BYNO|BYNOU|BYNOW,OTC,DE,DE,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,EINAR HANSENS ESPLANAD 29,,MALMO,,,EINAR HANSENS ESPLANAD 29,MALMO,,,46 763 134 695,,,000000000,,2026-05-15,10-Q,Y
|
||||
1855485,"Calidi Biotherapeutics, Inc.",Calidi Biotherapeutics,"Calidi Biotherapeutics, Inc.",CLDWW,CLDI|CLDWW,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating, / Emerging growth company,smaller_reporting_<75M,4475 EXECUTIVE DRIVE,SUITE 200,SAN DIEGO,CA,92121,4475 EXECUTIVE DRIVE,SAN DIEGO,CA,92121,858-794-9600,,,862967193,"Calidi Biotherapeutics, Inc.|First Light Acquisition Group, Inc.",2026-06-05,DEFA14A,Y
|
||||
1879270,Cannaisseur Group Inc.,Cannaisseur Group,Cannaisseur Group Inc.,TCRG,TCRG,OTC,DE,DE,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,650 PONCE DE LEON AVE,SUITE 300 #2334,ATLANTA,GA,30308,650 PONCE DE LEON AVE,ATLANTA,GA,30308,404-254-2100,,,861907561,,2026-05-11,10-Q,Y
|
||||
1081938,"CANNAPHARMARX, INC.",Cannapharmarx,"Cannapharmarx, Inc.",CPMD,CPMD,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4439 TOWNSHIP RD 304,,MOUNTAIN VIEW COUNTY,,T0M 0R0,4439 TOWNSHIP RD 304,MOUNTAIN VIEW COUNTY,,T0M 0R0,949-652-6838,,,274635140,"GOLDEN DRAGON HOLDING CO.|CCVG, INC.|CONCORD VENTURES, INC.|CAVION TECHNOLOGIES INC",2026-05-20,10-Q,Y
|
||||
1009759,"Capstone Green Energy Holdings, Inc.",Capstone Green Energy Holdings,"Capstone Green Energy Holdings, Inc.",CGEH,CGEH,OTC,DE,DE,Y,3510,Engines & Turbines,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,16640 STAGG STREET,,VAN NUYS,CA,91406,16640 STAGG STREET,VAN NUYS,CA,91406,818-734-5300,,,954180883,"Capstone Green Energy Holdings, Inc.|Capstone Green Energy Corp|CAPSTONE TURBINE CORP|CAPSTONE TURBINE Corp",2026-05-28,SD,Y
|
||||
1016178,CARVER BANCORP INC,Carver Bancorp,Carver Bancorp Inc,CARV,CARV,OTC,DE,DE,Y,6035,"Savings Institution, Federally Chartered",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,75 W 125TH ST,,NEW YORK,NY,10027-4512,75 W 125TH ST,NEW YORK,NY,10027-4512,2128764747,,,133904174,,2025-12-29,SCHEDULE 13D/A,Y
|
||||
1435064,CEMTREX INC,Cemtrex,Cemtrex Inc,CETXP,CETX|CETXP,OTC,DE,DE,Y,1700,Construction - Special Trade Contractors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,276 GREENPOINT AVE. BLD 8 SUITE 208,,BROOKLYN,NY,11222,276 GREENPOINT AVE. BLD 8 SUITE 208,BROOKLYN,NY,11222,631 756 9116,,,000000000,,2026-06-02,8-K,Y
|
||||
1870404,"CERO THERAPEUTICS HOLDINGS, INC.",Cero Therapeutics Holdings,"Cero Therapeutics Holdings, Inc.",CERO,CERO|CEROW,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating, / Emerging growth company,smaller_reporting_<75M,201 HASKINS WAY,SUITE 230,SOUTH SAN FRANCISCO,CA,94080,201 HASKINS WAY,SOUTH SAN FRANCISCO,CA,94080,650-407-2376,,,871088814,"CERO THERAPEUTICS HOLDINGS, INC.|PHOENIX BIOTECH ACQUISITION CORP.",2026-05-29,424B3,Y
|
||||
1352952,CFN Enterprises Inc.,CFN Enterprises,CFN Enterprises Inc.,CNFN,CNFN,OTC,DE,DE,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,600 E. 8TH STREET,,WHITEFISH,MT,59937,600 E. 8TH STREET,WHITEFISH,MT,59937,8334202636,,,000000000,Accelerize Inc.|ACCELERIZE NEW MEDIA INC,2026-05-20,10-Q,Y
|
||||
1459188,Charging Robotics Inc.,Charging Robotics,Charging Robotics Inc.,CHEV,CHEV,OTC,DE,DE,Y,5013,Wholesale-Motor Vehicle Supplies & New Parts,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,20 RAUL WALLENBERG STREET,,TEL AVIV,L3,6971916,20 RAUL WALLENBERG STREET,TEL AVIV,L3,6971916,972 54 642 0352,,,262274999,"FUEL DOCTOR HOLDINGS, INC.|Silverhill Management Services Inc",2026-05-14,10-Q,Y
|
||||
1025771,CHASE PACKAGING CORP,Chase Packaging,Chase Packaging Corp,WHLT,WHLT,OTC,DE,DE,Y,0700,Agricultural Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,PO BOX 126,,RUMSON,NJ,07760,PO BOX 126,RUMSON,NJ,07760,732-741-1500,,,931216127,,2026-05-15,10-Q,Y
|
||||
1310630,China Foods Holdings Ltd.,China Foods Holdings,China Foods Holdings Ltd.,CFOO,CFOO,OTC,DE,DE,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"SUITE 3102, EVERBRIGHT CENTER",108 GLOUCESTER ROAD,WANCHAI,K3,0000,"SUITE 3102, EVERBRIGHT CENTER",WANCHAI,K3,0000,852-3618-8608,,,910974149,"Trafalgar Resources, Inc.",2026-05-15,10-Q,Y
|
||||
1539029,"Clearside Biomedical, Inc.",Clearside Biomedical,"Clearside Biomedical, Inc.",CLSDQ,CLSDQ,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,900 NORTH POINT PARKWAY,SUITE 200,ALPHARETTA,GA,30005,900 NORTH POINT PARKWAY,ALPHARETTA,GA,30005,678-270-3631,,,452437375,,2026-01-07,15-12G,Y
|
||||
2103884,"Compass Sub North, Inc.",Compass Sub North,"Compass Sub North, Inc.",CONE,CONE,,DE,DE,Y,6022,State Commercial Banks,other,,smaller_reporting_<75M,"17 20TH STREET NORTH, SUITE 500",,BIRMINGHAM,AL,35203,"17 20TH STREET NORTH, SUITE 500",BIRMINGHAM,AL,35203,205-719-5750,,,000000000,,2026-05-08,EFFECT,Y
|
||||
1851959,Concord Acquisition Corp II,Concord Acquisition Corp II,Concord Acquisition Corp II,CNDA,CNDA|CNDAU|CNDAW,OTC,DE,DE,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,477 MADISON AVENUE,,NEW YORK,NY,10022,477 MADISON AVENUE,NEW YORK,NY,10022,212-883-4330,,,862171101,,2026-05-14,10-Q,Y
|
||||
1895249,"ConnectM Technology Solutions, Inc.",ConnectM Technology Solutions,"ConnectM Technology Solutions, Inc.",CNTM,CNTM|CNTMD,OTC,DE,DE,Y,1700,Construction - Special Trade Contractors,operating, / Emerging growth company,smaller_reporting_<75M,"2 MOUNT ROYAL AVENUE, SUITE 550",,MARLBOROUGH,MA,01752,"2 MOUNT ROYAL AVENUE, SUITE 550",MARLBOROUGH,MA,01752,617-395-1333,,,000000000,Monterey Capital Acquisition Corp,2026-06-08,4,Y
|
||||
2064307,ContextLogic Holdings Inc.,ContextLogic Holdings,ContextLogic Holdings Inc.,LOGC,LOGC,OTC,DE,DE,Y,5961,Retail-Catalog & Mail-Order Houses,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2648 INTERNATIONAL BLVD.,STE. 115,OAKLAND,CA,94601,2648 INTERNATIONAL BLVD.,OAKLAND,CA,94601,415-965-8476,,,000000000,"Easter Parent, Inc.",2026-06-05,4,Y
|
||||
2093018,CopperTech Metals Inc.,CopperTech Metals,CopperTech Metals Inc.,CUX,,,DE,DE,Y,1000,Metal Mining,other,,smaller_reporting_<75M,3500 SOUTH DUPONT HIGHWAY,,DOVER,DE,19901,3500 SOUTH DUPONT HIGHWAY,DOVER,DE,19901,44 7860 413642,,,000000000,,2026-06-02,S-1,Y
|
||||
1958489,"Cortigent, Inc.",Cortigent,"Cortigent, Inc.",CRGT,CRGT,,DE,DE,Y,3845,Electromedical & Electrotherapeutic Apparatus,other,,smaller_reporting_<75M,27200 TOURNEY ROAD,SUITE 315,VALENCIA,CA,91355,27200 TOURNEY ROAD,VALENCIA,CA,91355,818-833-5000,,,000000000,,2026-05-13,S-1/A,Y
|
||||
1562151,"Crimson Wine Group, Ltd",Crimson Wine Group,"Crimson Wine Group, Ltd",CWGL,CWGL,OTC,DE,DE,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5901 SILVERADO TRAIL,,NAPA,CA,94558,5901 SILVERADO TRAIL,NAPA,CA,94558,800-486-0503,,,133607383,,2026-06-01,SCHEDULE 13D/A,Y
|
||||
924396,Crisp Momentum Inc.,Crisp Momentum,Crisp Momentum Inc.,CRSF,CRSF,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"250 PARK AVENUE, 7TH FLOOR",,NEW YORK,NY,10017,1700 PALM BEACH LAKES BLVD,WEST PALM BEACH,FL,33401,43 660 596 1401,,,043021770,"OpenLocker Holdings, Inc.|Descrypto Holdings, Inc.|W Technologies, Inc.|Winning Edge International, Inc.|GWIN INC|GLOBAL SPORTS & ENTERTAINMENT INC/|IMSCO TECHNOLOGIES INC /DE/|IMSCO INC /MA/",2026-05-15,10-Q,Y
|
||||
2115027,Cryptex Digital Market Cap ETF,Cryptex Digital Market Cap ETF,Cryptex Digital Market Cap ETF,BAGZ,BAGZ,,DE,DE,Y,,,other,,smaller_reporting_<75M,"30 N. GOULD ST., SUITE R","CRYPTEX FINANCE, LLC",SHERIDAN,WY,82801,"30 N. GOULD ST., SUITE R",SHERIDAN,WY,82801,(888) 869-5261,,,000000000,,2026-03-25,S-1,Y
|
||||
1035422,"CTT PHARMACEUTICAL HOLDINGS, INC.",Ctt Pharmaceutical Holdings,"Ctt Pharmaceutical Holdings, Inc.",CTTH,CTTH,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Smaller reporting company,smaller_reporting_<75M,3853 NORTHDALE BLVD #268,,TAMPA,FL,33624,3853 NORTHDALE BLVD #268,TAMPA,FL,33624,813-606-0060,,,113763974,Mindesta Inc.|INDUSTRIAL MINERALS INC|PNW CAPITAL INC|WINCHESTER MINING CORP,2026-05-29,S-1/A,Y
|
||||
1058623,CUMULUS MEDIA INC,Cumulus Media,Cumulus Media Inc,CMLS,CMLS|CMLSQ,,DE,DE,Y,4832,Radio Broadcasting Stations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3280 PEACHTREE ROAD N.W.,SUITE 2300,ATLANTA,GA,30305,3280 PEACHTREE ROAD N.W.,ATLANTA,GA,30305,4049490700,,,364159663,,2026-04-30,10-K/A,Y
|
||||
1510964,"CV Sciences, Inc.",CV Sciences,"CV Sciences, Inc.",CVSI,CVSI,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9530 PADGETT STREET,SUITE 107,SAN DIEGO,CA,92126,9530 PADGETT STREET,SAN DIEGO,CA,92126,866-290-2157,,,800944970,"CannaVEST Corp.|Foreclosure Solutions, Inc.",2026-06-04,8-K,Y
|
||||
1175680,CytoDyn Inc.,CytoDyn,CytoDyn Inc.,CYDY,CYDY,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"1111 MAIN STREET, SUITE 660",,VANCOUVER,WA,98660,"1111 MAIN STREET, SUITE 660",VANCOUVER,WA,98660,360-980-8524,,,753056237,CYTODYN INC|REXRAY CORP,2026-05-20,EFFECT,Y
|
||||
1918102,"DEEP FISSION, INC.",Deep Fission,"Deep Fission, Inc.",FISN,FISN,,DE,DE,Y,4911,Electric Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2831 GARBER STREET,,BERKELEY,CA,94705,2831 GARBER STREET,BERKELEY,CA,94705,(707) 400-0778,,,874265302,Surfside Acquisition Inc.,2026-05-28,8-A12B,Y
|
||||
1533357,DEFENSE TECHNOLOGIES INTERNATIONAL CORP.,Defense Technologies International,Defense Technologies International Corp.,DTII,,OTC,DE,DE,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6700 N. LINDER ROAD,STE. 156-361,MERIDIAN,ID,83646,6700 N. LINDER ROAD,MERIDIAN,ID,83646,800-520-9485,,,000000000,CANYON GOLD CORP.,2026-04-24,10-Q,Y
|
||||
1805526,DeFi Development Corp.,DeFi Development,DeFi Development Corp.,DFUKF,DFDV|DFDVW|DFUKF,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,6401 CONGRESS AVE,STE 250,BOCA RATON,FL,33487,6401 CONGRESS AVE,BOCA RATON,FL,33487,5615594111,,,832676794,DeFi Development Corp.|Janover Inc.|Janover Ventures LLC,2026-06-05,DEF 14C,Y
|
||||
1394638,"Driveitaway Holdings, Inc.",Driveitaway Holdings,"Driveitaway Holdings, Inc.",DWAY,DWAY,OTC,DE,DE,Y,8200,Services-Educational Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3401 MARKET STREET,SUITE 200/201,PHILADELPHIA,PA,19104,3401 MARKET STREET,PHILADELPHIA,PA,19104,904-824-3133,,,204456503,"CREATIVE LEARNING Corp|B2 HEALTH, INC.",2026-05-22,10-Q,Y
|
||||
1282980,"Dror Ortho-Design, Inc.",Dror Ortho-Design,"Dror Ortho-Design, Inc.",DROR,DROR,OTC,DE,DE,Y,3843,Dental Equipment & Supplies,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,480 JOHNSON ROAD,SUITE 200,WASHINGTON,PA,15301,480 JOHNSON ROAD,WASHINGTON,PA,15301,724-206-1500,,,850461778,NOVINT TECHNOLOGIES INC,2026-06-05,3,Y
|
||||
1111741,"DYNARESOURCE, INC.",Dynaresource,"Dynaresource, Inc.",DYNR,DYNR,OTC,DE,DE,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,222 W. LAS COLINAS BLVD,SUITE 1910 NORTH TOWER,IRVING,TX,75039,222 W. LAS COLINAS BLVD,IRVING,TX,75039,(972) 868-9066,,,941589426,DYNARESOURCE INC|DYNA RESOURCE INC,2026-05-18,8-K,Y
|
||||
1347123,"EBR Systems, Inc.",EBR Systems,"EBR Systems, Inc.",EBRCZ,EBRCZ,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,480 OAKMEAD PARKWAY,,SUNNYVALE,CA,94085,480 OAKMEAD PARKWAY,SUNNYVALE,CA,94085,408 720-1906,,,571164669,EBR Systems Inc,2026-05-11,10-Q,Y
|
||||
1487798,ECA Marcellus Trust I,ECA Marcellus Trust I,ECA Marcellus Trust I,ECTM,ECTM,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating,,smaller_reporting_<75M,C/O BNY MELLON,"601 TRAVIS STREET, FLOOR 16",HOUSTON,TX,77002,C/O BNY MELLON,HOUSTON,TX,77002,512-236-6555,,,276522024,,2026-05-18,8-K,Y
|
||||
1715819,"Electromedical Technologies, Inc",Electromedical Technologies,"Electromedical Technologies, Inc",EMED,EMED,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,16561 N 92ND STREET,SUITE 101,SCOTTSDALE,AZ,85260,16561 N 92ND STREET,SCOTTSDALE,AZ,85260,888-880-7888,,,822619815,,2025-07-14,15-12G,Y
|
||||
1089815,Elite Health Systems Inc.,Elite Health Systems,Elite Health Systems Inc.,EHSI,EHSI,OTC,DE,DE,Y,8093,"Services-Specialty Outpatient Facilities, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1131 W 6TH STREET,SUITE 225,ONTARIO,CA,91762,1131 W 6TH STREET,ONTARIO,CA,91762,949-249-1170,,,521842411,"Elite Health Systems, Inc.|U.S. NeuroSurgical Holdings, Inc.|US NEUROSURGICAL INC",2026-05-20,10-Q,Y
|
||||
1035354,"Eloxx Pharmaceuticals, Inc.",Eloxx Pharmaceuticals,"Eloxx Pharmaceuticals, Inc.",ELOX,ELOX|ELOXD,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,P.O. BOX 274,,ARLINGTON,MA,02476,P.O. BOX 274,ARLINGTON,MA,02476,781-577-5300,,,841368850,"Sevion Therapeutics, Inc.|SENESCO TECHNOLOGIES INC|NAVA LEISURE USA INC",2026-06-08,EFFECT,Y
|
||||
822370,"Emmaus Life Sciences, Inc.",Emmaus Life Sciences,"Emmaus Life Sciences, Inc.",EMMA,EMMA,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"21250 HAWTHORNE BOULEVARD, SUITE 800",,TORRANCE,CA,90503,"21250 HAWTHORNE BOULEVARD, SUITE 800",TORRANCE,CA,90503,310-214-0065,,,870419387,"MYnd Analytics, Inc.|CNS RESPONSE, INC.|STRATIVATION, INC.|SalesTactix, Inc.|AGE RESEARCH INC",2026-05-15,8-K,Y
|
||||
2089161,Encore Inc.,Encore,Encore Inc.,ECR,,,DE,DE,Y,7900,Services-Amusement & Recreation Services,other,,smaller_reporting_<75M,"5100 N. RIVER ROAD, SUITE 300",,SCHILLER PARK,IL,60176,"5100 N. RIVER ROAD, SUITE 300",SCHILLER PARK,IL,60176,847-450-7203,,,464573857,,2026-04-10,S-1,Y
|
||||
1908984,ENDI Corp.,ENDI,ENDI Corp.,ENDI,ENDI,OTC,DE,DE,Y,6282,Investment Advice,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"1806 SUMMIT AVE, STE 300",,RICHMOND,VA,23230,"1806 SUMMIT AVE, STE 300",RICHMOND,VA,23230,(434) 336-7737,,,874284605,,2025-12-03,144,Y
|
||||
1716947,"Ensysce Biosciences, Inc.",Ensysce Biosciences,"Ensysce Biosciences, Inc.",ENSCW,ENSC|ENSCW,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7946 IVANHOE AVENUE,SUITE 201,LA JOLLA,CA,92037,7946 IVANHOE AVENUE,LA JOLLA,CA,92037,(858) 263-4196,,,822755287,Leisure Acquisition Corp.,2026-06-04,S-3,Y
|
||||
2028464,"ENTRATA, INC.",Entrata,"Entrata, Inc.",ENT,,,DE,DE,Y,7372,Services-Prepackaged Software,other,,smaller_reporting_<75M,4205 CHAPEL RIDGE ROAD,,LEHI,UT,84043,4205 CHAPEL RIDGE ROAD,LEHI,UT,84043,8013755522,,,000000000,,2026-05-28,S-1,Y
|
||||
2110029,"ERock, Inc.",ERock,"ERock, Inc.",EROC,EROC,,DE,DE,Y,3620,Electrical Industrial Apparatus,other,,smaller_reporting_<75M,1113 VINE ST.,SUITE 101,HOUSTON,TX,77002,1113 VINE ST.,HOUSTON,TX,77002,713.429.4091,,,000000000,"Enchanted Rock, Inc.",2026-06-09,8-A12B,Y
|
||||
1618835,"Evofem Biosciences, Inc.",Evofem Biosciences,"Evofem Biosciences, Inc.",EVFM,EVFM,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12400 HIGH BLUFF DRIVE,SUITE 600,SAN DIEGO,CA,92130,12400 HIGH BLUFF DRIVE,SAN DIEGO,CA,92130,(858) 550-1900,,,208527075,"Neothetics, Inc.",2026-05-18,8-K,Y
|
||||
1705012,"Fat Brands, Inc",Fat Brands,"Fat Brands, Inc",FATAQ,FATAQ|FABTQ|FATPQ,OTC,DE,DE,Y,5812,Retail-Eating Places,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"9720 WILSHIRE BLVD.,",SUITE 500,BEVERLY HILLS,CA,90212,"9720 WILSHIRE BLVD.,",BEVERLY HILLS,CA,90212,310-406-0600,,,821302696,,2026-06-04,8-K,Y
|
||||
1722731,"FDCTECH, INC.",Fdctech,"Fdctech, Inc.",FDCT,FDCT,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating, / Emerging growth company,smaller_reporting_<75M,200 SPECTRUM DRIVE,SUITE 300,IRVINE,CA,92618,200 SPECTRUM DRIVE,IRVINE,CA,92618,877-445-6047,,,811265459,"FDC TECH, INC.|Forex Development Corp.",2026-06-08,8-K,Y
|
||||
922358,FERRELLGAS PARTNERS L P,Ferrellgas Partners L P,Ferrellgas Partners L P,FGPR,FGPR,OTC,DE,DE,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,ONE LIBERTY PLAZA,,LIBERTY,MO,64068,ONE LIBERTY PLAZA,LIBERTY,MO,64068,816-792-1600,,,431698480,,2026-06-05,10-Q,Y
|
||||
2064124,"Figure Technology Solutions, Inc.",Figure Technology Solutions,"Figure Technology Solutions, Inc.",FGRS,FIGR|FGRS,OTC,DE,DE,Y,6163,Loan Brokers,operating,Non-accelerated filer / Emerging growth company,smaller_reporting_<75M,100 WEST LIBERTY ST.,SUITE 600,RENO,NV,10018,100 WEST LIBERTY ST.,RENO,NV,10018,(917) 789-8049,,,000000000,"Figure Technology Solutions, Inc.|FT Intermediate, Inc.",2026-06-04,4,Y
|
||||
1892704,"First Breach, Inc.",First Breach,"First Breach, Inc.",FBDT,FBDT,,DE,DE,Y,3480,"Ordnance & Accessories, (No Vehicles/Guided Missiles)",other,,smaller_reporting_<75M,8402 TOPPING RD.,,BALTIMORE,MD,21208,8402 TOPPING RD.,BALTIMORE,MD,21208,(410) 303-1600,,,825147193,,2026-05-27,S-1/A,Y
|
||||
1416876,"First Choice Healthcare Solutions, Inc.",First Choice Healthcare Solutions,"First Choice Healthcare Solutions, Inc.",FCHS,FCHS,OTC,DE,DE,Y,8071,Services-Medical Laboratories,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,709 S. HARBOR CITY BLVD.,SUITE 250,MELBOURNE,FL,32901,709 S. HARBOR CITY BLVD.,MELBOURNE,FL,32901,(321) 725-0090,,,900687379,"Medical Billing Assistance, Inc.|Medical Billing Assistance Inc",2026-05-08,10-Q,Y
|
||||
1065823,FIRST NILES FINANCIAL INC,First Niles Financial,First Niles Financial Inc,FNFI,FNFI|FNFPA,OTC,DE,DE,Y,6035,"Savings Institution, Federally Chartered",other,,smaller_reporting_<75M,55 NORTH MAIN STREET,,NILES,OH,44446,55 NORTH MAIN STREET,NILES,OH,44446,3306522539,,,341870418,,2025-05-19,D,Y
|
||||
1099668,"FIRST OTTAWA BANCSHARES, INC.",First Ottawa Bancshares,"First Ottawa Bancshares, Inc.",FOTB,FOTB,OTC,DE,DE,Y,6022,State Commercial Banks,operating,,smaller_reporting_<75M,701 LASALLE STREET,P O BOX 657,OTTAWA,IL,61350,701 LASALLE STREET,OTTAWA,IL,61350,8154340044X291,,,364331185,"FIRST OTTAWA BANCSHARES, INC|FIRST OTTAWA BANCSHARES INC",2025-12-17,D,Y
|
||||
1925062,"Forbright, Inc.",Forbright,"Forbright, Inc.",FRBT,FRBT,,DE,DE,Y,6022,State Commercial Banks,other,,smaller_reporting_<75M,"4445 WILLARD AVENUE, SUITE 1000",,CHEVY CHASE,MD,20815,"4445 WILLARD AVENUE, SUITE 1000",CHEVY CHASE,MD,20815,(301) 299-8810,,,000000000,,2026-06-08,S-1/A,Y
|
||||
1812360,FOXO TECHNOLOGIES INC.,Foxo Technologies,Foxo Technologies Inc.,FOXO,FOXO|FOXOW,OTC,DE,DE,Y,8731,Services-Commercial Physical & Biological Research,operating, / Emerging growth company,smaller_reporting_<75M,477 SOUTH ROSEMARY AVENUE,SUITE 224,WEST PALM BEACH,FL,33401,477 SOUTH ROSEMARY AVENUE,WEST PALM BEACH,FL,33401,(612) 800-0059,,,851050265,Delwinds Insurance Acquisition Corp.,2026-06-02,DEF 14C,Y
|
||||
1825248,Franklin BSP Capital Corp,Franklin BSP Capital,Franklin BSP Capital Corp,FRBP,FRBP,OTC,DE,DE,Y,,,operating,Non-accelerated filer / Emerging growth company,smaller_reporting_<75M,ONE MADISON AVENUE,SUITE 1600,NEW YORK,NY,10010,ONE MADISON AVENUE,NEW YORK,NY,10010,(212) 588-6700,,,000000000,Franklin BSP Capital L.L.C.,2026-06-05,DEFA14A,Y
|
||||
1543652,"Free Flow USA, Inc.",Free Flow USA,"Free Flow USA, Inc.",FFLO,FFLO,OTC,DE,DE,Y,5531,Retail-Auto & Home Supply Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9243 JOHN F. KENNEDY BLVD.,SUITE 104,NORTH BERGEN,NJ,07047,9243 JOHN F. KENNEDY BLVD.,NORTH BERGEN,NJ,07047,703-789-3344,,,453838831,"Free Flow, Inc.",2026-05-14,10-Q,Y
|
||||
1563577,"Galera Therapeutics, Inc.",Galera Therapeutics,"Galera Therapeutics, Inc.",GRTX,GRTX,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,101 LINDENWOOD DRIVE,SUITE 225,MALVERN,PA,19355,101 LINDENWOOD DRIVE,MALVERN,PA,19355,610-725-1500,,,461454898,,2026-06-02,425,Y
|
||||
2130606,"Gazelle Parent, Inc.",Gazelle Parent,"Gazelle Parent, Inc.",OBX,OBX,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,1030 MASSACHUSETTS AVENUE,,CAMBRIDGE,MA,02138,1030 MASSACHUSETTS AVENUE,CAMBRIDGE,MA,02138,(781) 806-6245,,,000000000,,2026-06-02,S-4/A,Y
|
||||
890725,GELSTAT CORP,Gelstat,Gelstat Corp,GSAC,GSAC,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,,smaller_reporting_<75M,333 SE 2ND AVENUE,SUITE 2000,MIAMI,FL,33131,333 SE 2ND AVENUE,MIAMI,FL,33131,772-212-1368,,,900075732,DEVELOPED TECHNOLOGY RESOURCE INC,2026-05-11,1-Z,Y
|
||||
1796949,"GenFlat Holdings, Inc.",GenFlat Holdings,"GenFlat Holdings, Inc.",GFLT,GFLT,OTC,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1983 N BERRA BLVD,,TOOELE,UT,84074,1983 N BERRA BLVD,TOOELE,UT,84074,615-696-7676,,,843639946,"Healthcare Business Resources, Inc.",2026-05-26,4,Y
|
||||
1121795,GHST World Inc.,GHST World,GHST World Inc.,GHST,GHST,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,3001 PGA BOULEVARD,SUITE 305,PALM BEACH GARDENS,FL,33410,3001 PGA BOULEVARD,PALM BEACH GARDENS,FL,33410,561-686-3307,,,912007477,Ghost Technology Inc.|I A EUROPE GROUP INC|GENERAL TELEPHONY COM INC,2026-05-13,10-Q,Y
|
||||
1846084,Global Crossing Airlines Group Inc.,Global Crossing Airlines Group,Global Crossing Airlines Group Inc.,JETMF,JETMF|JETBF,OTC,DE,DE,Y,4512,"Air Transportation, Scheduled",operating, / Emerging growth company,smaller_reporting_<75M,"4200 NW 36TH STREET, BUILDING 5A","MIAMI INT'L AIRPORT, 4TH FLOOR",MIAMI,FL,33166,"4200 NW 36TH STREET, BUILDING 5A",MIAMI,FL,33166,7867518503,,,981350261,,2026-05-12,8-K,Y
|
||||
1817232,Global Gas Corp,Global Gas,Global Gas Corp,HGAS,HGAS|HGASW,OTC,DE,DE,Y,2810,Industrial Inorganic Chemicals,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,99 WALL STREET,SUITE 436,NEW YORK,NY,10005,99 WALL STREET,NEW YORK,NY,10005,917-327-0437,,,851617911,Dune Acquisition Corp,2026-05-15,10-Q,Y
|
||||
1837774,Global Innovative Platforms Inc.,Global Innovative Platforms,Global Innovative Platforms Inc.,GIPL,GIPL,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating, / Emerging growth company,smaller_reporting_<75M,149 JAMES PLACE,,MAITLAND,FL,32751,149 JAMES PLACE,MAITLAND,FL,32751,321-230-3739,,,853816149,Canning Street Corp,2026-06-04,D,Y
|
||||
932021,GLOBAL TECHNOLOGIES LTD,Global Technologies,Global Technologies Ltd,GTLL,GTLL,,DE,DE,Y,3663,Radio & Tv Broadcasting & Communications Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,806 GREEN VALLEY ROAD,SUITE 200,GREENSBORO,NC,27408,806 GREEN VALLEY ROAD,GREENSBORO,NC,27408,(973) 233-5151,,,860970492,INTERACTIVE FLIGHT TECHNOLOGIES INC,2026-06-03,10-Q,Y
|
||||
1420108,"Glucose Health, Inc.",Glucose Health,"Glucose Health, Inc.",GLUC,GLUC,OTC,DE,DE,Y,2833,Medicinal Chemicals & Botanical Products,operating,Smaller reporting company,smaller_reporting_<75M,"609 SW 8TH STREET, SUITE 600",,BENTONVILLE,AR,72712,"609 SW 8TH STREET, SUITE 600",BENTONVILLE,AR,72712,479-802-3827,,,901117742,Bio-Solutions Corp.,2026-02-04,D,Y
|
||||
1011509,Golden Minerals Co,Golden Minerals,Golden Minerals Co,AUMN,AUMN,OTC,DE,DE,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1312 17TH ST,UNIT 2136,DENVER,CO,80202,1312 17TH ST,DENVER,CO,80202,3038395060,,,841363747,APEX SILVER MINES LTD,2026-05-20,8-K,Y
|
||||
1852040,Grayscale Basic Attention Token Trust (BAT),Grayscale Basic Attention Token Trust (BAT),Grayscale Basic Attention Token Trust (BAT),GBAT,GBAT,OTC,DE,DE,Y,,,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,866366321,,2026-02-05,144,Y
|
||||
2029297,Grayscale Bittensor Trust (TAO),Grayscale Bittensor Trust (TAO),Grayscale Bittensor Trust (TAO),GTAO,GTAO,OTC,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,operating, / Emerging growth company,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,996506784,,2026-05-20,8-K,Y
|
||||
2106762,Grayscale BNB ETF,Grayscale BNB ETF,Grayscale BNB ETF,GBNB,GBNB,,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,416775679,,2026-06-03,S-1/A,Y
|
||||
1852023,Grayscale Decentraland Trust (MANA),Grayscale Decentraland Trust (MANA),Grayscale Decentraland Trust (MANA),MANA,MANA,OTC,DE,DE,Y,,,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06092,290 HARBOR DRIVE,STAMFORD,CT,06092,212-668-1427,,,866384735,,2026-05-07,144,Y
|
||||
1852039,Grayscale Filecoin Trust (FIL),Grayscale Filecoin Trust (FIL),Grayscale Filecoin Trust (FIL),FILG,FILG,OTC,DE,DE,Y,6199,Finance Services,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,856627668,,2026-05-07,144,Y
|
||||
1748945,Grayscale Horizen Trust (ZEN),Grayscale Horizen Trust (ZEN),Grayscale Horizen Trust (ZEN),HZEN,HZEN,OTC,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,836217411,Zen Investment Trust,2026-05-08,10-Q,Y
|
||||
1732406,Grayscale Litecoin Trust (LTC),Grayscale Litecoin Trust (LTC),Grayscale Litecoin Trust (LTC),LTCN,LTCN,OTC,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,operating, / Emerging growth company,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212 668 1427,,,826868171,Litecoin Investment Trust,2026-05-22,8-K,Y
|
||||
1852024,Grayscale Livepeer Trust (LPT),Grayscale Livepeer Trust (LPT),Grayscale Livepeer Trust (LPT),GLIV,GLIV,OTC,DE,DE,Y,,,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,866374254,,2026-05-06,144,Y
|
||||
2025000,Grayscale Near Trust (NEAR),Grayscale Near Trust (NEAR),Grayscale Near Trust (NEAR),GSNR,GSNR,OTC,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,996514154,,2026-05-06,144,Y
|
||||
2024996,Grayscale Stacks Trust (STX),Grayscale Stacks Trust (STX),Grayscale Stacks Trust (STX),STCK,STCK,OTC,DE,DE,Y,,,other,,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,996511355,,2026-05-04,144,Y
|
||||
1761325,Grayscale Stellar Lumens Trust (XLM),Grayscale Stellar Lumens Trust (XLM),Grayscale Stellar Lumens Trust (XLM),GXLM,GXLM,OTC,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212 668 1427,,,836545098,Stellar Lumens Investment Trust,2026-05-08,10-Q,Y
|
||||
1720265,Grayscale Zcash Trust (ZEC),Grayscale Zcash Trust (ZEC),Grayscale Zcash Trust (ZEC),ZCSH,ZCSH,OTC,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,290 HARBOR DRIVE,4TH FLOOR,STAMFORD,CT,06902,290 HARBOR DRIVE,STAMFORD,CT,06902,212-668-1427,,,826646113,Zcash Investment Trust,2026-05-08,10-Q,Y
|
||||
1693687,GREENLIT VENTURES INC.,Greenlit Ventures,Greenlit Ventures Inc.,MSYND,MSYND|GLVT,,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,717 FULIN HOTEL,1805 HEPING ROAD,"LUOHU, SHENZHEN",,,717 FULIN HOTEL,"LUOHU, SHENZHEN",,,604-671-9998,,,814679061,"MS YOUNG ADVENTURE ENTERPRISE, INC.|AllyMe Holding Inc.|Rain Sound Acquisition Corp",2026-05-15,NT 10-Q,Y
|
||||
1841761,"Grove Collaborative Holdings, Inc.",Grove Collaborative Holdings,"Grove Collaborative Holdings, Inc.",GROVW,GROV|GROVW,OTC,DE,DE,Y,5961,Retail-Catalog & Mail-Order Houses,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1301 SANSOME STREET,,SAN FRANCISCO,CA,94111,1301 SANSOME STREET,SAN FRANCISCO,CA,94111,(800) 231-8527,,,882840659,Virgin Group Acquisition Corp. II,2026-06-04,4,Y
|
||||
1832487,"Guerrilla RF, Inc.",Guerrilla RF,"Guerrilla RF, Inc.",GUER,GUER,OTC,DE,DE,Y,3674,Semiconductors & Related Devices,operating, / Emerging growth company,smaller_reporting_<75M,2000 PISGAH CHURCH ROAD,,GREENSBORO,NC,27455,2000 PISGAH CHURCH ROAD,GREENSBORO,NC,27455,3365107840,,,853837067,Laffin Acquisition Corp.,2026-06-05,8-K,Y
|
||||
924515,GUIDED THERAPEUTICS INC,Guided Therapeutics,Guided Therapeutics Inc,GTHP,GTHP,OTC,DE,DE,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5835 PEACHTREE CORNERS EAST,SUITE B,PEACHTREE CORNERS,GA,30092,5835 PEACHTREE CORNERS EAST,PEACHTREE CORNERS,GA,30092,7702428723,,,582029543,SPECTRX INC,2026-05-15,10-Q,Y
|
||||
1563665,"Harvard Apparatus Regenerative Technology, Inc.",Harvard Apparatus Regenerative Technology,"Harvard Apparatus Regenerative Technology, Inc.",HRGN,HRGN,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,84 OCTOBER HILL ROAD,SUITE 11,HOLLISTON,MA,01746,84 OCTOBER HILL ROAD,HOLLISTON,MA,01746,(774) 233-7300,,,455210462,"Biostage, Inc.",2026-05-13,10-Q,Y
|
||||
844856,Healthier Choices Management Corp.,Healthier Choices Management,Healthier Choices Management Corp.,HCMC,HCMC,OTC,DE,DE,Y,2100,Tobacco Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3800 NORTH 28TH WAY,,HOLLYWOOD,FL,33020,3800 NORTH 28TH WAY,HOLLYWOOD,FL,33020,305-600-5004,,,841070932,VAPOR CORP.|MILLER DIVERSIFIED CORP,2026-05-14,10-Q,Y
|
||||
1583771,"Hepion Pharmaceuticals, Inc.",Hepion Pharmaceuticals,"Hepion Pharmaceuticals, Inc.",HEPA,HEPA|CTRVP,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,34 SHREWSBURY AVE.,SUITE 1D,RED BANK,NJ,07701,34 SHREWSBURY AVE.,RED BANK,NJ,07701,732-902-4000,,,462783806,"ContraVir Pharmaceuticals, Inc.",2026-05-26,3,Y
|
||||
797465,"HG Holdings, Inc.",HG Holdings,"HG Holdings, Inc.",STLY,STLY,OTC,DE,DE,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"6265 OLD WATER OAK ROAD, UNIT 204",,TALLAHASSEE,FL,32312,"6265 OLD WATER OAK ROAD, UNIT 204",TALLAHASSEE,FL,32312,850-201-9204,,,541272589,STANLEY FURNITURE CO INC.|STANLEY FURNITURE CO INC/,2026-05-13,10-Q,Y
|
||||
2089271,Honeywell Aerospace Inc.,Honeywell Aerospace,Honeywell Aerospace Inc.,HONA,HONA,,DE,DE,Y,3724,Aircraft Engines & Engine Parts,other,,smaller_reporting_<75M,1944 E SKY HARBOR CIR N,,PHOENIX,AZ,85034,1944 E SKY HARBOR CIR N,PHOENIX,AZ,85034,704-627-6200,,,394202057,Honeywell Aerospace LLC,2026-06-08,10-12B/A,Y
|
||||
1760542,HOOKIPA Pharma Inc.,HOOKIPA Pharma,HOOKIPA Pharma Inc.,HOOK,HOOK,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"350 FIFTH AVENUE, 72ND FLOOR, SUITE 7240",,NEW YORK,NY,10118,"350 FIFTH AVENUE, 72ND FLOOR, SUITE 7240",NEW YORK,NY,10118,0114318906360,,,815395687,,2025-10-09,4,Y
|
||||
88000,Horizon Kinetics Holding Corp,Horizon Kinetics Holding,Horizon Kinetics Holding Corp,HKHC,HKHC,OTC,DE,DE,Y,6282,Investment Advice,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,470 PARK AVE S.,,NEW YORK,NY,10016,470 PARK AVE S.,NEW YORK,NY,10016,6462912300,,,840920811,Scott's Liquid Gold - Inc.|SCOTTS LIQUID GOLD INC,2026-05-21,4,Y
|
||||
1639068,Hubilu Venture Corp,Hubilu Venture,Hubilu Venture Corp,HBUV,HBUV,OTC,DE,DE,Y,6510,Real Estate Operators (No Developers) & Lessors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9777 WILSHIRE BLVD,SUITE 804,BEVERLY HILLS,CA,90212,9777 WILSHIRE BLVD,BEVERLY HILLS,CA,90212,(310) 308-7887,,,473342387,,2026-05-26,10-Q,Y
|
||||
1718405,HYCROFT MINING HOLDING CORP,Hycroft Mining Holding,Hycroft Mining Holding Corp,HYMCW,HYMC|HYMCW,OTC,DE,DE,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4300 WATER CANYON ROAD,UNIT 1,WINNEMUCCA,NV,89445,4300 WATER CANYON ROAD,WINNEMUCCA,NV,89445,7753040260,,,822657796,HYCROFT MINING HOLDING CORP|Mudrick Capital Acquisition Corp,2026-06-08,4,Y
|
||||
1580490,I-ON Digital Corp.,I-ON Digital,I-ON Digital Corp.,IONI,IONI,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1244 N. STONE ST.,UNIT #3,CHICAGO,IL,60610,1244 N. STONE ST.,CHICAGO,IL,60610,866-440-2278,,,463031328,I-ON Communications Corp.|Evans Brewing Co Inc.|ALPINE 3 Inc.,2026-06-05,8-K,Y
|
||||
1729944,"IMAC Holdings, Inc.",IMAC Holdings,"IMAC Holdings, Inc.",BACK,BACK,OTC,DE,DE,Y,8093,"Services-Specialty Outpatient Facilities, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3401 MALLORY LANE,SUITE 100,FRANKLIN,TN,37067,3401 MALLORY LANE,FRANKLIN,TN,37067,844-266-4622,,,473579961,IMAC HOLDINGS LLC,2026-03-31,15-12G,Y
|
||||
1680513,IMPACT ANALYTICS INC.,Impact Analytics,Impact Analytics Inc.,IPTNF,IPTNF|IPTND,,DE,DE,Y,,,other,,smaller_reporting_<75M,780 ELKRIDGE LANDING ROAD,SUITE 100,LINTHICUM HEIGHTS,MD,21090,780 ELKRIDGE LANDING ROAD,LINTHICUM HEIGHTS,MD,21090,(917) 244-3631,,,474178385,,2025-06-03,D,Y
|
||||
1042418,"Inhibitor Therapeutics, Inc.",Inhibitor Therapeutics,"Inhibitor Therapeutics, Inc.",INTI,INTI,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4830 W. KENNEDY BLVD.,SUITE 600,TAMPA,FL,33609,4830 W. KENNEDY BLVD.,TAMPA,FL,33609,(813) 766-2462,,,541641133,"HedgePath Pharmaceuticals, Inc.|COMMONWEALTH BIOTECHNOLOGIES INC",2026-06-01,4,Y
|
||||
1190370,INNOVATIVE DESIGNS INC,Innovative Designs,Innovative Designs Inc,IVDN,IVDN,OTC,DE,DE,Y,2390,Miscellaneous Fabricated Textile Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,124 CHERRY ST.,STE 1,PITTSBURGH,PA,15223,124 CHERRY ST.,PITTSBURGH,PA,15223,4127990350,,,030465528,,2026-05-18,10-K/A,Y
|
||||
2001557,"Innventure, Inc.",Innventure,"Innventure, Inc.",INVLW,INV|INVLW,OTC,DE,DE,Y,6770,Blank Checks,operating, / Emerging growth company,smaller_reporting_<75M,"6900 TAVISTOCK LAKES BLVD, SUITE 400",,ORLANDO,FL,32827,"6900 TAVISTOCK LAKES BLVD, SUITE 400",ORLANDO,FL,32827,(321) 209-6787,,,934440048,"Learn SPAC HoldCo, Inc.",2026-05-20,8-K,Y
|
||||
1016504,INTEGRATED BIOPHARMA INC,Integrated Biopharma,Integrated Biopharma Inc,INBP,INBP,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,225 LONG AVENUE,BUILDING 15,HILLSIDE,NJ,07205,225 LONG AVENUE,HILLSIDE,NJ,07205,9739260816,,,222407475,INTEGRATED HEALTH TECHNOLOGIES INC|CHEM INTERNATIONAL INC,2026-05-08,8-K,Y
|
||||
1846235,International Media Acquisition Corp.,International Media Acquisition,International Media Acquisition Corp.,IMAQ,IMAQ|IMAQR|IMAQU|IMAQW,OTC,DE,DE,Y,7812,Services-Motion Picture & Video Tape Production,operating, / Emerging growth company,smaller_reporting_<75M,1604 HWY 130,,NORTH BRUNSWICK,NJ,08902,1604 HWY 130,NORTH BRUNSWICK,NJ,08902,2129603677,,,000000000,,2026-06-01,8-K,Y
|
||||
1355790,International Stem Cell CORP,International Stem Cell,International Stem Cell CORP,ISCO,ISCO,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9745 BUSINESSPARK AVENUE,,SAN DIEGO,CA,92131,9745 BUSINESSPARK AVENUE,SAN DIEGO,CA,92131,760-940-6383,,,204494098,BTHC III INC.,2026-05-14,10-Q,Y
|
||||
1054102,"INTERPACE BIOSCIENCES, INC.",Interpace Biosciences,"Interpace Biosciences, Inc.",IDXG,IDXG,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"WATERVIEW PLAZA, SUITE 310",2001 ROUTE 46,PARSIPPANY,NJ,07054,"WATERVIEW PLAZA, SUITE 310",PARSIPPANY,NJ,07054,412-224-6100,,,222919486,"Interpace Diagnostics Group, Inc.|PDI INC|PROFESSIONAL DETAILING INC",2026-05-14,8-K,Y
|
||||
1865494,"IO Biotech, Inc.",IO Biotech,"IO Biotech, Inc.",IOBTQ,IOBTQ,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,OLE MAALOES VEH 3,,COPENHAGEN,G7,2200,OLE MAALOES VEH 3,COPENHAGEN,G7,2200,4570702980,,,870909276,,2026-06-08,25-NSE,Y
|
||||
2123613,"Kardigan, Inc.",Kardigan,"Kardigan, Inc.",KARD,,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,"C/O KARDIGAN, INC.","131 OYSTER POINT BLVD., SECOND FLOOR",SOUTH SAN FRANCISCO,CA,94080,"C/O KARDIGAN, INC.",SOUTH SAN FRANCISCO,CA,94080,(415) 573-3220,,,932994203,,2026-05-26,S-1,Y
|
||||
1530746,"Kaya Holdings, Inc.",Kaya Holdings,"Kaya Holdings, Inc.",KAYS,KAYS,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,"915 MIDDLE RIVER DRIVE, SUITE 316",,FORT LAUDERDALE,FL,33304,"915 MIDDLE RIVER DRIVE, SUITE 316",FORT LAUDERDALE,FL,33304,954-5347895,,,900898007,"Alternative Fuels Americas, Inc.|Alternative Fuels America, Inc.",2026-03-30,NT 10-K,Y
|
||||
774415,"King Resources, Inc.",King Resources,"King Resources, Inc.",KRFG,KRFG,OTC,DE,DE,Y,3612,"Power, Distribution & Specialty Transformers",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"UNIT 1813, 18/F, FO TAN INDUSTRIAL CENTR",26-28 AU PUI WAN STREET,FO TAN,,,"UNIT 1813, 18/F, FO TAN INDUSTRIAL CENTR",FO TAN,,,852-35858905,,,133784149,OneSolution Technology Inc.|KING RESOURCES INC|ARXA INTERNATIONAL ENERGY INC,2026-06-03,DEF 14C,Y
|
||||
1372514,KIORA PHARMACEUTICALS INC,Kiora Pharmaceuticals,Kiora Pharmaceuticals Inc,KPHMW,KPRX|KPHMW,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,169 SAXONY RD.,SUITE 212,ENCINITAS,CA,92024,169 SAXONY RD.,ENCINITAS,CA,92024,858-224-9600,,,980443284,EYEGATE PHARMACEUTICALS INC,2026-05-28,424B3,Y
|
||||
1855457,"KORE Group Holdings, Inc.",KORE Group Holdings,"KORE Group Holdings, Inc.",KORGW,KORE|KORGW,OTC,DE,DE,Y,4899,"Communications Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1155 PERIMETER CENTER WEST,11TH FLOOR,ATLANTA,GA,30346,1155 PERIMETER CENTER WEST,ATLANTA,GA,30346,877-710-5673,,,863078783,"King Pubco, Inc.",2026-06-03,4,Y
|
||||
1884164,"KwikClick, Inc.",KwikClick,"KwikClick, Inc.",KWIK,KWIK,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,585 WEST 500 SOUTH,SUITE 130,BOUNTIFUL,UT,84010,585 WEST 500 SOUTH,BOUNTIFUL,UT,84010,8012434840,,,954463033,,2026-05-15,10-Q,Y
|
||||
1442492,"Laredo Oil, Inc.",Laredo Oil,"Laredo Oil, Inc.",LRDC,LRDC,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"2021 GUADALUPE STREET,",STE. 260,AUSTIN,TX,78705,"2021 GUADALUPE STREET,",AUSTIN,TX,78705,(512) 337-1199,,,262435874,"Laredo Mining, Inc.",2026-04-14,10-Q,Y
|
||||
1826000,"Latch, Inc.",Latch,"Latch, Inc.",LTCH,LTCH|LTCHW,OTC,DE,DE,Y,5072,Wholesale-Hardware,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1220 N PRICE ROAD,SUITE 2,OLIVETTE,MO,63132,1220 N PRICE ROAD,OLIVETTE,MO,63132,(314) 227-1100,,,853087759,TS Innovation Acquisitions Corp.,2026-06-05,4,Y
|
||||
1736734,Lendbuzz Inc.,Lendbuzz,Lendbuzz Inc.,LBZZ,LBZZ,,DE,DE,Y,6141,Personal Credit Institutions,other,,smaller_reporting_<75M,100 SUMMER STREET,,BOSTON,MA,02110,100 SUMMER STREET,BOSTON,MA,02110,857-999-0250,,,475047556,,2026-03-06,S-1/A,Y
|
||||
1803977,Limitless X Holdings Inc.,Limitless X Holdings,Limitless X Holdings Inc.,LIMX,LIMX,OTC,DE,DE,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"9777 WILSHIRE BLVD.,","SUITE 400,",BEVERLY HILLS,CA,90212,"9777 WILSHIRE BLVD.,",BEVERLY HILLS,CA,90212,720-273-0433,,,811034163,"BIO LAB NATURALS, INC.",2026-06-05,8-K/A,Y
|
||||
1347242,LIPELLA PHARMACEUTICALS INC.,Lipella Pharmaceuticals,Lipella Pharmaceuticals Inc.,LIPO,LIPO,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,400 N LEXINGTON ST,STE LL103,PITTSBURGH,PA,15208,400 N LEXINGTON ST,PITTSBURGH,PA,15208,412-901-0315,,,000000000,LIPELLA PHARMACEUTICALS INC,2026-03-31,8-K,Y
|
||||
1840780,Local Bounti Corporation/DE,Local Bounti,Local Bounti Corporation,LOCLW,LOCL|LOCLW,OTC,DE,DE,Y,0100,Agricultural Production-Crops,operating, / Emerging growth company,smaller_reporting_<75M,490 FOLEY LANE,,HAMILTON,MT,59840,490 FOLEY LANE,HAMILTON,MT,59840,800-640-4016,,,981584830,Leo Holdings III Corp.,2026-05-21,EFFECT,Y
|
||||
1842939,"Longevity Health Holdings, Inc.",Longevity Health Holdings,"Longevity Health Holdings, Inc.",XAGE,XAGE|XAGEW,OTC,DE,DE,Y,2840,"Soap, Detergents, Cleang Preparations, Perfumes, Cosmetics",operating, / Emerging growth company,smaller_reporting_<75M,"2403 SIDNEY STREET, SUITE 300",,PITTSBURGH,PA,15203,"2403 SIDNEY STREET, SUITE 300",PITTSBURGH,PA,15203,412-894-8248,,,861645738,Carmell Corp|ALPHA HEALTHCARE ACQUISITION CORP III,2026-06-04,8-K,Y
|
||||
1753712,Lord Abbett Credit Opportunities Fund,Lord Abbett Credit Opportunities Fund,Lord Abbett Credit Opportunities Fund,LARAX,LARAX,,DE,DE,Y,,,other,,smaller_reporting_<75M,30 HUDSON STREET,,JERSEY CITY,NJ,07302,30 HUDSON STREET,JERSEY CITY,NJ,07302,888-522-2388,,,000000000,,2026-05-29,NPORT-P,Y
|
||||
1327273,"Lyra Therapeutics, Inc.",Lyra Therapeutics,"Lyra Therapeutics, Inc.",LYRA,LYRA,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,480 ARSENAL WAY,,WATERTOWN,MA,02472,480 ARSENAL WAY,WATERTOWN,MA,02472,617-373-4600,,,000000000,"480 Biomedical, Inc.|Arsenal Vascular, Inc.|Arsenal Medical, Inc.|WMR Biomedical Inc",2026-05-15,4,Y
|
||||
1052354,MAN AHL DIVERSIFIED I LP,Man Ahl Diversified I,Man Ahl Diversified I LP,MADL,MADL,,DE,DE,Y,6221,Commodity Contracts Brokers & Dealers,operating,Non-accelerated filer,smaller_reporting_<75M,123 NORTH WACKER DRIVE,SUITE 2800,CHICAGO,IL,60606,123 NORTH WACKER DRIVE,CHICAGO,IL,60606,312-881-6800,,,000000000,,2026-05-14,10-Q,Y
|
||||
1965052,Marblegate Capital Corp,Marblegate Capital,Marblegate Capital Corp,MGTE,MGTE|MGTEW,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"411 THEODORE FREMD AVENUE, SUITE 206S",,RYE,NY,10580,"411 THEODORE FREMD AVENUE, SUITE 206S",RYE,NY,10580,(914) 415-4081,,,922142791,,2026-05-14,10-Q,Y
|
||||
1522767,MARIMED INC.,Marimed,Marimed Inc.,MRMD,MRMD,OTC,DE,DE,Y,2833,Medicinal Chemicals & Botanical Products,operating, / Emerging growth company,smaller_reporting_<75M,10 OCEANA WAY,2ND FLOOR,NORWOOD,MA,02062,10 OCEANA WAY,NORWOOD,MA,02062,781-277-0007,,,274672745,WORLDS ONLINE INC.,2026-06-08,4,Y
|
||||
1844392,"Marpai, Inc.",Marpai,"Marpai, Inc.",MRAI,MRAI,OTC,DE,DE,Y,8090,"Services-Misc Health & Allied Services, NEC",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,615 CHANNELSIDE DRIVE,SUITE 207,TAMPA,FL,33602,615 CHANNELSIDE DRIVE,TAMPA,FL,33602,646-303-3483,,,000000000,,2026-06-02,4,Y
|
||||
2131882,"McCarthy Finney, Inc.",McCarthy Finney,"McCarthy Finney, Inc.",MCFN,,,DE,DE,Y,,,other,,smaller_reporting_<75M,8580 STRAWBERRY LANE,,NIWOT,CO,80503,8580 STRAWBERRY LANE,NIWOT,CO,80503,303-995-3036,,,413005249,,2026-05-14,S-4,Y
|
||||
1295514,"MDWerks, Inc.",MDWerks,"MDWerks, Inc.",MDWK,MDWK,OTC,DE,DE,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"411 WALNUT STREET,",SUITE 20125,GREEN COVE SPRINGS,FL,32043,"411 WALNUT STREET,",GREEN COVE SPRINGS,FL,32043,(252) 501-0019,,,331095411,WESTERN EXPLORATION INC.,2026-05-29,4,Y
|
||||
1599117,"Mentor Capital, Inc.",Mentor Capital,"Mentor Capital, Inc.",MNTR,MNTR,OTC,DE,DE,Y,6799,"Investors, NEC",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,5964 CAMPUS COURT,,PLANO,TX,75093,5964 CAMPUS COURT,PLANO,TX,75093,(760) 788-4700,,,770395098,,2026-05-14,10-Q,Y
|
||||
1001601,"MGT CAPITAL INVESTMENTS, INC.",Mgt Capital Investments,"Mgt Capital Investments, Inc.",MGTI,MGTI,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,540 MONTREAL AVE,SUITE 133,MELBOURNE,FL,32935,540 MONTREAL AVE,MELBOURNE,FL,32935,(914) 630-7430,,,134148725,MGT CAPITAL INVESTMENTS INC|MEDICSIGHT INC|HTTP TECHNOLOGY INC|INTERNET HOLDINGS INC|CHINA BIOMEDICAL GROUP INC,2026-05-11,8-K,Y
|
||||
1788841,micromobility.com Inc.,micromobility.com,micromobility.com Inc.,MCOM,MCOM|MCOMW,OTC,DE,DE,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,500 BROOME ST.,,NEW YORK,NY,10013,500 BROOME ST.,NEW YORK,NY,10013,917-675-7157,,,843015108,"Helbiz, Inc.|GreenVision Acquisition Corp.",2026-03-31,NT 10-K,Y
|
||||
2088281,"Midera Food Processing, Inc.",Midera Food Processing,"Midera Food Processing, Inc.",MFP,MFP,,DE,DE,Y,3580,Refrigeration & Service Industry Machinery,other,,smaller_reporting_<75M,1400 TOASTMASTER DRIVE,,ELGIN,IL,60120,320 S. CANAL ST.,CHICAGO,IL,60606,(847) 450-9692,,,393886250,"Middleby Food Processing, Inc.",2026-05-27,10-12B/A,Y
|
||||
1886362,"Mobile Global Esports, Inc.",Mobile Global Esports,"Mobile Global Esports, Inc.",MGAM,MGAM,OTC,DE,DE,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,500 POST ROAD EAST,2ND FLOOR,WESTPORT,CT,06883,500 POST ROAD EAST,WESTPORT,CT,06883,(475) 666-8401,,,862684455,,2026-05-15,10-Q,Y
|
||||
2090312,Mobility Global Inc.,Mobility Global,Mobility Global Inc.,MBGL,MBGL,,DE,DE,Y,7389,"Services-Business Services, NEC",other,,smaller_reporting_<75M,1906 RESTON METRO PLAZA,,RESTON,VA,20190,1906 RESTON METRO PLAZA,RESTON,VA,20190,703-934-2664,,,000000000,S&P Global Mobility Holding Co,2026-06-04,3,Y
|
||||
836564,Mosaic ImmunoEngineering Inc.,Mosaic ImmunoEngineering,Mosaic ImmunoEngineering Inc.,CPMV,CPMV,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9114 ADAMS AVE.,#202,HUNTINGTON BEACH,CA,92646,9114 ADAMS AVE.,HUNTINGTON BEACH,CA,92646,657-208-0890,,,841070278,PATRIOT SCIENTIFIC CORP,2026-05-20,10-Q,Y
|
||||
1859035,Mountain Crest Acquisition Corp. V,Mountain Crest Acquisition Corp. V,Mountain Crest Acquisition Corp. V,MCAG,MCAG|MCAGR|MCAGU,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,524 BROADWAY,11TH FLOOR,NEW YORK,NY,10012,524 BROADWAY,NEW YORK,NY,10012,646-493-6558,,,000000000,,2026-05-15,10-Q,Y
|
||||
1946573,Nakamoto Inc.,Nakamoto,Nakamoto Inc.,NAKAW,NAKA|NAKAW,OTC,DE,DE,Y,6199,Finance Services,operating, / Emerging growth company,smaller_reporting_<75M,300 10TH AVE SOUTH,,NASHVILLE,TN,37203,300 10TH AVE SOUTH,NASHVILLE,TN,37203,(385) 388-8220,,,843829824,"Kindly MD, Inc.",2026-06-01,SCHEDULE 13D/A,Y
|
||||
1947861,Nature's Miracle Holding Inc.,Nature's Miracle Holding,Nature's Miracle Holding Inc.,NMHI,NMHI|NMHIW,OTC,DE,DE,Y,3523,Farm Machinery & Equipment,operating, / Emerging growth company,smaller_reporting_<75M,858 NORTH CENTRAL AVENUE,,UPLAND,CA,91786,858 NORTH CENTRAL AVENUE,UPLAND,CA,91786,888-420-3694,,,000000000,LBBB Merger Corp.,2026-05-28,8-K,Y
|
||||
1725911,NetBrands Corp.,NetBrands,NetBrands Corp.,NBND,NBND,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4042 AUSTIN BOULEVARD,SUITE B,ISLAND PARK,NY,11558,4042 AUSTIN BOULEVARD,ISLAND PARK,NY,11558,800-550-5996,,,823707673,Global Diversified Marketing Group Inc.|Dense Forest Acquisition Corp,2026-05-13,10-Q,Y
|
||||
1282631,NETLIST INC,Netlist,Netlist Inc,NLST,NLST,OTC,DE,DE,Y,3674,Semiconductors & Related Devices,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"111 ACADEMY, SUITE 100",,IRVINE,CA,92617,"111 ACADEMY, SUITE 100",IRVINE,CA,92617,949-435-0025,,,954812784,,2026-06-08,144,Y
|
||||
1699963,"Neutron Holdings, Inc.",Neutron Holdings,"Neutron Holdings, Inc.",LIME,,,DE,DE,Y,7372,Services-Prepackaged Software,other,,smaller_reporting_<75M,85 2ND ST,SUITE 750,SAN FRANCISCO,CA,94105,85 2ND ST,SAN FRANCISCO,CA,94105,415-449-4139,,,814870517,,2026-05-08,S-1,Y
|
||||
1061040,"New Generation Consumer Group, Inc.",New Generation Consumer Group,"New Generation Consumer Group, Inc.",NGCG,NGCG|NGCGD,OTC,DE,DE,Y,7371,Services-Computer Programming Services,operating,,smaller_reporting_<75M,300 DELAWARE AVE. SUITE 210,,WILMINGTON,DE,19801,7950 E. REDFIELD ROAD,SCOTTSDALE,AZ,85260,13025878719,,,113118271,MEGAWORLD INC,2026-03-27,253G1,Y
|
||||
1663712,NEXPOINT REAL ESTATE STRATEGIES FUND,Nexpoint Real Estate Strategies Fund,Nexpoint Real Estate Strategies Fund,NRSAX,NRSAX,,DE,DE,Y,,,other,,smaller_reporting_<75M,300 CRESCENT COURT,SUITE 700,DALLAS,TX,75201,300 CRESCENT COURT,DALLAS,TX,75201,214-276-6300,,,811061590,,2026-06-01,NPORT-P,Y
|
||||
1976663,"Nexscient, Inc.",Nexscient,"Nexscient, Inc.",NXNT,NXNT,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Emerging growth company,smaller_reporting_<75M,2029 CENTURY PARK EAST,SUITE 400,LOS ANGELES,CA,90067,2029 CENTURY PARK EAST,LOS ANGELES,CA,90067,(310) 494-6620,,,922915192,,2026-05-15,10-Q,Y
|
||||
1865631,NEXTNAV INC.,Nextnav,Nextnav Inc.,NXNVW,NN|NNAVW|NXNVW,OTC,DE,DE,Y,3812,"Search, Detection, Navigation, Guidance, Aeronautical Sys",operating, / Emerging growth company,smaller_reporting_<75M,11911 FREEDOM DRIVE,STE 200,RESTON,VA,20190,11911 FREEDOM DRIVE,RESTON,VA,20190,800-775-0982,,,000000000,Spartacus Acquisition Shelf Corp.,2026-06-03,4,Y
|
||||
1011060,Nordicus Partners Corp,Nordicus Partners,Nordicus Partners Corp,NORD,NORD,OTC,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,280 SOUTH BEVERLY DR.,SUITE 505,BEVERLY HILLS,CA,90212,280 SOUTH BEVERLY DR.,BEVERLY HILLS,CA,90212,508-523-3141,,,043186647,EKIMAS Corp|AdvanSource Biomaterials Corp|CARDIOTECH INTERNATIONAL INC,2026-02-13,10-Q,Y
|
||||
1072379,NORTHWEST BIOTHERAPEUTICS INC,Northwest Biotherapeutics,Northwest Biotherapeutics Inc,NWBO,NWBO,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4800 MONTGOMERY LANE,SUITE 800,BETHESDA,MD,20814,4800 MONTGOMERY LANE,BETHESDA,MD,20814,(240) 497-9024,,,943306718,,2026-05-15,10-Q,Y
|
||||
1759546,NU RIDE INC.,Nu Ride,Nu Ride Inc.,NRDE,NRDE,OTC,DE,DE,Y,3711,Motor Vehicles & Passenger Car Bodies,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"1700 BROADWAY, 19TH FLOOR",,NEW YORK,NY,10019,"1700 BROADWAY, 19TH FLOOR",NEW YORK,NY,10019,212-202-2200,,,832533239,Lordstown Motors Corp.|DiamondPeak Holdings Corp.,2026-06-04,8-K,Y
|
||||
1814215,"Nuburu, Inc.",Nuburu,"Nuburu, Inc.",BURUW,BURU|BURUW,OTC,DE,DE,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,44 COOK STREET,SUITE 100,DENVER,CO,80206,44 COOK STREET,DENVER,CO,80206,(303) 780-7389,,,000000000,Tailwind Acquisition Corp.,2026-06-01,8-K,Y
|
||||
1091596,"Nuo Therapeutics, Inc.",Nuo Therapeutics,"Nuo Therapeutics, Inc.",AURX,AURX,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,8285 EL RIO,SUITE 190,HOUSTON,TX,77054,8285 EL RIO,HOUSTON,TX,77054,832-236-9060,,,233011702,"Nuo Therapeutics, Inc|CYTOMEDIX INC|AUTOLOGOUS WOUND THERAPY INC|AUTOLOGOUS WOUND TRERAPY INC",2026-06-05,4,Y
|
||||
1869974,"Ocean Biomedical, Inc.",Ocean Biomedical,"Ocean Biomedical, Inc.",OCEA,OCEA,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,515 MADISON AVE SUITE 8078,,NEW YORK,NY,10022,515 MADISON AVE SUITE 8078,NEW YORK,NY,10022,(646) 908-2658,,,871309280,"Ocean Biomedical, Inc./DE|Aesther Healthcare Acquisition Corp.",2025-08-14,NT 10-Q,Y
|
||||
278165,OMNIQ Corp.,OMNIQ,OMNIQ Corp.,OMQS,OMQS,OTC,DE,DE,Y,7373,Services-Computer Integrated Systems Design,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,696 W CONFLUENCE AVE,,MURRAY,UT,84123,696 W CONFLUENCE AVE,MURRAY,UT,84123,800-242-7272,,,020314487,"Quest Solution, Inc.|AMERIGO ENERGY, INC.|STRATEGIC GAMING INVESTMENTS, INC.|LEFT RIGHT MARKETING TECHNOLOGY INC|LEFT RIGHT MAKETING TECHNOLOGY INC|GLOBAL GAMING & TECHNOLOGY INC",2026-06-02,8-K,Y
|
||||
908259,"Oncotelic Therapeutics, Inc.",Oncotelic Therapeutics,"Oncotelic Therapeutics, Inc.",OTLC,OTLC,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,29397 AGOURA RD.,#107,AGUORA HILLS,CA,91301,29397 AGOURA RD.,AGUORA HILLS,CA,91301,650-635-7000,,,133679168,MATEON THERAPEUTICS INC|OXIGENE INC,2026-05-14,10-Q,Y
|
||||
1825452,"Onfolio Holdings, Inc",Onfolio Holdings,"Onfolio Holdings, Inc",ONFOP,ONFO|ONFOP|ONFOW,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,operating, / Emerging growth company,smaller_reporting_<75M,1007 NORTH ORANGE STREET 4TH FLOOR,,WILMINGTON,DE,19801,1007 NORTH ORANGE STREET 4TH FLOOR,WILMINGTON,DE,19801,(682) 990-6920,,,000000000,"Onfolio Holdings Inc|Onfolio Holdings, Inc.",2026-06-08,PRE 14A,Y
|
||||
2070577,Option Therapeutics Inc.,Option Therapeutics,Option Therapeutics Inc.,OPTN,OPTN,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,680 W NYE LN STE 201,,CARSON CITY,NV,89703,680 W NYE LN STE 201,CARSON CITY,NV,89703,775-446-0517,,,334884057,,2026-03-16,S-1/A,Y
|
||||
1868282,Osprey Solana Trust,Osprey Solana Trust,Osprey Solana Trust,OSOL,OSOL,OTC,DE,DE,Y,,,other,,smaller_reporting_<75M,520 WHITE PLAINS ROAD,SUITE 500,TARRYTOWN,NY,10591,520 WHITE PLAINS ROAD,TARRYTOWN,NY,10591,9142144174,,,000000000,,2025-10-22,S-1,Y
|
||||
1816708,"Owlet, Inc.",Owlet,"Owlet, Inc.",OWLTW,OWLT|OWLTW,OTC,DE,DE,Y,3829,"Measuring & Controlling Devices, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2940 WEST MAPLE LOOP DRIVE,SUITE 203,LEHI,UT,84048,2940 WEST MAPLE LOOP DRIVE,LEHI,UT,84048,8443345330,,,000000000,Sandbridge Acquisition Corp,2026-06-05,8-K,Y
|
||||
1172069,"P2 Solar, Inc.",P2 Solar,"P2 Solar, Inc.",PTOS,PTOS,OTC,DE,DE,Y,1700,Construction - Special Trade Contractors,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,13718 91 AVENUE,,SURREY,,V3V 7X1,13718 91 AVENUE,SURREY,,V3V 7X1,778.321.0047,,,980234680,NATCO INTERNATIONAL INC.|SPECTRUM INTERNATIONAL INC,2025-08-15,NT 10-Q,Y
|
||||
1765651,Pacific Sports Exchange Inc.,Pacific Sports Exchange,Pacific Sports Exchange Inc.,PSPX,PSPX,OTC,DE,DE,Y,5940,Retail-Miscellaneous Shopping Goods Stores,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"3055 NW YEON AVE, #236",,PORTLAND,OR,97210,"3055 NW YEON AVE, #236",PORTLAND,OR,97210,971-279-2764,,,831189007,,2026-04-21,10-Q,Y
|
||||
1017655,PAID INC,Paid,Paid Inc,PAYD,PAYD,OTC,DE,DE,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,200 FRIBERG PARKWAY,SUITE 4004,WESTBOROUGH,MA,01581,200 FRIBERG PARKWAY,WESTBOROUGH,MA,01581,617-861-6050,,,731479833,SALES ONLINE DIRECT INC|SECURITIES RESOLUTION ADVISORS INC|ROSE INTERNATIONAL LTD,2026-05-20,3,Y
|
||||
1938569,Palomino Laboratories Inc.,Palomino Laboratories,Palomino Laboratories Inc.,PALX,PALX,OTC,DE,DE,Y,3674,Semiconductors & Related Devices,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,130 CASTILIAN DRIVE,SUITE 102,GOLETA,CA,93117,130 CASTILIAN DRIVE,GOLETA,CA,93117,(917) 200-3734,,,881619619,Unite Acquisition 3 Corp.,2026-05-15,10-Q,Y
|
||||
1657677,"Parabilis Medicines, Inc.",Parabilis Medicines,"Parabilis Medicines, Inc.",PBLS,PBLS,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,30 ACORN PARK DRIVE,6TH FLOOR,CAMBRIDGE,MA,02140,30 ACORN PARK DRIVE,CAMBRIDGE,MA,02140,617-945-9510,,,474505725,"FOG PHARMACEUTICALS, INC.",2026-06-09,S-1/A,Y
|
||||
1815903,"Petros Pharmaceuticals, Inc.",Petros Pharmaceuticals,"Petros Pharmaceuticals, Inc.",PTPI,PTPI,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,"1185 AVENUE OF THE AMERICAS, 3RD FLOOR",,NEW YORK,NY,10036,"1185 AVENUE OF THE AMERICAS, 3RD FLOOR",NEW YORK,NY,10036,973-242-0005,,,851410058,,2026-06-08,4,Y
|
||||
1923622,PGIM Private Credit Fund,PGIM Private Credit Fund,PGIM Private Credit Fund,PGIM,PGIM,,DE,DE,Y,,,operating, / Emerging growth company,smaller_reporting_<75M,655 BROAD ST,,NEWARK,NJ,07102,655 BROAD ST,NEWARK,NJ,07102,(973) 802-5032,,,000000000,PGIM Senior Loan Opportunities Fund,2026-05-28,8-K,Y
|
||||
1879848,PHOENIX MOTOR INC.,Phoenix Motor,Phoenix Motor Inc.,PEVM,PEVM,OTC,DE,DE,Y,3713,Truck & Bus Bodies,operating, / Emerging growth company,smaller_reporting_<75M,401 SOUTH DOUBLEDAY AVENUE,,ONTARIO,CA,91761,401 SOUTH DOUBLEDAY AVENUE,ONTARIO,CA,91761,909-987-0815,,,000000000,,2026-06-05,8-K,Y
|
||||
1807765,PMV Consumer Acquisition Corp.,PMV Consumer Acquisition,PMV Consumer Acquisition Corp.,PMVC,PMVC|PMVCW,OTC,DE,DE,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,249 ROYAL PALM WAY SUITE 503,,PALM BEACH,FL,33480,249 ROYAL PALM WAY SUITE 503,PALM BEACH,FL,33480,5616712100,,,845174573,,2026-05-14,10-Q,Y
|
||||
1784058,Pony Group Inc.,Pony Group,Pony Group Inc.,PNYG,PNYG,OTC,DE,DE,Y,7500,"Services-Automotive Repair, Services & Parking",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ENGINEER EXPERIMENT BUILDING, A202","7 GAOXIN SOUTH AVENUE, NANSHAN DISTRICT","SHENZHEN, GUANGDONG PROVINCE",,,"ENGINEER EXPERIMENT BUILDING, A202","SHENZHEN, GUANGDONG PROVINCE",,,86-0755-86665622,,,833532241,,2026-05-15,10-Q,Y
|
||||
1435617,"POWERDYNE INTERNATIONAL, INC.",Powerdyne International,"Powerdyne International, Inc.",PWDY,PWDY,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,45 MAIN STREET,,NORTH READING,MA,01864,45 MAIN STREET,NORTH READING,MA,01864,401-739-3300,,,205572576,Greenmark Acquisition CORP|Greenlight Acquisition CORP,2026-05-20,10-Q,Y
|
||||
1756404,Principal Real Asset Fund,Principal Real Asset Fund,Principal Real Asset Fund,PDSRX,PDSRX|PDSKX,,DE,DE,Y,,,other,,smaller_reporting_<75M,711 HIGH ST.,,DES MOINES,IA,50392,711 HIGH ST.,DES MOINES,IA,50392,5152359328,,,832104764,Principal Diversified Select Real Asset Fund,2026-05-28,N-CSR,Y
|
||||
1859807,"Profusa, Inc.",Profusa,"Profusa, Inc.",NVACW,PFSA|NVACW,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating, / Emerging growth company,smaller_reporting_<75M,"207 WEST 25TH ST, 9TH FLOOR",,NEW YORK,NY,10001,"207 WEST 25TH ST, 9TH FLOOR",NEW YORK,NY,10001,212-494-9022,,,863437271,NorthView Acquisition Corp,2026-06-08,424B3,Y
|
||||
868278,"ProPhase Labs, Inc.",ProPhase Labs,"ProPhase Labs, Inc.",PRPH,PRPH,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"711 STEWART AVE, SUITE 200",GARDEN CITY,NEW YORK,NY,11530,"711 STEWART AVE, SUITE 200",NEW YORK,NY,11530,(215) 345-0919,,,232577138,QUIGLEY CORP,2026-06-01,10-K,Y
|
||||
1022899,"Protagenic Therapeutics, Inc.\new","Protagenic Therapeutics, Inc.\new","Protagenic Therapeutics, Inc.\new",PTIX,PTIX|PTIXW,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,149 FIFTH AVENUE,SUITE 500,NEW YORK,NY,10010,149 FIFTH AVENUE,NEW YORK,NY,10010,(212) 994-8200,,,061390025,"Atrinsic, Inc.|NEW MOTION, INC.|MPLC, Inc.|MILLBROOK PRESS INC",2026-04-07,8-K,Y
|
||||
315545,"PROVECTUS BIOPHARMACEUTICALS, INC.",Provectus Biopharmaceuticals,"Provectus Biopharmaceuticals, Inc.",PVCT,PVCT,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,800 S. GAY STREET,SUITE 1610,KNOXVILLE,TN,37929,800 S. GAY STREET,KNOXVILLE,TN,37929,(866) 594-5999,,,900031917,PROVECTUS PHARMACEUTICALS INC|PROVECTUS PHARMACEUTICAL INC|ZAMAGE DIGITAL IMAGING INC|SPM GROUP INC,2026-06-05,4,Y
|
||||
1006028,"PURE BIOSCIENCE, INC.",Pure Bioscience,"Pure Bioscience, Inc.",PURE,PURE,OTC,DE,DE,Y,2890,Miscellaneous Chemical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,771 JAMACHA ROAD #512,,EL CAJON,CA,92019,771 JAMACHA ROAD #512,EL CAJON,CA,92019,619-596-8600,,,330530289,PURE BIOSCIENCE|INNOVATIVE MEDICAL SERVICES,2026-05-05,8-K,Y
|
||||
1844505,"QT IMAGING HOLDINGS, INC.",Qt Imaging Holdings,"Qt Imaging Holdings, Inc.",QTIWW,QTI|QTIWW,OTC,DE,DE,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,3 HAMILTON LANDING,SUITE 160,NOVATO,CA,94949,3 HAMILTON LANDING,NOVATO,CA,94949,415-842-7250,,,861728920,"GigCapital5, Inc.",2026-05-21,8-K,Y
|
||||
1549631,"Quarta-Rad, Inc.",Quarta-Rad,"Quarta-Rad, Inc.",QURT,QURT,OTC,DE,DE,Y,3823,"Industrial Instruments For Measurement, Display, and Control",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1201 ORANGE ST.,STE. 700,WILMINGTON,DE,19801,1201 ORANGE ST.,WILMINGTON,DE,19801,732-887-8511,,,454232089,,2026-05-15,10-Q,Y
|
||||
1487091,"Quest Water Global, Inc.",Quest Water Global,"Quest Water Global, Inc.",QWTR,QWTR,OTC,DE,DE,Y,3585,Air-Cond & Warm Air Heatg Equip & Comm & Indl Refrig Equip,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,SUITE 209,828 HARBOURSIDE DRIVE,NORTH VANCOUVER,A1,V7P 3R9,SUITE 209,NORTH VANCOUVER,A1,V7P 3R9,(888) 897-5536,,,271994359,"RPM Dental, Inc.",2026-05-29,8-K,Y
|
||||
1254699,QVC INC,Qvc,Qvc Inc,QVCCQ,QVCCQ|QVCDQ,OTC,DE,DE,Y,5961,Retail-Catalog & Mail-Order Houses,operating,Non-accelerated filer,smaller_reporting_<75M,,,,,,1200 WILSON DRIVE AT STUDIO PARK,WEST CHESTER,PA,19380,,,,232414041,,2026-06-01,SD,Y
|
||||
1448038,Redwood Mortgage Investors IX,Redwood Mortgage Investors IX,Redwood Mortgage Investors IX,RWDMU,,OTC,DE,DE,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,155 BOVET ROAD,SUITE 302,SAN MATEO,CA,,155 BOVET ROAD,SAN MATEO,CA,,650-365-5341,,,000000000,,2026-05-20,10-Q,Y
|
||||
1437283,"REGO PAYMENT ARCHITECTURES, INC.",Rego Payment Architectures,"Rego Payment Architectures, Inc.",RPMT,RPMT,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,325 SENTRY PARKWAY,SUITE 200,BLUE BELL,PA,19422,325 SENTRY PARKWAY,BLUE BELL,PA,19422,267-465-7530,,,352327649,"VIRTUAL PIGGY, INC.|Moggle, Inc.",2026-05-27,8-K,Y
|
||||
1860484,Relativity Acquisition Corp,Relativity Acquisition,Relativity Acquisition Corp,ACQC,ACQC,OTC,DE,DE,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"3753 HOWARD HUGHES PARKWAY, SUITE 200",,LAS VEGAS,NV,89619,"3753 HOWARD HUGHES PARKWAY, SUITE 200",LAS VEGAS,NV,89619,3107019520,,,863244927,,2026-06-02,10-Q,Y
|
||||
83350,RESERVE PETROLEUM CO,Reserve Petroleum,Reserve Petroleum Co,RSRV,RSRV,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6801 N BROADWAY STE 300,,OKLAHOMA CITY,OK,73116-9092,6801 NORTH BROADWAY,OKLAHOMA,OK,73116-9092,4058487551,,,730237060,,2026-05-26,ARS,Y
|
||||
2078721,"ReserveOne Holdings, Inc.",ReserveOne Holdings,"ReserveOne Holdings, Inc.",RONE,RONE,,DE,DE,Y,6199,Finance Services,other,,smaller_reporting_<75M,200 PARK AVE.,58TH FLOOR,NEW YORK,NY,10166,200 PARK AVE.,NEW YORK,NY,10166,212-204-2777,,,392968926,,2026-05-13,EFFECT,Y
|
||||
1836295,RetinalGenix Technologies Inc.,RetinalGenix Technologies,RetinalGenix Technologies Inc.,RTGN,RTGN,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1450 NORTH MCDOWELL BOULEVARD,SUITE 150,PETALUMA,CA,94954,1450 NORTH MCDOWELL BOULEVARD,PETALUMA,CA,94954,415-578-9583,,,823936890,,2026-05-20,10-Q,Y
|
||||
1839140,Revium Rx.,Revium Rx.,Revium Rx.,RVRC,RVRC,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,"C/O ABOUDI LEGAL GROUP PLLC, 745 5TH AVE",SUITE 500,NEW YORK,NY,10151,"C/O ABOUDI LEGAL GROUP PLLC, 745 5TH AVE",NEW YORK,NY,10151,6467684285,,,844516676,,2026-06-01,8-K,Y
|
||||
1742927,"REVIVA PHARMACEUTICALS HOLDINGS, INC.",Reviva Pharmaceuticals Holdings,"Reviva Pharmaceuticals Holdings, Inc.",RVPH,RVPH,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,10080 N WOLFE ROAD,SUITE SW3-200,CUPERTINO,CA,95014,10080 N WOLFE ROAD,CUPERTINO,CA,95014,4085018881,,,000000000,Tenzing Acquisition Corp.,2026-05-15,SCHEDULE 13G/A,Y
|
||||
2087716,"ROKIT America, Inc.",ROKIT America,"ROKIT America, Inc.",RKAM,RKAM,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,3435 WILSHIRE BLVD,SUITE 2925,LOS ANGELES,CA,90010,3435 WILSHIRE BLVD,LOS ANGELES,CA,90010,6788610046,,,384124442,,2026-06-04,S-1/A,Y
|
||||
1694617,"Royale Energy, Inc.",Royale Energy,"Royale Energy, Inc.",ROYL,ROYL,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1530 HILTON HEAD RD,,EL CAJON,CA,92019,1530 HILTON HEAD RD,EL CAJON,CA,92019,(619) 881-2800,,,814596368,"Royale Energy Holdings, Inc.",2026-04-10,8-K,Y
|
||||
2084032,"Salspera, Inc.",Salspera,"Salspera, Inc.",TKVA,TKVA,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,45 PROSPECT STREET,,CAMBRIDGE,MA,02139,45 PROSPECT STREET,CAMBRIDGE,MA,02139,652-402-5587,,,874698872,,2026-03-20,S-1/A,Y
|
||||
1001233,"SANGAMO THERAPEUTICS, INC",Sangamo Therapeutics,"Sangamo Therapeutics, Inc",SGMO,SGMO,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,501 CANAL BLVD.,,RICHMOND,CA,94084,501 CANAL BLVD.,RICHMOND,CA,94084,5109706000,,,680359556,SANGAMO BIOSCIENCES INC,2026-05-27,4,Y
|
||||
1661600,SATIVUS TECH CORP.,Sativus Tech,Sativus Tech Corp.,SATT,SATT,OTC,DE,DE,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,#3 BETHESDA METRO CENTER #700,,BETHESDA,MD,06880,#3 BETHESDA METRO CENTER #700,BETHESDA,MD,06880,800-608-6432,,,472847446,SEEDO CORP.|GRCR Partners Inc,2026-05-14,10-Q,Y
|
||||
1091326,"SB Technology Holdings, Inc.",SB Technology Holdings,"SB Technology Holdings, Inc.",VGLS,VGLSD,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Smaller reporting company,smaller_reporting_<75M,PO BOX 1020,,SOUTH PASADENA,CA,91031,PO BOX 1020,SOUTH PASADENA,CA,91031,805-879-9000,,,330814123,"VG Life Sciences Inc.|VG Life Sciences, Inc.|VIRAL GENETICS INC /DE/|5 STARLIVING ONLINE INC",2026-05-04,RW,Y
|
||||
1994624,ScanTech AI Systems Inc.,ScanTech AI Systems,ScanTech AI Systems Inc.,STAI,STAI,OTC,DE,DE,Y,3825,Instruments For Meas & Testing of Electricity & Elec Signals,operating, / Emerging growth company,smaller_reporting_<75M,"1177 AVENUE OF THE AMERICA, SUITE 5100",,NEW YORK,NY,10036,"1177 AVENUE OF THE AMERICA, SUITE 5100",NEW YORK,NY,10036,8886221218,,,933502562,,2026-06-08,25-NSE,Y
|
||||
87802,SCIENTIFIC INDUSTRIES INC,Scientific Industries,Scientific Industries Inc,SCND,SCND,OTC,DE,DE,Y,3826,Laboratory Analytical Instruments,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,70 ORVILLE DR,AIRPORT INTERNATIONAL PLZ,BOHEMIA,NY,11716,70 ORVILLE DR,BOHEMIA,NY,11716,6315674700,,,042217279,,2026-05-15,10-Q,Y
|
||||
1674227,SCWorx Corp.,SCWorx,SCWorx Corp.,WORX,WORX,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"35 VILLAGE RD, SUITE 100",,MIDDLETON,MA,01949,"35 VILLAGE RD, SUITE 100",MIDDLETON,MA,01949,2127397825,,,475412331,"Alliance MMA, Inc.",2026-06-01,PRE 14A,Y
|
||||
2094496,"Securitize Holdings, Inc.",Securitize Holdings,"Securitize Holdings, Inc.",SECZ,SECZ,,DE,DE,Y,6199,Finance Services,other,,smaller_reporting_<75M,"78 SW 7TH STREET, SUITE 500",,MIAMI,FL,33130,"78 SW 7TH STREET, SUITE 500",MIAMI,FL,33130,(646) 918-5012,,,000000000,,2026-06-05,EFFECT,Y
|
||||
1779977,"SeeQC, Inc.",SeeQC,"SeeQC, Inc.",SEQC,,,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,other,,smaller_reporting_<75M,150 CLEARBOOK ROAD,SUITE 170,ELMSFORD,NY,10523,150 CLEARBOOK ROAD,ELMSFORD,NY,10523,(914) 592-1190,,,825117037,,2026-05-26,S-4,Y
|
||||
1913577,"Semnur Pharmaceuticals, Inc.",Semnur Pharmaceuticals,"Semnur Pharmaceuticals, Inc.",SMNR,SMNR|SMNRW,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,960 SAN ANTONIO ROAD,,PALO ALTO,CA,94303,960 SAN ANTONIO ROAD,PALO ALTO,CA,94303,(650) 516-4310,,,981659463,Denali Capital Acquisition Corp.,2026-05-18,EFFECT,Y
|
||||
2068385,SharonAI Holdings Inc.,SharonAI Holdings,SharonAI Holdings Inc.,SHAZW,SHAZ|SHAZW,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"745 FIFTH AVENUE, SUITE 500",,NEW YORK,NY,10151,"745 FIFTH AVENUE, SUITE 500",NEW YORK,NY,10151,949-720-7133,,,000000000,"SharonAI Holdings, Inc.|Roth CH Holdings, Inc.",2026-06-05,S-1,Y
|
||||
1022505,"SideChannel, Inc.",SideChannel,"SideChannel, Inc.",SDCH,SDCH,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,146 MAIN STREET,SUITE 405,WORCESTER,MA,01608,146 MAIN STREET,WORCESTER,MA,01608,512-649-7700,,,860837077,CIPHERLOC Corp|NATIONAL SCIENTIFIC CORP/AZ,2026-05-12,10-Q,Y
|
||||
1642159,"Sigyn Therapeutics, Inc.",Sigyn Therapeutics,"Sigyn Therapeutics, Inc.",SIGY,SIGY,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9190 W OLYMPIC BLVD # 263,,BEVERLY HILLS,CA,90212,9190 W OLYMPIC BLVD # 263,BEVERLY HILLS,CA,90212,619-368-2000,,,472573116,Reign Resources Corp|Reign Sapphire Corp,2026-03-31,NT 10-K,Y
|
||||
91668,SOLITRON DEVICES INC,Solitron Devices,Solitron Devices Inc,SODI,SODI,OTC,DE,DE,Y,3674,Semiconductors & Related Devices,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,901 SANSBURYS WAY,,WEST PALM BEACH,FL,33411,901 SANSBURYS WAY,WEST PALM BEACH,FL,33411,561-848-4311,,,221684144,,2026-06-08,4,Y
|
||||
1870600,"Solo Brands, Inc.",Solo Brands,"Solo Brands, Inc.",SBDS,SBDS,OTC,DE,DE,Y,3949,"Sporting & Athletic Goods, NEC",operating, / Emerging growth company,smaller_reporting_<75M,1001 MUSTANG DR,,GRAPEVINE,TX,76051,1001 MUSTANG DR,GRAPEVINE,TX,76051,(817) 900-2664,,,871360865,,2026-05-27,8-K,Y
|
||||
1407973,"Sonendo, Inc.",Sonendo,"Sonendo, Inc.",SONX,SONX,OTC,DE,DE,Y,3843,Dental Equipment & Supplies,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,26061 MERIT CIRCLE,SUITE 101,Laguna Hills,CA,92653,26061 MERIT CIRCLE,Laguna Hills,CA,92653,(949) 766-3636,,,205041718,Dentatek CORP,2026-02-11,SCHEDULE 13G/A,Y
|
||||
1801602,"SpringBig Holdings, Inc.",SpringBig Holdings,"SpringBig Holdings, Inc.",SBIG,SBIG|SBIGW,OTC,DE,DE,Y,7371,Services-Computer Programming Services,operating, / Emerging growth company,smaller_reporting_<75M,621 NW 53RD ST,SUITE 260,BOCA RATON,FL,33487,621 NW 53RD ST,BOCA RATON,FL,33487,(800) 772-9172,,,882789488,Tuatara Capital Acquisition Corp,2026-06-03,8-K,Y
|
||||
2080215,StableCoinX Inc.,StableCoinX,StableCoinX Inc.,USDE,USDE,,DE,DE,Y,6199,Finance Services,other,,smaller_reporting_<75M,"4001 KENNETT PIKE, SUITE 302",,WILMINGTON,DE,19807,"4001 KENNETT PIKE, SUITE 302",WILMINGTON,DE,19807,(302) 803-6849,,,393052555,,2026-05-29,424B3,Y
|
||||
2049977,"Starton Holdings, Inc.",Starton Holdings,"Starton Holdings, Inc.",STA,STA,,DE,DE,Y,2834,Pharmaceutical Preparations,other,,smaller_reporting_<75M,"215 COLLEGE ROAD, SUITE 300",,PARAMUS,NJ,07652,"215 COLLEGE ROAD, SUITE 300",PARAMUS,NJ,07652,800-449-5405,,,332448745,,2026-06-09,S-1/A,Y
|
||||
1658645,Stone Ridge Trust V,Stone Ridge Trust V,Stone Ridge Trust V,LENDX,LENDX,,DE,DE,Y,,,other,,smaller_reporting_<75M,ONE VANDERBILT AVENUE,65TH FL.,NEW YORK,NY,10017,ONE VANDERBILT AVENUE,NEW YORK,NY,10017,212-257-4750,,,475536331,,2026-05-28,24F-2NT,Y
|
||||
1051514,"STRATA Skin Sciences, Inc.",STRATA Skin Sciences,"STRATA Skin Sciences, Inc.",SSKN,SSKN,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5 WALNUT GROVE DRIVE,SUITE 140,HORSHAM,PA,19044,5 WALNUT GROVE DRIVE,HORSHAM,PA,19044,215-619-3200,,,133986004,"MELA SCIENCES, INC. /NY|ELECTRO OPTICAL SCIENCES INC /NY",2026-03-26,10-K,Y
|
||||
1652539,SusGlobal Energy Corp.,SusGlobal Energy,SusGlobal Energy Corp.,SNRG,SNRG,OTC,DE,DE,Y,4953,Refuse Systems,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,200 DAVENPORT ROAD,,TORONTO,A6,M5R 1J2,200 DAVENPORT ROAD,TORONTO,A6,M5R 1J2,4162238500,,,000000000,,2026-03-31,NT 10-K,Y
|
||||
1527599,"SYNLOGIC, INC.",Synlogic,"Synlogic, Inc.",SYBX,SYBX,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,PO BOX 30,,WINCHESTER,MA,01890,PO BOX 30,WINCHESTER,MA,01890,617-659-2802,,,261824804,"Mirna Therapeutics, Inc.",2026-05-18,25-NSE,Y
|
||||
1922335,Syra Health Corp,Syra Health,Syra Health Corp,SYRA,SYRA,OTC,DE,DE,Y,7361,Services-Employment Agencies,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1119 KEYSTONE WAY N.,#201,CARMEL,IN,46032,1119 KEYSTONE WAY N.,CARMEL,IN,46032,(317) 922-0922,,,000000000,,2026-06-01,DEFA14A,Y
|
||||
1997652,Tamboran Resources Corp,Tamboran Resources,Tamboran Resources Corp,TBNRL,TBN|TBNRL,OTC,DE,DE,Y,1311,Crude Petroleum & Natural Gas,operating, / Emerging growth company,smaller_reporting_<75M,"LEVEL 39, SUITE 1, TOWER ONE",100 BARANGAROO AVENUE,BARANGAROO,C3,2000,"LEVEL 39, SUITE 1, TOWER ONE",BARANGAROO,C3,2000,61 2 8330 6626,,,000000000,,2026-06-08,S-8,Y
|
||||
1119190,"TAP REAL ESTATE TECHNOLOGIES, INC.",Tap Real Estate Technologies,"Tap Real Estate Technologies, Inc.",RWAX,RWAX,OTC,DE,DE,Y,5000,Wholesale-Durable Goods,operating, / Emerging growth company,smaller_reporting_<75M,26 CROSS STREET,,NEW CANAAN,CT,06840,26 CROSS STREET,NEW CANAAN,CT,06840,203-930-7427,,,271296318,"HUMBL, INC.|Tesoro Enterprises, Inc.|Tesoro Distributors, Inc.|IWT TESORO CORP|PONCA ACQUISITION",2026-05-29,8-K,Y
|
||||
1586554,Target Group Inc.,Target Group,Target Group Inc.,CBDY,CBDY,OTC,DE,DE,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,20 HEMPSTEAD DRIVE,,HAMILTON,,L8W 2E7,"55 ADMINISTRATION ROAD, UNIT 13",VAUGHAN,,L4K-4G9,905-541-3833,,,463610035,Chess Supersite Corp|River Run Acquisition Corp,2026-05-15,10-Q,Y
|
||||
1445942,Texas Mineral Resources Corp.,Texas Mineral Resources,Texas Mineral Resources Corp.,TMRC,TMRC,OTC,DE,DE,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,539 EL PASO STREET,,SIERRA BLANCA,TX,79851,539 EL PASO STREET,SIERRA BLANCA,TX,79851,(915) 369-2133,,,870294969,Texas Rare Earth Resources Corp.|Standard Silver Corp.,2026-04-24,4,Y
|
||||
1066684,THEGLOBE COM INC,Theglobe Com,Theglobe Com Inc,TGLO,TGLO,OTC,DE,DE,Y,7310,Services-Advertising,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,110 EAST BROWARD BOULEVARD,SUITE 1400,FORT LAUDERDALE,FL,33301,PO BOX 029006,FORT LAUDERDALE,FL,33302,954 769 5900,,,141782422,,2026-05-22,10-Q,Y
|
||||
1912582,"Thunder Power Holdings, Inc.",Thunder Power Holdings,"Thunder Power Holdings, Inc.",AIEV,AIEV,OTC,DE,DE,Y,3711,Motor Vehicles & Passenger Car Bodies,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"UNIT 5, 21/F., WESTLEY SQUARE","48 HOI YUEN ROAD, KWUN TONG",KOWLOON,,,"UNIT 5, 21/F., WESTLEY SQUARE",KOWLOON,,,909-214-2482,,,874620515,Feutune Light Acquisition Corp,2026-06-02,DEF 14C,Y
|
||||
2107523,Titan Holdings Corp.,Titan Holdings,Titan Holdings Corp.,KMCM,KMCM,,DE,DE,Y,1000,Metal Mining,other,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"701 BRICKELL AVE., SUITE 1550",,MIAMI,FL,33131,"701 BRICKELL AVE., SUITE 1550",MIAMI,FL,33131,305-728-5376,,,000000000,,2026-04-21,425,Y
|
||||
730349,TOFUTTI BRANDS INC,Tofutti Brands,Tofutti Brands Inc,TOFB,TOFB,OTC,DE,DE,Y,2024,Ice Cream & Frozen Desserts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,105 NEWFIELD AVENUE,SUITE H,EDISON,NJ,08837,105 NEWFIELD AVE,EDISON,NJ,08837,9082722400,,,133094658,,2026-05-18,10-Q,Y
|
||||
846377,"Totaligent, Inc.",Totaligent,"Totaligent, Inc.",TGNT,TGNT,OTC,DE,DE,Y,6153,Short-Term Business Credit Institutions,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3651 FAU BLVD SUITE 400,,BOCA RATON,FL,,3651 FAU BLVD SUITE 400,BOCA RATON,FL,,561-988-2621,,,800142655,"ALLTEMP, INC.|SOURCE FINANCIAL, INC.|WIKI GROUP, INC.|WIKILOAN INC.|SWAP-A-DEBT, INC.|5 FIFTY 5.COM, INC.|WINDSOR CAPITAL CORP",2026-05-15,10-Q,Y
|
||||
1045942,"Track Group, Inc.",Track Group,"Track Group, Inc.",TRCK,TRCK,OTC,DE,DE,Y,3669,"Communications Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,200 E. 5TH AVENUE SUITE 100,,NAPERVILLE,IL,60563,200 E. 5TH AVENUE SUITE 100,NAPERVILLE,IL,60563,877-260-2010,,,870543981,"SecureAlert, Inc.|REMOTE MDX INC|VOLU SOL INC",2026-05-14,D,Y
|
||||
1725262,"Tri-County Financial Group, Inc.",Tri-County Financial Group,"Tri-County Financial Group, Inc.",TYFG,TYFG,OTC,DE,DE,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Emerging growth company,smaller_reporting_<75M,706 WASHINGTON STREET,,MENDOTA,IL,61342,706 WASHINGTON STREET,MENDOTA,IL,61342,815-538-2265,,,363412522,,2026-05-13,10-Q,Y
|
||||
1550453,TriLinc Global Impact Fund LLC,TriLinc Global Impact Fund,TriLinc Global Impact Fund LLC,TRLC,TRLC,OTC,DE,DE,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1230 Rosecrans Ave,SUITE 602,Manhattan Beach,CA,90266,1230 Rosecrans Ave,Manhattan Beach,CA,90266,310-997-0580,,,364732802,,2026-06-01,8-K,Y
|
||||
2011954,Twin Hospitality Group Inc.,Twin Hospitality Group,Twin Hospitality Group Inc.,TWNPQ,TWNPQ,OTC,DE,DE,Y,5812,Retail-Eating Places,operating, / Emerging growth company,smaller_reporting_<75M,"5151 BELT LINE ROAD, SUITE 1200",,DALLAS,TX,75254,"5151 BELT LINE ROAD, SUITE 1200",DALLAS,TX,75254,972-941-3150,,,991232362,,2026-06-04,8-K,Y
|
||||
1723517,UC Asset LP,UC Asset,UC Asset LP,UCASU,UCASU,OTC,DE,DE,Y,6799,"Investors, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2299 PERIMETER PARK DRIVE,SUITE 120,ATLANTA,GA,30341,2299 PERIMETER PARK DRIVE,ATLANTA,GA,30341,(470)475-1035,,,300912782,,2026-06-04,1-A/A,Y
|
||||
1114936,UMeWorld Inc.,UMeWorld,UMeWorld Inc.,UMEW,UMEW,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"UNIT B 12/F, HANG SENG","CAUSEWAY BAY BUILDING, 28 YEE WOO STREET",CAUSEWAY BAY,,00000,"UNIT B 12/F, HANG SENG",CAUSEWAY BAY,,00000,(852) 8191 5550,,,980177440,UMeWorld Ltd|ALPHARX INC,2026-05-15,3,Y
|
||||
2134552,US Elemental Inc.,US Elemental,US Elemental Inc.,ULIT,,,DE,DE,Y,1400,Mining & Quarrying of Nonmetallic Minerals (No Fuels),other,,smaller_reporting_<75M,"241 RIDGE STREET, SUITE 210",,RENO,NV,89501,"241 RIDGE STREET, SUITE 210",RENO,NV,89501,(212) 983-1602,,,000000000,,2026-06-04,425,Y
|
||||
1543623,US NUCLEAR CORP.,Us Nuclear,Us Nuclear Corp.,UCLE,UCLE,OTC,DE,DE,Y,3829,"Measuring & Controlling Devices, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7051 ETON AVENUE,,CANOGA PARK,CA,91303,7051 ETON AVENUE,CANOGA PARK,CA,91303,818-883-7043,,,454535739,"APEX 3, INC.",2026-05-14,NT 10-Q,Y
|
||||
1736510,Variant Alternative Income Fund,Variant Alternative Income Fund,Variant Alternative Income Fund,NICHX,NICHX,,DE,DE,Y,,,other,,smaller_reporting_<75M,"C/O UMB FUND SERVICES, INC.",,MILWAUKEE,WI,53212,"C/O UMB FUND SERVICES, INC.",MILWAUKEE,WI,53212,4142992200,,,000000000,,2026-05-22,N-23C3A,Y
|
||||
2109801,"VARSAL TECH, INC.",Varsal Tech,"Varsal Tech, Inc.",VAT,,,DE,DE,Y,2800,Chemicals & Allied Products,other,,smaller_reporting_<75M,363 IVYLAND ROAD,,WARMINSTER,PA,18974,363 IVYLAND ROAD,WARMINSTER,PA,18974,2159575880,,,413424196,,2026-05-26,S-1,Y
|
||||
839087,VASO Corp,VASO,VASO Corp,VASO,VASO,OTC,DE,DE,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"137 COMMERCIAL STREET, STE. 200",,PLAINVIEW,NY,11803,"137 COMMERCIAL STREET, STE. 200",PLAINVIEW,NY,11803,516-997-4600,,,112871434,"VASOMEDICAL, INC|VASOMEDICAL INC",2026-05-15,10-Q,Y
|
||||
1825079,"Velo3D, Inc.",Velo3D,"Velo3D, Inc.",VLDXW,VELO|VLDXW,OTC,DE,DE,Y,3559,"Special Industry Machinery, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2710 LAKEVIEW CT,,FREMONT,CA,94538,2710 LAKEVIEW CT,FREMONT,CA,94538,(408) 610-3915,,,000000000,JAWS Spitfire Acquisition Corp,2026-06-01,SCHEDULE 13G/A,Y
|
||||
2078149,"Veri MedTech Holdings, Inc.",Veri MedTech Holdings,"Veri MedTech Holdings, Inc.",VRHI,VRHI,OTC,DE,DE,Y,7374,Services-Computer Processing & Data Preparation,other,,smaller_reporting_<75M,"1600 INTERNATIONAL DRIVE, SUITE 600",,MCLEAN,VA,22102,"1600 INTERNATIONAL DRIVE, SUITE 600",MCLEAN,VA,22102,404-468-2883,,,000000000,,2026-06-02,S-1/A,Y
|
||||
1984345,"Vestible Assets, LLC",Vestible Assets,"Vestible Assets, LLC",VTBAS,,OTC,DE,DE,Y,7389,"Services-Business Services, NEC",other,,smaller_reporting_<75M,5440 WEST 110TH STREET,SUITE 300,OVERLAND PARK,KS,66211,5440 WEST 110TH STREET,OVERLAND PARK,KS,66211,417-438-2561,,,932084697,,2026-05-22,1-K,Y
|
||||
1812173,Vicarious Surgical Inc.,Vicarious Surgical,Vicarious Surgical Inc.,RBOT,RBOT|RBOTW,OTC,DE,DE,Y,3842,"Orthopedic, Prosthetic & Surgical Appliances & Supplies",operating, / Emerging growth company,smaller_reporting_<75M,78 FOURTH AVENUE,,WALTHAM,MA,02451,78 FOURTH AVENUE,WALTHAM,MA,02451,(617) 868-1700,,,000000000,D8 Holdings Corp.,2026-04-30,10-Q,Y
|
||||
727510,"Viskase Holdings, Inc.",Viskase Holdings,"Viskase Holdings, Inc.",ENZN,ENZN|ENZND,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"333 EAST BUTTERFIELD ROAD, SUITE 400",,LOMBARD,IL,60148,"333 EAST BUTTERFIELD ROAD, SUITE 400",LOMBARD,IL,60148,(630) 874-0700,,,222372868,"ENZON PHARMACEUTICALS, INC.|ENZON PHARMACEUTICALS INC|ENZON PHARMACEUTICALS INC|ENZON PHARMACEUTICAL INC|ENZON INC",2026-05-05,8-A12G,Y
|
||||
1565228,"Vislink Technologies, Inc.",Vislink Technologies,"Vislink Technologies, Inc.",VISL,VISL,OTC,DE,DE,Y,3669,"Communications Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,350 CLARK DRIVE,SUITE 125,MT. OLIVE,NJ,07828,350 CLARK DRIVE,MT. OLIVE,NJ,07828,941 953 9035,,,205856795,"xG TECHNOLOGY, INC.",2025-06-20,SCHEDULE 13D/A,Y
|
||||
1449349,VIVOS INC,Vivos,Vivos Inc,RDGL,RDGL,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,719 JADWIN AVENUE,,RICHLAND,WA,99352,719 JADWIN AVENUE,RICHLAND,WA,99352,509-736-4000,,,800138937,ADVANCED MEDICAL ISOTOPE Corp,2026-05-14,10-Q,Y
|
||||
1853070,"Volato Group, Inc.",Volato Group,"Volato Group, Inc.",SOARW,SOAR|SOARW,OTC,DE,DE,Y,4522,"Air Transportation, Nonscheduled",operating, / Emerging growth company,smaller_reporting_<75M,1954 AIRPORT ROAD,SUITE 124,CHAMBLEE,GA,30341,1954 AIRPORT ROAD,CHAMBLEE,GA,30341,844-399-8998,,,862707040,PROOF Acquisition Corp I,2026-06-08,8-K,Y
|
||||
1580864,"Vroom, Inc.",Vroom,"Vroom, Inc.",VRMWW,VRM|VRMWW,OTC,DE,DE,Y,5500,Retail-Auto Dealers & Gasoline Stations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"3600 W SAM HOUSTON PKWY S, FLOOR 4",,HOUSTON,TX,77042,"3600 W SAM HOUSTON PKWY S, FLOOR 4",HOUSTON,TX,77042,646-979-4746,,,901112566,"AutoAmerica, Inc.",2026-06-05,4,Y
|
||||
1424768,VYCOR MEDICAL INC,Vycor Medical,Vycor Medical Inc,VYCO,VYCO,OTC,DE,DE,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,951 BROKEN SOUND PARKWAY,SUITE 320,"BOCA RATON,",FL,33487,951 BROKEN SOUND PARKWAY,"BOCA RATON,",FL,33487,562.558.2000,,,203369218,,2026-05-15,8-K,Y
|
||||
1745078,"Vynleads, Inc.",Vynleads,"Vynleads, Inc.",VYND,VYND,OTC,DE,DE,Y,7200,Services-Personal Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,596 HERRONS FERRY ROAD,SUITE 301,ROCK HILL,SC,29730,596 HERRONS FERRY ROAD,ROCK HILL,SC,29730,845-745-0981,,,474584272,,2026-05-15,NT 10-Q,Y
|
||||
1921603,WhiteHawk Income Corp,WhiteHawk Income,WhiteHawk Income Corp,WHK,WHK,,DE,DE,Y,1311,Crude Petroleum & Natural Gas,other,,smaller_reporting_<75M,2400 MARKET STREET,OFFSITE SUITE 230,PHILADELPHIA,PA,19103,2400 MARKET STREET,PHILADELPHIA,PA,19103,917 691-9676,,,880862160,,2026-06-09,8-A12B,Y
|
||||
946486,WINDTREE THERAPEUTICS INC /DE/,Windtree Therapeutics,Windtree Therapeutics Inc,WINT,WINT,OTC,DE,DE,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2600 KELLY ROAD,SUITE 100,WARRINGTON,PA,18976,2600 KELLY ROAD,WARRINGTON,PA,18976,2154889300,,,943171943,DISCOVERY LABORATORIES INC /DE/|ANSAN PHARMACEUTICALS INC|ANSAN INC,2026-04-01,NT 10-K,Y
|
||||
1854463,WinVest Acquisition Corp.,WinVest Acquisition,WinVest Acquisition Corp.,WINV,WINV|WINVR|WINVU|WINVW,OTC,DE,DE,Y,6770,Blank Checks,operating, / Emerging growth company,smaller_reporting_<75M,125 CAMBRIDGEPARK DRIVE,SUITE 301,CAMBRIDGE,MA,02140,125 CAMBRIDGEPARK DRIVE,CAMBRIDGE,MA,02140,(617) 658-3094,,,862451181,,2026-06-01,425,Y
|
||||
1785494,Woodbridge Liquidation Trust,Woodbridge Liquidation Trust,Woodbridge Liquidation Trust,WBQNL,WBQNL,OTC,DE,DE,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"C/O AKERMAN LLP, LAS OLAS CENTER II","350 EAST LAS OLAS BOULEVARD, SUITE 1600",FORT LAUDERDALE,FL,33301,"C/O AKERMAN LLP, LAS OLAS CENTER II",FORT LAUDERDALE,FL,33301,954 4632700,,,367730868,,2026-05-14,10-Q,Y
|
||||
943535,"WORLD HEALTH ENERGY HOLDINGS, INC.",World Health Energy Holdings,"World Health Energy Holdings, Inc.",WHEN,WHEN,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1825 NW CORPORATE BLVD,SUITE 110,BOCA RATON,FL,33431,1825 NW CORPORATE BLVD,BOCA RATON,FL,33431,5618700440,,,592762023,ADVANCED PLANT PHARMACEUTICALS INC,2026-04-15,8-K,Y
|
||||
1813744,"World Scan Project, Inc.",World Scan Project,"World Scan Project, Inc.",WDSP,WDSP,OTC,DE,DE,Y,5045,Wholesale-Computers & Peripheral Equipment & Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"2-18-23, NISHIWASEDA",,"SHINJUKU-KU, TOKYO",M0,162-0051,"2-18-23, NISHIWASEDA","SHINJUKU-KU, TOKYO",M0,162-0051,81-3-6670-1692,,,352677532,,2025-10-27,8-K,Y
|
||||
1279715,"Wright Investors Service Holdings, Inc.",Wright Investors Service Holdings,"Wright Investors Service Holdings, Inc.",IWSH,IWSH,OTC,DE,DE,Y,6282,Investment Advice,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,118 NORTH BEDFORD ROAD,SUITE 100,MT KISCO,NY,10549,118 NORTH BEDFORD ROAD,MT KISCO,NY,10549,(914) 242-5700,,,134005439,NATIONAL PATENT DEVELOPMENT CORP,2026-05-15,10-Q,Y
|
||||
2111860,"Xtend AI Robotics, Inc.",Xtend AI Robotics,"Xtend AI Robotics, Inc.",XTND,XTND,,DE,DE,Y,3760,Guided Missiles & Space Vehicles & Parts,other,,smaller_reporting_<75M,5247 CROSSROADS PARK DRIVE,,TAMPA,FL,33610,5247 CROSSROADS PARK DRIVE,TAMPA,FL,33610,000-000-0000,,,000000000,,2026-06-02,425,Y
|
||||
2040753,"Xtreme One Entertainment, Inc.",Xtreme One Entertainment,"Xtreme One Entertainment, Inc.",XONI,XONI,OTC,DE,DE,Y,7900,Services-Amusement & Recreation Services,other,,smaller_reporting_<75M,47 COMMERCE SW,,GRAND RAPIDS,MI,49503,47 COMMERCE SW,GRAND RAPIDS,MI,49503,305-701-9100,,,208535566,,2026-05-12,SEC STAFF ACTION,Y
|
||||
1311673,"Yale Transaction Finders, Inc.",Yale Transaction Finders,"Yale Transaction Finders, Inc.",YTFD,YTFD,OTC,DE,DE,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2308/C KETTNER BLVD.,,SAN DIEGO,CA,92101,2308/C KETTNER BLVD.,SAN DIEGO,CA,92101,619-232-1001,,,760736467,"Yacht Finders, Inc.",2026-05-18,8-K,Y
|
||||
1843714,"Zapata Quantum, Inc.",Zapata Quantum,"Zapata Quantum, Inc.",ZPTA,ZPTA|ZPTAW,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,6 LIBERTY SQUARE,#2488,BOSTON,MA,02109,6 LIBERTY SQUARE,BOSTON,MA,02109,857-367-9002,,,981578373,Zapata Computing Holdings Inc.|Andretti Acquisition Corp.,2026-06-05,S-1,Y
|
||||
1594204,ZHEN DING RESOURCES INC.,Zhen Ding Resources,Zhen Ding Resources Inc.,RBTK,RBTK,OTC,DE,DE,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,99 AVE DE LA MOSELLE,,SAINT LAMBERT,A8,J45 1W9,99 AVE DE LA MOSELLE,SAINT LAMBERT,A8,J45 1W9,(438) 376-5317,,,113350926,,2026-05-14,10-Q,Y
|
||||
1131312,ZION OIL & GAS INC,Zion Oil & Gas,Zion Oil & Gas Inc,ZNOG,ZNOG|ZNOGW,OTC,DE,DE,Y,1382,Oil & Gas Field Exploration Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12655 NORTH CENTRAL EXPRESSWAY,SUITE 1000,DALLAS,TX,75243,12655 NORTH CENTRAL EXPRESSWAY,DALLAS,TX,75243,2142214610,,,200065053,,2026-06-03,8-K,Y
|
||||
1854275,"Zoomcar Holdings, Inc.",Zoomcar Holdings,"Zoomcar Holdings, Inc.",ZCAR,ZCAR|ZCARW,OTC,DE,DE,Y,7510,Services-Auto Rental & Leasing (No Drivers),operating, / Emerging growth company,smaller_reporting_<75M,"ANJANEYA TECHNO PARK, NO.147, 1ST FLOOR",KODIHALLI,BANGALORE,K7,560008,"ANJANEYA TECHNO PARK, NO.147, 1ST FLOOR",BANGALORE,K7,560008,91 99454-8382,,,000000000,Innovative International Acquisition Corp.,2026-06-05,8-K,Y
|
||||
1637147,"zSpace, Inc.",zSpace,"zSpace, Inc.",ZSPC,ZSPC,OTC,DE,DE,Y,7372,Services-Prepackaged Software,operating, / Emerging growth company,smaller_reporting_<75M,2050 GATEWAY PLACE,SUITE 100-302,SAN JOSE,CA,95110,2050 GATEWAY PLACE,SAN JOSE,CA,95110,(408)498-4050,,,352284050,,2026-06-01,8-K,Y
|
||||
1859007,"ZyVersa Therapeutics, Inc.",ZyVersa Therapeutics,"ZyVersa Therapeutics, Inc.",ZVSA,ZVSA,OTC,DE,DE,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2436 NORTH FEDERAL HIGHWAY,SUITE 466,LIGHTHOUSE POINT,FL,33064,2436 NORTH FEDERAL HIGHWAY,LIGHTHOUSE POINT,FL,33064,908-370-5102,,,862685744,Larkspur Health Acquisition Corp.,2026-05-13,10-Q,Y
|
||||
1877461,1606 CORP.,1606,1606 Corp.,CBDW,CBDW,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating, / Emerging growth company,smaller_reporting_<75M,2425 E. CAMELBACK RD,SUITE 150,PHOENIX,AZ,85016,2425 E. CAMELBACK RD,PHOENIX,AZ,85016,602-481-1544,,,861497346,,2026-06-03,8-K,Y
|
||||
1453122,"3DX Industries, Inc.",3DX Industries,"3DX Industries, Inc.",DDDX,,OTC,NV,NV,Y,2750,Commercial Printing,operating,Smaller reporting company,smaller_reporting_<75M,"6920 SALASHAN PARKWAY, BUILDING D-100",,FERNDALE,WA,98248,"6920 SALASHAN PARKWAY, BUILDING D-100",FERNDALE,WA,98248,949-682-7889,,,000000000,"Amarok Resources, Inc.|Ukragro Corp",2026-05-13,1-A,Y
|
||||
1464865,"Accredited Solutions, Inc.",Accredited Solutions,"Accredited Solutions, Inc.",ASII,ASII,OTC,NV,NV,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"20311 CHARTWELL CENTER DRIVE, SUITE 1469",,CORNELIUS,NC,28031,"20311 CHARTWELL CENTER DRIVE, SUITE 1469",CORNELIUS,NC,28031,800-947-9197,,,452578051,"Good Hemp, Inc.|Lone Star Gold, Inc.|Keyser Resources, Inc.",2025-07-18,15-12G/A,Y
|
||||
1622996,"ACRO BIOMEDICAL CO., LTD.",Acro Biomedical Co.,"Acro Biomedical Co., Ltd.",ACBM,ACBM,OTC,NV,NV,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12175 VISIONARY WAY,SUITE 1160,FISHERS,IN,46038,12175 VISIONARY WAY,FISHERS,IN,46038,(317) 286-6788,,,471950356,"KILLER WAVES HAWAII, INC",2026-05-05,10-Q,Y
|
||||
1420924,"Adapti, Inc.",Adapti,"Adapti, Inc.",ADTI,ADTI,OTC,NV,NV,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2818 FORT HAMILTON PARKWAY,,BROOKLYN,NY,11218,2818 FORT HAMILTON PARKWAY,BROOKLYN,NY,11218,347.834.7118,,,000000000,"Scepter Holdings, Inc. NV|Brazos International Exploration, Inc.",2026-06-02,3,Y
|
||||
1160420,"Adia Nutrition, Inc.",Adia Nutrition,"Adia Nutrition, Inc.",ADIA,ADIA,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4421 GABRIELLA LANE,,WINTER PARK,FL,32792,4421 GABRIELLA LANE,WINTER PARK,FL,32792,321-231-2843,,,870675769,"PivX Solutions, Inc.|DRILLING INC",2026-05-15,10-Q,Y
|
||||
1588014,"ADM ENDEAVORS, INC.",Adm Endeavors,"Adm Endeavors, Inc.",ADMQ,ADMQ,OTC,NV,NV,Y,7310,Services-Advertising,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5941 POSEY LANE,,HALTOM CITY,TX,76117,5941 POSEY LANE,HALTOM CITY,TX,76117,817-637-2150,,,450459323,,2026-06-05,4,Y
|
||||
930245,Agassi Sports Entertainment Corp.,Agassi Sports Entertainment,Agassi Sports Entertainment Corp.,AASP,AASP,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1120 N. TOWN CENTER DR #160,,LAS VEGAS,NV,89144,1120 N. TOWN CENTER DR #160,LAS VEGAS,NV,89144,702-400-4005,,,880203976,GLOBAL ACQUISITIONS Corp|ALL AMERICAN SPORTPARK INC|SAINT ANDREWS GOLF CORP,2026-06-05,8-K,Y
|
||||
1603345,Agentix Corp.,Agentix,Agentix Corp.,AGTX,AGTX,OTC,NV,NV,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,32932 PACIFIC COAST HIGHWAY,#14-254,DANA POINT,CA,92629,32932 PACIFIC COAST HIGHWAY,DANA POINT,CA,92629,321-229-2014,,,462876282,FairWind Energy Inc.,2026-02-17,10-Q,Y
|
||||
1605331,AI Era Corp.,AI Era,AI Era Corp.,AERA,AERA,OTC,NV,NV,Y,6794,Patent Owners & Lessors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,144 MAIN STREET,SUITE 1009,MT. KISCO,NY,10549,144 MAIN STREET,MT. KISCO,NY,10549,(917) 336-2398,,,371740351,AB INTERNATIONAL GROUP CORP.,2026-05-11,8-K,Y
|
||||
1763329,"AIBOTICS, INC.",Aibotics,"Aibotics, Inc.",AIBT,AIBT,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,480 22ND STREET,,HEYBURN,ID,83336,480 22ND STREET,HEYBURN,ID,83336,208-677-2020,,,870645794,"Mycotopia Therapies, Inc.|20/20 Global, Inc.",2026-06-09,10-Q,Y
|
||||
1950209,Ainnova Tech,Ainnova Tech,Ainnova Tech,ZHDM,ZHDM,OTC,NV,NV,Y,,,other,,smaller_reporting_<75M,"440 LOUISIANA STREET, LYRIC TOWER",SUITE 900,HOUSTON,TX,77002,"440 LOUISIANA STREET, LYRIC TOWER",HOUSTON,TX,77002,713-714-0779,,,873747314,,2025-08-26,D/A,Y
|
||||
1532390,ALKALINE WATER Co INC,ALKALINE WATER Co,ALKALINE WATER Co INC,WTER,WTER,OTC,NV,NV,Y,5140,Wholesale-Groceries & Related Products,operating, / Emerging growth company,smaller_reporting_<75M,5524 N 51ST AVE,,GLENDALE,AZ,85301,5524 N 51ST AVE,GLENDALE,AZ,85301,480-656-2423,,,990367049,GLOBAL LINES INC,2025-12-23,8-K,Y
|
||||
1484674,"ALL THINGS MOBILE ANALYTIC, INC.",All Things Mobile Analytic,"All Things Mobile Analytic, Inc.",ATMH,ATMH,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Smaller reporting company,smaller_reporting_<75M,209 W 29TH STREET,SUITE 6241,NEW YORK,X1,10001,209 W 29TH STREET,NEW YORK,X1,10001,(888) 350-4660,,,854301443,TORON INC.,2025-12-30,RW,Y
|
||||
1834868,Alternative Ballistics Corp,Alternative Ballistics,Alternative Ballistics Corp,ALBC,ALBC,OTC,NV,NV,Y,3480,"Ordnance & Accessories, (No Vehicles/Guided Missiles)",other,,smaller_reporting_<75M,5940 S. RAINBOW BLVD,,LAS VEGAS,NV,89118,5940 S. RAINBOW BLVD,LAS VEGAS,NV,89118,619-326-4411,,,852764555,Alternative Ballisitics Corp,2026-04-30,1-K,Y
|
||||
773717,"American Clean Resources Group, Inc.",American Clean Resources Group,"American Clean Resources Group, Inc.",ACRG,ACRG,OTC,NV,NV,Y,1400,Mining & Quarrying of Nonmetallic Minerals (No Fuels),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12567 WEST CEDAR DRIVE,SUITE 104,LAKEWOOD,CO,80228-2039,12567 WEST CEDAR DRIVE,LAKEWOOD,CO,80228-2039,8889607347,,,840991764,"Standard Metals Processing, Inc.|Standard Gold Holdings, Inc.|Standard Gold|PRINCETON ACQUISITIONS INC",2026-05-29,4,Y
|
||||
1545236,American Heritage International Inc.,American Heritage International,American Heritage International Inc.,AHII,AHII,OTC,NV,NV,Y,4950,Sanitary Services,operating,Smaller reporting company,smaller_reporting_<75M,222 N. EXPRESSWAY,77/83,BROWNSVILLE,TX,78521,222 N. EXPRESSWAY,BROWNSVILLE,TX,78521,7755804544,,,711052991,Cumberland Hills Ltd.,2026-03-18,D,Y
|
||||
1356371,"AMERICAN LITHIUM MINERALS, INC.",American Lithium Minerals,"American Lithium Minerals, Inc.",AMLM,AMLM,OTC,NV,NV,Y,1000,Metal Mining,operating,,smaller_reporting_<75M,1007 SOUTH STREET,,CARSON CITY,NV,89701,1007 SOUTH STREET,CARSON CITY,NV,89701,877-734-8787,,,711049972,Nugget Resources Inc.,2026-02-04,QUALIF,Y
|
||||
1648087,AMERICAN REBEL HOLDINGS INC,American Rebel Holdings,American Rebel Holdings Inc,AREB,AREB|AREBW,OTC,NV,NV,Y,3490,Miscellaneous Fabricated Metal Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"218 3RD AVENUE NORTH, #400",,NASHVILLE,TN,37201,"218 3RD AVENUE NORTH, #400",NASHVILLE,TN,37201,833-267-3235,,,473892903,CUBESCAPE INC,2026-06-02,DEF 14A,Y
|
||||
1514443,"AMERIGUARD SECURITY SERVICES, INC.",Ameriguard Security Services,"Ameriguard Security Services, Inc.",AGSS,AGSS,OTC,NV,NV,Y,7381,"Services-Detective, Guard & Armored Car Services",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"5470 W. SPRUCE AVENUE , SUITE 102",,FRESNO,CA,93722,"5470 W. SPRUCE AVENUE , SUITE 102",FRESNO,CA,93722,559-271-5984,,,990363866,"HEALTH REVENUE ASSURANCE HOLDINGS, INC.|ANVEX INTERNATIONAL, INC.",2026-04-20,8-K,Y
|
||||
1781629,"Ankam, Inc.",Ankam,"Ankam, Inc.",ANKM,ANKM,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating, / Emerging growth company,smaller_reporting_<75M,"5F, NO. 97, JINGYE 1ST RD.",ZHONGSHAN DIST.,TAIPEI CITY,F5,104,"5F, NO. 97, JINGYE 1ST RD.",TAIPEI CITY,F5,104,886-928-486237,,,611900749,Ankam Inc.,2026-04-30,10-Q,Y
|
||||
1570132,"ANVI GLOBAL HOLDINGS, INC.",Anvi Global Holdings,"Anvi Global Holdings, Inc.",ANVI,ANVI,OTC,NV,NV,Y,5400,Retail-Food Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1135 KILDAIRE FARM ROAD,SUITE 319-4,CARY,NC,27511,1135 KILDAIRE FARM ROAD,CARY,NC,27511,408 821 4491,,,331226144,"VETRO, INC.",2026-06-03,10-K,Y
|
||||
1134982,"Apple iSports Group, Inc.",Apple iSports Group,"Apple iSports Group, Inc.",AAPI,AAPI,OTC,NV,NV,Y,6411,"Insurance Agents, Brokers & Service",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,100 SPECTRUM CENTER DRIVE,SUITE 900,IRVINE,CA,920618,100 SPECTRUM CENTER DRIVE,IRVINE,CA,920618,61 3 8393 1459,,,880126444,PREVENTION INSURANCE COM|PREVENTION INSURANCE COM INC,2026-05-21,10-Q,Y
|
||||
1755101,APPlife Digital Solutions Inc,APPlife Digital Solutions,APPlife Digital Solutions Inc,ALDS,ALDS,OTC,NV,NV,Y,5531,Retail-Auto & Home Supply Stores,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,50 CALIFORNIA ST,SUITE 1500,SAN FRANCISCO,CA,94111,50 CALIFORNIA ST,SAN FRANCISCO,CA,94111,4154395260,,,824868628,,2026-05-13,10-Q,Y
|
||||
1651992,"Appsoft Technologies, Inc.",Appsoft Technologies,"Appsoft Technologies, Inc.",ASFT,ASFT,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1225 FRANKLIN AVE.,SUITE 325,GARDEN CITY,NY,11530,1225 FRANKLIN AVE.,GARDEN CITY,NY,11530,5162247717,,,473427919,,2026-05-20,10-Q,Y
|
||||
1498148,Artificial Intelligence Technology Solutions Inc.,Artificial Intelligence Technology Solutions,Artificial Intelligence Technology Solutions Inc.,AITX,AITX,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,10800 GALAXIE AVENUE,,FERNDALE,MI,48220,10800 GALAXIE AVENUE,FERNDALE,MI,48220,(877) 787-6268,,,272343603,ON THE MOVE SYSTEMS CORP.,2026-06-09,10-K,Y
|
||||
1113313,ARVANA INC,Arvana,Arvana Inc,AVNI,AVNI,OTC,NV,NV,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,299 S. MAIN STREET,13TH FLOOR,SALT LAKE CITY,UT,84111,299 S. MAIN STREET,SALT LAKE CITY,UT,84111,(801) 232-7395,,,870618509,TURINCO INC,2026-04-23,8-K,Y
|
||||
1828748,ASIAFIN HOLDINGS CORP.,Asiafin Holdings,Asiafin Holdings Corp.,ASFH,ASFH,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating, / Emerging growth company,smaller_reporting_<75M,"SUITE 30.02, 30TH FLOOR,","MENARA KH(PROMET), JALAN SULTAN ISMAIL,",KUALA LUMPUR,N8,50250,"SUITE 30.02, 30TH FLOOR,",KUALA LUMPUR,N8,50250,60321487170,,,371950147,,2026-05-19,8-K,Y
|
||||
1095146,Athena Bitcoin Global,Athena Bitcoin Global,Athena Bitcoin Global,ABIT,ABIT,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,800 NW 7TH AVENUE,,MIAMI,FL,33136,800 NW 7TH AVENUE,MIAMI,FL,33136,312-690-4466,,,870493596,GAMEPLAN INC,2026-05-22,15-12G,Y
|
||||
1673504,Atlantis Glory Inc.,Atlantis Glory,Atlantis Glory Inc.,AGLY,AGLY,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM 2106, BEAUTIFUL GROUP TOWER",77 CONNAUGHT ROAD,HONG KONG,F4,00000,"ROOM 2106, BEAUTIFUL GROUP TOWER",HONG KONG,F4,00000,86-18503010555,,,383995730,Shengshi Elevator International Holding Group Inc.|Galem Group Inc.,2026-04-30,10-Q,Y
|
||||
1338929,"Authentic Holdings, Inc.",Authentic Holdings,"Authentic Holdings, Inc.",AHRO,AHRO,OTC,NV,NV,Y,5130,"Wholesale-Apparel, Piece Goods & Notions",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,55 MADISON AVE #400,,MORRISTOWN,NJ,07960,55 MADISON AVE #400,MORRISTOWN,NJ,07960,732-695-4389,,,113746201,"Global Fiber Technologies, Inc.|ECO TEK 360 INC|Global Fashion Technologies, Inc.|Premiere Opportunities Group, Inc.|Premiere Publishing Group, Inc.|Premier Publishing Group, Inc.",2026-04-15,15-12G,Y
|
||||
1740797,"AVAI BIO, INC.",Avai Bio,"Avai Bio, Inc.",AVAI,AVAI,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5348 VEGAS DRIVE,,LAS VEGAS,NV,89108,5348 VEGAS DRIVE,LAS VEGAS,NV,89108,866-533-0065,,,384053064,AVANT TECHNOLOGIES INC.|TREND INNOVATIONS HOLDING INC.|FREECOOK,2026-05-08,8-K,Y
|
||||
1631463,Barrel Energy Inc.,Barrel Energy,Barrel Energy Inc.,BRLL,,OTC,NV,NV,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3859 S VALLEY VIEW BLVD,SUITE 2 #107,LAS VEGAS,NV,,3859 S VALLEY VIEW BLVD,LAS VEGAS,NV,,888-397-9114,,,471963189,,2026-05-14,10-Q,Y
|
||||
1448705,"BASANITE, INC.",Basanite,"Basanite, Inc.",BASA,BASA,OTC,NV,NV,Y,3990,Miscellaneous Manufacturing Industries,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,216 CROWN STREET,STE 502,NEW HAVEN,CT,06510,216 CROWN STREET,NEW HAVEN,CT,06510,888-501-1176,,,204959207,"PayMeOn, Inc.|MMAX MEDIA, INC.|Nevada Processing Solutions",2026-06-05,8-K,Y
|
||||
1409197,"Bespoke Extracts, Inc.",Bespoke Extracts,"Bespoke Extracts, Inc.",BSPK,BSPK,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,12001 E. 33RD ST- UNIT O,,AURORA,CO,80010,12001 E. 33RD ST- UNIT O,AURORA,CO,80010,720-949-1143,,,204743354,"DiMi Telematics International, Inc.|First Quantum Ventures Inc|FIRST QUANTUM VENTURES INC",2026-05-18,NT 10-Q,Y
|
||||
1593184,"BIOREGENX, INC.",Bioregenx,"Bioregenx, Inc.",BRGX,BRGX,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7407 ZIEGLER ROAD,,CHATTANOOGA,TN,37421,7407 ZIEGLER ROAD,CHATTANOOGA,TN,37421,(866) 770-4067,,,462836541,"FINDIT, INC.|ARTEMIS ENERGY HOLDINGS, INC.",2026-05-20,10-Q,Y
|
||||
1784440,"BioScience Health Innovations, Inc.",BioScience Health Innovations,"BioScience Health Innovations, Inc.",BHIC,BHIC,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2722 S WEST TEMPLE,,SALT LAKE CITY,UT,84115,2722 S WEST TEMPLE,SALT LAKE CITY,UT,84115,801-949-0791,,,000000000,Nowtransit Inc,2026-05-11,10-Q,Y
|
||||
1630113,BIOTRICITY INC.,Biotricity,Biotricity Inc.,BTCY,BTCY,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,203 REDWOOD PARKWAY,SUITE 600,REDWOOD CITY,CA,94065,203 REDWOOD PARKWAY,REDWOOD CITY,CA,94065,(800) 590-4155,,,472548273,"METASOLUTIONS, INC.",2026-05-29,PRE 14C,Y
|
||||
1445815,"BIOXYTRAN, INC",Bioxytran,"Bioxytran, Inc",BIXT,BIXT,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"C/O BIOXYTRAN, INC.","75 2ND AVE, SUITE 605 STE 605",NEEDHAM,MA,02494,"C/O BIOXYTRAN, INC.",NEEDHAM,MA,02494,617-494-1199,,,262797630,"U.S. RARE EARTH MINERALS, INC.|U.S. RARE EARTH MINERALS, INC|U.S. Natural Nutrients & Minerals, Inc.|AMERICA'S DRIVING RANGES, INC.",2026-05-15,10-Q,Y
|
||||
1873213,Birdie Win Corp,Birdie Win,Birdie Win Corp,BRWC,BRWC,OTC,NV,NV,Y,8200,Services-Educational Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"D109, LEVEL 1, BLOCK D, KELANA SQUARE","JALAN SS 7/26, PETALING JAYA",SELANGOR,N8,47301,"D109, LEVEL 1, BLOCK D, KELANA SQUARE",SELANGOR,N8,47301,60327764841,,,384179726,,2026-06-08,10-Q,Y
|
||||
1549145,"BLUE BIOFUELS, INC.",Blue Biofuels,"Blue Biofuels, Inc.",BIOF,BIOF,OTC,NV,NV,Y,2860,Industrial Organic Chemicals,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3710 BUCKEYE ST,SUITE 120,PALM BEACH GARDENS,FL,33401,3710 BUCKEYE ST,PALM BEACH GARDENS,FL,33401,(888)607-3555,,,454944960,"ALLIANCE BIOENERGY PLUS, INC.|Alliance Media Group Holdings, Inc.",2026-06-09,8-K,Y
|
||||
1416697,"Blue Line Protection Group, Inc.",Blue Line Protection Group,"Blue Line Protection Group, Inc.",BLPG,BLPG,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5765 LOGAN STREET,,DENVER,CO,80216,5765 LOGAN STREET,DENVER,CO,80216,800-844-5576,,,205543728,"Engraving Masters, Inc.|Engraving Master Inc",2025-08-08,15-12G,Y
|
||||
1496690,"BlueOne Technologies, Inc.",BlueOne Technologies,"BlueOne Technologies, Inc.",BCRD,BCRD,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"4695 MACARTHUR COURT,",SUITE 1100,NEWPORT BEACH,CA,92660,"4695 MACARTHUR COURT,",NEWPORT BEACH,CA,92660,800-210-9755,,,260478989,"BlueOne Card, Inc.|Manneking, Inc.|TBSS International, Inc.|Avenue South Ltd.",2026-05-13,8-K,Y
|
||||
1416090,BLUSKY AI INC.,Blusky Ai,Blusky Ai Inc.,BSAI,BSAI,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5330 SO 900 E,STE 280,MURRAY,UT,84117,5330 SO 900 E,MURRAY,UT,84117,801-312-8113,,,352302128,"INCEPTION MINING INC.|GOLD AMERICAN MINING CORP.|SILVER AMERICA, INC.|Golf Alliance CORP|GOLF ALLIANCE CORP",2026-05-22,8-K,Y
|
||||
1130781,"BMP AI Technologies, Inc.",BMP AI Technologies,"BMP AI Technologies, Inc.",BMPA,BMPA,OTC,NV,NV,Y,7812,Services-Motion Picture & Video Tape Production,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,10409 PACIFIC PALISADES AVE.,,LAS VEGAS,,00000,10409 PACIFIC PALISADES AVE.,LAS VEGAS,,00000,727-314-3717,,,912090516,"NEURALBASE AI LTD.|Viratech Corp.|Soleil Film, Inc.|Soleil Film & Television, Inc.|AMERI DREAM ENTERTAINMENT INC|MCSMOOTHIES INC",2026-05-20,10-Q,Y
|
||||
1122993,BROOKMOUNT EXPLORATIONS INC,Brookmount Explorations,Brookmount Explorations Inc,BMXI,BMXI,OTC,NV,NV,Y,1400,Mining & Quarrying of Nonmetallic Minerals (No Fuels),operating,,smaller_reporting_<75M,14TH FLOOR 400 BURRARD STREET,V6C 3G2,VANCOUVER BC,A1,V6C 3G2,14TH FLOOR 400 BURRARD STREET,VANCOUVER BC,A1,V6C 3G2,604.643.1745,,,980382063,,2026-04-28,SCHEDULE 13G,Y
|
||||
1397795,Bryn Inc.,Bryn,Bryn Inc.,BRRN,BRRN,OTC,NV,NV,Y,8741,Services-Management Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2332 GALIANO STREET,"2D FLOOR, #5138",CORAL GABLES,FL,33143,2332 GALIANO STREET,CORAL GABLES,FL,33143,305-988-9807,,,204682058,"Byrn, Inc.|Born, Inc.|QUTURE INTERNATIONAL, INC.|TECHS LOANSTAR, INC.",2026-05-19,10-Q,Y
|
||||
1407583,Bunker Hill Mining Corp.,Bunker Hill Mining,Bunker Hill Mining Corp.,BHLL,BHLL,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,82 RICHMOND STREET EAST,TORONTO,ONTARIO,A6,M5C 1P1,82 RICHMOND STREET EAST,ONTARIO,A6,M5C 1P1,416-477-7771,,,320196442,Liberty Silver Corp|LIBERTY SILVER CORP|Lincoln Mining Corp,2026-05-13,DEF 14A,Y
|
||||
1882781,"C2 Blockchain, Inc.",C2 Blockchain,"C2 Blockchain, Inc.",CBLO,CBLO,OTC,NV,NV,Y,6199,Finance Services,operating, / Emerging growth company,smaller_reporting_<75M,"12818 SW 8TH ST., UNIT #2008",,MIAMI,FL,33184,"12818 SW 8TH ST., UNIT #2008",MIAMI,FL,33184,8884373432,,,872645378,"C2 Blockchain,Inc.",2026-06-02,8-K,Y
|
||||
2027982,"C2 Capital Group, Inc.",C2 Capital Group,"C2 Capital Group, Inc.",CCLV,CCLV,,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,other,,smaller_reporting_<75M,5825 WINDSOR COURT,,BOCA RATON,FL,33496,5825 WINDSOR COURT,BOCA RATON,FL,33496,561-445-3665,,,000000000,,2026-04-29,FWP,Y
|
||||
1174891,"CalEthos, Inc.",CalEthos,"CalEthos, Inc.",GEDC,GEDC,OTC,NV,NV,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,THREE SUGAR CREEK CENTER,SUITE 100,SUGAR LAND,TX,77478,THREE SUGAR CREEK CENTER,SUGAR LAND,TX,77478,713-929-3863,,,000000000,"RealSource Residential, Inc|UPSTREAM BIOSCIENCES INC.|FORCE ENERGY CORP.|INTEGRATED BRAND SOLUTIONS INC",2026-05-14,10-Q,Y
|
||||
1680132,CANNABIS SUISSE CORP.,Cannabis Suisse,Cannabis Suisse Corp.,CSUI,CSUI,OTC,NV,NV,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,10 NORTH NEWNAN STREET,SUITE A,JACKSONVILLE,FL,32202,10 NORTH NEWNAN STREET,JACKSONVILLE,FL,32202,904-598-5820,,,383993849,Geant Corp.,2026-04-20,10-Q,Y
|
||||
1377149,CareView Communications Inc,CareView Communications,CareView Communications Inc,CRVW,CRVW,OTC,NV,NV,Y,3663,Radio & Tv Broadcasting & Communications Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,405 STATE HIGHWAY 121,SUITE B-240,LEWISVILLE,TX,75067,405 STATE HIGHWAY 121,LEWISVILLE,TX,75067,972-943-6050,,,954659068,,2026-05-13,10-Q,Y
|
||||
1678105,Caro Holdings Inc.,Caro Holdings,Caro Holdings Inc.,CAHO,CAHO,OTC,NV,NV,Y,5961,Retail-Catalog & Mail-Order Houses,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7 CASTLE STREET,,SHEFFIELD,X0,S3 8LT,7 CASTLE STREET,SHEFFIELD,X0,S3 8LT,(786) 755-3210,,,000000000,,2026-02-13,10-Q,Y
|
||||
1776073,CBD Life Sciences Inc.,CBD Life Sciences,CBD Life Sciences Inc.,CBDL,CBDL,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,other,,smaller_reporting_<75M,10953 N. FRANK LLOYD WRIGHT BLVD.,UNIT 108,SCOTTSDALE,AZ,,10953 N. FRANK LLOYD WRIGHT BLVD.,SCOTTSDALE,AZ,,480-209-1720,,,205118532,,2026-06-08,QUALIF,Y
|
||||
1569340,"Cell Source, Inc.",Cell Source,"Cell Source, Inc.",CLCS,CLCS,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,57 WEST 57TH STREET,SUITE 400,NEW YORK,NY,10019,57 WEST 57TH STREET,NEW YORK,NY,10019,646-612-7554,,,320379665,"TICKET TO SEE, INC.",2026-05-14,10-Q,Y
|
||||
1134765,"Charlie's Holdings, Inc.",Charlie's Holdings,"Charlie's Holdings, Inc.",CHUC,CHUC,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1007 BRIOSO DR.,,COSTA MESA,CA,92627,1007 BRIOSO DR.,COSTA MESA,CA,92627,949-570-0691,,,841575085,"True Drinks Holdings, Inc.|BAZI INTERNATIONAL, INC.|XELR8 HOLDINGS, INC.|VITACUBE SYSTEMS HOLDINGS INC|INSTANET INC",2026-06-05,8-K,Y
|
||||
1727255,Chilean Cobalt Corp.,Chilean Cobalt,Chilean Cobalt Corp.,COBA,COBA,OTC,NV,NV,Y,1000,Metal Mining,operating, / Emerging growth company,smaller_reporting_<75M,1199 LANCASTER AVENUE,SUITE 107,BERWYN,PA,19312,1199 LANCASTER AVENUE,BERWYN,PA,19312,484-580-8697,,,823590294,,2026-05-22,SCHEDULE 13G,Y
|
||||
1527613,CIMG Inc.,CIMG,CIMG Inc.,CIMG,CIMG,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM R2, FTY D, 16/F, KIN GA IND. BLDG.","9 SAN ON STREET, TUEN MUN",HONG KONG,,,"ROOM R2, FTY D, 16/F, KIN GA IND. BLDG.",HONG KONG,,,(760) 295-2408,,,383849791,"NuZee, Inc.|Havana Furnishings Inc.",2026-06-04,8-K,Y
|
||||
1911467,"Circle Energy, Inc./NV",Circle Energy,"Circle Energy, Inc.",CRCE,CRCE,OTC,NV,NV,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,8211 E REGAL PLACE,,TULSA,OK,74133,8211 E REGAL PLACE,TULSA,OK,74133,918-994-0693,,,874125972,,2026-05-11,10-Q,Y
|
||||
813716,CIRTRAN CORP,Cirtran,Cirtran Corp,CIRX,CIRX,OTC,NV,NV,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6360 S PECOS ROAD,SUITE 8,LAS VEGAS,NV,89120,6360 S PECOS ROAD,LAS VEGAS,NV,89120,8019635112,,,680121636,VERMILLION VENTURES INC,2026-05-20,10-Q,Y
|
||||
1391426,Clean Vision Corp,Clean Vision,Clean Vision Corp,CLNV,CLNV,OTC,NV,NV,Y,2860,Industrial Organic Chemicals,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2711 N. SEPULVEDA BLVD,,MANHATTAN BEACH,CA,90266,2711 N. SEPULVEDA BLVD,MANHATTAN BEACH,CA,90266,424-835-1845,,,000000000,"Byzen Digital, Inc.|CHINA VITUP HEALTH CARE HOLDINGS, INC.",2026-05-15,NT 10-Q,Y
|
||||
1343009,CNBX Pharmaceuticals Inc.,CNBX Pharmaceuticals,CNBX Pharmaceuticals Inc.,CNBX,CNBX,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,#3 BETHESDA METRO CENTER,SUITE 700,BETHESDA,MD,20814,#3 BETHESDA METRO CENTER,BETHESDA,MD,20814,877-424-2429,,,203373669,Cannabics Pharmaceuticals Inc.|American Mining Corp|Thrust Energy Corp.,2026-05-08,SCHEDULE 13G/A,Y
|
||||
2050338,Collab Z Inc.,Collab Z,Collab Z Inc.,CLBZ,CLBZ,,NV,NV,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"29 ORINDA WAY, #536",,ORINDA,CA,94563,"29 ORINDA WAY, #536",ORINDA,CA,94563,925-577-9068,,,993072058,,2026-05-26,S-1/A,Y
|
||||
1621888,Complete Financial Solutions Inc.,Complete Financial Solutions,Complete Financial Solutions Inc.,CFSU,CFSU,OTC,NV,NV,Y,,,other,,smaller_reporting_<75M,101 CONVENTION CENTER DR,SUITE 900,LAS VEGAS,NV,89109,101 CONVENTION CENTER DR,LAS VEGAS,NV,89109,702-291-1922,,,208269281,,2025-07-18,D/A,Y
|
||||
1452583,"CONSERVATIVE BROADCAST MEDIA & PUBLISHING, INC.",Conservative Broadcast Media & Publishing,"Conservative Broadcast Media & Publishing, Inc.",CBMJ,CBMJ,OTC,NV,NV,Y,4911,Electric Services,operating,,smaller_reporting_<75M,5220 JIMMY LEE SMITH PARKWAY,"STE. 104, PMB 312",HIRAM,GA,30141,5220 JIMMY LEE SMITH PARKWAY,HIRAM,GA,30141,8777045773,,,450457114,"Canna Consumer Goods, Inc. .|Canna Brands, Inc. .|Crownbutte Wind Power, Inc.",2026-02-06,D,Y
|
||||
1706509,Cosmos Group Holdings Inc.,Cosmos Group Holdings,Cosmos Group Holdings Inc.,COSG,COSG,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOMS 1309-11, 13TH FLOOR","TAI YAU BUILDING, NO. 181 JOHNSTON ROAD",WANCHAI,K3,00000,"ROOMS 1309-11, 13TH FLOOR",WANCHAI,K3,00000,852 3188 9363,,,223617931,,2025-08-14,15-12G,Y
|
||||
1357671,"Creatd, Inc.",Creatd,"Creatd, Inc.",CRTD,CRTD,OTC,NV,NV,Y,7819,Services-Allied To Motion Picture Production,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"419 LAFAYETTE STREET, 6TH FLOOR",,NEW YORK,NY,10003,"419 LAFAYETTE STREET, 6TH FLOOR",NEW YORK,NY,10003,201-258-3770,,,870645394,"Jerrick Media Holdings, Inc.|Great Plains Holdings, Inc.|LILM, INC.",2025-08-19,RW,Y
|
||||
315958,CREDITRISKMONITOR COM INC,Creditriskmonitor Com,Creditriskmonitor Com Inc,CRMZ,CRMZ,OTC,NV,NV,Y,7320,"Services-Consumer Credit Reporting, Collection Agencies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9107 WEST RUSSELL ROAD,SUITE 100,LAS VEGAS,NV,10989,9107 WEST RUSSELL ROAD,LAS VEGAS,NV,10989,845-230-3000,,,362972588,NEW GENERATION FOODS INC,2026-05-12,10-Q,Y
|
||||
1103833,"Crown Equity Holdings, Inc.",Crown Equity Holdings,"Crown Equity Holdings, Inc.",CRWE,CRWE,OTC,NV,NV,Y,5734,Retail-Computer & Computer Software Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,11226 PENTLAND DOWNS ST.,,LAS VEGAS,NV,89141,11226 PENTLAND DOWNS ST.,LAS VEGAS,NV,89141,702-683-8946,,,330677140,"MICRO BIO-MEDICAL WASTE SYSTEMS, INC.|20/20 NETWORKS INC|20/20 WEB DESIGN INC",2026-05-11,10-Q,Y
|
||||
1688126,Crypto Co,Crypto,Crypto Co,CRCW,CRCW,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,23823 MALIBU ROAD,SUITE 50477,MALIBU,CA,90265,23823 MALIBU ROAD,MALIBU,CA,90265,(424) 228-9955,,,464212405,"CROE, INC.",2026-05-15,NT 10-Q,Y
|
||||
1823635,"CXJ GROUP CO., Ltd",CXJ GROUP CO.,"CXJ GROUP CO., Ltd",ECXJ,ECXJ,OTC,NV,NV,Y,3714,Motor Vehicle Parts & Accessories,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM 401 4THFLOOR, EAST BLOCK BUILDING 5",XINTIANDI BUSINESSCENTERNO7 ANQIAOGANGRD,"GONGSHU, HANGZHOU, ZHEJIANG",F4,310017,"ROOM 401 4THFLOOR, EAST BLOCK BUILDING 5","GONGSHU, HANGZHOU, ZHEJIANG",F4,310017,8618668175727,,,852041913,,2026-04-10,10-Q,Y
|
||||
768408,CYANOTECH CORP,Cyanotech,Cyanotech Corp,CYAN,CYAN,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,73-4460 QUEEN KAAHUMANU HWY,SUITE 102,KAILUA KONA,HI,96740,73-4460 QUEEN KAAHUMANU HWY,KAILUA-KONA,HI,96740,8083261353,,,911206026,,2026-02-13,15-12G,Y
|
||||
1068689,"Data443 Risk Mitigation, Inc.",Data443 Risk Mitigation,"Data443 Risk Mitigation, Inc.",ATDS,ATDS,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,4000 SANCAR WAY,SUITE 400,RESEARCH TRIANGLE PARK,NC,27709,4000 SANCAR WAY,RESEARCH TRIANGLE PARK,NC,27709,919-858-6542,,,860914051,"LandStar, Inc.|LANDSTAR INC|LANDSTAR RUBBER INC",2026-05-14,10-Q,Y
|
||||
1281984,"Decentral Life, Inc.",Decentral Life,"Decentral Life, Inc.",WDLF,WDLF,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3465 S GAYLORD CT.,SUITE A509,ENGLEWOOD,CO,80113,3465 S GAYLORD CT.,ENGLEWOOD,CO,80113,855-933-3277,,,460495298,"Social Life Network, Inc.|SEW CAL LOGO INC",2025-08-25,D/A,Y
|
||||
1099369,DESTINY MEDIA TECHNOLOGIES INC,Destiny Media Technologies,Destiny Media Technologies Inc,DSNY,DSNY,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1110 - 885 W GEORGIA ST,,VANCOUVER,A1,V6C 3E8,1110 - 885 W GEORGIA ST,VANCOUVER,A1,V6C 3E8,604-609-7736,,,841516745,,2026-04-14,10-Q,Y
|
||||
1420368,DLT Resolution Inc.,DLT Resolution,DLT Resolution Inc.,DLTI,DLTI,OTC,NV,NV,Y,7200,Services-Personal Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"5940 S. RAINBOW BLVD,",STE 400-32132,LAS VEGAS,NV,89118,"5940 S. RAINBOW BLVD,",LAS VEGAS,NV,89118,1 (702) 796-6363,,,208248213,"Hemcare Health Services Inc.|NSU Resources Inc|Bio-Carbon Solutions International Inc.|Elemental Protective Coating Corp.|DBL SENIOR CARE, INC.",2026-02-06,15-15D,Y
|
||||
1360442,"Dogecoin Cash, Inc.",Dogecoin Cash,"Dogecoin Cash, Inc.",DOGP,DOGP,OTC,NV,NV,Y,7200,Services-Personal Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,355 W MESQUITE BLVD,C70,MESQUITE,NV,89027,355 W MESQUITE BLVD,MESQUITE,NV,89027,323-420-8683,,,201898270,"Cannabis Sativa, Inc.|Ultra Sun Corp",2026-05-28,144,Y
|
||||
1518336,Dream Homes & Development Corp.,Dream Homes & Development,Dream Homes & Development Corp.,DREM,DREM,OTC,NV,NV,Y,1531,Operative Builders,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,314 S. MAIN STREET,,FORKED RIVER,NJ,08731,314 S. MAIN STREET,FORKED RIVER,NJ,08731,609-693-8881,,,202208821,"Virtual Learning Company, Inc.",2026-05-26,15-12G,Y
|
||||
1413909,DSG Global Inc.,DSG Global,DSG Global Inc.,DSGT,DSGT,OTC,NV,NV,Y,7373,Services-Computer Integrated Systems Design,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,SUITE 207-15272 CROYDON DRIVE,,SURREY,A1,V3Z 0Z5,SUITE 207-15272 CROYDON DRIVE,SURREY,A1,V3Z 0Z5,877-589-8806,,,261134956,BOREAL PRODUCTIONS INC.,2026-05-06,8-K,Y
|
||||
1652561,DSwiss Inc,DSwiss,DSwiss Inc,DQWS,DQWS,OTC,NV,NV,Y,2844,"Perfumes, Cosmetics & Other Toilet Preparations",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"UNIT 18-11, 18-12 & 18-01, TOWER A,","VERTICAL BUSINESS SUITE, BANGSAR SOUTH,",KUALA LUMPUR,N8,59200,"UNIT 18-11, 18-12 & 18-01, TOWER A,",KUALA LUMPUR,N8,59200,(603)2770-4032,,,474215595,,2026-05-15,10-Q,Y
|
||||
1854526,DYNAMIC AEROSPACE SYSTEMS Corp,DYNAMIC AEROSPACE SYSTEMS,DYNAMIC AEROSPACE SYSTEMS Corp,BRQL,BRQL,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating, / Emerging growth company,smaller_reporting_<75M,3753 PLAZA DR,,ANN ARBOR,MI,48108,3753 PLAZA DR,ANN ARBOR,MI,48108,734-773-3776,,,862265420,"BrooQLy Inc.|brooqLy, Inc.|MyTreat, Inc.",2026-05-20,424B3,Y
|
||||
1995920,E-Smart Corp.,E-Smart,E-Smart Corp.,ESMR,ESMR,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,7311 OXFORD AVE,,PHILADELPHIA,PA,19111,7311 OXFORD AVE,PHILADELPHIA,PA,19111,16203079197,,,352810816,,2026-04-14,10-Q,Y
|
||||
2100704,East West Ave Acquisition Corp.,East West Ave Acquisition,East West Ave Acquisition Corp.,EWAV,EWAV,,NV,NV,Y,6770,Blank Checks,other,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,5725 S VALLEY VIEW BLVD STE 5 #378094,,LAS VEGAS,NV,89118,5725 S VALLEY VIEW BLVD STE 5 #378094,LAS VEGAS,NV,89118,802-242-1238,,,412320127,,2026-06-05,S-1/A,Y
|
||||
1490873,"ECO SCIENCE SOLUTIONS, INC.",Eco Science Solutions,"Eco Science Solutions, Inc.",ESSI,ESSI|ESSID,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"300 S. EL CAMINO REAL, #206",,SAN CLEMENTE,CA,92672,"300 S. EL CAMINO REAL, #206",SAN CLEMENTE,CA,92672,833-464-3726,,,464199032,"EATON SCIENTIFIC SYSTEMS, INC.|PRISTINE SOLUTIONS INC.",2026-05-01,NT 10-K,Y
|
||||
1652958,"Edgemode, Inc.",Edgemode,"Edgemode, Inc.",EDGM,EDGM,OTC,NV,NV,Y,8082,Services-Home Health Care Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,110 E. BROWARD BLVD. SUITE 1700,,FT. LAUDERDALE,FL,33301,110 E. BROWARD BLVD. SUITE 1700,FT. LAUDERDALE,FL,33301,707-687-9093,,,474046237,"FOURTH WAVE ENERGY, INC.|PIERRE CORP.|Wadena Corp.",2026-05-28,10-Q,Y
|
||||
1741489,"Elvictor Group, Inc.",Elvictor Group,"Elvictor Group, Inc.",ELVG,ELVG,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,VASSILEOS CONSTANTINOU 79,VARI,ATTIKI,J3,16672,VASSILEOS CONSTANTINOU 79,ATTIKI,J3,16672,(877) 374-4196,,,823296328,"Thenablers, Inc.",2026-05-20,8-K,Y
|
||||
1300306,EMERGING HOLDINGS INC,Emerging Holdings,Emerging Holdings Inc,EMRH,EMRH,OTC,NV,NV,Y,,,other,,smaller_reporting_<75M,10409 PACIFIC PALISADES AVE,,LAS VEGAS,NV,89144,10409 PACIFIC PALISADES AVE,LAS VEGAS,NV,89144,6615195708,,,862418448,,2026-01-22,C-TR,Y
|
||||
1410708,Emo Capital Corp.,Emo Capital,Emo Capital Corp.,NUVID,NUVID,OTC,NV,NV,Y,2870,Agricultural Chemicals,operating,Smaller reporting company,smaller_reporting_<75M,10409 PACIFIC PALISADES AVE,,LAS VEGAS,NV,89144,10409 PACIFIC PALISADES AVE,LAS VEGAS,NV,89144,702-628-7279,,,000000000,,2025-08-21,1-K/A,Y
|
||||
1346022,Enertopia Corp.,Enertopia,Enertopia Corp.,ENRT,ENRT,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"#18, 1873 SPALL ROAD",,KELOWNA,A1,V1Y 4R2,"#18, 1873 SPALL ROAD",KELOWNA,A1,V1Y 4R2,250-870-2219,,,000000000,Golden Aria Corp.,2026-05-22,8-K,Y
|
||||
1171326,ENTREPRENEUR UNIVERSE BRIGHT GROUP,Entrepreneur Universe Bright,Entrepreneur Universe Bright Group,EUBG,EUBG,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating, / Emerging growth company,smaller_reporting_<75M,"SUITE 907, SAIGAO CITY PLAZA BUILDING 2","NO. 170, WEIYANG ROAD",XI'AN,F4,0000,"SUITE 907, SAIGAO CITY PLAZA BUILDING 2",XI'AN,F4,0000,86-400-6087979,,,753025152,LONESTAR Group Holdings CO|U.S. ENERGY HOLDINGS INC.|PITBOSS ENTERTAINMENT INC.|KARMA MEDIA INC|ESTELLE REYNA INC|LE GOURMET CO INC,2026-05-15,8-K,Y
|
||||
1883835,ESG Inc.,ESG,ESG Inc.,ESGH,ESGH,OTC,NV,NV,Y,0100,Agricultural Production-Crops,operating, / Emerging growth company,smaller_reporting_<75M,433 EAST HILLENDALE RD.,,CHADDS FORD,PA,19317,433 EAST HILLENDALE RD.,CHADDS FORD,PA,19317,267-467-5871,,,871918342,PLASMA INNOVATIVE INC.,2026-05-27,8-K,Y
|
||||
1816554,EVENTIKO INC.,Eventiko,Eventiko Inc.,EVTK,EVTK,OTC,NV,NV,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"1445 WOODMONT LANE NW, #2639",,ATLANTA,GA,30318,"1445 WOODMONT LANE NW, #2639",ATLANTA,GA,30318,404-549-4542,,,981535709,EVENTIKO INC,2026-03-17,10-Q,Y
|
||||
1700844,EvoAir Holdings Inc.,EvoAir Holdings,EvoAir Holdings Inc.,EVOH,EVOH,OTC,NV,NV,Y,3585,Air-Cond & Warm Air Heatg Equip & Comm & Indl Refrig Equip,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"31-A2, JALAN 5/32A","6 1/2 MILES, OFF JALAN KEPONG",KUALA LUMPUR,N8,52000,"31-A2, JALAN 5/32A",KUALA LUMPUR,N8,52000,603 6243 3379,,,981353613,UNEX HOLDINGS INC.,2026-04-10,10-Q,Y
|
||||
1871181,"FAMILY OFFICE OF AMERICA, INC.",Family Office of America,"Family Office of America, Inc.",FOFA,FOFA,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"6898 S. UNIVERSITY BLVD.,",SUITE 100,CENTENNIAL,CO,80122,"6898 S. UNIVERSITY BLVD.,",CENTENNIAL,CO,80122,303-874-7474,,,842488498,"Qualis Innovations, Inc.",2026-05-15,10-Q,Y
|
||||
1811999,"FARMHOUSE, INC. /NV",Farmhouse,"Farmhouse, Inc.",FMHS,FMHS,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1355 MARKET ST. STE 488,,SAN FRANCISCO,CA,94103,1355 MARKET ST. STE 488,SAN FRANCISCO,CA,94103,8884206856,,,463321759,,2026-05-20,10-Q,Y
|
||||
1370816,"FBC Holding, Inc.",FBC Holding,"FBC Holding, Inc.",FBCD,FBCD,OTC,NV,NV,Y,5600,Retail-Apparel & Accessory Stores,operating,,smaller_reporting_<75M,"10855 N. 116TH STREET, SUITE 115",,SCOTTSDALE,AZ,85259,"10855 N. 116TH STREET, SUITE 115",SCOTTSDALE,AZ,85259,480-410-6780,,,711026782,FBC Holding Inc.|Wave Uranium Holding|Iron Link Ltd.,2026-01-06,253G1,Y
|
||||
1377167,"Financial Gravity Companies, Inc.",Financial Gravity Companies,"Financial Gravity Companies, Inc.",FGCO,FGCO,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2501 RANCH ROAD 620 SOUTH,SUITE 110,LAKEWAY,TX,78734,2501 RANCH ROAD 620 SOUTH,LAKEWAY,TX,78734,800-588-3893,,,204057712,"PACIFIC OIL Co|PRAIRIE WEST OIL & GAS, LTD.|KAT Racing, Inc.",2026-01-13,D,Y
|
||||
1319643,"FinTrade Sherpa, Inc.",FinTrade Sherpa,"FinTrade Sherpa, Inc.",FTSP,FTSP,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,13529 SKINNER ROAD,SUITE N,CYPRESS,TX,77429,13529 SKINNER ROAD,CYPRESS,TX,77429,(832) 371-6531,,,474347638,Lode-Star Mining Inc.|International Gold Corp.,2026-05-19,NT 10-Q,Y
|
||||
1525306,First America Resources Corp,First America Resources,First America Resources Corp,FSTJ,FSTJ,OTC,NV,NV,Y,5065,"Wholesale-Electronic Parts & Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1000 E. ARMSTRONG ST.,,MORRIS,IL,60450,1000 E. ARMSTRONG ST.,MORRIS,IL,60450,815-941-9888,,,272563052,"GOLDEN OASIS NEW ENERGY GROUP, INC.",2026-05-15,10-Q,Y
|
||||
1492617,"FLYWHEEL ADVANCED TECHNOLOGY, INC.",Flywheel Advanced Technology,"Flywheel Advanced Technology, Inc.",FWFW,FWFW,OTC,NV,NV,Y,7380,Services-Miscellaneous Business Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"123 WEST NYE LANE, SUITE 455",,CARSON CITY,NV,89706,"123 WEST NYE LANE, SUITE 455",CARSON CITY,NV,89706,888-983-1623,,,272473958,"PAN GLOBAL, CORP.|SAVVY BUSINESS SUPPORT INC|SAAVY BUSINESS SUPPORT INC",2026-05-14,10-Q,Y
|
||||
1687919,FORGE INNOVATION DEVELOPMENT CORP.,Forge Innovation Development,Forge Innovation Development Corp.,FGNV,FGNV,OTC,NV,NV,Y,6552,Land Subdividers & Developers (No Cemeteries),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"17700 CASTLETON STREET, SUITE 469",,CITY OF INDUSTRY,CA,91748,"17700 CASTLETON STREET, SUITE 469",CITY OF INDUSTRY,CA,91748,626-361-1393,,,814635390,"YOU-GO ENTERPRISES, LLC",2026-04-14,15-15D,Y
|
||||
1626745,"Fortune Valley Treasures, Inc.",Fortune Valley Treasures,"Fortune Valley Treasures, Inc.",FVTI,FVTI,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,B1601 ORIENTAL IMPRESSION BUILDING 2,"LIANSHENG ROAD, HUMEN TOWN DONGGUAN CITY",GUANGDONG PROVINCE,F4,518000,B1601 ORIENTAL IMPRESSION BUILDING 2,GUANGDONG PROVINCE,F4,518000,(86) (769) 8572-9133,,,320439333,"CRYPTO-SERVICES, INC.",2025-06-13,15-12G,Y
|
||||
1624517,"Frequency Holdings, Inc",Frequency Holdings,"Frequency Holdings, Inc",FRQN,FRQN,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"8910 WEST 192ND STREET, SUITE N",,MOKENA,IL,60448,"8910 WEST 192ND STREET, SUITE N",MOKENA,IL,60448,404-885-6045,,,471893698,"Yuenglings Ice Cream Corp|Aureus, Inc.|Aureus Inc",2026-01-12,15-12G,Y
|
||||
1636051,FUSE GROUP HOLDING INC.,Fuse Group Holding,Fuse Group Holding Inc.,FUST,FUST,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,805 W. DUARTE RD. #102,,ARCADIA,CA,91007,805 W. DUARTE RD. #102,ARCADIA,CA,91007,(626) 977-0000,,,471017473,FUSE ENTERPRISES INC.,2026-05-13,10-Q,Y
|
||||
1497230,Fyntechnical Innovations Inc,Fyntechnical Innovations,Fyntechnical Innovations Inc,FYNN,FYNN,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"9170 GLADES ROAD,",STE 150,BOCA RATON,FL,33433,"9170 GLADES ROAD,",BOCA RATON,FL,33433,3608205973,,,200108910,"SMC Entertainment, Inc.",2026-03-31,NT 10-K,Y
|
||||
1471781,GBT Technologies Inc.,GBT Technologies,GBT Technologies Inc.,GTCH,GTCH,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2500 BROADWAY SUITE F125,,SANTA MONICA,CA,90404,2500 BROADWAY SUITE F125,SANTA MONICA,CA,90404,424-238-4589,,,270603137,Gopher Protocol Inc.|Forex International Trading Corp.,2026-05-15,10-Q,Y
|
||||
1973160,GEMZ Corp. NV,GEMZ Corp. NV,GEMZ Corp. NV,GMZP,GMZP,OTC,NV,NV,Y,1520,General Bldg Contractors - Residential Bldgs,other,,smaller_reporting_<75M,2180 N. PARK AVE.,SUITE 200,WINTER PARK,FL,32789,2180 N. PARK AVE.,WINTER PARK,FL,32789,407-674-9444,,,000000000,GEMZ Corp,2025-12-09,1-Z,Y
|
||||
1792941,Genvor Inc,Genvor,Genvor Inc,GNVR,GNVR,OTC,NV,NV,Y,0100,Agricultural Production-Crops,operating, / Emerging growth company,smaller_reporting_<75M,1550 W HORIZON RIDGE PKWY,STE R #3040,HENDERSON,NV,89012,1550 W HORIZON RIDGE PKWY,HENDERSON,NV,89012,715.903.6473,,,832054746,"Allure Worldwide, Inc.",2026-05-26,3,Y
|
||||
1169138,"GIVBUX, INC.",Givbux,"Givbux, Inc.",GBUX,GBUX,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating, / Emerging growth company,smaller_reporting_<75M,2801 WEST COAST HWY.,SUITE 200,NEWPORT BEACH,CA,92663,2801 WEST COAST HWY.,NEWPORT BEACH,CA,92663,844-448-2899,,,841609495,SENTAIDA TIRE CO LTD|RUB A DUB SOAP INC,2026-06-05,8-K,Y
|
||||
1848672,Glidelogic Corp.,Glidelogic,Glidelogic Corp.,GDLG,GDLG,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,8275 S. EASTERN AVE. SUITE 200-#406,,LAS VEGAS,NV,89123,8275 S. EASTERN AVE. SUITE 200-#406,LAS VEGAS,NV,89123,(310) 397-2300,,,981575837,,2026-04-27,10-K,Y
|
||||
1473490,"Global AI, Inc.",Global AI,"Global AI, Inc.",GLAI,GLAI,OTC,NV,NV,Y,5960,Retail-Nonstore Retailers,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,110 FRONT STREET,SUITE 300,JUPITER,FL,33477,110 FRONT STREET,JUPITER,FL,33477,561-240-0333,,,264170100,"Wall Street Media Co, Inc.|BRIGHT MOUNTAIN HOLDINGS, INC.|MY CATALOGS ONLINE, INC.",2026-06-03,10-Q,Y
|
||||
1938338,GlobalTech Corp,GlobalTech,GlobalTech Corp,GLTK,GLTK,OTC,NV,NV,Y,4813,Telephone Communications (No Radiotelephone),operating, / Emerging growth company,smaller_reporting_<75M,"3550 BARRON WAY, SUITE 13A",,RENO,NV,89511,"3550 BARRON WAY, SUITE 13A",RENO,NV,89511,775-624-4817,,,823926338,,2026-06-03,8-K,Y
|
||||
1378866,Go Green Global Technologies Corp.,Go Green Global Technologies,Go Green Global Technologies Corp.,GOGR,GOGR,OTC,NV,NV,Y,3677,"Electronic Coils, Transformers & Other Inductors",operating,,smaller_reporting_<75M,5 PRODUCTION DRIVE,,BROOKFILED,CT,06804,5 PRODUCTION DRIVE,BROOKFILED,CT,06804,800-605-2857,,,204412118,"Go Green Technologies Corp|DIVERSIFIED SECURE VENTURES CORP.|SECURE RUNWAY SYSTEMS CORP.|PHOTOMATICA, INC.",2025-07-09,15-12G,Y
|
||||
894501,"GOLD ROCK HOLDINGS, INC.",Gold Rock Holdings,"Gold Rock Holdings, Inc.",GRHI,GRHI,OTC,NV,NV,Y,7373,Services-Computer Integrated Systems Design,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"2020 GENERAL BOOTH BLVD, #230",,VIRGINIA BEACH,VA,23452,"2020 GENERAL BOOTH BLVD, #230",VIRGINIA BEACH,VA,23452,7573066090,,,870434297,COMPOSITE HOLDINGS INC|COMPOSITE INDUSTRIES OF AMERICA INC|WORLD HOMES INC|AFFORDABLE HOMES OF AMERICA INC|KOWTOW INC,2026-05-06,10-Q,Y
|
||||
1375348,Golden Star Resource Corp.,Golden Star Resource,Golden Star Resource Corp.,GLNS,GLNS,OTC,NV,NV,Y,1090,Miscellaneous Metal Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,SUITE #300 500 NORTH RAINBOW BLVD,,LAS VEGAS,NV,89107,SUITE #300 500 NORTH RAINBOW BLVD,LAS VEGAS,NV,89107,(210) 862-3071,,,000000000,,2026-05-14,10-Q,Y
|
||||
1800373,"GOLDENWELL BIOTECH, INC.",Goldenwell Biotech,"Goldenwell Biotech, Inc.",GWLL,GWLL,OTC,NV,NV,Y,2000,Food and Kindred Products,operating, / Emerging growth company,smaller_reporting_<75M,7316 CAPILANO DR.,,SOLON,OH,44139,7316 CAPILANO DR.,SOLON,OH,44139,440-666-7999,,,842896086,,2026-05-27,8-K,Y
|
||||
1454742,"GOOD GAMING, INC.",Good Gaming,"Good Gaming, Inc.",GMER,GMER,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,415 MCFARLAN ROAD,SUITE 108,KENNETT SQUARE,PA,19348,415 MCFARLAN ROAD,KENNETT SQUARE,PA,19348,(888) 295-7279,,,263988293,"HDS INTERNATIONAL CORP.|GMV Wireless, Inc.",2026-05-15,10-Q,Y
|
||||
1673475,"GPO Plus, Inc.",GPO Plus,"GPO Plus, Inc.",GPOX,GPOX,OTC,NV,NV,Y,8900,"Services-Services, NEC",operating, / Emerging growth company,smaller_reporting_<75M,3571 E. SUNSET ROAD,SUITE 300,LAS VEGAS,NV,89120,3571 E. SUNSET ROAD,LAS VEGAS,NV,89120,855-935-4769,,,371817132,GLOBAL HOUSE HOLDINGS LTD.|KOLDECK INC.,2026-05-01,8-K,Y
|
||||
1282571,GREENLITE VENTURES INC,Greenlite Ventures,Greenlite Ventures Inc,GRNL,GRNL,OTC,NV,NV,Y,1000,Metal Mining,operating,,smaller_reporting_<75M,1407 FOOTHILL BLVD,SUITE 305,LA VERNE,CA,91750,1407 FOOTHILL BLVD,LA VERNE,CA,91750,909-901-9086,,,912170874,,2025-09-17,D,Y
|
||||
1584480,"Greentech Innovations, Inc.",Greentech Innovations,"Greentech Innovations, Inc.",GTIC,GTIC,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,244 MADISON AVENUE,,NEW YORK CITY,NY,10016-2817,244 MADISON AVENUE,NEW YORK CITY,NY,10016-2817,(802) 255-4212,,,000000000,"Startech Labs, Inc.|UpperSolution.com",2026-04-14,10-Q,Y
|
||||
1765048,GUOCHUN INTERNATIONAL INC.,Guochun International,Guochun International Inc.,GCGJ,GCGJ,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,66 WEST FLAGLER STREET,"SUITE 900, #3040",MIAMI,FL,33130,66 WEST FLAGLER STREET,MIAMI,FL,33130,12512629446,,,320575017,"Charmt, Inc.",2026-05-11,10-Q,Y
|
||||
1989788,Guru App Factory Corp,Guru App Factory,Guru App Factory Corp,GAFC,GAFC,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,74 NORFOLK HOUSE RD,,LONDON,,SW16 1JH,74 NORFOLK HOUSE RD,LONDON,,SW16 1JH,44-794-454-4871,,,981726952,,2026-03-17,10-Q,Y
|
||||
1539680,HAMMER TECHNOLOGY HOLDINGS CORP.,Hammer Technology Holdings,Hammer Technology Holdings Corp.,HMMR,HMMR,OTC,NV,NV,Y,4899,"Communications Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6151 LAKE OSPREY DRIVE,,SARASOTA,FL,34240,6151 LAKE OSPREY DRIVE,SARASOTA,FL,34240,844-413-2600,,,981032170,HAMMER FIBER OPTICS HOLDINGS CORP|Tanaris Power Holdings Inc.|Recursos Montana S.A.,2026-03-17,10-Q,Y
|
||||
1482554,"Hartford Creative Group, Inc.",Hartford Creative Group,"Hartford Creative Group, Inc.",HFUS,HFUS,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,8832 GLENDON WAY,,ROSEMEAD,CA,91770,8832 GLENDON WAY,ROSEMEAD,CA,91770,626-656-6192,,,205422795,"Hartford Great Health Corp.|Photoamigo, Inc.",2026-05-18,POS AM,Y
|
||||
1750777,"Hawkeye Systems, Inc.",Hawkeye Systems,"Hawkeye Systems, Inc.",HWKE,HWKE,OTC,NV,NV,Y,3861,Photographic Equipment & Supplies,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7401 CARMEL EXECUTIVE PARK DRIVE,SUITE 315,CHARLOTTE,NC,28226,7401 CARMEL EXECUTIVE PARK DRIVE,CHARLOTTE,NC,28226,912-388-6720,,,830799093,,2026-06-05,8-K,Y
|
||||
1680139,HealthLynked Corp,HealthLynked,HealthLynked Corp,HLYK,HLYK,OTC,NV,NV,Y,8011,Services-Offices & Clinics of Doctors of Medicine,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1265 CREEKSIDE PARKWAY,SUITE 302,NAPLES,FL,34108,1265 CREEKSIDE PARKWAY,NAPLES,FL,34108,800-928-7144,,,471634127,,2026-05-29,S-1/A,Y
|
||||
1630176,HEALTHY EXTRACTS INC.,Healthy Extracts,Healthy Extracts Inc.,HYEX,HYEX,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7375 COMMERCIAL WAY,SUITE 125,HENDERSON,NV,89011,7375 COMMERCIAL WAY,HENDERSON,NV,89011,702-505-0471,,,472594704,HEALTHLY EXTRACTS INC.|GREY CLOAK TECH INC.,2026-05-18,8-K,Y
|
||||
1813603,Hestia Insight Inc.,Hestia Insight,Hestia Insight Inc.,HSTA,HSTA,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,732 S. 6TH STREET,# 4762,LAS VEGAS,NV,89101,732 S. 6TH STREET,LAS VEGAS,NV,89101,929-329-4756,,,850994055,,2026-05-11,DEF 14C,Y
|
||||
1807616,Hi-Great Group Holding Co,Hi-Great Group Holding,Hi-Great Group Holding Co,HIGR,HIGR,OTC,NV,NV,Y,7011,Hotels & Motels,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,621 S. VIRGIL AVE #470,,LOS ANGELES,CA,90005,621 S. VIRGIL AVE #470,LOS ANGELES,CA,90005,213-219-7746,,,462218131,,2026-05-27,10-K,Y
|
||||
1413891,"HIGH WIRE NETWORKS, INC.",High Wire Networks,"High Wire Networks, Inc.",HWNI,HWNI,OTC,NV,NV,Y,4813,Telephone Communications (No Radiotelephone),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,30 N LINCOLN ST.,,BATAVIA,IL,60510,30 N LINCOLN ST.,BATAVIA,IL,60510,952.974.4000,,,260592672,"HWN, INC.|Spectrum Global Solutions, Inc.|Mantra Venture Group Ltd.",2026-06-03,8-K,Y
|
||||
1342916,"HNO International, Inc.",HNO International,"HNO International, Inc.",HNOI,HNOI,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"41558 EASTMAN DRIVE, SUITE B",,MURRIETA,CA,92562,"41558 EASTMAN DRIVE, SUITE B",MURRIETA,CA,92562,951-305-8872,,,202781289,CLENERGEN Corp|Clenergen Corp|American Bonanza Resources Corp.,2026-05-08,8-K,Y
|
||||
1367993,"Holistic Asset Finance Group Co., Ltd.",Holistic Asset Finance Group Co.,"Holistic Asset Finance Group Co., Ltd.",HAFG,HAFG,OTC,NV,NV,Y,7380,Services-Miscellaneous Business Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM 624 , GEHUA TOWER A",QINGLONG HUTONG BUILDING NO. 1,"BEIJING,",,,"ROOM 624 , GEHUA TOWER A","BEIJING,",,,(86-10) 8418 6112,,,870602435,"Legend Media, Inc.|NOBLE QUESTS INC",2026-05-11,10-Q,Y
|
||||
1324759,HONG YUAN HOLDING GROUP,Hong Yuan Holding,Hong Yuan Holding Group,HGYN,HGYN,OTC,NV,NV,Y,2821,"Plastic Materials, Synth Resins & Nonvulcan Elastomers",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"NO. 3, 21ST FLOOR, BUILDING 1, NO. 176",JIQING 1ST ROAD,CHENGDU HIGH-TECH ZONE,,,"NO. 3, 21ST FLOOR, BUILDING 1, NO. 176",CHENGDU HIGH-TECH ZONE,,,861 8999250338,,,000000000,Cereplast Inc,2026-05-15,NT 10-Q,Y
|
||||
1086303,"Hongchang International Co., Ltd",Hongchang International Co.,"Hongchang International Co., Ltd",HCIL,HCIL,OTC,NV,NV,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM 2409, RONGSHANG BUILDING, FUREN AVE","YANGPU VILLAGE, YINXI SUBDISTRICT","FUQING CITY, FUZHOU CITY",,350300,"ROOM 2409, RONGSHANG BUILDING, FUREN AVE","FUQING CITY, FUZHOU CITY",,350300,86 180 5901 6050,,,870627910,Heyu Biological Technology Corp|PACIFIC WEBWORKS INC,2026-02-13,10-Q,Y
|
||||
797564,"HST Global, Inc.",HST Global,"HST Global, Inc.",HSTC,HSTC,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,509 OLD GREAT NECK ROAD,SUITE 105,VIRGINIA BEACH,VA,23454,509 OLD GREAT NECK ROAD,VIRGINIA BEACH,VA,23454,800-961-4750,,,731215433,NT HOLDING CORP.|ABSS CORP|UNICO INC,2025-11-10,SCHEDULE 13D,Y
|
||||
1994373,Huineng Technology Corp,Huineng Technology,Huineng Technology Corp,HNIT,HNIT,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"33-01, 33RD FLOOR, MENARA KECK SENG","203, JALAN BUKIT BINTANG",KUALA LUMPUR,N8,55100,"33-01, 33RD FLOOR, MENARA KECK SENG",KUALA LUMPUR,N8,55100,60321165722,,,372108225,Aceztech Corp,2026-04-14,10-Q,Y
|
||||
1502966,"Hypha Labs, Inc.",Hypha Labs,"Hypha Labs, Inc.",FUNI,FUNI,OTC,NV,NV,Y,8734,Services-Testing Laboratories,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5940 S. RAINBOW BOULEVARD,,LAS VEGAS,NV,89118,5940 S. RAINBOW BOULEVARD,LAS VEGAS,NV,89118,(702) 744-0640,,,273601979,"Digipath, Inc.|DigiPath,Inc.",2026-05-15,10-Q,Y
|
||||
1263364,Idaho Copper Corp,Idaho Copper,Idaho Copper Corp,COPR,COPR,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"800 W. MAIN ST, STE 1460",,BOISE,ID,83702,"800 W. MAIN ST, STE 1460",BOISE,ID,83702,208-274-9220,,,980221494,Joway Health Industries Group Inc|G2 VENTURES INC,2026-06-04,S-1/A,Y
|
||||
1290658,"IIOT-OXYS, Inc.",IIOT-OXYS,"IIOT-OXYS, Inc.",ITOX,ITOX,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,705 CAMBRIDGE ST.,,CAMBRIDGE,MA,02141,705 CAMBRIDGE ST.,CAMBRIDGE,MA,02141,401-307-3092,,,562415252,"Gotham Capital Holdings, Inc.|Creative Beauty Supply of New Jersey CORP",2026-05-27,8-K,Y
|
||||
2025878,"Independence Power Holdings, Inc.",Independence Power Holdings,"Independence Power Holdings, Inc.",ITXP,ITXP,OTC,NV,NV,Y,8700,"Services-Engineering, Accounting, Research, Management",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,14114 N. DALLAS PARKWAY,SUITE 200,DALLAS,TX,75254,14114 N. DALLAS PARKWAY,DALLAS,TX,75254,903-944-7121,,,352851106,TriUnity Business Services Ltd,2026-05-12,10-Q,Y
|
||||
1591913,"Innovative Payment Solutions, Inc.",Innovative Payment Solutions,"Innovative Payment Solutions, Inc.",IPSI,IPSI,OTC,NV,NV,Y,5961,Retail-Catalog & Mail-Order Houses,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"56B 5TH AVENUE, LOT 1 #AT",,CARMEL BY THE SEA,CA,93921,"56B 5TH AVENUE, LOT 1 #AT",CARMEL BY THE SEA,CA,93921,(866) 477-4729,,,000000000,"QPAGOS|Asiya Pearls, Inc.",2026-05-15,10-Q,Y
|
||||
1939365,"INSPIRE VETERINARY PARTNERS, INC.",Inspire Veterinary Partners,"Inspire Veterinary Partners, Inc.",IVPR,IVPR,OTC,NV,NV,Y,0700,Agricultural Services,operating, / Emerging growth company,smaller_reporting_<75M,780 LYNNHAVEN PKWY #400,,VIRGINIA BEACH,VA,23452,780 LYNNHAVEN PKWY #400,VIRGINIA BEACH,VA,23452,(757) 288-3088,,,854359258,,2026-06-04,25-NSE,Y
|
||||
1794276,Intelligent Hotel Group Ltd.,Intelligent Hotel Group,Intelligent Hotel Group Ltd.,ZHJD,ZHJD,OTC,NV,NV,Y,2870,Agricultural Chemicals,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"NO. 1408, NORTH DISTRICT, LIBAO BUILDING","KEHUA NORTH ROAD NO. 62, WUHOU DISTRICT","CHENGDU, SICHUAN PROVINCE",,,"NO. 1408, NORTH DISTRICT, LIBAO BUILDING","CHENGDU, SICHUAN PROVINCE",,,8602883232517,,,611948707,YCQH Agricultural Technology Co. Ltd,2026-05-14,NT 10-Q,Y
|
||||
1100788,INTERNATIONAL STAR INC,International Star,International Star Inc,ILST,ILST,OTC,NV,NV,Y,6794,Patent Owners & Lessors,operating,,smaller_reporting_<75M,8 THE GREEN,SUITE A,DOVER,DE,19901,8 THE GREEN,DOVER,DE,19901,347-616-1399,,,860876846,,2026-06-04,1-Z,Y
|
||||
862651,"Investview, Inc.",Investview,"Investview, Inc.",INVU,INVU|INVUP,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,521 W. LANCASTER AVE,FLOOR 2,HAVERFORD,PA,19041,521 W. LANCASTER AVE,HAVERFORD,PA,19041,732-889-4300,,,870369205,"Global Investor Services, Inc.|TheRetirementSolution.com, Inc.|Voxpath Holdings, Inc.|UINTAH MOUNTAIN COPPER COMPANY",2026-05-15,10-Q,Y
|
||||
1498372,iWallet Corp,iWallet,iWallet Corp,IWAL,IWAL,OTC,NV,NV,Y,3669,"Communications Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,401 RYLAND ST.,STE. 200A,RENO,NV,89502,401 RYLAND ST.,RENO,NV,89502,858-610-2958,,,271830013,"Queensridge Mining Resources, Inc.",2026-05-15,10-Q,Y
|
||||
1133062,JANEL CORP,Janel,Janel Corp,JANL,JANL,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,80 EIGHTH AVENUE,,NEW YORK,NY,10011,80 EIGHTH AVENUE,NEW YORK,NY,10011,718-527-3800,,,861005291,JANEL WORLD TRADE LTD|WINE SYSTEMS DESIGN INC,2026-06-04,4,Y
|
||||
1647822,"Jingbo Technology, Inc.",Jingbo Technology,"Jingbo Technology, Inc.",SVMB,SVMB,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"BUILDING B8, CHINA ZHIGU, YINHU STREET",FUYANG DISTRICT,"HANGZHOU, ZHEJIANG",,,"BUILDING B8, CHINA ZHIGU, YINHU STREET","HANGZHOU, ZHEJIANG",,,400-926-0345,,,473240707,SavMobi Technology Inc.,2026-05-29,NT 10-K,Y
|
||||
1907425,JOCOM HOLDINGS CORP.,Jocom Holdings,Jocom Holdings Corp.,JOCM,JOCM,OTC,NV,NV,Y,7380,Services-Miscellaneous Business Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"NO. 11-1, LEVEL 11, TOWER 3, AVENUE 3","BANGSAR SOUTH, NO. 8 JALAN KERINCHI",KUALA LUMPUR,N8,59200,"NO. 11-1, LEVEL 11, TOWER 3, AVENUE 3",KUALA LUMPUR,N8,59200,60322416637,,,384177722,,2026-05-14,NT 10-Q,Y
|
||||
1517389,"Jubilant Flame International, Ltd",Jubilant Flame International,"Jubilant Flame International, Ltd",JFIL,JFIL,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM 508, T1N VI PARK",360 XIN LONG ROAD,SHANGHAI,,201101,"ROOM 508, T1N VI PARK",SHANGHAI,,201101,6132523673,,,272775885,"Jiu Feng Investment Hong Kong Ltd|LIBERTY VISION, INC.",2026-04-28,10-K,Y
|
||||
1729637,Karbon-X Corp.,Karbon-X,Karbon-X Corp.,KARX,KARX,OTC,NV,NV,Y,2844,"Perfumes, Cosmetics & Other Toilet Preparations",operating, / Emerging growth company,smaller_reporting_<75M,1720 54- 5 AVE SW,,CALGARY,A0,T2P 0M2,1720 54- 5 AVE SW,CALGARY,A0,T2P 0M2,250-608-5435,,,822882342,COCOLUV INC.,2026-06-05,8-K,Y
|
||||
1935033,KEEMO Fashion Group Ltd,KEEMO Fashion Group,KEEMO Fashion Group Ltd,KMFG,KMFG,OTC,NV,NV,Y,5130,"Wholesale-Apparel, Piece Goods & Notions",operating, / Emerging growth company,smaller_reporting_<75M,"69 WANKE BOYU, XILI LUXIN 1ST RD",NANSHAN DISTRICT,GUANGDONG,F4,518052,"69 WANKE BOYU, XILI LUXIN 1ST RD",GUANGDONG,F4,518052,8617612822030,,,320686375,,2026-04-01,8-K,Y
|
||||
1696025,"Kindcard, Inc.",Kindcard,"Kindcard, Inc.",KCRD,KCRD,OTC,NV,NV,Y,5940,Retail-Miscellaneous Shopping Goods Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1001 YAMATO RD.,SUITE #100,BOCA RATON,FL,33431,1001 YAMATO RD.,BOCA RATON,FL,33431,888-888-0708,,,814520116,MWF GLOBAL INC.,2026-05-19,10-K,Y
|
||||
1110607,"Koil Energy Solutions, Inc.",Koil Energy Solutions,"Koil Energy Solutions, Inc.",KLNG,KLNG,OTC,NV,NV,Y,3533,Oil & Gas Field Machinery & Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1310 RANKIN ROAD,,HOUSTON,TX,77073,1310 RANKIN ROAD,HOUSTON,TX,77073,(281) 517-5000,,,752263732,"Deep Down, Inc.|MediQuip Holdings, INC|TRUE HEALTH INC",2026-05-22,8-K,Y
|
||||
1108248,KRONOS ADVANCED TECHNOLOGIES INC,Kronos Advanced Technologies,Kronos Advanced Technologies Inc,KNOS,KNOS,OTC,NV,NV,Y,3564,Industrial & Commercial Fans & Blowers & Air Purifing Equip,operating,,smaller_reporting_<75M,2501 GARFIELD AVENUE,,PARKERSBURG,WV,26101,505 24TH STREET,PARKERSBURG,WV,26101,800-723-3247,,,870440410,TSET INC,2025-12-15,SEC STAFF ACTION,Y
|
||||
1081834,Kuber Resources Corp,Kuber Resources,Kuber Resources Corp,KUBR,KUBR,OTC,NV,NV,Y,4832,Radio Broadcasting Stations,operating, / Emerging growth company,smaller_reporting_<75M,1113 LIPPO CENTRE TOWER 2,89 QUEENSWAY,ADMIRALTY,K3,000-000,1113 LIPPO CENTRE TOWER 2,ADMIRALTY,K3,000-000,852 3703 6155,,,870629754,UONLIVE CORP|CHINA WORLD TRADE CORP|TXON INTERNATIONAL DEVELOPMENT CORP,2026-03-31,NT 10-K,Y
|
||||
1477960,LataMed AI Corp.,LataMed AI,LataMed AI Corp.,LMED,LMED,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,AV ROMULO GALLEGOS CON AVENIDA LAS PALMA,EDIF TORRE GERENCIAL LOS ANDES,"PISO 4 OFICINA 4-D, URB BOLEIT",,1071,AV ROMULO GALLEGOS CON AVENIDA LAS PALMA,"PISO 4 OFICINA 4-D, URB BOLEIT",,1071,1-787-476-2350,,,263670551,"Catalyst Crew Technologies Corp.|Blue Chip Technologies Corp.|Hermes Jets, Inc.",2026-05-20,10-Q,Y
|
||||
1715433,Leader Capital Holdings Corp.,Leader Capital Holdings,Leader Capital Holdings Corp.,LCHD,LCHD,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating, / Emerging growth company,smaller_reporting_<75M,"RM. 711, 7F., NO. 89, SECTION 1,","ZHONGQING ROAD, NORTH DISTRICT,",TAICHUNG,F5,404638,"RM. 711, 7F., NO. 89, SECTION 1,",TAICHUNG,F5,404638,852 3487 6378,,,371853394,,2025-09-24,SCHEDULE 13G/A,Y
|
||||
1643721,"LEAFBUYER TECHNOLOGIES, INC.",Leafbuyer Technologies,"Leafbuyer Technologies, Inc.",LBUY,LBUY|LBUYD,,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"6888 S. CLINTON STREET, SUITE 300",,GREENWOOD VILLAGE,CO,80112,"6888 S. CLINTON STREET, SUITE 300",GREENWOOD VILLAGE,CO,80112,720-235-0099,,,383944821,AP EVENT INC.,2026-05-14,10-Q,Y
|
||||
1456189,Leatt Corp,Leatt,Leatt Corp,LEAT,LEAT,OTC,NV,NV,Y,3751,"Motorcycles, Bicycles & Parts",operating, / Emerging growth company,smaller_reporting_<75M,"12 KIEPERSOL DRIVE, ATLAS GARDENS",CONTERMANSKLOOF ROAD,"DURBANVILLE, WESTERN CAPE",T3,7550,"12 KIEPERSOL CRES, ATLAS GARDENS","DURBANVILLE, WESTERN CAPE",T3,7550,(27)21-556-5409,,,202819367,,2026-05-13,8-K,Y
|
||||
1230524,"Leopard Energy, Inc.",Leopard Energy,"Leopard Energy, Inc.",LEEN,LEEN,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"VIA TOMASO RODARI, 6 - 6900",,LUGANO,V8,6900,"VIA TOMASO RODARI, 6 - 6900",LUGANO,V8,6900,41 79 1595013,,,900314205,"Cyber Apps World|CLEAN ENVIRO TECH CORP|SKY POWER SOLUTIONS CORP.|Superlattice Power, Inc.|ZINGO, INC|JAVAKINGCOFFEE INC|TITAN WEB SOLUTIONS INC",2026-03-02,10-Q,Y
|
||||
1391135,LFTD PARTNERS INC.,Lftd Partners,Lftd Partners Inc.,LIFD,LIFD,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,14155 PINE ISLAND DRIVE,,JACKSONVILLE,FL,32224,14155 PINE ISLAND DRIVE,JACKSONVILLE,FL,32224,847-915-2446,,,870479286,Acquired Sales CORP|ACQUIRED SALES CORP,2026-05-15,10-Q,Y
|
||||
2057463,Liberty Capital Corp/NV,Liberty Capital,Liberty Capital Corp,GLIBB,GLIBA|GLIBB|GLIBK,OTC,NV,NV,Y,4841,Cable & Other Pay Television Services,operating, / Emerging growth company,smaller_reporting_<75M,12300 LIBERTY BLVD,,ENGLEWOOD,CO,80112,12300 LIBERTY BLVD,ENGLEWOOD,CO,80112,7208755700,,,000000000,"GCI Liberty, Inc.",2026-06-04,4,Y
|
||||
2078416,"Liberty Live Holdings, Inc.",Liberty Live Holdings,"Liberty Live Holdings, Inc.",LLYVB,LLYVA|LLYVB|LLYVK,OTC,NV,NV,Y,7900,Services-Amusement & Recreation Services,operating, / Emerging growth company,smaller_reporting_<75M,12300 LIBERTY BLVD.,,ENGLEWOOD,CO,80112,12300 LIBERTY BLVD.,ENGLEWOOD,CO,80112,888-789-8415,,,332910829,,2026-05-13,8-K,Y
|
||||
1172178,LIBERTY STAR URANIUM & METALS CORP.,Liberty Star Uranium & Metals,Liberty Star Uranium & Metals Corp.,LBSR,LBSR,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2 EAST CONGRESS ST.,STE 900,TUCSON,AZ,85701,2 EAST CONGRESS ST.,TUCSON,AZ,85701,520-425-1433,,,270019071,LIBERTY STAR GOLD CORP|TITANIUM INTELLIGENCE INC,2026-06-01,8-K,Y
|
||||
1407704,"LINGERIE FIGHTING CHAMPIONSHIPS, INC.",Lingerie Fighting Championships,"Lingerie Fighting Championships, Inc.",BOTY,BOTY,OTC,NV,NV,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6955 NORTH DURANGO DRIVE,SUITE 1115-129,LAS VEGAS,NV,89149,6955 NORTH DURANGO DRIVE,LAS VEGAS,NV,89149,702-505-0743,,,208009362,"CALA ENERGY CORP.|XODTEC LED, INC.|Xodtec Group USA, Inc.|Sparking Events, Inc.",2026-05-20,10-Q,Y
|
||||
2065821,Little West Holdings Inc.,Little West Holdings,Little West Holdings Inc.,LILW,LILW,,NV,NV,Y,2080,Beverages,other,,smaller_reporting_<75M,426 E 58TH STREET,,LOS ANGELES,CA,90011,426 E 58TH STREET,LOS ANGELES,CA,90011,(323) 412-0682,,,334089960,,2026-04-14,S-1/A,Y
|
||||
1593549,"Livento Group, Inc.",Livento Group,"Livento Group, Inc.",LIVG,LIVG,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,17 STATE STREET,,NEW YORK,NY,10004,17 STATE STREET,NEW YORK,NY,10004,980 432 8241,,,493999052,"NuGene International, Inc.|Bling Marketing, Inc.",2026-05-15,10-Q,Y
|
||||
1566826,"LogicMark, Inc.",LogicMark,"LogicMark, Inc.",LGMK,LGMK,OTC,NV,NV,Y,3842,"Orthopedic, Prosthetic & Surgical Appliances & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2801 DIODE LANE,,LOUISVILLE,KY,40299,2801 DIODE LANE,LOUISVILLE,KY,40299,(502) 442-7911,,,460678374,"Nxt-ID, Inc.",2026-05-15,8-K,Y
|
||||
1892316,Longduoduo Co Ltd,Longduoduo Co,Longduoduo Co Ltd,LDDD,LDDD,OTC,NV,NV,Y,8000,Services-Health Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"G3-5-8016, SHUI'AN TOWN, RUYI HEADQUARTE",HOHHOT ECONOMIC DEVELOPMENT ZONE,HOHHOT,,010000,"G3-5-8016, SHUI'AN TOWN, RUYI HEADQUARTE",HOHHOT,,010000,86 (0472) 510 4980,,,372018431,,2026-05-12,10-Q,Y
|
||||
1726079,"Lucent, Inc.",Lucent,"Lucent, Inc.",LUCN,LUCN,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5151 CALIFORNIA AVE.,SUITE 100,IRVINE,CA,92617,5151 CALIFORNIA AVE.,IRVINE,CA,92617,949-251-1470,,,834057513,"Tipmefast, Inc.",2025-12-31,8-K,Y
|
||||
1960262,"LUDWIG ENTERPRISES, INC.",Ludwig Enterprises,"Ludwig Enterprises, Inc.",LUDG,LUDG,OTC,NV,NV,Y,8071,Services-Medical Laboratories,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,3160 NW 1 AVENUE,,POMPANO BEACH,FL,33064,3160 NW 1 AVENUE,POMPANO BEACH,FL,33064,786-235-9026,,,611133438,,2026-05-29,10-Q,Y
|
||||
831378,LVPAI GROUP Ltd,LVPAI GROUP,LVPAI GROUP Ltd,LVPA,LVPA,OTC,NV,NV,Y,6799,"Investors, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,110 WALL STREET SUITE 15C,,NEW YORK,NY,10005,"50 WEST LIBERTY STREET, SUITE 880",RENO,NV,89501,2127018527,,,760251547,FINOTEC GROUP INC|ONLINE INTERNATIONAL CORP /NV/|CONDOR WEST CORP,2026-05-18,10-K,Y
|
||||
1753373,"M2i Global, Inc.",M2i Global,"M2i Global, Inc.",MTWO,MTWO,OTC,NV,NV,Y,5050,Wholesale-Metals & Minerals (No Petroleum),operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,885 TAHOE BLVD.,,INCLINE VILLAGE,NV,89451,885 TAHOE BLVD.,INCLINE VILLAGE,NV,89451,(775) 909-6000,,,000000000,INKY INC.,2026-05-15,10-Q,Y
|
||||
1977837,MADE IN USA INC.,Made in Usa,Made in Usa Inc.,USDW,USDW,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating, / Emerging growth company,smaller_reporting_<75M,"1712 PIONEER AVENUE,",SUITE 500,CHEYENNE,WY,82001,"1712 PIONEER AVENUE,",CHEYENNE,WY,82001,561-789-1139,,,371922983,ALIXO-YOLLOO Corp|ALIXO-YOLLO Corp|ALIXO-YOLLOO CORP.,2026-06-02,SCHEDULE 13G,Y
|
||||
1318268,Madison Technologies Inc.,Madison Technologies,Madison Technologies Inc.,MDEX,MDEX,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2500 WESTCHESTER AVENUE,SUITE 401,PURCHASE,NY,10577,2500 WESTCHESTER AVENUE,PURCHASE,NY,10577,(212) 257-4193,,,000000000,"MADISON EXPLORATIONS, INC.|Madison Explorations Inc.|MADISON EXPLORATIONS INC.",2026-05-18,10-Q,Y
|
||||
1515317,MAGELLAN COPPER & GOLD Corp,MAGELLAN COPPER & GOLD,MAGELLAN COPPER & GOLD Corp,MAGE,MAGE,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,602 CEDAR STREET,SUITE 205,WALLACE,ID,83873,602 CEDAR STREET,WALLACE,ID,83873,707-291-6198,,,273566922,MAGELLAN COPPER & GOLD INC.|MAGELLAN GOLD Corp,2026-05-15,10-Q,Y
|
||||
1439264,Marvion Inc.,Marvion,Marvion Inc.,MVNC,MVNC,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"UNIT B, 15/F, TEDA BUILDING",87 WING LOK STREET,SHEUNG WAN,,,"UNIT B, 15/F, TEDA BUILDING",SHEUNG WAN,,,852 2111 4437,,,262723015,Bonanza Goldfields Corp.|Bonanza Goldfield Corp.,2026-05-14,10-Q,Y
|
||||
1404593,Medical Care Technologies Inc.,Medical Care Technologies,Medical Care Technologies Inc.,MDCE,MDCE,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,,smaller_reporting_<75M,1910 S STAPLEY DRIVE,SUITE 221,MESA,AZ,85204,1910 S STAPLEY DRIVE,MESA,AZ,85204,480-645-0750,,,000000000,"AM OIL RESOURCES & TECHNOLOGY INC.|Aventerra Explorations, Inc.",2026-04-22,1-A,Y
|
||||
1827855,Medicale Corp.,Medicale,Medicale Corp.,MCLE,MCLE,OTC,NV,NV,Y,8000,Services-Health Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,9314 FOREST HILL BLVD,#929,WELLINGTON,FL,33411,9314 FOREST HILL BLVD,WELLINGTON,FL,33411,407-245-7339,,,981556944,,2026-02-17,10-Q,Y
|
||||
1931055,Medinotec Inc.,Medinotec,Medinotec Inc.,MDNC,MDNC,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"NORTHLANDS DECO PARK, 10 NEW MARKET ST.",STAND 299 AVANT GARDE AVENUE,JOHANNESBURG,,2169,"NORTHLANDS DECO PARK, 10 NEW MARKET ST.",JOHANNESBURG,,2169,27 87 330 2301,,,364990343,,2026-05-28,10-K,Y
|
||||
1520118,"MedWellAI, Inc.",MedWellAI,"MedWellAI, Inc.",MWAI,MWAI,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2380 DREW STREET,SUITE 3,CLEARWATER,FL,33765,2380 DREW STREET,CLEARWATER,FL,33765,813-358-4400,,,821725385,"INTEGRATED VENTURES, INC.|EMS FIND, INC.|LIGHTCOLLAR, INC.",2026-05-05,10-Q,Y
|
||||
924095,"Metavesco, Inc.",Metavesco,"Metavesco, Inc.",MVCO,MVCO,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer,smaller_reporting_<75M,300 EAST MAIN STREET,,NORFOLK,VA,23510,410 PEACHTREE PKWY,CUMMING,GA,30041,678-341-5898,,,541694665,WATERSIDE CAPITAL CORP|EASTERN VIRGINIA SMALL BUSINESS INVESTMENT CORP,2025-07-25,253G1,Y
|
||||
1309251,MICROALLIANCE GROUP INC.,Microalliance Group,Microalliance Group Inc.,MALG,MALG,OTC,NV,NV,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"701 S. CARSON STREET, SUITE 200",,CARSON CITY,NV,89701,"701 S. CARSON STREET, SUITE 200",CARSON CITY,NV,89701,604-331-1459,,,861098668,"FOUNTAIN HEALTHY AGING, INC.|IMMUREBOOST, INC.|eSavingsStore.com, Inc.|Celtic Cross Ltd.",2025-07-24,D,Y
|
||||
1854816,Minerva Gold Inc.,Minerva Gold,Minerva Gold Inc.,MINR,MINR,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"12/1 KUNAYEV STR, IA 17",,NUR-SULTAN,1P,010000,"12/1 KUNAYEV STR, IA 17",NUR-SULTAN,1P,010000,(725) 225-1800,,,981588963,,2026-05-11,10-K,Y
|
||||
802257,"Mitesco, Inc.",Mitesco,"Mitesco, Inc.",MITI,MITI,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"505 BEACHLAND BLVD., SUITE 1377",,VERO BEACH,FL,32963,"505 BEACHLAND BLVD., SUITE 1377",VERO BEACH,FL,32963,844-383-8689,,,000000000,"True Nature Holding, Inc.|Trunity Holdings, Inc.|BRAIN TREE INTERNATIONAL INC",2026-06-08,8-K,Y
|
||||
1440799,MMEX Resources Corp,MMEX Resources,MMEX Resources Corp,MMEX,MMEX,OTC,NV,NV,Y,7819,Services-Allied To Motion Picture Production,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3600 DICKINSON,,FORT STOCKTON,TX,79735,3600 DICKINSON,FORT STOCKTON,TX,79735,855-880-0400,,,261749145,"MMEX Mining Corp|Management Energy, Inc.|MGMT ENERGY, INC.|Quantum Information, Inc.",2026-04-21,8-K,Y
|
||||
1447380,MOBIVITY HOLDINGS CORP.,Mobivity Holdings,Mobivity Holdings Corp.,MFON,MFON,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3133 WEST FRYE ROAD,SUITE 215,CHANDLER,AZ,85226,3133 WEST FRYE ROAD,CHANDLER,AZ,85226,877-282-7660,,,263439095,COMMERCETEL CORP|ARES VENTURES CORP.,2026-03-31,8-K,Y
|
||||
1611046,ModuLink Inc.,ModuLink,ModuLink Inc.,MDLK,MDLK,OTC,NV,NV,Y,7000,"Hotels, Rooming Houses, Camps & Other Lodging Places",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"UNIT 2, LEVEL 6, WESTIN CENTRE","26 HUNG TO ROAD, KWUN TONG",HONG KONG,,,"UNIT 2, LEVEL 6, WESTIN CENTRE",HONG KONG,,,888-493-8028,,,465692180,International Endeavors Corp,2026-05-20,10-Q,Y
|
||||
1671132,Music Licensing Inc.,Music Licensing,Music Licensing Inc.,SONG,SONG,OTC,NV,NV,Y,7900,Services-Amusement & Recreation Services,other,,smaller_reporting_<75M,3811 AIRPORT PULLING ROAD NORTH,SUITE 203,NAPLES,FL,34105,3811 AIRPORT PULLING ROAD NORTH,NAPLES,FL,34105,(833) 227-7683,,,465145215,Nuvus Gro Corp|HempTech Corp,2026-02-06,SCHEDULE 13D,Y
|
||||
1556801,"My City Builders, Inc.",My City Builders,"My City Builders, Inc.",MYCB,MYCB,OTC,NV,NV,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"100 BISCAYNE BLVD., #1611",,MIAMI,FL,33132,"100 BISCAYNE BLVD., #1611",MIAMI,FL,33132,786-553-4006,,,273816969,"iMine Corp|DIAMANTE MINERALS, INC.|OCONN INDUSTRIES CORP",2026-06-05,10-Q,Y
|
||||
1703625,"NAPC Defense, Inc.",NAPC Defense,"NAPC Defense, Inc.",BLIS,BLIS,OTC,NV,NV,Y,7310,Services-Advertising,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1501 LAKE AVE SE,,LARGO,FL,33771,1501 LAKE AVE SE,LARGO,FL,33771,(754) 242-6272,,,000000000,"Treasure & Shipwreck Recovery, Inc.|BELISS CORP.",2026-06-08,8-K,Y
|
||||
1605481,Nevada Canyon Gold Corp.,Nevada Canyon Gold,Nevada Canyon Gold Corp.,NGLD,NGLD,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5655 RIGGINS COURT,SUITE 15,RENO,NV,89502,5655 RIGGINS COURT,RENO,NV,89502,888-909-5548,,,465152859,"Tech Foundry Ventures, Inc.",2026-06-05,8-K,Y
|
||||
1132509,New Momentum Corp.,New Momentum,New Momentum Corp.,NNAX,NNAX,OTC,NV,NV,Y,8741,Services-Management Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"150 CECIL STREET, #08-01",,SINGAPORE,U0,069543,"150 CECIL STREET, #08-01",SINGAPORE,U0,069543,65 3105 1428,,,880435998,"Eason Education Kingdom Holdings, Inc.|HAN LOGISTICS INC",2026-03-31,NT 10-K,Y
|
||||
1371128,"NewHydrogen, Inc.",NewHydrogen,"NewHydrogen, Inc.",NEWH,NEWH,OTC,NV,NV,Y,3081,Unsupported Plastics Film & Sheet,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,27936 VISTA CANYON BLVD,Suite 202,Santa Clarita,CA,91387,27936 VISTA CANYON BLVD,Santa Clarita,CA,91387,6612510001,,,000000000,BioSolar Inc,2026-05-15,10-Q,Y
|
||||
1289223,"Newport Gold, Inc.",Newport Gold,"Newport Gold, Inc.",NWPG,,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,,smaller_reporting_<75M,1495 RIDGEVIEW DRIVE,SUITE 220,RENO,NV,89509,1495 RIDGEVIEW DRIVE,RENO,NV,89509,905-542-4990,,,000000000,,2026-04-22,D,Y
|
||||
1593001,"NightFood Holdings, Inc.",NightFood Holdings,"NightFood Holdings, Inc.",NGTF,NGTF,OTC,NV,NV,Y,3590,Misc Industrial & Commercial Machinery & Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,500 WHITE PLAINS ROAD,SUITE 520,TARRYTOWN,NY,10591,500 WHITE PLAINS ROAD,TARRYTOWN,NY,10591,866-291-7778,,,463885019,,2026-05-20,10-Q,Y
|
||||
772263,NITCHES INC,Nitches,Nitches Inc,NICH,,OTC,NV,NV,Y,2330,"Women's, Misses': and Juniors Outerwear",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1333 N. BUFFALO DR.,UNIT 210,LAS VEGAS,NV,89128,1333 N. BUFFALO DR.,LAS VEGAS,NV,89128,858-625-2633,,,952848021,BEEBAS CREATIONS INC,2026-01-08,15-12G,Y
|
||||
1603793,"Norris Industries, Inc.",Norris Industries,"Norris Industries, Inc.",NRIS,NRIS,OTC,NV,NV,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,102 PALO PINTO ST.,SUITE B,WEATHERFORD,TX,76086,102 PALO PINTO ST.,WEATHERFORD,TX,76086,8558096900,,,465034746,"INTERNATIONAL WESTERN PETROLEUM, INC.",2026-05-29,10-K,Y
|
||||
1415744,NORTHERN MINERALS & EXPLORATION LTD.,Northern Minerals & Exploration,Northern Minerals & Exploration Ltd.,NMEX,NMEX,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1301 AVENUE M,,CISCO,TX,76437,P.O. BOX 31,CISCO,TX,76437,254-442-2627,,,000000000,"Punchline Resources Ltd.|Punchline Entertainment, Inc.",2026-06-05,8-K,Y
|
||||
827099,Ocean Thermal Energy Corp,Ocean Thermal Energy,Ocean Thermal Energy Corp,CPWR,CPWR,OTC,NV,NV,Y,4931,Electric & Other Services Combined,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3675 MARKET STREET,SUITE 200,PHILADELPHIA,PA,19104,3675 MARKET STREET,PHILADELPHIA,PA,19104,(717) 299-1344,,,205081381,TETRIDYN SOLUTIONS INC|CREATIVE VENDING CORP,2026-05-12,10-Q,Y
|
||||
1626644,"Odyssey Health, Inc.",Odyssey Health,"Odyssey Health, Inc.",ODYY,ODYY,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2300 WEST SAHARA AVENUE,SUITE 800-#4012,LAS VEGAS,NV,89102,2300 WEST SAHARA AVENUE,LAS VEGAS,NV,89102,702-780-6559,,,471022125,"Odyssey Group International, Inc.",2026-05-26,8-K,Y
|
||||
1848334,"OKMIN RESOURCES, INC.",Okmin Resources,"Okmin Resources, Inc.",OKMN,OKMN,OTC,NV,NV,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,16501 VENTURA BLVD.,SUITE 400,ENCINO,CA,91436,16501 VENTURA BLVD.,ENCINO,CA,91436,818-201-3727,,,854401166,,2026-05-15,10-Q,Y
|
||||
1682265,Onar Holding Corp,Onar Holding,Onar Holding Corp,ONAR,ONAR,OTC,NV,NV,Y,1700,Construction - Special Trade Contractors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,8605 SANTA MONICA BOULEVARD,PMB 36522,LOS ANGELES,CA,90069,8605 SANTA MONICA BOULEVARD,LOS ANGELES,CA,90069,213-437-3081,,,472200506,"Reliant Holdings, Inc.",2026-06-01,DEF 14C,Y
|
||||
1622244,"One World Products, Inc.",One World Products,"One World Products, Inc.",OWPC,OWPC,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,6605 GRAND MONTECITO PKWY,SUITE 100,LAS VEGAS,NV,89149,6605 GRAND MONTECITO PKWY,LAS VEGAS,NV,89149,7026050605,,,611744826,"One World Pharma, Inc.|PUNTO GROUP, CORP.",2026-03-31,NT 10-K,Y
|
||||
1388295,OneMeta Inc.,OneMeta,OneMeta Inc.,ONEI,ONEI,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1 HAMPSHIRE COURT,,"NEWPORT BEACH,",CA,92660,1 HAMPSHIRE COURT,"NEWPORT BEACH,",CA,92660,949-642-7816,,,205150818,"WebSafety, Inc.|Blindspot Alert, Inc.|Promotions on Wheels Holdings, Inc.",2026-05-26,SEC STAFF ACTION,Y
|
||||
1419793,"ORIGINCLEAR, INC.",Originclear,"Originclear, Inc.",OCLN,OCLN,OTC,NV,NV,Y,3559,"Special Industry Machinery, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,600 CLEVELAND ST,SUITE 307,CLEARWATER,FL,33755,600 CLEVELAND ST,CLEARWATER,FL,33755,727-476-1330,,,260287664,ORIGINOIL INC,2026-05-29,10-Q,Y
|
||||
1854183,Orion Bliss Corp.,Orion Bliss,Orion Bliss Corp.,ORIB,ORIB,OTC,NV,NV,Y,2840,"Soap, Detergents, Cleang Preparations, Perfumes, Cosmetics",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,KALONITE 9-57,,ASHDOD,,7724233,KALONITE 9-57,ASHDOD,,7724233,307-298-0969,,,981591444,,2026-02-17,10-Q,Y
|
||||
1994582,Oyocar Group Inc.,Oyocar Group,Oyocar Group Inc.,OYCG,OYCG,OTC,NV,NV,Y,5500,Retail-Auto Dealers & Gasoline Stations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"COLINAS MARINAS, MARBELLAS, VILLA 10",,SOSUA,G8,57000,"COLINAS MARINAS, MARBELLAS, VILLA 10",SOSUA,G8,57000,1-829-859-0389,,,981742455,,2026-04-13,10-Q,Y
|
||||
1751707,OZ VISION INC.,Oz Vision,Oz Vision Inc.,OZVN,UNXP|OZVN,OTC,NV,NV,Y,4700,Transportation Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,4345 W. POST RD,,LAS VEGAS,NV,89118,4345 W. POST RD,LAS VEGAS,NV,89118,949-350-0123,,,821965608,United Express Inc.,2026-05-15,10-Q,Y
|
||||
1679817,"OZOP ENERGY SOLUTIONS, INC.",Ozop Energy Solutions,"Ozop Energy Solutions, Inc.",OZSC,OZSC,OTC,NV,NV,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,55 RONALD REAGAN BLVD.,,WARWICK,NY,10990,55 RONALD REAGAN BLVD.,WARWICK,NY,10990,(845) 544-5112,,,352540672,OZOP SURGICAL CORP.|Newmarkt Corp.,2026-05-22,10-Q,Y
|
||||
1620749,Panamera Holdings Corp,Panamera Holdings,Panamera Holdings Corp,PHCI,PHCI,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating, / Emerging growth company,smaller_reporting_<75M,"2000 WEST LOOP SOUTH, SUITE 1820",,HOUSTON,TX,77056,"2000 WEST LOOP SOUTH, SUITE 1820",HOUSTON,TX,77056,713-878-7200,,,465707326,PANAMERA HEALTHCARE Corp,2026-05-12,8-K,Y
|
||||
1297937,"PARKS AMERICA, INC",Parks America,"Parks America, Inc",PRKA,PRKA,OTC,NV,NV,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1300 OAK GROVE RD,,PINE MOUNTAIN,GA,31822,1300 OAK GROVE RD,PINE MOUNTAIN,GA,31822,706-663-8744,,,910626756,GREAT AMERICAN FAMILY PARKS INC,2026-05-11,10-Q,Y
|
||||
1080448,PATRIOT GOLD CORP,Patriot Gold,Patriot Gold Corp,PGOL,PGOL,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,401 RYLAND STREET,SUITE 180,RENO,NV,89502,401 RYLAND STREET,RENO,NV,89502,702-456-9565,,,860947048,NORTHERN OSTRICH CORP,2026-05-15,10-Q,Y
|
||||
1609258,PetroGas Co,PetroGas,PetroGas Co,PTCO,PTCO,OTC,NV,NV,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2800 POST OAK BOULEVARD,SUITE 4100,HOUSTON,TX,77056,2800 POST OAK BOULEVARD,HOUSTON,TX,77056,(806) 375-3338,,,981153516,America Resources Exploration Inc.|Alazzio Entertainment Corp,2026-02-05,10-Q,Y
|
||||
1512922,"PetVivo Holdings, Inc.",PetVivo Holdings,"PetVivo Holdings, Inc.",PETV,PETV|PETVW,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating, / Emerging growth company,smaller_reporting_<75M,5251 EDINA INDUSTRIAL BLVD,,EDINA,MN,55439,5251 EDINA INDUSTRIAL BLVD,EDINA,MN,55439,(952) 217-4952,,,990363559,Technologies Scan Corp,2026-06-01,4,Y
|
||||
1710495,PINEAPPLE EXPRESS CANNABIS Co,PINEAPPLE EXPRESS CANNABIS,PINEAPPLE EXPRESS CANNABIS Co,PNXP,PNXP,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,300 PEACHTREE STREET NE,#1775,ATLANTA,GA,30009,300 PEACHTREE STREET NE,ATLANTA,GA,30009,404-734-3277,,,364864568,MINARO CORP,2026-05-05,8-K,Y
|
||||
1813452,Planet 13 Holdings Inc.,Planet 13 Holdings,Planet 13 Holdings Inc.,PLNH,PLNH,OTC,NV,NV,Y,0100,Agricultural Production-Crops,operating, / Emerging growth company,smaller_reporting_<75M,2548 WEST DESERT INN ROAD,,LAS VEGAS,NV,89109,4675 W. TECO AVE.,LAS VEGAS,NV,89118,702-815-1313,,,832787199,,2026-05-15,8-K,Y
|
||||
1265521,"Polomar Health Services, Inc.",Polomar Health Services,"Polomar Health Services, Inc.",PMHS,PMHS,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,32866 US HWY. 19 N,,PALM HARBOR,FL,34684,32866 US HWY. 19 N,PALM HARBOR,FL,34684,800-490-7454,,,861006313,Trustfeed Corp.|HEALTHMED SERVICES LTD,2026-06-01,10-Q,Y
|
||||
1350156,PREAXIA HEALTH CARE PAYMENT SYSTEMS INC.,Preaxia Health Care Payment Systems,Preaxia Health Care Payment Systems Inc.,PAXH,,OTC,NV,NV,Y,5700,"Retail-Home Furniture, Furnishings & Equipment Stores",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,PO BOX 368,,DUNEDIN,FL,34697-0368,PO BOX 368,DUNEDIN,FL,34697-0368,(403) 850-4120,,,204395271,SUN WORLD PARTNERS INC,2026-05-15,10-Q,Y
|
||||
1570937,Premier Air Charter Holdings Inc.,Premier Air Charter Holdings,Premier Air Charter Holdings Inc.,PREM,PREM,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2006 PALOMAR AIRPORT ROAD,SUITE 210,CARLSBAD,CA,92011,2006 PALOMAR AIRPORT ROAD,CARLSBAD,CA,92011,858-239-0788,,,990385465,ALTAIR INTERNATIONAL CORP.,2026-05-26,3,Y
|
||||
1128189,"ProtoKinetix, Inc.",ProtoKinetix,"ProtoKinetix, Inc.",PKTX,PKTX,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,109 W. MAIN ST.,,DALTON,OH,44618,109 W. MAIN ST.,DALTON,OH,44618,330-445-4971,,,943355026,RJV NETWORK INC,2026-05-15,NT 10-Q,Y
|
||||
1141964,PUBLIC CO MANAGEMENT CORP,Public Co Management,Public Co Management Corp,PCMC,PCMC,OTC,NV,NV,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9350 WILSHIRE BOULEVARD,SUITE 203,BEVERLY HILLS,CA,90212,9350 WILSHIRE BOULEVARD,BEVERLY HILLS,CA,90212,310-862-1957,,,880496188,"MYOFFIZ, INC.|MYOFFIZ INC",2026-05-12,10-Q,Y
|
||||
1575858,Purebase Corp,Purebase,Purebase Corp,PUBC,PUBC,OTC,NV,NV,Y,2870,Agricultural Chemicals,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,8631 STATE HIGHWAY 124,P.O. BOX 757,IONE,CA,95640,8631 STATE HIGHWAY 124,IONE,CA,95640,(530) 676-7873,,,272060863,Port of Call Online Inc.,2026-06-01,8-K,Y
|
||||
856984,"QHSLab, Inc.",QHSLab,"QHSLab, Inc.",USAQ,USAQ,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,901 NORTHPOINT PARKWAY,SUITE 302,WEST PALM BEACH,FL,33407,901 NORTHPOINT PARKWAY,WEST PALM BEACH,FL,33407,(929) 379-6503,,,112655906,USA EQUITIES CORP.|AMERICAN BIOGENETIC SCIENCES INC,2026-05-26,8-K,Y
|
||||
1103795,"QS Energy, Inc.",QS Energy,"QS Energy, Inc.",QSEP,QSEP,OTC,NV,NV,Y,3533,Oil & Gas Field Machinery & Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,23902 FM 2978,,TOMBALL,TX,77375,23902 FM 2978,TOMBALL,TX,77375,775-300-7647,,,522088326,SAVE THE WORLD AIR INC,2026-05-15,10-Q,Y
|
||||
1393781,Quality Industrial Corp.,Quality Industrial,Quality Industrial Corp.,QIND,QIND,OTC,NV,NV,Y,3590,Misc Industrial & Commercial Machinery & Equipment,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,505 MONTGOMERY STREET FLOOR 11,,SAN FRANCISCO,CA,94111,505 MONTGOMERY STREET FLOOR 11,SAN FRANCISCO,CA,94111,800-706-0806,,,352675388,WIKISOFT CORP.|POWER PLAY DEVELOPMENT CORP,2026-05-15,10-Q,Y
|
||||
1663038,Quantum Genesis AI Corp.,Quantum Genesis AI,Quantum Genesis AI Corp.,QTZM,QTZM|QGAI,,NV,NV,Y,2860,Industrial Organic Chemicals,operating, / Emerging growth company,smaller_reporting_<75M,"15656 BERNARDO CENTER DRIVE, #801",,SAN DIEGO,CA,92127,"15656 BERNARDO CENTER DRIVE, #801",SAN DIEGO,CA,92127,858-216-7676,,,364806481,Quantumzyme Corp.|Reliant Service Inc,2026-04-15,10-Q/A,Y
|
||||
1101433,QUOTEMEDIA INC,Quotemedia,Quotemedia Inc,QMCI,QMCI,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,17100 E SHEA BLVD,SUITE 230,FOUNTAIN HILLS,AZ,85268,17100 E SHEA BLVD,FOUNTAIN HILLS,AZ,85268,4809057311,,,912008633,QUOTEMEDIA INC|QUOTEMEDIA COM INC,2026-05-14,10-Q,Y
|
||||
1872292,Rainmaker Worldwide Inc.,Rainmaker Worldwide,Rainmaker Worldwide Inc.,RAKR,RAKR,OTC,NV,NV,Y,2086,Bottled & Canned Soft Drinks & Carbonated Waters,operating, / Emerging growth company,smaller_reporting_<75M,2510 EAST SUNSET ROAD,SUITE 5 #925,LAS VEGAS,NV,89120,2510 EAST SUNSET ROAD,LAS VEGAS,NV,89120,877-334-3820,,,824346844,,2026-04-24,8-K,Y
|
||||
1438943,"RANGE IMPACT, INC.",Range Impact,"Range Impact, Inc.",RNGE,RNGE,OTC,NV,NV,Y,1600,Heavy Construction Other Than Bldg Const - Contractors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,200 PARK AVENUE,SUITE 400,CLEVELAND,OH,44122,200 PARK AVENUE,CLEVELAND,OH,44122,530-231-7800,,,753268988,"MALACHITE INNOVATIONS, INC.|Vitality Biopharma, Inc.|Stevia First Corp.|Legend Mining Inc.",2026-06-03,8-K,Y
|
||||
1415397,Raphael Pharmaceutical Inc.,Raphael Pharmaceutical,Raphael Pharmaceutical Inc.,RAPH,RAPH,OTC,NV,NV,Y,2833,Medicinal Chemicals & Botanical Products,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,SUITE 105 - 5348 VEGAS DR.,,LAS VEGAS,NV,89108,SUITE 105 - 5348 VEGAS DR.,LAS VEGAS,NV,89108,702-442-1166,,,260204284,Easy Energy Inc,2026-05-14,10-Q,Y
|
||||
1910975,Rapid Line Inc.,Rapid Line,Rapid Line Inc.,RPDL,RPDL,OTC,NV,NV,Y,8200,Services-Educational Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1111 SOUTH ROOP STREET,#1915,CARSON CITY,NV,89702,1111 SOUTH ROOP STREET,CARSON CITY,NV,89702,415-841-3570,,,372039216,,2026-06-01,10-Q,Y
|
||||
2126221,"Recreatives Industries, Inc.",Recreatives Industries,"Recreatives Industries, Inc.",RECX,,OTC,NV,NV,Y,,,other,,smaller_reporting_<75M,1936 59TH TERRACE EAST,,BRADENTON,FL,34203,1936 59TH TERRACE EAST,BRADENTON,FL,34203,(800) 255-2511,,,873525932,,2026-05-22,1-A,Y
|
||||
1589150,Regen BioPharma Inc,Regen BioPharma,Regen BioPharma Inc,RGBP,RGBP|RGBPP,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4700 SPRING ST #304,,LA MESA,CA,91942,4700 SPRING ST #304,LA MESA,CA,91942,619-722-5505,,,455192997,,2026-05-14,10-Q,Y
|
||||
1357878,"REGENEREX PHARMA, INC.",Regenerex Pharma,"Regenerex Pharma, Inc.",RGPX,RGPX,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,"5348 VEGAS DRIVE, SUITE 177",,LAS VEGAS,NV,89108,"5348 VEGAS DRIVE, SUITE 177",LAS VEGAS,NV,89108,305-927-5191,,,980479983,"PEPTIDE TECHNOLOGIES, INC.|Eternelle Skincare Products Inc.|CREENERGY Corp|ONLINE ORIGINALS, INC",2026-05-06,8-K,Y
|
||||
1412126,RemSleep Holdings Inc.,RemSleep Holdings,RemSleep Holdings Inc.,RMSL,RMSL,OTC,NV,NV,Y,7200,Services-Personal Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,14175 ICOT BVLD. SUITE 300,,CLEARWATER,FL,33760,14175 ICOT BVLD. SUITE 300,CLEARWATER,FL,33760,(727) 955-4465,,,383759675,"OBICOM, INC.|Kat Gold Holdings Corp.|Bella Viaggio, Inc.",2026-06-04,8-K,Y
|
||||
1335288,ReoStar Energy CORP,ReoStar Energy,ReoStar Energy CORP,REOS,REOS,OTC,NV,NV,Y,1382,Oil & Gas Field Exploration Services,operating,,smaller_reporting_<75M,87 N. RAYMOND AVE,SUITE 200,PASADENA,CA,91103,87 N. RAYMOND AVE,PASADENA,CA,91103,1-817-989-7367,,,208428738,"GOLDRANGE RESOURCES, INC.",2026-04-29,1-K,Y
|
||||
897078,"Resonate Blends, Inc.",Resonate Blends,"Resonate Blends, Inc.",KOAN,KOAN,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"26565 AGOURA RD.,","SUITE 200,",CALABASAS,CA,91302,"26565 AGOURA RD.,",CALABASAS,CA,91302,571-888-0009,,,581588291,"Textmunication Holdings, Inc.|FIRSTWAVE TECHNOLOGIES INC|BROCK INTERNATIONAL INC|BROCK CONTROL SYSTEMS INC",2025-07-22,15-12G/A,Y
|
||||
1785493,RHINO BITCOIN INC.,Rhino Bitcoin,Rhino Bitcoin Inc.,RHNO,RHNO,OTC,NV,NV,Y,1700,Construction - Special Trade Contractors,operating, / Emerging growth company,smaller_reporting_<75M,1200 BRICKELL AVENUE #310,,MIAMI,FL,33131,1200 BRICKELL AVENUE #310,MIAMI,FL,33131,888-854-3824,,,611907981,Phoenix Plus Corp.,2026-04-15,8-K/A,Y
|
||||
1424864,Rise Gold Corp.,Rise Gold,Rise Gold Corp.,RYES,RYES,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1250 - 625 HOWE STREET,,VANCOUVER,,V6C 2T6,1250 - 625 HOWE STREET,VANCOUVER,,V6C 2T6,604-999-4136,,,300692325,Rise Resources Inc.|Patriot Minefinders Inc.|Atlantic Resources Inc.,2026-05-22,8-K,Y
|
||||
1970743,"RMX INDUSTRIES, INC.",Rmx Industries,"Rmx Industries, Inc.",RMXI,RMXI,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,4514 COLE AVE,STE. 600,DALLAS,TX,75205,4514 COLE AVE,DALLAS,TX,75205,619-977-7203,,,882960484,"Reticulate Micro, Inc.",2026-05-19,10-Q,Y
|
||||
2034288,Rocky Mountains Group Ltd,Rocky Mountains Group,Rocky Mountains Group Ltd,RMGL,,OTC,NV,NV,Y,8200,Services-Educational Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,E 242 BUCKLANDS BEACH ROAD,BUCKLANDS BEACH,AUCKLAND,Q2,2012,E 242 BUCKLANDS BEACH ROAD,AUCKLAND,Q2,2012,61 4 05223877,,,932609396,,2026-05-04,8-A12G,Y
|
||||
1893657,Rubber Leaf Inc,Rubber Leaf,Rubber Leaf Inc,RLEA,RLEA,OTC,NV,NV,Y,3714,Motor Vehicle Parts & Accessories,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"QIXING ROAD, WENG'AO INDUSTRIAL ZONE","CHUNHU SUBDISTRICT, FENGHUA DISTRICT","NINGBO, ZHEJIANG",F4,315506,"QIXING ROAD, WENG'AO INDUSTRIAL ZONE","NINGBO, ZHEJIANG",F4,315506,86-18217730800,,,320655276,,2026-06-03,S-1/A,Y
|
||||
1128281,"Saker Aviation Services, Inc.",Saker Aviation Services,"Saker Aviation Services, Inc.",SKAS,SKAS,OTC,NV,NV,Y,4581,"Airports, Flying Fields & Airport Terminal Services",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,885 2ND AVENUE,,NEW YORK,NY,10017,885 2ND AVENUE,NEW YORK,NY,10017,212-909-9500,,,870617649,"FirstFlight, Inc.|FBO AIR, INC.|SHADOWS BEND DEVELOPMENT INC",2026-05-15,10-Q,Y
|
||||
1277575,SAXON CAPITAL GROUP INC,Saxon Capital Group,Saxon Capital Group Inc,SCGX,SCGX,OTC,NV,NV,Y,1311,Crude Petroleum & Natural Gas,operating,,smaller_reporting_<75M,7740 E EVANS RD,,SCOTTSDALE,AZ,85260,7740 E GRAY RD,SCOTTSDALE,AZ,85260,480-385-3893,,,300220588,"USA SUPERIOR ENERGY HOLDINGS, INC.|COMLINK COMMUNICATIONS CO",2026-04-23,D,Y
|
||||
2032609,Scientist Home Future Health Ltd,Scientist Home Future Health,Scientist Home Future Health Ltd,SHFH,SHFH,OTC,NV,NV,Y,2844,"Perfumes, Cosmetics & Other Toilet Preparations",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"3/F, MOW HING INDUSTRIAL BUILDING",205 WAI YIP STREET,KWUN TONG,K3,00000,"3/F, MOW HING INDUSTRIAL BUILDING",KWUN TONG,K3,00000,85257023076,,,000000000,,2026-05-14,10-Q,Y
|
||||
1763660,SEATech Ventures Corp.,SEATech Ventures,SEATech Ventures Corp.,SEAV,SEAV,OTC,NV,NV,Y,7380,Services-Miscellaneous Business Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"11-05&11-06, TOWER A,","AVE 3 VERTICAL BUSINESS SUITE,","BANGSAR SOUTH, KUALA LUMPUR",N8,59200,"11-05&11-06, TOWER A,","BANGSAR SOUTH, KUALA LUMPUR",N8,59200,60322421288,,,611992326,,2026-05-27,DEF 14C,Y
|
||||
1358633,SENTIENT BRANDS HOLDINGS INC.,Sentient Brands Holdings,Sentient Brands Holdings Inc.,SNBH,SNBH,OTC,NV,NV,Y,5734,Retail-Computer & Computer Software Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,590 MADISON AVE,"21ST, FLOOR",NEW YORK,NY,10022,590 MADISON AVE,NEW YORK,NY,10022,646-202-2897,,,200956471,"Intelligent Buying, Inc.",2026-05-22,3,Y
|
||||
889353,Sentinel Holdings Ltd.,Sentinel Holdings,Sentinel Holdings Ltd.,SNTL,SNTL,OTC,NV,NV,Y,7200,Services-Personal Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1793 LAFAYETTE ST 2ND FL,,SANTA CLARA,CA,95050,1793 LAFAYETTE ST 2ND FL,SANTA CLARA,CA,95050,801-706-9429,,,954363944,James Maritime Holdings Inc.|OUT TAKES INC,2026-06-05,10-K,Y
|
||||
794998,SETO HOLDINGS INC,Seto Holdings,Seto Holdings Inc,SETO,SETO,OTC,NV,NV,Y,3540,Metalworkg Machinery & Equipment,operating,,smaller_reporting_<75M,554 NORTH STATE ROAD,,BRIARCLIFF MANOR,NY,10510,554 NORTH STATE ROAD,BRIARCLIFF MANOR,NY,10510,9142731400,,,770082545,SEMICON TOOLS INC /NV/,2025-12-19,QUALIF,Y
|
||||
819926,SHARING ECONOMY INTERNATIONAL INC.,Sharing Economy International,Sharing Economy International Inc.,SEII,SEII,OTC,NV,NV,Y,7373,Services-Computer Integrated Systems Design,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9205 COUNTRY CLUB DRIVE,,FARMINGTON HILLS,MI,48221,9205 COUNTRY CLUB DRIVE,FARMINGTON HILLS,MI,48221,248-971-9325,,,900648920,"Cleantech Solutions International, Inc.,|China Wind Systems, Inc|MALEX INC",2026-06-03,8-K,Y
|
||||
1031093,"SILVER BULL RESOURCES, INC.",Silver Bull Resources,"Silver Bull Resources, Inc.",SVBL,SVBL,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"999 WEST HASTINGS STREET, SUITE 1508",,VANCOUVER,,V6C 2W2,"999 WEST HASTINGS STREET, SUITE 1508",VANCOUVER,,V6C 2W2,604-687-5800,,,911766677,METALLINE MINING CO,2026-04-17,8-K,Y
|
||||
1508786,"SILVERTON ENERGY, INC.",Silverton Energy,"Silverton Energy, Inc.",SLTN,,OTC,NV,NV,Y,3021,Rubber & Plastics Footwear,operating,Smaller reporting company,smaller_reporting_<75M,17304 PRESTON RD,SUITE 1290,DALLAS,TX,75252,17304 PRESTON RD,DALLAS,TX,75252,2148026777,,,923197364,"META GOLD, INC.|TIRELESS STEPS, INC.",2025-08-28,D,Y
|
||||
1085277,"SKINVISIBLE, INC.",Skinvisible,"Skinvisible, Inc.",SKVI,SKVI,OTC,NV,NV,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6320 S SANDHILL ROAD,UNIT 9,LAS VEGAS,NV,89120,6320 S SANDHILL ROAD,LAS VEGAS,NV,89120,702-433-7154,,,880344219,SKINVISIBLE INC,2026-05-13,10-Q,Y
|
||||
1546853,"Skkynet Cloud Systems, Inc.",Skkynet Cloud Systems,"Skkynet Cloud Systems, Inc.",SKKY,SKKY,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2233 ARGENTIA ROAD,SUITE 302,MISSISSAUGA,A6,L5N 2X7,2233 ARGENTIA ROAD,MISSISSAUGA,A6,L5N 2X7,888-702-7851,,,453757848,"Skyynet Cloud Systems, Inc.",2026-04-28,4,Y
|
||||
1555017,"Sky Century Investment, Inc.",Sky Century Investment,"Sky Century Investment, Inc.",SKYI,SKYI,OTC,NV,NV,Y,8741,Services-Management Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,220 EMERALD VISTA WAY #233,,LAS VEGAS,NV,89144,220 EMERALD VISTA WAY #233,LAS VEGAS,NV,89144,205-238-7735,,,455243254,"BAND REP MANAGEMENT, INC.|Band Rep Management, Inc.|SKY CENTURY INVESTMENT INC.",2026-04-14,10-Q,Y
|
||||
1817511,SOCIETY PASS INCORPORATED.,Society Pass Incorporated.,Society Pass Incorporated.,SOPAQ,SOPAQ,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating, / Emerging growth company,smaller_reporting_<75M,"80 ROBINSON ROAD, #17-01B",,SINGAPORE,,068898,"80 ROBINSON ROAD, #17-01B",SINGAPORE,,068898,65 6518-9382,,,831019155,,2026-06-08,8-K,Y
|
||||
1071840,"SolarWindow Technologies, Inc.",SolarWindow Technologies,"SolarWindow Technologies, Inc.",WNDW,WNDW,OTC,NV,NV,Y,2860,Industrial Organic Chemicals,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,9375 E. SHEA BLVD,SUITE 107-B,SCOTTSDALE,AZ,85260,9375 E. SHEA BLVD,SCOTTSDALE,AZ,85260,800-213-0689,,,593509694,"NEW ENERGY TECHNOLOGIES, INC.|OCTILLION CORP",2026-05-20,EFFECT,Y
|
||||
1427644,"Solidus Communications, Inc.",Solidus Communications,"Solidus Communications, Inc.",SLDC,SLDC,OTC,NV,NV,Y,4813,Telephone Communications (No Radiotelephone),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,260 WILLIAMSON BLVD,STE 731544,ORMOND BEACH,FL,32174,260 WILLIAMSON BLVD,ORMOND BEACH,FL,32174,7869424449,,,980546544,"Telco Cuba, Inc.|TELCO CUBA, INC..|CaerVision Global, Inc.|American Mineral Group, Inc.|Sungro Minerals Inc.",2025-09-30,QUALIF,Y
|
||||
1874138,"Sparx Holdings Group, Inc.",Sparx Holdings Group,"Sparx Holdings Group, Inc.",SHGI,,OTC,NV,NV,Y,3585,Air-Cond & Warm Air Heatg Equip & Comm & Indl Refrig Equip,operating, / Emerging growth company,smaller_reporting_<75M,"1800D MINERAL SPRING AVENUE, #164",,NORTH PROVIDENCE,RI,02904,1180 NARRAGANSETT BOULEVARD,CRANSTON,RI,02905,401-830-9878,,,923402117,"Prime Time Holdings, Inc.",2026-04-07,1-SA,Y
|
||||
1840102,"SPECIFICITY, INC.",Specificity,"Specificity, Inc.",SPTY,SPTY,OTC,NV,NV,Y,7311,Services-Advertising Agencies,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,408 WARE BLVD,SUITE 508,TAMPA,FL,33619,408 WARE BLVD,TAMPA,FL,33619,8133644744,,,854017786,,2026-06-05,10-K/A,Y
|
||||
1131903,SPECTRAL CAPITAL Corp,SPECTRAL CAPITAL,SPECTRAL CAPITAL Corp,FCCN,FCCN,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4500 9TH AVENUE NE,,SEATTLE,WA,98105,4500 9TH AVENUE NE,SEATTLE,WA,98105,206-385-6490,,,880472860,SPECTRA CAPITAL Corp|FUSA CAPITAL CORP|GALAXY CHAMPIONSHIP WRESTLING INC,2026-06-05,10-K/A,Y
|
||||
1553788,"SPLASH BEVERAGE GROUP, INC.",Splash Beverage Group,"Splash Beverage Group, Inc.",SBEVW,SBEV|SBEVW,OTC,NV,NV,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"1314 E LAS OLAS BLVD, SUITE 221",,FORT LAUDERDALE,FL,33301,"1314 E LAS OLAS BLVD, SUITE 221",FORT LAUDERDALE,FL,33301,954.745.5815,,,341720075,"Canfield Medical Supply, Inc.",2026-06-04,8-K,Y
|
||||
1999261,StageWise Strategies Corp.,StageWise Strategies,StageWise Strategies Corp.,STWI,STWI,OTC,NV,NV,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,FRIEDRICHSTR. 114A,,BERLIN,2M,10117,FRIEDRICHSTR. 114A,BERLIN,2M,10117,14133076199,,,612108075,,2026-05-20,10-Q/A,Y
|
||||
1178660,Standard Dental Labs Inc.,Standard Dental Labs,Standard Dental Labs Inc.,TUTH,TUTH,OTC,NV,NV,Y,3843,Dental Equipment & Supplies,operating,,smaller_reporting_<75M,424 E CENTRAL BLVD,SUITE 308,ORLANDO,FL,32801,424 E CENTRAL BLVD,ORLANDO,FL,32801,321-465-9899,,,880411500,COSTAS INC,2026-04-24,1-U,Y
|
||||
1401835,Star Gold Corp.,Star Gold,Star Gold Corp.,SRGZ,SRGZ,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1875 N. LAKEWOOD DR.,SUITE 200,COEUR D'ALENE,ID,83814,1875 N. LAKEWOOD DR.,COEUR D'ALENE,ID,83814,208-664-5066,,,270348508,Elan Development Inc,2026-06-05,8-K,Y
|
||||
1539850,"Starco Brands, Inc.",Starco Brands,"Starco Brands, Inc.",STCB,STCB,OTC,NV,NV,Y,7311,Services-Advertising Agencies,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,250 26TH STREET,SUITE 200,SANTA MONICA,CA,90402,250 26TH STREET,SANTA MONICA,CA,90402,818-760-1644,,,271781753,"Insynergy Products, Inc",2026-05-20,10-Q,Y
|
||||
1803096,"STARGUIDE GROUP, INC.",Starguide Group,"Starguide Group, Inc.",STRG,STRG,OTC,NV,NV,Y,5190,Wholesale-Miscellaneous Nondurable Goods,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,300 E 2ND ST,STE 1510 PMB 5010,RENO,NV,89501,300 E 2ND ST,RENO,NV,89501,702-664-0097,,,611817627,,2026-05-01,NT 10-K,Y
|
||||
1794942,"Stark Focus Group, Inc.",Stark Focus Group,"Stark Focus Group, Inc.",SKFG,SKFG,OTC,NV,NV,Y,5130,"Wholesale-Apparel, Piece Goods & Notions",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"SUITE 3001, 505 6TH STREET SW",,CALGARY,A0,T2P 1X5,"SUITE 3001, 505 6TH STREET SW",CALGARY,A0,T2P 1X5,(403) 237-8330,,,320610316,,2026-06-02,10-K,Y
|
||||
1795851,"Stewards, Inc.",Stewards,"Stewards, Inc.",SWRD,SWRD,OTC,NV,NV,Y,6153,Short-Term Business Credit Institutions,other,,smaller_reporting_<75M,4300 N. UNIVERSITY DRIVE,SUITE D-105,LAUDERHILL,FL,33351,4300 N. UNIVERSITY DRIVE,LAUDERHILL,FL,33351,8333286477,,,880436017,"Favo Capital, Inc.|Favo Realty, Inc",2026-06-01,S-1/A,Y
|
||||
1493712,Stimcell Energetics Inc.,Stimcell Energetics,Stimcell Energetics Inc.,STME,STME,OTC,NV,NV,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"820 - 1130 PENDER STREET, WEST",,VANCOUVER,A1,V6E 4A4,"820 - 1130 PENDER STREET, WEST",VANCOUVER,A1,V6E 4A4,(844) 238-2692,,,383939625,"Cell MedX Corp.|Sports Asylum, Inc.|Plandel Resources, Inc.",2026-04-10,10-Q,Y
|
||||
847942,STRATEGIC ACQUISITIONS INC /NV/,Strategic Acquisitions,Strategic Acquisitions Inc,STQN,STQN,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2464 DARTS COVE WAY,(MOUNT PLEASANT) CHARLESTON,SOUTH CAROLINA,SC,29466-0101,2464 DARTS COVE WAY,SOUTH CAROLINA,SC,29466-0101,212-878-6532,,,133506506,,2026-05-07,10-Q,Y
|
||||
1576197,"Strategic Environmental & Energy Resources, Inc.",Strategic Environmental & Energy Resources,"Strategic Environmental & Energy Resources, Inc.",SENR,SENR,OTC,NV,NV,Y,4955,Hazardous Waste Management,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,370 INTERLOCKEN BOULEVARD,SUITE 680,BROOMFIELD,CO,80021,370 INTERLOCKEN BOULEVARD,BROOMFIELD,CO,80021,(303)295-6498,,,020565834,,2026-03-31,NT 10-K,Y
|
||||
1394108,SUIC Worldwide Holdings Ltd.,SUIC Worldwide Holdings,SUIC Worldwide Holdings Ltd.,SUIC,SUIC,OTC,NV,NV,Y,2860,Industrial Organic Chemicals,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,136-20 38TH AVE.,UNIT 3G,FLUSHING,NY,11354,136-20 38TH AVE.,FLUSHING,NY,11354,929-391-2550,,,472148252,"Sino United Worldwide Consolidated Ltd.|AJ GREENTECH HOLDINGS.|AMERICAN JIANYE GREENTECH HOLDINGS, LTD.|Gateway Certifications, Inc.",2026-05-14,10-Q,Y
|
||||
1619096,Summit Networks Inc.,Summit Networks,Summit Networks Inc.,SNTW,SNTW,OTC,NV,NV,Y,4953,Refuse Systems,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"1221 BRICKELL AVENUE, SUITE 900",,MIAMI,FL,33131,"1221 BRICKELL AVENUE, SUITE 900",MIAMI,FL,33131,305-347-5158,,,352511257,,2026-05-19,10-Q,Y
|
||||
1171838,"Sundance Strategies, Inc.",Sundance Strategies,"Sundance Strategies, Inc.",SUND,SUND,OTC,NV,NV,Y,6411,"Insurance Agents, Brokers & Service",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"4626 NORTH 300 WEST, SUITE 365",,PROVO,UT,84604,"4626 NORTH 300 WEST, SUITE 365",PROVO,UT,84604,801-705-8968,,,880515333,JAVA EXPRESS INC,2026-02-17,10-Q,Y
|
||||
1481028,"SUNHYDROGEN, INC.",Sunhydrogen,"Sunhydrogen, Inc.",HYSR,HYSR,OTC,NV,NV,Y,3674,Semiconductors & Related Devices,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,BIOVENTURES CENTER,2500 CROSSPARK ROAD,CORALVILLE,IA,52241,BIOVENTURES CENTER,CORALVILLE,IA,52241,805-966-6566,,,000000000,"Hypersolar, Inc.",2026-05-08,10-Q,Y
|
||||
1624985,SUPA Consolidated Inc.,SUPA Consolidated,SUPA Consolidated Inc.,SFCX,SFCX,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,530 TECHNOLOGY DRIVE,SUITE 100,IRVINE,CA,92618,530 TECHNOLOGY DRIVE,IRVINE,CA,92618,844.787.2720,,,371758469,"Tribal Rides International Corp.|XINDA INTERNATIONAL CORP.|TriMax Consulting, Inc.",2026-05-01,10-Q,Y
|
||||
1192323,Superstar Platforms Inc.,Superstar Platforms,Superstar Platforms Inc.,SPST,SPST,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,114 JUAN PABLO DUARTE CALLE,,SANTO DOMINGO,NY,00000,P. O. BOX 3143,LIVERPOOL,NY,13089,315-701-1031,,,010741042,"Dinewise, Inc.|DINEWISE, INC.|SIMPLAGENE USA INC",2026-05-15,10-Q,Y
|
||||
1437750,T-REX Acquisition Corp.,T-REX Acquisition,T-REX Acquisition Corp.,TRXA,TRXA,OTC,NV,NV,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7301 NW 4TH STREET,SUITE 102,PLANTATION,FL,33317,7301 NW 4TH STREET,PLANTATION,FL,33317,954-742-3001,,,261754034,"Trex Acquisition Corp.|Sync2 Networks Corp|Plethora Resources, Inc.",2026-05-26,10-Q,Y
|
||||
1090396,TABLE TRAC INC,Table Trac,Table Trac Inc,TBTC,TBTC,OTC,NV,NV,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,BAKER TECHNOLOGY PLAZA SOUTH,6101 BAKER ROAD ? SUITE 206,MINNETONKA,MN,55345,BAKER TECHNOLOGY PLAZA SOUTH,MINNETONKA,MN,55345,952-548-8877,,,880365568,,2026-05-13,8-K,Y
|
||||
1753391,"TANCHENG GROUP CO., LTD.",Tancheng Group Co.,"Tancheng Group Co., Ltd.",QSJC,QSJC,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"7TH FLOOR, JINCHENG INTL., JIUJINCI RD.",WANBAILIN DISTRICT,TAIYUAN CITY,,,"7TH FLOOR, JINCHENG INTL., JIUJINCI RD.",TAIYUAN CITY,,,8613910972765,,,384086827,BIGEON CORP.,2026-05-15,10-Q,Y
|
||||
1481443,"TechCom, Inc.",TechCom,"TechCom, Inc.",TCRI,TCRI,OTC,NV,NV,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"2901, 29TH FLOOR, BOULEVARD PLAZA TOWER",BURJ KHALIFA DISTRICT,DOWNTOWN DUBAI,C0,00000,"2901, 29TH FLOOR, BOULEVARD PLAZA TOWER",DOWNTOWN DUBAI,C0,00000,852 29803711,,,061701678,RMD Entertainment Group,2026-05-06,10-Q,Y
|
||||
1384365,"Telvantis, Inc.",Telvantis,"Telvantis, Inc.",RDAR,RDAR,OTC,NV,NV,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1680 MICHIGAN AVENUE,SUITE 700,MIAMI BEACH,FL,33139,1680 MICHIGAN AVENUE,MIAMI BEACH,FL,33139,954-456-3191,,,204622782,"RAADR, INC.|PITOOEY!, INC.|WHITE DENTAL SUPPLY, INC.",2025-10-15,1-Z,Y
|
||||
711034,THUNDER MOUNTAIN GOLD INC,Thunder Mountain Gold,Thunder Mountain Gold Inc,THMG,THMG,OTC,NV,NV,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,11770 W. PRESIDENT DR. STE F,,BOISE,ID,83713,11770 W. PRESIDENT DR. STE F,BOISE,ID,83713,208-658-1037,,,911031075,,2026-06-08,8-K,Y
|
||||
1463208,"Transportation & Logistics Systems, Inc.",Transportation & Logistics Systems,"Transportation & Logistics Systems, Inc.",TLSS,TLSS,OTC,NV,NV,Y,4700,Transportation Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5500 MILITARY TRAIL,SUITE 22-357,JUPITER,FL,33458,5500 MILITARY TRAIL,JUPITER,FL,33458,1.833.764.1443,,,263106763,PETROTERRA CORP.|LORAN CONNECTION CORP,2026-06-05,8-K,Y
|
||||
1758699,TRANSUITE.ORG INC.,Transuite.org,Transuite.org Inc.,TRSO,TRSO,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,732 S 6TH ST # 4304,,LAS VEGAS,NV,89101,732 S 6TH ST # 4304,LAS VEGAS,NV,89101,7028339602,,,301129581,,2026-05-22,10-K,Y
|
||||
1349706,"TurnOnGreen, Inc.",TurnOnGreen,"TurnOnGreen, Inc.",TOGI,TOGI|TOGIW,OTC,NV,NV,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1421 MCCARTHY BLVD.,,MILPITAS,CA,95035,1421 MCCARTHY BLVD.,MILPITAS,CA,95035,(510) 657-2635,,,205648820,IMPERALIS HOLDING CORP.|COLOURED (US) INC.,2026-05-13,10-Q,Y
|
||||
1952670,TV Channels Network Inc.,TV Channels Network,TV Channels Network Inc.,TVCN,TVCN,,NV,NV,Y,4899,"Communications Services, NEC",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,7582 LAS VEGAS BLVD SOUTH,,LAS VEGAS,NV,89123,7582 LAS VEGAS BLVD SOUTH,LAS VEGAS,NV,89123,7027219915,,,883851932,,2026-05-14,10-Q,Y
|
||||
1096938,"United Health Products, Inc.",United Health Products,"United Health Products, Inc.",UEEC,UEEC,OTC,NV,NV,Y,3842,"Orthopedic, Prosthetic & Surgical Appliances & Supplies",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,526 COMMERCE CIRCLE,STE. #120,MESQUITE,NV,89027,526 COMMERCE CIRCLE,MESQUITE,NV,89027,475-755-1005,,,841517723,United EcoEnergy Corp.|MNS EAGLE EQUITY GROUP III INC,2026-05-22,424B3,Y
|
||||
1677897,UPAY,Upay,Upay,UPYY,UPYY,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,3010 LBJ FWY,SUITE 1200,DALLAS,TX,75234,3010 LBJ FWY,DALLAS,TX,75234,9728886052,,,371793622,,2026-06-02,10-K,Y
|
||||
1746119,Vanguard Green Investment Ltd,Vanguard Green Investment,Vanguard Green Investment Ltd,VGES,VGES,OTC,NV,NV,Y,7200,Services-Personal Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"RM. 5, 7F., NO. 296, SEC. 4, XINYI RD.,","DA AN DIST.,",TAIPEI CITY,F5,106427,"RM. 5, 7F., NO. 296, SEC. 4, XINYI RD.,",TAIPEI CITY,F5,106427,886 0905153139,,,301089215,MU GLOBAL HOLDING Ltd,2026-03-16,10-Q,Y
|
||||
1506929,"VERDE RESOURCES, INC.",Verde Resources,"Verde Resources, Inc.",VRDR,VRDR,OTC,NV,NV,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,8112 MARYLAND AVE,SUITE 400,ST. LOUIS,MO,63105,8112 MARYLAND AVE,ST. LOUIS,MO,63105,(314) 530-9071,,,272448672,,2026-06-03,10-K/A,Y
|
||||
2033264,Vertical Data Inc.,Vertical Data,Vertical Data Inc.,VDTA,VDTA,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1980 FESTIVAL PLAZA DRIVE SUITE 300,,LAS VEGAS,NV,89135,1980 FESTIVAL PLAZA DRIVE SUITE 300,LAS VEGAS,NV,89135,7026132328,,,992841705,,2026-06-05,POS AM,Y
|
||||
1084475,"Video River Networks, Inc.",Video River Networks,"Video River Networks, Inc.",NIHK,NIHK,OTC,NV,NV,Y,6500,Real Estate,operating, / Emerging growth company,smaller_reporting_<75M,1333 N. BUFFALO DR.,SUITE 210,LAS VEGAS,NV,89128,1333 N. BUFFALO DR.,LAS VEGAS,NV,89128,5015842853,,,870627349,NIGHTHAWK SYSTEMS INC|PEREGRINE INC|LSI COMMUNICATIONS INC,2025-11-05,15-15D,Y
|
||||
1832161,"VIP Play, Inc.",VIP Play,"VIP Play, Inc.",VIPZ,VIPZ,OTC,NV,NV,Y,5900,Retail-Miscellaneous Retail,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,78 SW 7TH STREET,SUITE 500,MIAMI,FL,33130,78 SW 7TH STREET,MIAMI,FL,33130,866-783-9435,,,850738656,KeyStar Corp.,2026-05-15,10-Q,Y
|
||||
1470129,VisitIQ Corp.,VisitIQ,VisitIQ Corp.,VIIQ,VIIQ,OTC,NV,NV,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,729 N. WASHINGTON AVENUE,SUITE 600,MINNEAPOLIS,MN,55401,729 N. WASHINGTON AVENUE,MINNEAPOLIS,MN,55401,651-295-7583,,,680678185,"Capstone Technologies Group Inc.|China Bilingual Technology & Education Group Inc.|DESIGNER EXPORT, INC",2026-05-26,10-K/A,Y
|
||||
1699709,VitaNova Life Sciences Corp,VitaNova Life Sciences,VitaNova Life Sciences Corp,VNOV,VNOV,OTC,NV,NV,Y,5130,"Wholesale-Apparel, Piece Goods & Notions",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"39 E. BROADWAY, STE 603",,NEW YORK,NY,10002,"39 E. BROADWAY, STE 603",NEW YORK,NY,10002,516-886-8888,,,352583762,YIJIA GROUP CORP.|YIJIA GROUP CORP|Soldino Group Corp,2026-03-18,8-K,Y
|
||||
1703073,VIVIC CORP.,Vivic,Vivic Corp.,VIVC,VIVC,OTC,NV,NV,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"187 E. WARM SPRINGS ROAD., SUITE B450",,LAS VEGAS,NV,89119-4112,"187 E. WARM SPRINGS ROAD., SUITE B450",LAS VEGAS,NV,89119-4112,702-899-0818,,,981353606,,2026-05-14,10-Q,Y
|
||||
1410738,Voip-pal.com Inc,Voip-pal.com,Voip-pal.com Inc,VPLM,VPLM,OTC,NV,NV,Y,3661,Telephone & Telegraph Apparatus,operating, / Emerging growth company,smaller_reporting_<75M,7215 BOSQUE BLVD,SUITE 102,WACO,TX,76710,7215 BOSQUE BLVD,WACO,TX,76710,253-219-9512,,,980184110,,2026-06-04,144,Y
|
||||
1515139,WASTE ENERGY CORP.,Waste Energy,Waste Energy Corp.,WAST,WAST,OTC,NV,NV,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3250 OAKLAND HILLS COURT,,FAIRFIELD,CA,94534,3250 OAKLAND HILLS COURT,FAIRFIELD,CA,94534,424-570-9446,,,273098487,"METAWORKS PLATFORMS, INC.|CurrencyWorks Inc.|ICOX INNOVATIONS INC.|AppCoin Innovations Inc.|RedStone Literary Agents, Inc.",2026-05-27,8-K/A,Y
|
||||
1393772,"WEED, INC.",Weed,"Weed, Inc.",BUDZ,BUDZ,OTC,NV,NV,Y,8731,Services-Commercial Physical & Biological Research,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4920 N. POST TRAIL,,TUCSON,AZ,85750,4920 N. POST TRAIL,TUCSON,AZ,85750,520-818-8582,,,830452269,UNITED MINES INC,2026-05-15,10-Q,Y
|
||||
723533,Wenyuan Group Corp.,Wenyuan Group,Wenyuan Group Corp.,WYGC,WYGC,OTC,NV,NV,Y,8742,Services-Management Consulting Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"RM 219, NO. 25 CAIHE RD",SHANGCHENG DIST.,HANGZHOU,,,"RM 219, NO. 25 CAIHE RD",HANGZHOU,,,626-872-9451,,,953506403,"Longwen Group Corp.|Allied Ventures Holdings Corp.|Dephasium Corp.|ALLIED VENTURES HOLDING CORP.|Pay Mobile, Inc|EXPERTELLIGENCE INC",2026-05-20,10-Q,Y
|
||||
1616156,"WEWARDS, INC.",Wewards,"Wewards, Inc.",WEWA,WEWA,OTC,NV,NV,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3305 SPRING MOUNTAIN ROAD,SUITE 104,LAS VEGAS,NV,89102,3305 SPRING MOUNTAIN ROAD,LAS VEGAS,NV,89102,702-944-5599,,,331230099,"GLOBAL ENTERTAINMENT CLUBS, INC.|FUTURE WORLD GROUP, INC.|Betafox Corp.",2026-03-17,10-Q,Y
|
||||
1587603,"WINNERS, INC.",Winners,"Winners, Inc.",WNRS,WNRS|WNRSD,,NV,NV,Y,7900,Services-Amusement & Recreation Services,other,,smaller_reporting_<75M,401 RYLAND STREET,SUITE 200-A,RENO,NV,89502,401 RYLAND STREET,RENO,NV,89502,954-908-3366,,,260764832,"Baroma, Inc.",2026-04-24,QUALIF,Y
|
||||
1503658,"Winning Catering Group, Inc.",Winning Catering Group,"Winning Catering Group, Inc.",WNHK,WNHK,OTC,NV,NV,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4800 MONTGOMERY LANE,SUITE 210,BETHESDA,MD,20814,4800 MONTGOMERY LANE,BETHESDA,MD,20814,301-971-3940,,,271467607,LiquidValue Development Inc.|SeD Intelligent Home Inc.|HOMEOWNUSA,2026-04-22,10-Q,Y
|
||||
1558740,Winvest Group Ltd,Winvest Group,Winvest Group Ltd,WNLV,WNLV,OTC,NV,NV,Y,7812,Services-Motion Picture & Video Tape Production,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,50 WEST LIBERTY STREET,SUITE 880,RENO,NV,89501,50 WEST LIBERTY STREET,RENO,NV,89501,(775) 996-0288,,,272052033,ZYROX MINING INTERNATIONAL INC,2026-05-14,NT 10-Q,Y
|
||||
1560143,WYTEC INTERNATIONAL INC,Wytec International,Wytec International Inc,WYTC,WYTC,OTC,NV,NV,Y,4822,Telegraph & Other Message Communications,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"19206 HUEBNER ROAD, SUITE 202",,SAN ANTONIO,TX,78258,"19206 HUEBNER ROAD, SUITE 202",SAN ANTONIO,TX,78258,(210) 233-8980,,,460720717,,2026-05-26,D,Y
|
||||
1651932,"Xenous Holdings, Inc.",Xenous Holdings,"Xenous Holdings, Inc.",XITO,XITO,OTC,NV,NV,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"SUITE 20.03, PLAZA 138, JALAN AMPANG",,KUALA LUMPUR,N8,50450,"SUITE 20.03, PLAZA 138, JALAN AMPANG",KUALA LUMPUR,N8,50450,603 2181 0150,,,870363526,M101 CORP.|Concept Holding Corp.,2026-05-12,8-K,Y
|
||||
1557376,"Zeo ScientifiX, Inc.",Zeo ScientifiX,"Zeo ScientifiX, Inc.",ZEOX,ZEOX,OTC,NV,NV,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3321 COLLEGE AVENUE,SUITE 246,DAVIE,FL,33314,3321 COLLEGE AVENUE,DAVIE,FL,33314,888-963-7881,,,474180540,"Organicell Regenerative Medicine, Inc.|Biotech Products Services & Research, Inc.|BESPOKE TRICYCLES INC",2026-06-09,8-K,Y
|
||||
1465311,Zicix Corp,Zicix,Zicix Corp,ZICX,ZICX,OTC,NV,NV,Y,7310,Services-Advertising,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"1901, THE WORLD TRADE CENTRE","280 GLOUCESTER ROAD, CAUSEWAY BAY",HONG KONG,,,"1901, THE WORLD TRADE CENTRE",HONG KONG,,,852-91010998,,,742036525,BEDERRA Corp,2026-02-20,10-Q,Y
|
||||
1101026,"Zivo Bioscience, Inc.",Zivo Bioscience,"Zivo Bioscience, Inc.",ZIVO,ZIVO|ZIVOW,OTC,NV,NV,Y,2836,"Biological Products, (No Diagnostic Substances)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,21 E. LONG LAKE ROAD,SUITE 100,BLOOMFIELD HILLS,MI,48304,21 E. LONG LAKE ROAD,BLOOMFIELD HILLS,MI,48304,(248) 452 9866,,,870699977,HEALTH ENHANCEMENT PRODUCTS INC|WESTERN GLORY HOLE INC,2026-04-24,4,Y
|
||||
1279620,"Zoned Properties, Inc.",Zoned Properties,"Zoned Properties, Inc.",ZDPY,ZDPY,OTC,NV,NV,Y,6512,Opeators of Nonresidential Buildings,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"8360 E. RAINTREE DRIVE, SUITE #230",,SCOTTSDALE,AZ,85260,"8360 E. RAINTREE DRIVE, SUITE #230",SCOTTSDALE,AZ,85260,877-360-8839,,,465198242,"Vanguard Minerals CORP|Vanguard Minerals Corp|Knewtrino, Inc.|MONGOLIAN EXPLORATIONS LTD",2026-05-15,8-K,Y
|
||||
1328409,WHITE RIVER BANCSHARES CO,White River Bancshares,White River Bancshares Co,WRIV,WRIV,OTC,AR,AR,Y,,,other,,smaller_reporting_<75M,3878 N. CROSSOVER ROAD,SUITE 20,FAYETTEVILLE,AR,72703,3878 N. CROSSOVER ROAD,FAYETTEVILLE,AR,72703,479-684-3700,,,000000000,,2026-05-15,SCHEDULE 13G/A,Y
|
||||
2135939,Norient Acquisition,Norient Acquisition,Norient Acquisition,NORT,,,AZ,AZ,Y,,,other,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,ARC GROUP SECURITIES LLC,"398 MILL AVE, SUITE 201B",TEMPE,AZ,85281,ARC GROUP SECURITIES LLC,TEMPE,AZ,85281,1 928 625 0928,,,000000000,,2026-06-03,S-1,Y
|
||||
1956237,Almco Plumbing Inc,Almco Plumbing,Almco Plumbing Inc,ALMP,ALMP,OTC,CA,CA,Y,1700,Construction - Special Trade Contractors,other,,smaller_reporting_<75M,5663 BALBOA AVE,UNIT 372,SAN DIEGO,CA,92111,5663 BALBOA AVE,SAN DIEGO,CA,92111,8582529321,,,364915179,,2026-04-30,1-K,Y
|
||||
1723059,Bio Essence Corp,Bio Essence,Bio Essence Corp,BIOE,BIOE,OTC,CA,CA,Y,2834,Pharmaceutical Preparations,operating, / Emerging growth company,smaller_reporting_<75M,2955 MAIN STREET,STE 300,IRVINE,CA,92614,2955 MAIN STREET,IRVINE,CA,92614,888-816-1494,,,943349551,,2026-05-19,8-K/A,Y
|
||||
803016,CALIFORNIA FIRST LEASING CORP,California First Leasing,California First Leasing Corp,CFNB,CFNB,OTC,CA,CA,Y,6021,National Commercial Banks,operating,Smaller reporting company,smaller_reporting_<75M,"5000 BIRCH STREET, SUITE 500",,NEWPORT BEACH,CA,92660,"5000 BIRCH STREET, SUITE 500",NEWPORT BEACH,CA,92660,949-255-0500,,,330964185,CALIFORNIA FIRST NATIONAL BANCORP|AMPLICON INC,2026-06-08,40-17G,Y
|
||||
1917599,Endeavor Bancorp,Endeavor Bancorp,Endeavor Bancorp,EDVR,EDVR,OTC,CA,CA,Y,,,other,,smaller_reporting_<75M,"750 B STREET, SUITE 3110",,SAN DIEGO,CA,92101,"750 B STREET, SUITE 3110",SAN DIEGO,CA,92101,619-887-3505,,,874376296,,2026-02-17,D,Y
|
||||
79661,PORTSMOUTH SQUARE INC,Portsmouth Square,Portsmouth Square Inc,PRSI,PRSI,OTC,CA,CA,Y,6552,Land Subdividers & Developers (No Cemeteries),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,11620 WILSHIRE BOULEVARD,SUITE 350,LOS ANGELES,CA,90025,11620 WILSHIRE BOULEVARD,LOS ANGELES,CA,90025,(310) 889-2511,,,941674111,,2026-05-26,8-K,Y
|
||||
92108,SOUTHERN CALIFORNIA GAS CO,Southern California Gas,Southern California Gas Co,SOCGM,SOCGM|SOCGP,OTC,CA,CA,Y,4922,Natural Gas Transmission,operating,,smaller_reporting_<75M,555 WEST 5TH STREET,,LOS ANGELES,CA,90013-1011,555 WEST 5TH STREET,LOS ANGELES,CA,90013-1011,2132441200,,,951240705,,2026-05-15,8-K,Y
|
||||
942126,TAITRON COMPONENTS INC,Taitron Components,Taitron Components Inc,TAIT,TAIT,OTC,CA,CA,Y,5065,"Wholesale-Electronic Parts & Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,28040 WEST HARRISON PARKWAY,,VALENCIA,CA,91355,28040 WEST HARRISON PARKWAY,VALENCIA,CA,91355,(661) 257-6060,,,954249240,,2026-02-12,SCHEDULE 13G/A,Y
|
||||
835662,"AiXin Life International, Inc.",AiXin Life International,"AiXin Life International, Inc.",AIXN,AIXN,OTC,CO,CO,Y,5912,Retail-Drug Stores and Proprietary Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"HONGXING INTL BUSINESS BUILDING 2,","14TH FLR, NO. 69, QINGYUN SOUVE AVE.,","JINJIANG DISTRICT,CHENGDU CITY",F4,610021,"HONGXING INTL BUSINESS BUILDING 2,","JINJIANG DISTRICT,CHENGDU CITY",F4,610021,212-739-7689,,,841085935,MERCARI COMMUNICATIONS GROUP LTD,2026-05-18,8-K,Y
|
||||
872716,ALPINE BANKS OF COLORADO,Alpine Banks of Colorado,Alpine Banks of Colorado,ALPIB,ALPIB,OTC,CO,CO,Y,,,other,,smaller_reporting_<75M,"P.O. BOX 10,000",,GLENWOOD SPRINGS,CO,81601,"P.O. BOX 10,000",GLENWOOD SPRINGS,CO,81601,970-384-3257,,,840868818,,2025-12-04,D,Y
|
||||
875729,BION ENVIRONMENTAL TECHNOLOGIES INC,Bion Environmental Technologies,Bion Environmental Technologies Inc,BNET,BNET,OTC,CO,CO,Y,2870,Agricultural Chemicals,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,PO BOX 323,,OLD BETHPAGE,NY,11804,PO BOX 323,OLD BETHPAGE,NY,11804,406-839-0816,,,841176672,,2026-05-15,10-Q,Y
|
||||
2029586,"Blue Line Holdings, Inc.",Blue Line Holdings,"Blue Line Holdings, Inc.",BLNH,BLNH,OTC,CO,CO,Y,2086,Bottled & Canned Soft Drinks & Carbonated Waters,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1361 CASTLEPOINT CIRCLE,,CASTLE PINES,CO,80108,1361 CASTLEPOINT CIRCLE,CASTLE PINES,CO,80108,720-705-9222,,,993114735,,2026-05-04,10-Q,Y
|
||||
1411057,"Cannabis Bioscience International Holdings, Inc.",Cannabis Bioscience International Holdings,"Cannabis Bioscience International Holdings, Inc.",CBIH,CBIH,OTC,CO,CO,Y,8731,Services-Commercial Physical & Biological Research,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,6201 BONHOMME ROAD,SUITE 435S,HOUSTON,TX,77036,6201 BONHOMME ROAD,HOUSTON,TX,77036,214-733-0868,,,844901229,CHINA INFRASTRUCTURE CONSTRUCTION Corp|FIDELITY AVIATION CORP,2026-05-21,253G2,Y
|
||||
1084551,Community Redevelopment Inc.,Community Redevelopment,Community Redevelopment Inc.,CRDV,CRDV,OTC,CO,CO,Y,6552,Land Subdividers & Developers (No Cemeteries),operating, / Emerging growth company,smaller_reporting_<75M,9 C MEDWAY ROAD,#214,MILFORD,MA,01757,9 C MEDWAY ROAD,MILFORD,MA,01757,774-573-9114,,,852629422,Crosswind Renewable Energy Corp|STEALTH MEDIALABS INC|KIDSTOYSPLUS COM INC,2026-05-29,1-A,Y
|
||||
790273,CONECTISYS CORP,Conectisys,Conectisys Corp,CONC,CONC,OTC,CO,CO,Y,3663,Radio & Tv Broadcasting & Communications Equipment,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,14308 S. GOSS RD.,,CHENEY,WA,99004,14308 S. GOSS RD.,CHENEY,WA,99004,949 929-5455,,,841017107,,2026-05-06,10-Q,Y
|
||||
1828377,Fortitude Gold Corp,Fortitude Gold,Fortitude Gold Corp,FTCO,FTCO,OTC,CO,CO,Y,1040,Gold and Silver Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2886 CARRIAGE MANOR POINT,,COLORADO SPRINGS,CO,80906,2886 CARRIAGE MANOR POINT,COLORADO SPRINGS,CO,80906,3033207708,,,852602691,,2026-06-05,8-K,Y
|
||||
84112,"GEORGE RISK INDUSTRIES, INC.",George Risk Industries,"George Risk Industries, Inc.",RSKIA,RSKIA,OTC,CO,CO,Y,3669,"Communications Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,802 SOUTH ELM,,KIMBALL,NE,69145,802 S ELM ST,KIMBALL,NE,69145,3082354645,,,840524756,RISK GEORGE INDUSTRIES INC,2026-05-11,SCHEDULE 13G,Y
|
||||
1497649,Graphene & Solar Technologies Ltd,Graphene & Solar Technologies,Graphene & Solar Technologies Ltd,GSTX,GSTX,OTC,CO,CO,Y,1000,Metal Mining,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,11201 NORTH TATUM BOULEVARD,SUITE 300,PHOENIX,AZ,85028,11201 NORTH TATUM BOULEVARD,PHOENIX,AZ,85028,602-388-8335,,,272888719,Solar Quartz Technologies Corp|Vanguard Energy Corp,2026-05-15,10-Q,Y
|
||||
918573,GROOVE BOTANICALS INC.,Groove Botanicals,Groove Botanicals Inc.,GRVE,GRVE,OTC,CO,CO,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,310 FOURTH AVENUE SOUTH,SUITE 7000,MINNEAPOLIS,MN,55415,310 FOURTH AVENUE SOUTH,MINNEAPOLIS,MN,55415,(952) 746-9652,,,841168832,"Avalon Oil & Gas, Inc.|XDOGS COM INC|SLED DOGS CO",2026-05-22,8-K,Y
|
||||
1945619,Kinetic Seas Inc.,Kinetic Seas,Kinetic Seas Inc.,KSEZ,KSEZ,OTC,CO,CO,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1501 WOODFIELD ROAD,SUITE 114E,SCHAUMBURG,IL,60173,1501 WOODFIELD ROAD,SCHAUMBURG,IL,60173,888-901-8806,,,471981170,"Bellatora, Inc.",2026-06-08,144,Y
|
||||
1493137,"Lifeloc Technologies, Inc",Lifeloc Technologies,"Lifeloc Technologies, Inc",LCTC,LCTC,OTC,CO,CO,Y,3826,Laboratory Analytical Instruments,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12441 WEST 49TH AVE UNIT #4,,WHEAT RIDGE,CO,80033,12441 WEST 49TH AVE UNIT #4,WHEAT RIDGE,CO,80033,303-431-9500,,,841053680,Lifeloc Technologies Inc,2026-06-05,8-K,Y
|
||||
1145604,"NIKA PHARMACEUTICALS, INC",Nika Pharmaceuticals,"Nika Pharmaceuticals, Inc",NIKA,NIKA,OTC,CO,CO,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,2269 MERRIMACK VALLEY AVENUE,,HENDERSON,NV,89044,2269 MERRIMACK VALLEY AVENUE,HENDERSON,NV,89044,7023263615,,,900292940,CENTENNIAL GROWTH EQUITIES INC,2026-05-12,10-Q,Y
|
||||
1990446,"Trans American Aquaculture, Inc",Trans American Aquaculture,"Trans American Aquaculture, Inc",GRPS,GRPS,OTC,CO,CO,Y,0200,Agricultural Prod-Livestock & Animal Specialties,operating, / Emerging growth company,smaller_reporting_<75M,1022 SHADYSIDE LANE,,DALLAS,TX,75223,1022 SHADYSIDE LANE,DALLAS,TX,75223,972-358-6037,,,020685828,,2026-05-15,NT 10-Q,Y
|
||||
1477009,TREES Corp (Colorado),TREES Corp (Colorado),TREES Corp (Colorado),CANN,CANN,OTC,CO,CO,Y,5912,Retail-Drug Stores and Proprietary Stores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,215 UNION BOULEVARD,SUITE 415,LAKEWOOD,CO,80228,215 UNION BOULEVARD,LAKEWOOD,CO,80228,303-759-1300,,,208096131,"GENERAL CANNABIS CORP|Advanced Cannabis Solutions, Inc.|Promap Corp",2025-08-22,8-K,Y
|
||||
23426,CONNECTICUT LIGHT & POWER CO,Connecticut Light & Power,Connecticut Light & Power Co,CNTHP,CNTHP|CNLPL|CNTHO|CNTHN|CNLHP|CNLTP|CNLTL|CNPWM|CNLHO|CNPWP|CNLPM|CNLTN|CNLHN,OTC,CT,CT,Y,4911,Electric Services,operating,,smaller_reporting_<75M,107 SELDEN STREET,,BERLIN,CT,06037-1616,107 SELDEN STREET,BERLIN,CT,06037,(860)665-5000,,,060303850,,2026-05-07,10-Q,Y
|
||||
1472033,"Citibank,N.A./ADR","Citibank,N.A./ADR","Citibank,N.A./ADR",JTGEY,JTGEY|JTGLF,OTC,DC,DC,Y,,,other,,smaller_reporting_<75M,"388 GREENWICH STREET, 14TH FLOOR",,NEW YORK,NY,10013,"388 GREENWICH STREET, 14TH FLOOR",NEW YORK,NY,10013,212-816-6647,,,521568099,"Citibank,N.A./ADR",2026-06-08,F-6EF,Y
|
||||
1386044,"Awareness Group, Inc.",Awareness Group,"Awareness Group, Inc.",TAAG,TAAG,OTC,FL,FL,Y,6163,Loan Brokers,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"4343 N SCOTTSDALE RD, #150",,SCOTTSDALE,AZ,85251,"4343 N SCOTTSDALE RD, #150",SCOTTSDALE,AZ,85251,818-357-3155,,,562560951,"Freedom Holdings, Inc.|FREEDOM ENERGY HOLDINGS INC|FREEDOM FINANCIAL HOLDINGS INC",2026-05-11,NT 10-Q,Y
|
||||
1109262,"BILI Social International, Inc.",BILI Social International,"BILI Social International, Inc.",AGGI,AGGI,OTC,FL,FL,Y,5960,Retail-Nonstore Retailers,operating, / Emerging growth company,smaller_reporting_<75M,625 BROAD STREET,"2ND FLOOR, SUITE 240",NEWARK,NJ,07102,625 BROAD STREET,NEWARK,NJ,07102,888-458-2454,,,223084979,"Allied Energy, Inc.|TECHNOL FUEL CONDITIONERS INC|BRAZILIAN SERVICES COM INC",2026-06-04,8-K,Y
|
||||
1658678,"BioStem Technologies, Inc.",BioStem Technologies,"BioStem Technologies, Inc.",BSEM,BSEM,OTC,FL,FL,Y,2836,"Biological Products, (No Diagnostic Substances)",other,,smaller_reporting_<75M,2836 CENTER PORT CIRCLE,,POMPANO BEACH,FL,33604,2836 CENTER PORT CIRCLE,POMPANO BEACH,FL,33604,954-380-8342,,,270400416,BIOSTEM TECHNOLOGIES,2026-06-03,D,Y
|
||||
1568385,"Bright Mountain Media, Inc.",Bright Mountain Media,"Bright Mountain Media, Inc.",BMTM,BMTM,OTC,FL,FL,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,6400 CONGRESS AVE.,SUITE 2050,BOCA RATON,FL,33487,6400 CONGRESS AVE.,BOCA RATON,FL,33487,561-998-2440,,,272977890,"Bright Mountain Acquisition Corp|Bright Mountain Holdings, Inc./FL",2026-05-19,4,Y
|
||||
1166708,"Brownie's Marine Group, Inc",Brownie's Marine Group,"Brownie's Marine Group, Inc",BWMG,BWMG,OTC,FL,FL,Y,3949,"Sporting & Athletic Goods, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"3001 NW 25TH AVENUE,",SUITE 1,POMPANO BEACH,FL,33069,"3001 NW 25TH AVENUE,",POMPANO BEACH,FL,33069,954-462-5570,,,300024898,UNITED COMPANIES CORP,2026-05-15,10-Q,Y
|
||||
1509957,Can B Corp,Can B,Can B Corp,NASC,NASC,OTC,FL,FL,Y,5122,"Wholesale-Drugs, Proprietaries & Druggists' Sundries",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"960 SOUTH BROADWAY, SUITE 120",,HICKSVILLE,NY,11801,"960 SOUTH BROADWAY, SUITE 120",HICKSVILLE,NY,11801,516-205-4751,,,203624118,"Canbiola, Inc.|Wrapmail, Inc.",2025-07-16,15-12G,Y
|
||||
814926,"CAPSTONE COMPANIES, INC.",Capstone Companies,"Capstone Companies, Inc.",CAPC,CAPC,OTC,FL,FL,Y,3640,Electric Lighting & Wiring Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"NUMBER 144-V, 10 FAIRWAY DRIVE",SUITE 100,DEERFIELD BEACH,FL,33441,"NUMBER 144-V, 10 FAIRWAY DRIVE",DEERFIELD BEACH,FL,33441,(954) 252-3440,,,841047159,CHDT CORP|CHINA DIRECT TRADING CORP|CBQ INC|FREEDOM FUNDING INC,2026-05-20,8-K/A,Y
|
||||
811222,Cardiff Lexington Corp,Cardiff Lexington,Cardiff Lexington Corp,CDIX,CDIX,OTC,FL,FL,Y,8011,Services-Offices & Clinics of Doctors of Medicine,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3753 HOWARD HUGHES PARKWAY,SUITE 200,LAS VEGAS,NV,89169,3753 HOWARD HUGHES PARKWAY,LAS VEGAS,NV,89169,844-628-2100,,,841044583,CARDIFF INTERNATIONAL INC,2026-05-13,10-Q,Y
|
||||
1362516,"Cleartronic, Inc.",Cleartronic,"Cleartronic, Inc.",CLRI,CLRI,OTC,FL,FL,Y,4812,Radiotelephone Communications,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,28050 US HWY 19 N,,CLEARWATER,FL,33761,28050 US HWY 19 N,CLEARWATER,FL,33761,813-289-7620,,,650958798,"GlobalTel IP, Inc.",2026-05-12,10-Q,Y
|
||||
1619227,"Cloudweb, Inc.",Cloudweb,"Cloudweb, Inc.",CLOW,CLOW,OTC,FL,FL,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,800 W EL CAMINO REAL,SUITE 180,MOUNTAIN VIEW,CA,94040,800 W EL CAMINO REAL,MOUNTAIN VIEW,CA,94040,(650) 963-7749,,,470978297,"Data Backup Solutions, Inc.|Formigli Inc.",2026-05-15,NT 10-Q,Y
|
||||
1400271,Curative Biotechnology Inc,Curative Biotechnology,Curative Biotechnology Inc,CUBT,CUBTD,OTC,FL,FL,Y,2836,"Biological Products, (No Diagnostic Substances)",other,,smaller_reporting_<75M,1825 NW CORPORATE BLVD,SUITE 110,BOCA RATON,FL,33431,1825 NW CORPORATE BLVD,BOCA RATON,FL,33431,800-526-8006,,,721550658,Connectyx Technologies Corp,2025-12-22,RW,Y
|
||||
1127475,"Digital Brand Media & Marketing Group, Inc.",Digital Brand Media & Marketing Group,"Digital Brand Media & Marketing Group, Inc.",DBMM,DBMM,OTC,FL,FL,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"600 THIRD AVENUE, 2ND FLOOR",,NEW YORK,NY,10016,"600 THIRD AVENUE, 2ND FLOOR",NEW YORK,NY,10016,646-722-2706,,,593666743,RTG VENTURES INC,2026-04-14,10-Q,Y
|
||||
784539,EACO CORP,Eaco,Eaco Corp,EACO,EACO,OTC,FL,FL,Y,5065,"Wholesale-Electronic Parts & Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5065 E HUNTER AVE,,ANAHEIM,CA,92807,5065 E HUNTER AVE,ANAHEIM,CA,92807,(714) 876-2490,,,592597349,FAMILY STEAK HOUSES OF FLORIDA INC,2026-04-13,10-Q,Y
|
||||
1538495,"Earth Science Tech, Inc.",Earth Science Tech,"Earth Science Tech, Inc.",ETST,ETST,OTC,FL,FL,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,8950 SW 74TH CT,SUITE 101,MIAMI,FL,33156,8950 SW 74TH CT,MIAMI,FL,33156,(786) 375-7281,,,454267181,Ultimate Novelty Sports Inc.,2026-04-17,8-K,Y
|
||||
1363598,"Entrex Carbon Market, Inc.",Entrex Carbon Market,"Entrex Carbon Market, Inc.",NTRX,NTRX,OTC,FL,FL,Y,5712,Retail-Furniture Stores,operating,,smaller_reporting_<75M,150 EAST PALMETTO PARK EIGHTH FLOOR,,BOCA RATON,FL,33432,150 EAST PALMETTO PARK EIGHTH FLOOR,BOCA RATON,FL,33432,8774368739,,,842099590,"UHF Logistics Group, Inc.|Regal Group, Inc.|Regal Life Concepts, Inc.|Regal Rock, Inc.",2026-02-20,QUALIF,Y
|
||||
1695473,"Greater Cannabis Company, Inc.",Greater Cannabis Company,"Greater Cannabis Company, Inc.",GCAN,GCAN,OTC,FL,FL,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"15 WALKER AVE,",SUITE 101,BALTIMORE,MD,21208,"15 WALKER AVE,",BALTIMORE,MD,21208,(443) 738-4051,,,300842570,,2026-05-13,10-Q,Y
|
||||
915661,GREEN LEAF INNOVATIONS INC,Green Leaf Innovations,Green Leaf Innovations Inc,GRLF,GRLF,OTC,FL,FL,Y,2050,Bakery Products,operating,,smaller_reporting_<75M,15800 PINES BLVD,,PEMBROKE PINES,FL,33027,15800 PINES BLVD,PEMBROKE PINES,FL,33027,8003036268,,,872290605,RAPTOR INVESTMENTS INC|PARAMARK ENTERPRISES INC|T J CINNAMONS INC,2025-08-15,1-A-W,Y
|
||||
2066926,Guident Corp.,Guident,Guident Corp.,GDNT,GDNT,,FL,FL,Y,7372,Services-Prepackaged Software,other,,smaller_reporting_<75M,4910 COMMUNICATION AVE,SUITE 150,BOCA RATON,FL,33431,4910 COMMUNICATION AVE,BOCA RATON,FL,33431,561-245-1306,,,845172003,,2026-03-17,FWP,Y
|
||||
1953988,Helio Corp /FL/,Helio,Helio Corp,HLEO,HLEO,OTC,FL,FL,Y,3760,Guided Missiles & Space Vehicles & Parts,operating, / Emerging growth company,smaller_reporting_<75M,2448 SIXTH STREET,,BERKELEY,CA,94710,2448 SIXTH STREET,BERKELEY,CA,94710,510-545-2666,,,920286004,WEB3 Corp|Stirling Bridge Group Inc,2026-06-04,4,Y
|
||||
312257,INNOVATIVE FOOD HOLDINGS INC,Innovative Food Holdings,Innovative Food Holdings Inc,IVFH,IVFH,OTC,FL,FL,Y,5141,"Wholesale-Groceries, General Line",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2528 S 27TH AVE,,BROADVIEW,IL,60155,2528 S 27TH AVE,BROADVIEW,IL,60155,239-596-0204,,,201167761,ALPHA SOLARCO INC,2026-05-20,10-Q,Y
|
||||
1861448,"IntriEnergy, Inc.",IntriEnergy,"IntriEnergy, Inc.",ITRE,,OTC,FL,FL,Y,,,other,,smaller_reporting_<75M,"3510 KRAFT ROAD, SUITE 200",,NAPLES,FL,34105,4850 TAMIAMI TRAIL N SUITE 301,NAPLES,FL,34103,(239) 303-6400,,,464617171,,2026-04-27,D/A,Y
|
||||
2122791,Lawaken Group Inc.,Lawaken Group,Lawaken Group Inc.,LAWK,,,FL,FL,Y,,,other,,smaller_reporting_<75M,"NO. 1201, BUILDING A4, CHINA VISION,","99 LONGCHUAN ROAD, BAOHE DISTRICT",HEFEI,,230041,"NO. 1201, BUILDING A4, CHINA VISION,",HEFEI,,230041,086 0551 87276125,,,000000000,,2026-05-19,S-1,Y
|
||||
1594968,Loan Artificial Intelligence Corp.,Loan Artificial Intelligence,Loan Artificial Intelligence Corp.,VEST,VEST|LAAI,,FL,FL,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"1113 TOWER 2, LIPPO CENTRE,",89 QUEENSWAY,ADMIRALTY,,0000,"1113 TOWER 2, LIPPO CENTRE,",ADMIRALTY,,0000,949-258-4404,,,454895104,"Vestiage, Inc.",2026-05-20,10-Q,Y
|
||||
1374567,"Luvu Brands, Inc.",Luvu Brands,"Luvu Brands, Inc.",LUVU,LUVU,OTC,FL,FL,Y,2510,Household Furniture,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2745 BANKERS INDUSTRIAL DRIVE,,ATLANTA,GA,30360,2745 BANKERS INDUSTRIAL DRIVE,ATLANTA,GA,30360,770-246-6426,,,593581576,"Liberator, Inc.|WES Consulting, Inc.",2026-05-15,8-K,Y
|
||||
1872066,MIAMI BREEZE CAR CARE INC,Miami Breeze Car Care,Miami Breeze Car Care Inc,MIBE,,OTC,FL,FL,Y,7500,"Services-Automotive Repair, Services & Parking",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,848 BRICKELL AVE,PH 5,MIAMI,FL,33131,848 BRICKELL AVE,MIAMI,FL,33131,(917) 232-0289,,,862579086,,2026-01-23,15-12G,Y
|
||||
1492448,Nextel Medical Corp.,Nextel Medical,Nextel Medical Corp.,MAJI,MAJI,OTC,FL,FL,Y,4899,"Communications Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7901 4TH STREET N #23494,,ST. PETERSBURG,FL,33702,7901 4TH STREET N #23494,ST. PETERSBURG,FL,33702,509-605-6533,,,272616571,"Exousia Pro, Inc.|GRN Holding Corp|Discovery Gold Corp|NORMAN CAY DEVELOPMENT, INC.",2026-05-26,253G2,Y
|
||||
72205,NOBILITY HOMES INC,Nobility Homes,Nobility Homes Inc,NOBH,NOBH,OTC,FL,FL,Y,2451,Mobile Homes,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3741 S W 7TH ST,,OCALA,FL,34474,3741 SW 7TH STREET,OCALA,FL,34474,3527325157,,,591166102,,2026-03-17,10-Q,Y
|
||||
720762,NON INVASIVE MONITORING SYSTEMS INC /FL/,Non Invasive Monitoring Systems,Non Invasive Monitoring Systems Inc,NIMU,NIMU,OTC,FL,FL,Y,3760,Guided Missiles & Space Vehicles & Parts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1840 W AVE,,MIAMI BEACH,FL,33139,1840 WEST AVE,MIAMI BEACH,FL,33140,3055343694,,,592007840,,2026-06-08,DEF 14C,Y
|
||||
912544,NovelStem International Corp.,NovelStem International,NovelStem International Corp.,NSTM,NSTM,OTC,FL,FL,Y,5990,"Retail-Retail Stores, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2255 GLADES RD,STE 237 W,BOCA RATON,FL,33431,2255 GLADES RD,BOCA RATON,FL,33431,5619988000,,,650385686,NovelStem International Corp|HOLLYWOOD MEDIA CORP|HOLLYWOOD COM INC|BIG ENTERTAINMENT INC,2026-05-15,10-Q,Y
|
||||
1000045,OLD MARKET CAPITAL Corp,OLD MARKET CAPITAL,OLD MARKET CAPITAL Corp,OMCC,OMCC,OTC,FL,FL,Y,6153,Short-Term Business Credit Institutions,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1601 DODGE ST.,SUITE 3350,OMAHA,NE,68102,1601 DODGE ST.,OMAHA,NE,68102,727-726-0763,,,593019317,NICHOLAS FINANCIAL INC,2026-01-21,SCHEDULE 13G/A,Y
|
||||
914139,PARKERVISION INC,Parkervision,Parkervision Inc,PRKR,PRKR,OTC,FL,FL,Y,3663,Radio & Tv Broadcasting & Communications Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4446 - 1A HENDRICKS AVENUE,SUITE 354,JACKSONVILLE,FL,32207,4446 - 1A HENDRICKS AVENUE,JACKSONVILLE,FL,32207,9047326100,,,592971472,,2026-05-21,3,Y
|
||||
1094032,QDM International Inc.,QDM International,QDM International Inc.,QDMI,QDMI,OTC,FL,FL,Y,6411,"Insurance Agents, Brokers & Service",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,ROOM 1030B 10F OCEAN CENTRE HARBOUR CITY,"5 CANTON ROAD, TSIM SHA TSUI",KOWLOON,K3,000000,ROOM 1030B 10F OCEAN CENTRE HARBOUR CITY,KOWLOON,K3,000000,852 3188 9800,,,593564984,"24/7 Kid Doc, Inc.|DALE JARRETT RACING ADVENTURE INC|DALE JARRET RACING ADVENTURE INC|JARRETT FAVRE DRIVING ADVENTURE INC",2026-06-02,S-8,Y
|
||||
1807893,"STANDARD PREMIUM FINANCE HOLDINGS, INC.",Standard Premium Finance Holdings,"Standard Premium Finance Holdings, Inc.",SPFX,SPFX,OTC,FL,FL,Y,6159,Miscellaneous Business Credit Institution,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,13590 SW 134TH AVE,#214,MIAMI,FL,33186,13590 SW 134TH AVE,MIAMI,FL,33186,(305) 232-2752,,,812624094,,2026-05-29,4,Y
|
||||
1292490,"Synbio International, Inc.",Synbio International,"Synbio International, Inc.",SYIN,SYIN,OTC,FL,FL,Y,7374,Services-Computer Processing & Data Preparation,other,,smaller_reporting_<75M,30 N GOULD ST,STE 5835,SHERIDAN,WY,89014,30 N GOULD ST,SHERIDAN,WY,89014,646-359-4854,,,043588066,Natural Harmony Foods Inc,2025-09-04,SEC STAFF ACTION,Y
|
||||
909112,TEMPLETON EMERGING MARKETS INCOME FUND,Templeton Emerging Markets Income Fund,Templeton Emerging Markets Income Fund,TXEMF,TEI|TXEMF,OTC,FL,FL,Y,,,other,,smaller_reporting_<75M,300 S.E. 2ND STREET,,FORT LAUDERDALE,FL,33301-1923,300 S.E. 2ND STREET,FORT LAUDERDALE,FL,33301-1923,9545277500,,,593192205,TEMPLETON EMERGING MARKETS INCOME FUND INC,2026-05-27,NPORT-P,Y
|
||||
1434601,"Transglobal Management Group, Inc.",Transglobal Management Group,"Transglobal Management Group, Inc.",TMGI,TMGI,OTC,FL,FL,Y,4832,Radio Broadcasting Stations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,7901 4TH ST. N.,SUITE 4887,ST. PETERSBURGH,FL,33702,7901 4TH ST. N.,ST. PETERSBURGH,FL,33702,(602) 989-4653,,,262091212,"Marquie Group, Inc.|ZHONG SEN INTERNATIONAL TEA CO|ZHONG SEN INTERNATIONAL TEA Co|MUSIC OF YOUR LIFE INC",2026-05-28,8-K,Y
|
||||
1082733,"VISIUM TECHNOLOGIES, INC.",Visium Technologies,"Visium Technologies, Inc.",VISM,VISM,OTC,FL,FL,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"401 E. LAS OLAS BOULEVARD,",SUITE 1400,FORT LAUDERDALE,FL,33301,"401 E. LAS OLAS BOULEVARD,",FORT LAUDERDALE,FL,33301,(954) 712-7487,,,870449667,"NuSTATE ENERGY HOLDINGS, INC.|Fittipaldi Logistics, Inc.|POWER2SHIP INC|JAGUAR INVESTMENTS INC",2026-05-20,10-Q,Y
|
||||
1138586,"Xcelerate, Inc.",Xcelerate,"Xcelerate, Inc.",XCRT,XCRT,OTC,FL,FL,Y,8000,Services-Health Services,operating,,smaller_reporting_<75M,110 RENAISSANCE CIRCLE,,MAULDIN,SC,29662,110 RENAISSANCE CIRCLE,MAULDIN,SC,29662,854-900-2020,,,650710392,"UNION DENTAL HOLDINGS, INC.|NATIONAL BUSINESS HOLDINGS INC|SHAVA INC",2025-05-29,RW,Y
|
||||
925779,HIRU Corp,HIRU,HIRU Corp,HIRU,HIRU,OTC,GA,GA,Y,5812,Retail-Eating Places,operating,,smaller_reporting_<75M,20 BAY STREET,,TORONTO,A6,M5J 2N8,20 BAY STREET,TORONTO,A6,M5J 2N8,954-228-1053,,,581861457,PHOENIX RESTAURANT GROUP INC|DENAMERICA CORP|AMERICAN FAMILY RESTAURANTS INC,2025-08-06,SCHEDULE 13G/A,Y
|
||||
1076691,OCONEE FINANCIAL CORP,Oconee Financial,Oconee Financial Corp,OSBK,OSBK,OTC,GA,GA,Y,6022,State Commercial Banks,operating,,smaller_reporting_<75M,35 NORTH MAIN STREET,PO BOX 205,WATKINSVILLE,GA,30677-0205,35 NORTH MAIN STREET,WATKINSVILLE,GA,30677-0205,7067696611,,,000000000,,2025-08-28,D,Y
|
||||
2084026,"QumulusAI, Inc.",QumulusAI,"QumulusAI, Inc.",QMLS,QMLS,,GA,GA,Y,7374,Services-Computer Processing & Data Preparation,other,,smaller_reporting_<75M,1130 POWERS FERRY PL,,MARIETTA,GA,30067,C/O FOX ROTHSCHILD LLP,MINNEAPOLIS,MN,55402,877-420-9242,,,922681813,,2026-05-14,S-1/A,Y
|
||||
1133798,"TX Rail Products, Inc.",TX Rail Products,"TX Rail Products, Inc.",TXRP,TXRP,OTC,GA,GA,Y,5084,Wholesale-Industrial Machinery & Equipment,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,P. O. BOX 1425,,ASHLAND,KY,41105,P. O. BOX 1425,ASHLAND,KY,41105,606-928-1131,,,582558702,"TX Holdings, Inc.|R WIRELESS INC|HOM CORP",2026-06-02,RW,Y
|
||||
1308027,Vystar Corp,Vystar,Vystar Corp,VYST,VYST,OTC,GA,GA,Y,3060,"Fabricated Rubber Products, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,365 SHREWSBURY ST.,,WORCESTER,MA,01604,365 SHREWSBURY ST.,WORCESTER,MA,01604,1 (508) 791-9114,,,202027731,,2026-05-13,10-Q,Y
|
||||
1122020,"PCS Edventures!, Inc.",PCS Edventures!,"PCS Edventures!, Inc.",PCSV,PCSV|PCSVD,,ID,ID,Y,8200,Services-Educational Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,941 S. INDUSTRY WAY,,MERIDIAN,ID,83642,941 S. INDUSTRY WAY,MERIDIAN,ID,83642,208-343-3110,,,820475383,PCS EDVENTURES COM INC,2026-05-06,4/A,Y
|
||||
18654,Ameren Illinois Co,Ameren Illinois,Ameren Illinois Co,AILIH,AILIH|AILLI|AILLM|AILLN|AILIM|AILLO|AILIN|AILLP|AILIO|AILIP,OTC,IL,IL,Y,4931,Electric & Other Services Combined,operating,,smaller_reporting_<75M,10 RICHARD MARK WAY,,COLLINSVILLE,IL,62234,10 RICHARD MARK WAY,COLLINSVILLE,IL,62234,618-343-8150,,,370211380,CENTRAL ILLINOIS PUBLIC SERVICE CO,2026-05-18,8-K,Y
|
||||
786298,FORESIGHT FINANCIAL GROUP INC,Foresight Financial Group,Foresight Financial Group Inc,FGFH,FGFH,OTC,IL,IL,Y,6022,State Commercial Banks,other,,smaller_reporting_<75M,809 CANNELL-PURI CT,"SUITE 5, PO BOX 339",WINNEBAGO,IL,61088,809 CANNELL-PURI CT,WINNEBAGO,IL,61088,8158477500,,,363371610,,2026-02-17,SCHEDULE 13G,Y
|
||||
709005,NOBLE ROMANS INC,Noble Romans,Noble Romans Inc,NROM,NROM,OTC,IN,IN,Y,5812,Retail-Eating Places,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,ONE VIRGINIA AVE,STE 800,INDIANAPOLIS,IN,46204,ONE VIRGINIA AVENUE,INDIANAPOLIS,IN,46204,3176343377,,,351281154,,2026-06-08,10-K,Y
|
||||
1919847,"Software Effective Solutions, Corp.",Software Effective Solutions,"Software Effective Solutions, Corp.",SFWJ,SFWJ,OTC,LA,LA,Y,7371,Services-Computer Programming Services,other,,smaller_reporting_<75M,"6500 RIVER PLACE BLVD, BUILDING 7",SUITE 250,AUSTIN,TX,78730,"6500 RIVER PLACE BLVD, BUILDING 7",AUSTIN,TX,78730,512-554-3736,,,872005243,,2025-10-24,253G2,Y
|
||||
1812286,Harrison Street Infrastructure Income Fund,Harrison Street Infrastructure Income Fund,Harrison Street Infrastructure Income Fund,VCRDX,VCRDX,,MA,MA,Y,,,other,,smaller_reporting_<75M,"5050 S. SYRACUSE ST., SUITE 1100",,DENVER,CO,80237,"5050 S. SYRACUSE ST., SUITE 1100",DENVER,CO,80237,(877) 200-1878,,,000000000,Versus Capital Infrastructure Income Fund|Versus Capital Real Asset Debt Fund,2026-06-04,N-CSR,Y
|
||||
13372,NSTAR ELECTRIC CO,Nstar Electric,Nstar Electric Co,NSARO,NSARO|NSARP,OTC,MA,MA,Y,4911,Electric Services,operating,,smaller_reporting_<75M,800 BOYLSTON ST,P1600,BOSTON,MA,02199,800 BOYLSTON ST,BOSTON,MA,02199,6174242000,,,041278810,BOSTON EDISON CO,2026-05-13,8-K,Y
|
||||
1723701,PIMCO Flexible Municipal Income Fund,PIMCO Flexible Municipal Income Fund,PIMCO Flexible Municipal Income Fund,PMFAX,PMFAX,,MA,MA,Y,,,other,,smaller_reporting_<75M,1633 BROADWAY,,NEW YORK,NY,10019,1633 BROADWAY,NEW YORK,NY,10019,(844) 337-4626,,,000000000,,2026-05-29,NPORT-P,Y
|
||||
790500,"ABRDN ASIA-PACIFIC INCOME FUND, INC.",Abrdn Asia-pacific Income Fund,"Abrdn Asia-pacific Income Fund, Inc.",ABAKF,FAX|ABAKF,OTC,MD,MD,Y,,,other,,smaller_reporting_<75M,1900 MARKET STREET,SUITE 200,PHILADELPHIA,PA,19103,1900 MARKET STREET,PHILADELPHIA,PA,19103,215-405-5700,,,133334183,ABERDEEN ASIA-PACIFIC INCOME FUND INC|ABERDEEN ASIA PACIFIC INCOME FUND INC|FIRST AUSTRALIA PRIME INCOME FUND INC,2026-05-29,POS EX,Y
|
||||
1327978,Ares Real Estate Income Trust Inc.,Ares Real Estate Income Trust,Ares Real Estate Income Trust Inc.,ZARE,ZARE,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,ONE TABOR CENTER,"1200 SEVENTEENTH STREET, SUITE 2900",DENVER,CO,80202,ONE TABOR CENTER,DENVER,CO,80202,(303)228-2200,,,300309068,Black Creek Diversified Property Fund Inc.|Dividend Capital Diversified Property Fund Inc.|Dividend Capital Total Realty Trust Inc.,2026-06-04,8-K,Y
|
||||
1275477,"BIMINI CAPITAL MANAGEMENT, INC.",Bimini Capital Management,"Bimini Capital Management, Inc.",BMNM,BMNM,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3305 FLAMINGO DRIVE,,VERO BEACH,FL,32963,3305 FLAMINGO DRIVE,VERO BEACH,FL,32963,772 231 1400,,,721571637,Opteum Inc.|BIMINI MORTGAGE MANAGEMENT INC,2026-05-08,10-Q,Y
|
||||
1662972,"Blackstone Real Estate Income Trust, Inc.",Blackstone Real Estate Income Trust,"Blackstone Real Estate Income Trust, Inc.",BSTT,BSTT,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,345 PARK AVENUE,,NEW YORK,NY,10154,345 PARK AVENUE,NEW YORK,NY,10154,212-583-5000,,,810696966,,2026-06-04,8-K,Y
|
||||
1498547,"CIM REAL ESTATE FINANCE TRUST, INC.",Cim Real Estate Finance Trust,"Cim Real Estate Finance Trust, Inc.",CMRF,CMRF,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,2398 EAST CAMELBACK ROAD,4TH FLOOR,PHOENIX,AZ,85016,2398 EAST CAMELBACK ROAD,PHOENIX,AZ,85016,602-778-8700,,,273148022,"COLE CREDIT PROPERTY TRUST IV, INC.|Cole Advisor Retail Income REIT, Inc.",2026-05-13,10-Q,Y
|
||||
2013792,"EWSB Bancorp, Inc. /MD/",EWSB Bancorp,"EWSB Bancorp, Inc.",EWSB,EWSB,OTC,MD,MD,Y,6036,"Savings Institutions, Not Federally Chartered",operating, / Emerging growth company,smaller_reporting_<75M,109 WEST SECOND STREET,,KAUKAUNA,WI,02492,109 WEST SECOND STREET,KAUKAUNA,WI,02492,(920) 766-4646,,,000000000,,2026-06-05,8-K,Y
|
||||
1698022,"Farmers & Merchants Bancshares, Inc.",Farmers & Merchants Bancshares,"Farmers & Merchants Bancshares, Inc.",FMFG,FMFG,OTC,MD,MD,Y,6036,"Savings Institutions, Not Federally Chartered",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4510 LOWER BECKLEYSVILLE ROAD,SUITE H,HAMPSTEAD,MD,21074,4510 LOWER BECKLEYSVILLE ROAD,HAMPSTEAD,MD,21074,4103741510,,,813605835,,2026-05-21,8-K,Y
|
||||
1068897,FOXBY CORP.,Foxby,Foxby Corp.,FXBY,FXBY,OTC,MD,MD,Y,,,investment,,smaller_reporting_<75M,17 OLD DREWSVILLE ROAD,,WALOPLE,NH,,17 OLD DREWSVILLE ROAD,WALOPLE,NH,,2127850900,,,391966806,FOXBY CORP|INTERNET GROWTH FUND INC|LCM INTERNET GROWTH FUND INC,2026-05-28,NPORT-P,Y
|
||||
890066,GLEN BURNIE BANCORP,Glen Burnie Bancorp,Glen Burnie Bancorp,GLBZ,GLBZ,OTC,MD,MD,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,101 CRAIN HWY SE,,GLEN BURNIE,MD,21061,101 CRAIN HWY SE,GLEN BURNIE,MD,21061,4107663300,,,521782444,,2026-01-13,15-12G,Y
|
||||
1978811,"Gouverneur Bancorp, Inc./MD/",Gouverneur Bancorp,"Gouverneur Bancorp, Inc.",GOVB,GOVB,OTC,MD,MD,Y,6036,"Savings Institutions, Not Federally Chartered",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,42 CHURCH STREET,,GOUVERNEUR,NY,13642,42 CHURCH STREET,GOUVERNEUR,NY,13642,315-287-2600,,,000000000,,2026-05-19,4,Y
|
||||
1585101,"HINES GLOBAL INCOME TRUST, INC.",Hines Global Income Trust,"Hines Global Income Trust, Inc.",HGIT,HGIT,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,845 TEXAS AVENUE,SUITE 3300,HOUSTON,TX,77002,845 TEXAS AVENUE,HOUSTON,TX,77002,888-220-6121,,,800947092,"HINES GLOBAL REIT II, INC.",2026-05-18,424B3,Y
|
||||
1528985,"Inland Real Estate Income Trust, Inc.",Inland Real Estate Income Trust,"Inland Real Estate Income Trust, Inc.",INRE,INRE,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,2901 BUTTERFIELD ROAD,,OAK BROOK,IL,60523,2901 BUTTERFIELD ROAD,OAK BROOK,IL,60523,6302188000,,,453079597,"Inland Monthly Income Trust, Inc.|Inland Core Assets Real Estate Trust, Inc.",2026-05-21,4,Y
|
||||
1690012,"InPoint Commercial Real Estate Income, Inc.",InPoint Commercial Real Estate Income,"InPoint Commercial Real Estate Income, Inc.",ICRL,ICR-PA|ICRL|ICRP,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2901 BUTTERFIELD ROAD,,OAK BROOK,IL,60523,2901 BUTTERFIELD ROAD,OAK BROOK,IL,60523,630-218-8000,,,320506267,,2026-05-28,8-K,Y
|
||||
2067746,"JOSS Realty REIT, Inc.",JOSS Realty REIT,"JOSS Realty REIT, Inc.",JOSS,JOSS,,MD,MD,Y,6798,Real Estate Investment Trusts,other,,smaller_reporting_<75M,"650 FIFTH AVENUE, SUITE 2700",,NEW YORK,NY,10019,"650 FIFTH AVENUE, SUITE 2700",NEW YORK,NY,10019,2127108194,,,334793312,,2026-04-14,S-11/A,Y
|
||||
1482430,"KBS Real Estate Investment Trust III, Inc.",KBS Real Estate Investment Trust III,"KBS Real Estate Investment Trust III, Inc.",KBSR,KBSR,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,800 NEWPORT CENTER DRIVE,SUITE 700,NEWPORT BEACH,CA,92660,800 NEWPORT CENTER DRIVE,NEWPORT BEACH,CA,92660,949-417-6500,,,271627696,,2026-05-14,10-Q,Y
|
||||
1619312,"Lightstone Value Plus REIT IV, Inc.",Lightstone Value Plus REIT IV,"Lightstone Value Plus REIT IV, Inc.",LTSV,LTSV,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1985 CEDAR BRIDGE AVENUE,SUITE 1,LAKEWOOD,NJ,08701,1985 CEDAR BRIDGE AVENUE,LAKEWOOD,NJ,08701,732-367-0129,,,471796830,Lightstone Real Estate Income Trust Inc.,2026-05-13,10-Q,Y
|
||||
2024899,"Monroe Federal Bancorp, Inc.",Monroe Federal Bancorp,"Monroe Federal Bancorp, Inc.",MFBI,MFBI,OTC,MD,MD,Y,6035,"Savings Institution, Federally Chartered",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,24 E. MAIN STREET,,TIPP CITY,OH,45371,24 E. MAIN STREET,TIPP CITY,OH,45371,(937) 667-8461,,,000000000,,2026-02-17,SCHEDULE 13G/A,Y
|
||||
1561032,"National Healthcare Properties, Inc.",National Healthcare Properties,"National Healthcare Properties, Inc.",HLTC,NHP|HLTC|NHPAP|NHPBP,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,"540 MADISON AVE, 27TH FLOOR",,NEW YORK,NY,10022,"540 MADISON AVE, 27TH FLOOR",NEW YORK,NY,10022,332-258-8770,,,383888962,"Healthcare Trust, Inc.|American Realty Capital Healthcare Trust II, Inc.",2026-06-01,SCHEDULE 13G,Y
|
||||
1854964,"NewLake Capital Partners, Inc.",NewLake Capital Partners,"NewLake Capital Partners, Inc.",NLCP,NLCP,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating, / Emerging growth company,smaller_reporting_<75M,50 LOCUST AVENUE,,NEW CANAAN,CT,06840,50 LOCUST AVENUE,NEW CANAAN,CT,06840,203.594.1402,,,834400045,,2026-06-08,8-K,Y
|
||||
888981,NOCOPI TECHNOLOGIES INC/MD/,Nocopi Technologies,Nocopi Technologies Inc,NNUP,NNUP,OTC,MD,MD,Y,3944,"Games, Toys & Children's Vehicles (No Dolls & Bicycles)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,480 SHOEMAKER ROAD,SUITE 104,KING OF PRUSSIA,PA,19406,480 SHOEMAKER ROAD,KING OF PRUSSIA,PA,19406,6108349600,,,870406496,,2026-05-21,8-K,Y
|
||||
1456772,OFFICE PROPERTIES INCOME TRUST,Office Properties Income Trust,Office Properties Income Trust,OPIRQ,OPIRQ|OPITQ,OTC,MD,MD,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,C/O THE RMR GROUP,"TWO NEWTON PL., 255 WASH. ST., STE. 300",NEWTON,MA,02458,C/O THE RMR GROUP,NEWTON,MA,02458,(617) 219-1440,,,264273474,Government Properties Income Trust|GOVERNMENT PROPERTIES INCOME TRUST,2026-06-04,8-K,Y
|
||||
1824204,Park View OZ REIT Inc,Park View OZ REIT,Park View OZ REIT Inc,PVOZ,PVOZ,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,other,,smaller_reporting_<75M,ONE BEACON STREET,32ND FLOOR,BOSTON,MA,02108,ONE BEACON STREET,BOSTON,MA,02108,617 917 8807,,,851631598,,2026-05-26,1-U,Y
|
||||
1305767,"Pioneer Floating Rate Fund, Inc.",Pioneer Floating Rate Fund,"Pioneer Floating Rate Fund, Inc.",PHD,PHD,,MD,MD,Y,,,other,,smaller_reporting_<75M,60 STATE STREET,5TH FLOOR,BOSTON,MA,02109,60 STATE STREET,BOSTON,MA,02109,617-742-7825,,,582683903,Pioneer Floating Rate Trust,2026-04-23,NPORT-P,Y
|
||||
845385,PRINCETON CAPITAL CORP,Princeton Capital,Princeton Capital Corp,PIAC,PIAC,OTC,MD,MD,Y,,,operating,Non-accelerated filer,smaller_reporting_<75M,800 TURNPIKE STREET,SUITE 300,NORTH ANDOVER,MA,01845,800 TURNPIKE STREET,NORTH ANDOVER,MA,01845,978-794-3366,,,463516073,REGAL ONE CORP|REGAL ONE Corp,2026-05-26,40-17G,Y
|
||||
1692345,"PROCACCIANTI HOTEL REIT, INC.",Procaccianti Hotel Reit,"Procaccianti Hotel Reit, Inc.",PRXA,PRXA,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1140 RESERVOIR AVENUE,,CRANSTON,RI,02920,1140 RESERVOIR AVENUE,CRANSTON,RI,02920,401-946-4600,,,813661609,,2026-05-27,8-K,Y
|
||||
2087419,"PSB Financial, Inc.",PSB Financial,"PSB Financial, Inc.",PNSB,,OTC,MD,MD,Y,6036,"Savings Institutions, Not Federally Chartered",operating, / Emerging growth company,smaller_reporting_<75M,202 NORTH MAIN STREET,,DEER LODGE,MT,59722,833 E MICHIGAN STREET,MILWAUKEE,WI,53202,406-846-2202,,,000000000,,2026-05-21,8-K,Y
|
||||
2077715,"RiverNorth Long Prime Unicorn Fund I, Inc.",RiverNorth Long Prime Unicorn Fund I,"RiverNorth Long Prime Unicorn Fund I, Inc.",UNIU,UNIU,,MD,MD,Y,,,other,,smaller_reporting_<75M,360 SOUTH ROSEMARY AVENUE,SUITE 1420,WEST PALM BEACH,FL,33401,360 SOUTH ROSEMARY AVENUE,WEST PALM BEACH,FL,33401,561-484-7185,,,000000000,"RiverNorth Long Prime Unicorn Fund 2028, Inc.|RiverNorth Long Prime Unicorn Fund 2027, Inc.",2026-06-08,8-A12B/A,Y
|
||||
2077697,"RiverNorth Short Prime Unicorn Fund I, Inc",RiverNorth Short Prime Unicorn Fund I,"RiverNorth Short Prime Unicorn Fund I, Inc",UNID,UNID,,MD,MD,Y,,,other,,smaller_reporting_<75M,360 SOUTH ROSEMARY AVENUE,SUITE 1420,WEST PALM BEACH,FL,33401,360 SOUTH ROSEMARY AVENUE,WEST PALM BEACH,FL,33401,561-484-7185,,,392956978,"RiverNorth Short Prime Unicorn Fund 2028, Inc|RiverNorth Short Prime Unicorn Fund 2027, Inc.",2026-06-08,8-A12B/A,Y
|
||||
2036060,"Security Midwest Bancorp, Inc.",Security Midwest Bancorp,"Security Midwest Bancorp, Inc.",SBMW,SBMW,OTC,MD,MD,Y,6036,"Savings Institutions, Not Federally Chartered",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,510 E. MONROE,,SPRINFIELD,IL,62701,510 E. MONROE,SPRINFIELD,IL,62701,(217) 789-3500,,,000000000,,2026-05-14,10-Q,Y
|
||||
2072421,"Seneca Bancorp, Inc.",Seneca Bancorp,"Seneca Bancorp, Inc.",SNNF,SNNF,OTC,MD,MD,Y,6021,National Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,35 OSWEGO STREET,,BALDWINSVILLE,NY,13027,35 OSWEGO STREET,BALDWINSVILLE,NY,13027,(315) 638-0233,,,000000000,,2026-06-04,8-K,Y
|
||||
1301236,Sotherly Hotels Inc.,Sotherly Hotels,Sotherly Hotels Inc.,SOHON,SOHOO|SOHON|SOHOB,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,306 SOUTH HENRY STREET,SUITE 100,WILLIAMSBURG,VA,23185,306 SOUTH HENRY STREET,WILLIAMSBURG,VA,23185,757-229-5648,,,000000000,MHI Hospitality CORP,2026-04-28,SCHEDULE 13G/A,Y
|
||||
1711929,"Starwood Real Estate Income Trust, Inc.",Starwood Real Estate Income Trust,"Starwood Real Estate Income Trust, Inc.",SWDR,SWDR,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer,smaller_reporting_<75M,2340 COLLINS AVENUE,,MIAMI BEACH,FL,33139,2340 COLLINS AVENUE,MIAMI BEACH,FL,33139,305-695-5500,,,822023409,,2026-05-29,8-K,Y
|
||||
1852575,"Strategic Storage Trust VI, Inc.",Strategic Storage Trust VI,"Strategic Storage Trust VI, Inc.",SGST,SGST,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating, / Emerging growth company,smaller_reporting_<75M,10 TERRACE ROAD,,LADERA RANCH,CA,92694,10 TERRACE ROAD,LADERA RANCH,CA,92694,9495424516,,,853494431,,2026-05-28,8-K,Y
|
||||
1698538,"Strategic Student & Senior Housing Trust, Inc.",Strategic Student & Senior Housing Trust,"Strategic Student & Senior Housing Trust, Inc.",STSR,STSR,OTC,MD,MD,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,10 TERRACE ROAD,,LADERA RANCH,CA,92694,10 TERRACE ROAD,LADERA RANCH,CA,92694,949 429 6600,,,000000000,"Strategic Student Senior & Storage Trust, Inc.",2026-05-26,8-K,Y
|
||||
2084261,"URSB Bancorp, Inc.",URSB Bancorp,"URSB Bancorp, Inc.",URSB,URSB,OTC,MD,MD,Y,6036,"Savings Institutions, Not Federally Chartered",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,11-15 COOKE AVENUE,,CARTERET,NJ,07008,11-15 COOKE AVENUE,CARTERET,NJ,07008,732-541-5445,,,000000000,,2026-05-15,10-Q,Y
|
||||
1630745,"DCFC Holdings, LLC",DCFC Holdings,"DCFC Holdings, LLC",DCFBS,DCFBS,OTC,MI,MI,Y,,,other,,smaller_reporting_<75M,3401 E. LAFAYETTE,,DETROIT,MI,48216,3401 E. LAFAYETTE,DETROIT,MN,,3136562480,,,472662769,,2026-04-30,C-AR,Y
|
||||
1023458,AEI INCOME & GROWTH FUND XXII LTD PARTNERSHIP,Aei Income & Growth Fund Xxii Ltd Partnership,Aei Income & Growth Fund Xxii Ltd Partnership,XAEIU,XAEIU,OTC,MN,MN,Y,6500,Real Estate,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,30 EAST 7TH ST SUITE 1300,,ST PAUL,MN,55101,30 EAST 7TH ST SUITE 1300,ST PAUL,MN,55101,6512277333,,,411848181,,2026-05-13,10-Q,Y
|
||||
943034,AUTOSCOPE TECHNOLOGIES CORP,Autoscope Technologies,Autoscope Technologies Corp,AATC,AATC,OTC,MN,MN,Y,3829,"Measuring & Controlling Devices, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1115 HENNEPIN AVE,,MINNEAPOLIS,MN,55403,1115 HENNEPIN AVE,MINNEAPOLIS,MN,55403,6516037700,,,863685595,IMAGE SENSING SYSTEMS INC,2026-03-30,D/A,Y
|
||||
1838003,"Encore Medical, Inc.",Encore Medical,"Encore Medical, Inc.",EMI,EMI,,MN,MN,Y,3841,Surgical & Medical Instruments & Apparatus,other,,smaller_reporting_<75M,2975 LONE OAK DRIVE,,EAGAN,MN,55121,2975 LONE OAK DRIVE,EAGAN,MN,55121,651-797-0913,,,822906303,,2026-04-09,FWP,Y
|
||||
1489874,Golden Growers Cooperative,Golden Growers Cooperative,Golden Growers Cooperative,GGROU,GGROU,OTC,MN,MN,Y,0700,Agricultural Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1002 MAIN AVENUE WEST,SUITE 5,WEST FARGO,ND,58078,1002 MAIN AVENUE WEST,WEST FARGO,ND,58078,701-281-0468,,,000000000,,2026-05-08,10-Q,Y
|
||||
71557,"Nuvera Communications, Inc.",Nuvera Communications,"Nuvera Communications, Inc.",NUVR,NUVR,OTC,MN,MN,Y,4813,Telephone Communications (No Radiotelephone),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,27 NORTH MINNESOTA ST.,,NEW ULM,MN,56073,P O BOX 697,NEW ULM,MN,56073,5073544111,,,410440990,NEW ULM TELECOM INC,2026-05-29,4,Y
|
||||
942895,REDWOOD FINANCIAL INC /MN/,Redwood Financial,Redwood Financial Inc,REDW,REDW,OTC,MN,MN,Y,6035,"Savings Institution, Federally Chartered",other,,smaller_reporting_<75M,301 S WASHINGTON ST,P O BOX 317,REDWOOD FALLS,MN,56283,301 S WASHINGTON ST,REDWOOD FALLS,MN,56283,5076378730,,,411807233,,2026-03-18,D,Y
|
||||
100826,UNION ELECTRIC CO,Union Electric,Union Electric Co,UELMO,UELMO|UEPCN|UEPEO|UEPEP|UEPCP|UEPEN|UEPCO|UEPEM,OTC,MO,MO,Y,4911,Electric Services,operating,,smaller_reporting_<75M,1901 CHOUTEAU AVENUE,MC 1310,ST LOUIS,MO,63166,1901 CHOUTEAU AVENUE,ST LOUIS,MO,63166,314-621-3222,,,430559760,,2026-05-18,8-K,Y
|
||||
770460,PEOPLES FINANCIAL CORP /MS/,Peoples Financial,Peoples Financial Corp,PFBX,PFBX,OTC,MS,MS,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,152 LAMEUSE STREET,P O BOX 529,BILOXI,MS,39530,P O BOX 529,BILOXI,MS,39533-0529,2284355511,,,640709834,PEOPLES FINANCIAL CORP,2026-06-04,4,Y
|
||||
1531193,"First Carolina Financial Services, Inc.",First Carolina Financial Services,"First Carolina Financial Services, Inc.",FCBM,FCBM,,NC,NC,Y,6022,State Commercial Banks,other,,smaller_reporting_<75M,2626 GLENWOOD AVENUE,SUITE 200,RALEIGH,NC,27608,2626 GLENWOOD AVENUE,RALEIGH,NC,27608,252-937-2152,,,272136973,,2026-06-08,FWP,Y
|
||||
898171,UWHARRIE CAPITAL CORP,Uwharrie Capital,Uwharrie Capital Corp,UWHR,UWHR,OTC,NC,NC,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,132 NORTH FIRST STREET,PO BOX 338,ALBEMARLE,NC,28001,P O BOX 338,ALBEMARLE,NC,28002-0338,7049836181,,,561814206,STANLY CAPITAL CORP,2026-05-26,3,Y
|
||||
1053369,ELITE PHARMACEUTICALS INC /NV/,Elite Pharmaceuticals,Elite Pharmaceuticals Inc,ELTP,ELTP,OTC,NJ,NJ,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,165 LUDLOW AVENUE,,NORTHVALE,NJ,07647,165 LUDLOW AVENUE,NORTHVALE,NJ,07647,2017502646,,,223542636,ELITE PHARMACEUTICALS INC /DE/,2026-06-01,8-K,Y
|
||||
36840,"FIRST REAL ESTATE INVESTMENT TRUST OF NEW JERSEY, INC.",First Real Estate Investment Trust of New Jersey,"First Real Estate Investment Trust of New Jersey, Inc.",FREVS,FREVS,OTC,NJ,NJ,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,505 MAIN STREET,SUITE 400,HACKENSACK,NJ,07601,505 MAIN STREET,HACKENSACK,NJ,07601,2014886400,,,221697095,FIRST REAL ESTATE INVESTMENT TRUST OF NEW JERSEY,2026-05-28,PRER14A,Y
|
||||
803097,"SportsQuest, Inc.",SportsQuest,"SportsQuest, Inc.",SPQS,SPQS,OTC,NJ,NJ,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"500 AUSTRALIAN AVENUE, SUITE 600",,WEST PALM BEACH,FL,33401,"500 AUSTRALIAN AVENUE, SUITE 600",WEST PALM BEACH,FL,33401,954-837-6833,,,222742564,AIR BROOK AIRPORT EXPRESS INC,2026-05-15,10-Q,Y
|
||||
81023,PUBLIC SERVICE CO OF NEW MEXICO,Public Service Co of New Mexico,Public Service Co of New Mexico,PNMXO,PNMXO,OTC,NM,NM,Y,4931,Electric & Other Services Combined,operating,,smaller_reporting_<75M,414 SILVER AVE. SW,,ALBUQUERQUE,NM,87102-3289,414 SILVER AVE. SW,ALBUQUERQUE,NM,87102-3289,5058482700,,,850019030,,2026-06-02,8-K,Y
|
||||
1642365,Alpine Auto Brokers Inc.,Alpine Auto Brokers,Alpine Auto Brokers Inc.,ALTB,ALTB,OTC,NY,NY,Y,5990,"Retail-Retail Stores, NEC",operating, / Emerging growth company,smaller_reporting_<75M,749 SOUTH STATE STREET,,SALT LAKE CITY,UT,84111,"ROOM 2605 SOUTH TOWER, CONCORDIA PLAZA",KOWLOON,K3,000000,(852) 2180 7022,,,383970138,"Balincan International Inc.|Alpine Auto Brokers, Inc.",2025-08-05,8-K,Y
|
||||
1672571,Antiaging Quantum Living Inc.,Antiaging Quantum Living,Antiaging Quantum Living Inc.,AAQL,AAQL,OTC,NY,NY,Y,7331,Services-Direct Mail Advertising Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,135-22 NORTHERN BLVD,2ND FL,FLUSHING,NY,11354,135-22 NORTHERN BLVD,FLUSHING,NY,11354,9174705393,,,472643986,Achison Inc,2026-02-13,10-Q,Y
|
||||
1904616,Baker Global Asset Management Inc.,Baker Global Asset Management,Baker Global Asset Management Inc.,BAKR,BAKR,OTC,NY,NY,Y,6200,"Security & Commodity Brokers, Dealers, Exchanges & Services",other,,smaller_reporting_<75M,"3 WEST GARDEN STREET, SUITE 407",,PENSACOLA,FL,32502,"3 WEST GARDEN STREET, SUITE 407",PENSACOLA,FL,32502,5169311090,,,000000000,,2025-10-31,1-K,Y
|
||||
2094107,"Ballston Spa Bancorp, Inc.",Ballston Spa Bancorp,"Ballston Spa Bancorp, Inc.",BSPA,BSPA,OTC,NY,NY,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,990 STATE ROUTE 67,,BALLSTON SPA,NY,,990 STATE ROUTE 67,BALLSTON SPA,NY,,(518) 363-8199,,,742245601,,2026-05-14,10-Q,Y
|
||||
1939479,China Strategic Technology Group Limited/ADR,China Strategic Technology Group Limited/ADR,China Strategic Technology Group Limited/ADR,USPCY,USPCY,OTC,NY,NY,Y,3510,Engines & Turbines,other,,smaller_reporting_<75M,120 BROADWAY,32ND FLOOR,NEW YORK,NY,10271,120 BROADWAY,NEW YORK,NY,10271,2122383128,,,000000000,USPACE Technology Group Limited/ADR|Hong Kong Aerospace Technology Group Limited/ADR,2025-12-02,424B3,Y
|
||||
1837671,Copper Property CTL Pass Through Trust,Copper Property CTL Pass Through Trust,Copper Property CTL Pass Through Trust,CPPTL,CPPTL,OTC,NY,NY,Y,6500,Real Estate,operating, / Emerging growth company,smaller_reporting_<75M,6501 LEGACY DRIVE,,PLANO,TX,75024,6501 LEGACY DRIVE,PLANO,TX,75024,972-243-1100,,,000000000,,2026-06-05,8-K,Y
|
||||
927719,DELHI BANK CORP,Delhi Bank,Delhi Bank Corp,DWNX,DWNX,OTC,NY,NY,Y,6021,National Commercial Banks,other,,smaller_reporting_<75M,124 MAIN ST,,DELHI,NY,13753,124 MAIN ST,DELHI,NY,13753,855-413-3544,,,141777653,,2026-03-16,QUALIF,Y
|
||||
1261002,GENOIL INC,Genoil,Genoil Inc,GNOLF,GNOLF,OTC,NY,NY,Y,1389,"Oil & Gas Field Services, NEC",operating,Non-accelerated filer,smaller_reporting_<75M,"ONE ROCKEFELLER CENTER, 11TH FLOOR",,NEW YORK,NY,10020,"ONE ROCKEFELLER CENTER, 11TH FLOOR",NEW YORK,NY,10020,1-403-750 3450,,,000000000,,2026-05-13,20-F,Y
|
||||
1585380,"Greene Concepts, Inc",Greene Concepts,"Greene Concepts, Inc",INKW,INKW,OTC,NY,NY,Y,2086,Bottled & Canned Soft Drinks & Carbonated Waters,other,,smaller_reporting_<75M,1865 HERNDON AVENUE,SUITE K358,CLOVIS,CA,93611,1865 HERNDON AVENUE,CLOVIS,CA,93611,559-494-1000,,,743101465,,2026-05-21,253G1,Y
|
||||
50292,IEH Corp,IEH,IEH Corp,IEHC,IEHC,OTC,NY,NY,Y,3678,Electronic Connectors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,140 58TH ST BLDG B UNIT 8E,,BROOKLYN,NY,11220,140 58TH STREET BUILDING B SUITE 8E,BROOKLYN,NY,11220,7184924440,,,135549345,IEH CORPORATION,2026-06-08,8-K,Y
|
||||
2003750,"Maitong Sunshine Cultural Development Co., Ltd",Maitong Sunshine Cultural Development Co.,"Maitong Sunshine Cultural Development Co., Ltd",MGSD,MGSD,OTC,NY,NY,Y,4700,Transportation Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"ROOM 202, GATE 6, BUILDING 9, YAYUAN","ANHUI BEILI, CHAOYANG DISTRICT",BEIJING,,100000,"ROOM 202, GATE 6, BUILDING 9, YAYUAN",BEIJING,,100000,0086 010 64927946,,,934332287,,2026-05-20,10-Q,Y
|
||||
66496,MILLS MUSIC TRUST,Mills Music Trust,Mills Music Trust,MMTRS,MMTRS,OTC,NY,NY,Y,6794,Patent Owners & Lessors,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1001 AVENUE OF THE AMERICAS,2ND FLOOR,NEW YORK,NY,10018,1001 AVENUE OF THE AMERICAS,NEW YORK,NY,10018,2128685781,,,136183792,,2026-05-15,10-Q,Y
|
||||
1562805,Mitsui Kinzoku Co Ltd./ADR,Mitsui Kinzoku Co Ltd./ADR,Mitsui Kinzoku Co Ltd./ADR,XZJCF,XZJCF,OTC,NY,NY,Y,,,other,,smaller_reporting_<75M,120 BROADWAY,32ND FLOOR,NEW YORK,NY,10271,120 BROADWAY,NEW YORK,NY,10271,212-238-3128,,,000000000,"Mitsui Mining & Smelting Co., Ltd./ADR",2025-10-10,F-6 POS,Y
|
||||
1084267,"Mobiquity Technologies, Inc.",Mobiquity Technologies,"Mobiquity Technologies, Inc.",MOBQ,MOBQ|MOBQW,OTC,NY,NY,Y,7310,Services-Advertising,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,35 TORRINGTON LANE,,SHOREHAM,NY,11786,35 TORRINGTON LANE,SHOREHAM,NY,11786,516-256-7766,,,113427886,ACE MARKETING & PROMOTIONS INC,2026-05-15,10-Q,Y
|
||||
747540,SURGE COMPONENTS INC,Surge Components,Surge Components Inc,SPRS,SPRS,OTC,NY,NY,Y,5065,"Wholesale-Electronic Parts & Equipment, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,95 EAST JEFRYN BLVD,,DEER PARK,NY,11729,SURGE COMPONENTS INC,DEER PARK,NY,11729,5165951818,,,112602030,,2026-04-14,10-Q,Y
|
||||
1555815,Tisco Financial Group Public Co Limited/ADR,Tisco Financial Group Public Co Limited/ADR,Tisco Financial Group Public Co Limited/ADR,TSCFY,TSCFY,OTC,NY,NY,Y,,,other,,smaller_reporting_<75M,120 BROADWAY,32ND FLOOR,NEW YORK,NY,10271,120 BROADWAY,NEW YORK,NY,10271,2122383267,,,000000000,,2025-09-05,F-6EF,Y
|
||||
895464,Yubo International Biotech Ltd,Yubo International Biotech,Yubo International Biotech Ltd,YBGJ,YBGJ,OTC,NY,NY,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"ROOM 105, BUILDING 5, 31 XISHIKU AVENUE",,BEIJING,F4,00000,"ROOM 105, BUILDING 5, 31 XISHIKU AVENUE",BEIJING,F4,00000,86 (010) 6615-5141,,,113074326,MAGNA LAB INC,2026-05-15,10-Q,Y
|
||||
2066925,"CAPSTONE 72, INC.",Capstone 72,"Capstone 72, Inc.",CAPI,CAPI,,OH,OH,Y,6500,Real Estate,other,,smaller_reporting_<75M,"1440 ROCKSIDE RD SUITE 118,",ROCKSIDE PLAZA,PARMA,OH,44134,"1440 ROCKSIDE RD SUITE 118,",PARMA,OH,44134,1 828 7246873,,,334807947,,2026-05-27,S-11/A,Y
|
||||
1006830,CONSUMERS BANCORP INC /OH/,Consumers Bancorp,Consumers Bancorp Inc,CBKM,CBKM,OTC,OH,OH,Y,6021,National Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,614 E LINCOLN WAY,PO BOX 256,MINERVA,OH,44657-2096,614 E LINCOLN WAY,MINERVA,OH,44657-2095,3308687701,,,341771400,,2026-06-01,3,Y
|
||||
880417,"CSB Bancorp, Inc.",CSB Bancorp,"CSB Bancorp, Inc.",CSBB,CSBB,OTC,OH,OH,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,91 NORTH CLAY ST,,MILLERSBURG,OH,44654,91 NORTH CLAY ST,MILLERSBURG,OH,44654,3306749015,,,341687530,CSB BANCORP INC /OH,2026-05-14,10-Q,Y
|
||||
1087456,UNITED BANCSHARES INC/OH,United Bancshares,United Bancshares Inc,UBOH,,OTC,OH,OH,Y,6021,National Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,105 PROGRESSIVE DRIVE,,COLUMBUS GROVE,OH,45830,105 PROGRESSIVE DRIVE,COLUMBUS GROVE,OH,45830,419-659-2141,,,341516518,,2026-05-13,D,Y
|
||||
1917993,Growth Stalk Holdings Corp,Growth Stalk Holdings,Growth Stalk Holdings Corp,GSTK,GSTK,OTC,OK,OK,Y,0100,Agricultural Production-Crops,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,11991 N HWY 99,,SEMINOLE,OK,74868,11991 N HWY 99,SEMINOLE,OK,74868,4054560207,,,873145742,,2026-05-28,D,Y
|
||||
1879293,"Mag Mile Capital, Inc.",Mag Mile Capital,"Mag Mile Capital, Inc.",MMCP,MMCP,OTC,OK,OK,Y,3567,Industrial Process Furnaces & Ovens,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1141 W. RANDOLPH STREET,SUITE 200,CHICAGO,IL,60607,3625 COVE POINT DRIVE,SALT LAKE CITY,UT,84109,801 209 0740,,,871614433,"Myson, Inc.",2026-05-14,10-Q,Y
|
||||
1449794,"Embassy Bancorp, Inc.",Embassy Bancorp,"Embassy Bancorp, Inc.",EMYB,EMYB,OTC,PA,PA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,100 GATEWAY DRIVE,SUITE 100,BETHLEHEM,PA,18017,100 GATEWAY DRIVE,BETHLEHEM,PA,18017,610-882-8800,,,263339011,,2026-06-08,4,Y
|
||||
1437479,ENB Financial Corp,ENB Financial,ENB Financial Corp,ENBP,ENBP,OTC,PA,PA,Y,6021,National Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,31 E MAIN STREET,PO BOX 457,EPHRATA,PA,17522-0457,31 E MAIN STREET,EPHRATA,PA,17522-0457,717-733-4181,,,510661129,,2026-05-15,10-Q,Y
|
||||
862668,ESCALON MEDICAL CORP,Escalon Medical,Escalon Medical Corp,ESMC,ESMC,OTC,PA,PA,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,435 DEVON PARK ROAD,SUITE 824,WAYNE,PA,19087,435 DEVON PARK ROAD,WAYNE,PA,19087,6106886830,,,330272839,,2026-05-15,10-Q,Y
|
||||
737875,FIRST KEYSTONE CORP,First Keystone,First Keystone Corp,FKYS,FKYS,OTC,PA,PA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,111 W FRONT ST,PO BOX 289,BERWICK,PA,18603,111 WEST FRONT STREET,BERWICK,PA,18603,570-752-3671 X 1150,,,232249083,,2026-05-28,8-K,Y
|
||||
1846702,"Forge Group, Inc.",Forge Group,"Forge Group, Inc.",FIGP,FIGP,OTC,PA,PA,Y,6331,"Fire, Marine & Casualty Insurance",other,,smaller_reporting_<75M,8401 CONNECTICUT AVENUE,SUITE 300,CHEVY CHASE,MD,20815,8401 CONNECTICUT AVENUE,CHEVY CHASE,MD,20815,202-547-8700,,,854184821,"Amalgamated Specialty Group Holdings, Inc.",2026-05-15,1-U,Y
|
||||
714712,JUNIATA VALLEY FINANCIAL CORP,Juniata Valley Financial,Juniata Valley Financial Corp,JUVF,JUVF,OTC,PA,PA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,BRIDGE AND MAIN STREETS,PO BOX 66,MIFFLINTOWN,PA,17059-0066,BRIDGE AND MAIN STREETS,MIFFLINTOWN,PA,17059-0066,855-582-5101,,,232235254,,2026-06-04,4,Y
|
||||
731122,MUNCY COLUMBIA FINANCIAL Corp,MUNCY COLUMBIA FINANCIAL,MUNCY COLUMBIA FINANCIAL Corp,CCFN,CCFN,OTC,PA,PA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1199 LIGHTSTREET ROAD,,BLOOMSBURG,PA,17815,1199 LIGHTSTREET ROAD,BLOOMSBURG,PA,17815,5707844400,,,232254643,CCFNB BANCORP INC,2026-05-27,4,Y
|
||||
750558,QNB CORP.,Qnb,Qnb Corp.,QNBC,QNBC,OTC,PA,PA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,15 NORTH THIRD STREET,,QUAKERTOWN,PA,18951-9005,P.O. BOX 9005,QUAKERTOWN,PA,18951,2155385600,,,232318082,QNB CORP,2026-06-08,8-K/A,Y
|
||||
1391933,"QUAINT OAK BANCORP, INC.",Quaint Oak Bancorp,"Quaint Oak Bancorp, Inc.",QNTO,QNTO,OTC,PA,PA,Y,6036,"Savings Institutions, Not Federally Chartered",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,501 KNOWLES AVENUE,,SOUTHAMPTON,PA,18966,501 KNOWLES AVENUE,SOUTHAMPTON,PA,18966,215 364 4059,,,352293957,QUAINT OAK BANCORP INC,2026-05-27,4,Y
|
||||
202947,CAPITAL PROPERTIES INC /RI/,Capital Properties,Capital Properties Inc,CPTP,CPTP,OTC,RI,RI,Y,6519,"Lessors of Real Property, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,5 STEEPLE STREET,UNIT 303,PROVIDENCE,RI,02903,5 STEEPLE STREET,PROVIDENCE,RI,02903,401-435-7171,,,050386287,,2026-02-10,SCHEDULE 13G,Y
|
||||
1437213,"Coastal Carolina Bancshares, Inc.",Coastal Carolina Bancshares,"Coastal Carolina Bancshares, Inc.",CCNB,CCNB,OTC,SC,SC,Y,6021,National Commercial Banks,operating,,smaller_reporting_<75M,1012 38TH AVENUE NORTH,,MYRTLE BEACH,SC,29577,1012 38TH AVENUE NORTH,MYRTLE BEACH,SC,29577,(843) 839-1952,,,331206107,,2026-02-13,SCHEDULE 13G/A,Y
|
||||
818677,SECURITY FEDERAL CORP,Security Federal,Security Federal Corp,SFDL,SFDL,OTC,SC,SC,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,238 RICHLAND AVENUE NW,,AIKEN,SC,29801,238 RICHLAND AVENUE NW,AIKEN,SC,29801,8036413000,,,570858504,SECURITY FEDERAL CORPORATION,2026-03-20,10-K,Y
|
||||
1568969,Techlott Inc.,Techlott,Techlott Inc.,LOTT,APYP,OTC,SD,SD,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,16 NATAN ALTERMAN ST,,GAN YAVNE,,,447 BROADWAY,NEW YORK,NY,10013,8006743561,,,461496846,"APPYEA, INC",2026-06-03,8-K,Y
|
||||
29332,DIXIE GROUP INC,Dixie Group,Dixie Group Inc,DXYN,DXYN,OTC,TN,TN,Y,2273,Carpets & Rugs,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,PO BOX 2007,,DALTON,GA,30722,PO BOX 2007,DALTON,GA,30722,7068765814,,,620183370,DIXIE YARNS INC,2026-05-27,SCHEDULE 13G,Y
|
||||
96664,"American Fusion, Inc.",American Fusion,"American Fusion, Inc.",AMFN,AMFN,OTC,TX,TX,Y,4911,Electric Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"401 N CARROLL AVE., STE. 192",,SOUTHLAKE,TX,76092,"401 N CARROLL AVE., STE. 192",SOUTHLAKE,TX,76092,480-788-7420,,,221436279,"Renewal Fuels, Inc.|TECH LABORATORIES INC",2026-05-20,10-Q,Y
|
||||
1572386,"GREENWAY TECHNOLOGIES, INC. & SUBSIDIARIES","Greenway Technologies, Inc. & Subsidiaries","Greenway Technologies, Inc. & Subsidiaries",GWTI,GWTI,OTC,TX,TX,Y,2860,Industrial Organic Chemicals,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,1521 NORTH COOPER STREET,SUITE 205,ARLINGTON,TX,76011,1521 NORTH COOPER STREET,ARLINGTON,TX,76011,(561) 809-4644,,,900893594,"GREENWAY TECHNOLOGIES INC|UMED HOLDINGS, INC.",2026-06-03,8-K,Y
|
||||
862022,HUGOTON ROYALTY TRUST,Hugoton Royalty Trust,Hugoton Royalty Trust,HGTXU,HGTXU,OTC,TX,TX,Y,6792,Oil Royalty Traders,operating,,smaller_reporting_<75M,C/O ARGENT TRUST COMPANY,"3838 OAK LAWN AVE., SUITE 1720",DALLAS,TX,75219-4518,C/O ARGENT TRUST COMPANY,DALLAS,TX,75219-4518,972-919-1360,,,586379215,,2026-05-18,8-K,Y
|
||||
1096296,MINERALRITE Corp,MINERALRITE,MINERALRITE Corp,RITE,RITE,OTC,TX,TX,Y,1090,Miscellaneous Metal Ores,operating, / Emerging growth company,smaller_reporting_<75M,325 N. ST. PAUL STREET,SUITE 3100,DALLAS,TX,75201,325 N. ST. PAUL STREET,DALLAS,TX,75201,469-881-8900,,,900315909,ROYAL QUANTUM GROUP INC|PLATINUM SUPERYACHTS INC|MENTOR ON CALL INC|PSM CORP,2026-05-27,8-K,Y
|
||||
844985,POSITRON CORP,Positron,Positron Corp,POSC,POSC,OTC,TX,TX,Y,3845,Electromedical & Electrotherapeutic Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,530 OAKMONT LANE,,WESTMOUNT,IL,60559,530 OAKMONT LANE,WESTMOUNT,IL,60559,2814927100,,,760083622,,2026-05-15,10-Q,Y
|
||||
1038277,RADNOSTIX INC,Radnostix,Radnostix Inc,INIS,INIS,OTC,TX,TX,Y,3823,"Industrial Instruments For Measurement, Display, and Control",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4137 COMMERCE CIRCLE,,IDAHO FALLS,ID,83401,4137 COMMERCE CIRCLE,IDAHO FALLS,ID,83401,2085245300,,,742763837,INTERNATIONAL ISOTOPES INC,2026-06-04,DEFA14A,Y
|
||||
34285,RELIABILITY INC,Reliability,Reliability Inc,RLBY,RLBY,OTC,TX,TX,Y,7363,Services-Help Supply Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,22505 GATEWAY CENTER DRIVE,P.O. BOX 71,CLARKSBURG,MD,20871,22505 GATEWAY CENTER DRIVE,CLARKSBURG,MD,20871,(203) 489-9500,,,750868913,,2026-05-20,10-Q,Y
|
||||
1181412,SPACE EXPLORATION TECHNOLOGIES CORP,Space Exploration Technologies,Space Exploration Technologies Corp,SPCX,SPCX,,TX,TX,Y,7370,"Services-Computer Programming, Data Processing, Etc.",other,,smaller_reporting_<75M,1 ROCKET ROAD,,STARBASE,TX,78521,1 ROCKET ROAD,STARBASE,TX,78521,3103636000,,,000000000,,2026-06-09,FWP,Y
|
||||
867038,SPINDLETOP OIL & GAS CO,Spindletop Oil & Gas,Spindletop Oil & Gas Co,SPND,SPND,OTC,TX,TX,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12850 SPURLING RD.,SUITE 200,DALLAS,TX,75230-1279,12850 SPURLING RD.,DALLAS,TX,75230-1279,9726442581,,,752063001,,2026-05-20,10-Q,Y
|
||||
1083490,SUNRISE REAL ESTATE GROUP INC,Sunrise Real Estate Group,Sunrise Real Estate Group Inc,SRRE,SRRE,OTC,TX,TX,Y,6513,Operators of Apartment Buildings,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,SUITE 1502,NO. 333 ZHAOJIABANG ROAD,SHANGHAI,,,SUITE 1502,SHANGHAI,,,8621-64220505,,,752713701,SUNRISE REAL ESTATE DEVELOPMENT GROUP INC|PARALLAX ENTERTAINMENT INC,2026-05-20,10-Q,Y
|
||||
1532383,VANJIA CORP,Vanjia,Vanjia Corp,VNJA,VNJA,OTC,TX,TX,Y,1531,Operative Builders,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4771 SWEETWATER BLVD #199,,SUGAR LAND,TX,77479,4771 SWEETWATER BLVD #199,SUGAR LAND,TX,77479,713-898-6818,,,453051284,Vantone Realty Corp,2026-05-15,10-Q,Y
|
||||
1062506,ATLANTICA INC,Atlantica,Atlantica Inc,ALDA,ALDA,OTC,UT,UT,Y,6770,Blank Checks,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,11450 SE DIXIE HIGHWAY,,HOBE SOUND,FL,33455,11450 SE DIXIE HIGHWAY,HOBE SOUND,FL,33455,772-545-9002,,,430976473,,2026-05-04,10-Q,Y
|
||||
1543637,"Nu-Med Plus, Inc.",Nu-Med Plus,"Nu-Med Plus, Inc.",NUMD,NUMD,OTC,UT,UT,Y,3841,Surgical & Medical Instruments & Apparatus,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,640 BELLE TERRE RD. 2 E,,PORT JEFFERSON,NY,11777,640 BELLE TERRE RD. 2 E,PORT JEFFERSON,NY,11777,631-403-4337,,,453672530,,2026-05-14,10-Q,Y
|
||||
1610718,"Outdoor Specialty Products, Inc.",Outdoor Specialty Products,"Outdoor Specialty Products, Inc.",ODRS,ODRS,OTC,UT,UT,Y,3949,"Sporting & Athletic Goods, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,3842 QUAIL HOLLOW DRIVE,,SALT LAKE CITY,UT,84109,3842 QUAIL HOLLOW DRIVE,SALT LAKE CITY,UT,84109,801-560-5184,,,464854952,,2026-05-05,10-Q,Y
|
||||
1138476,PACIFIC HEALTH CARE ORGANIZATION INC,Pacific Health Care Organization,Pacific Health Care Organization Inc,PFHO,PFHO,OTC,UT,UT,Y,8090,"Services-Misc Health & Allied Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,19800 MACARTHUR BOULEVARD,SUITES 306 & 307,IRVINE,CA,92612,19800 MACARTHUR BOULEVARD,IRVINE,CA,92612,(949) 721-8272,,,870285238,,2026-06-04,4,Y
|
||||
841533,"SADDLE RANCH MEDIA, INC.",Saddle Ranch Media,"Saddle Ranch Media, Inc.",SRMX,SRMX,OTC,UT,UT,Y,3640,Electric Lighting & Wiring Equipment,operating,,smaller_reporting_<75M,19200 VON KARMAN AVE.,STE 400,IRVINE,CA,92612,19200 VON KARMAN AVE.,IRVINE,CA,92612,949-212-1898,,,870461653,INTERLINE RESOURCES CORP,2026-02-04,1-A-W,Y
|
||||
727346,"SELECTIS HEALTH, INC.",Selectis Health,"Selectis Health, Inc.",GBCS,GBCS,OTC,UT,UT,Y,6798,Real Estate Investment Trusts,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,8480 E. ORCHARD ROAD,SUITE 4900,GREENWOOD VILLAGE,CO,80111,8480 E. ORCHARD ROAD,GREENWOOD VILLAGE,CO,80111,720-680-0808,,,870340206,"GLOBAL HEALTHCARE REIT, INC.|GLOBAL CASINOS INC",2026-05-26,3,Y
|
||||
804563,BENCHMARK BANKSHARES INC,Benchmark Bankshares,Benchmark Bankshares Inc,BMBN,BMBN,OTC,VA,VA,Y,6022,State Commercial Banks,operating,,smaller_reporting_<75M,100 S BROAD ST,,KENBRIDGE,VA,23944,100 S BROAD ST,KENBRIDGE,VA,23944,8046768444,,,541460991,,2025-05-29,D,Y
|
||||
1763925,CoJax Oil & Gas Corp,CoJax Oil & Gas,CoJax Oil & Gas Corp,CJAX,CJAX,OTC,VA,VA,Y,1311,Crude Petroleum & Natural Gas,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,3130 19TH ST N,,ARLINGTON,VA,22201,3130 19TH ST N,ARLINGTON,VA,22201,703-216-8606,,,461892622,,2026-05-13,10-Q,Y
|
||||
1900720,EPWK Holdings Ltd.,EPWK Holdings,EPWK Holdings Ltd.,EPWKF,EPWKF,OTC,VA,VA,Y,7389,"Services-Business Services, NEC",other, / Emerging growth company,smaller_reporting_<75M,NO. 359 CHENGYI ROAD,"DISTRICT A, BUILDING #2",XIAMEN,,0000,NO. 359 CHENGYI ROAD,XIAMEN,,0000,86 400-1286688,,,000000000,,2026-06-02,25-NSE,Y
|
||||
740806,F&M BANK CORP,F&m Bank,F&m Bank Corp,FMBM,FMBM,OTC,VA,VA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,P.O. BOX 1111,,TIMBERVILLE,VA,22853,P. O. BOX 1111,TIMBERVILLE,VA,22853,540-896-8941,,,541280811,,2026-05-27,8-K,Y
|
||||
1163389,NEW PEOPLES BANKSHARES INC,New Peoples Bankshares,New Peoples Bankshares Inc,NWPP,NWPP,OTC,VA,VA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,67 COMMERCE DRIVE,,HONAKER,VA,24260,PO BOX 1810,HONAKER,VA,24260,2768737000,,,311804543,,2026-06-08,4,Y
|
||||
1865429,"Oak View Bankshares, Inc.",Oak View Bankshares,"Oak View Bankshares, Inc.",OAKV,OAKV,OTC,VA,VA,Y,6021,National Commercial Banks,other,,smaller_reporting_<75M,128 BROADVIEW AVENUE,,WARRENTON,VA,20186,128 BROADVIEW AVENUE,WARRENTON,VA,20186,540-359-7151,,,870937245,,2025-10-24,D,Y
|
||||
1657642,"Skyline Bankshares, Inc.",Skyline Bankshares,"Skyline Bankshares, Inc.",SLBK,SLBK,OTC,VA,VA,Y,6022,State Commercial Banks,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,101 JACKSONVILLE CIRCLE,,FLOYD,VA,24091,101 JACKSONVILLE CIRCLE,FLOYD,VA,24091,540-745-4191,,,475486027,Parkway Acquisition Corp.,2026-05-21,8-K,Y
|
||||
1083522,JONES SODA CO.,Jones Soda,Jones Soda Co.,JSDA,JSDA,OTC,WA,WA,Y,2080,Beverages,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4786 1ST AVENUE SOUTH,SUITE 103,SEATTLE,WA,98134,4786 1ST AVENUE SOUTH,SEATTLE,WA,98134,206 624-3357,,,911696175,JONES SODA CO|URBAN JUICE & SODA CO LTD /WY/,2026-05-22,10-K/A,Y
|
||||
107815,WISCONSIN ELECTRIC POWER CO,Wisconsin Electric Power,Wisconsin Electric Power Co,WELPP,WELPP|WELPM,OTC,WI,WI,Y,4911,Electric Services,operating,Non-accelerated filer,smaller_reporting_<75M,231 W MICHIGAN ST,PO BOX 2046,MILWAUKEE,WI,53290-0001,231 W MICHIGAN ST,MILWAUKEE,WI,53201,414-221-2345,,,390476280,,2026-06-04,8-K,Y
|
||||
2042320,Alpha One Inc.,Alpha One,Alpha One Inc.,AOAO,AOAO,OTC,WY,WY,Y,4899,"Communications Services, NEC",other,,smaller_reporting_<75M,"NO. 203, F2.62A, 2F, TIANZHAN BUILDING,","NO. 4 TANRAN 5TH ROAD,",SHENZHEN,F4,518001,"NO. 203, F2.62A, 2F, TIANZHAN BUILDING,",SHENZHEN,F4,518001,86 755 82794624,,,271310226,,2026-05-27,RW,Y
|
||||
1771995,American Picture House Corp,American Picture House,American Picture House Corp,APHP,APHP,OTC,WY,WY,Y,7900,Services-Amusement & Recreation Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,555 MADISON AVENUE 5FL,,NEW YORK,NY,10022,555 MADISON AVENUE 5FL,NEW YORK,NY,10022,9175658898,,,830754859,,2026-05-14,10-Q,Y
|
||||
1133818,"BIO-PATH HOLDINGS, INC.",Bio-path Holdings,"Bio-path Holdings, Inc.",BPTH,BPTH,OTC,WY,WY,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,4710 BELLAIRE BOULEVARD,SUITE 210,BELLAIRE,TX,77401,4710 BELLAIRE BOULEVARD,BELLAIRE,TX,77401,(832) 742-1357,,,870652870,BIO-PATH HOLDINGS INC|OGDEN GOLF CO CORP,2026-05-26,8-K,Y
|
||||
1444839,Bravo Multinational Inc.,Bravo Multinational,Bravo Multinational Inc.,BRVO,BRVO,OTC,WY,WY,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2020 GENERAL BOOTH BLVD UNIT 230,,VIRGINIA BEACH,VA,23454,2020 GENERAL BOOTH BLVD UNIT 230,VIRGINIA BEACH,VA,23454,757-306-6090,,,854068651,GoldLand Holdings Corp.|GoldCorp Holdings Corp.|GoldCorp Holding Co.,2026-05-19,10-Q,Y
|
||||
1873722,Bubblr Inc.,Bubblr,Bubblr Inc.,BBLR,BBLR,OTC,WY,WY,Y,7370,"Services-Computer Programming, Data Processing, Etc.",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,30 N. GOULD STREET,SUITE R,SHERIDAN,WY,82801,30 N. GOULD STREET,SHERIDAN,WY,82801,647-646-2263,,,862355916,,2026-05-15,10-Q,Y
|
||||
1106861,CS DIAGNOSTICS CORP.,Cs Diagnostics,Cs Diagnostics Corp.,CSDX,CSDX,OTC,WY,WY,Y,2842,"Specialty Cleaning, Polishing and Sanitation Preparations",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,STRESEMANNALLEE 4B,,NEUSS,2M,41460,STRESEMANNALLEE 4B,NEUSS,2M,41460,49 21311510871,,,201290331,FLASHZERO CORP.|CHILDRENS INTERNET INC|DWC INSTALLATIONS,2026-05-15,NT 10-Q,Y
|
||||
1741220,CW Petroleum Corp,CW Petroleum,CW Petroleum Corp,CWPE,CWPE,OTC,WY,WY,Y,5172,Wholesale-Petroleum & Petroleum Products (No Bulk Stations),other,,smaller_reporting_<75M,23501 CINCO RANCH BLVD,SUITE H120-#325,KATY,TX,77494,23501 CINCO RANCH BLVD,KATY,TX,77494,281-817-8099,,,202765559,,2026-04-29,1-K,Y
|
||||
1935092,"Cyber Enviro-Tech, Inc.",Cyber Enviro-Tech,"Cyber Enviro-Tech, Inc.",CETI,CETI,OTC,WY,WY,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"6991 E. CAMELBACK ROAD, SUITE D-300",,SCOTTSDALE,AZ,85251,"6991 E. CAMELBACK ROAD, SUITE D-300",SCOTTSDALE,AZ,85251,307-200-2803,,,863601702,,2026-05-20,10-K,Y
|
||||
725394,"Dalrada Technology Group, Inc.",Dalrada Technology Group,"Dalrada Technology Group, Inc.",DHTI,DHTI,OTC,WY,WY,Y,7363,Services-Help Supply Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,600 LA TERRAZA BOULEVARD,,ESCONDIDO,CA,92025,600 LA TERRAZA BOULEVARD,ESCONDIDO,CA,92025,858-283-1253,,,383713274,DALRADA FINANCIAL CORP|IMAGING TECHNOLOGIES CORP/CA|PERSONAL COMPUTER PRODUCTS INC,2026-05-21,10-Q,Y
|
||||
1791929,"DISCOUNT PRINT USA, INC.",Discount Print Usa,"Discount Print Usa, Inc.",DPUI,DPUI,OTC,WY,WY,Y,2750,Commercial Printing,other,,smaller_reporting_<75M,2801 S. VALLEY VIEW BLVD,SUITE 7-1,LAS VEGAS,NV,89102,2801 S. VALLEY VIEW BLVD,LAS VEGAS,NV,89102,7025273536,,,842125667,,2026-05-26,253G1,Y
|
||||
1356914,ECOPLUS INC,Ecoplus,Ecoplus Inc,ECPL,ECPL,OTC,WY,WY,Y,8090,"Services-Misc Health & Allied Services, NEC",other,,smaller_reporting_<75M,120 WASHINGTON ST.,,SALEM,MA,01970,120 WASHINGTON ST.,SALEM,MA,01970,855-955-3275,,,000000000,,2026-05-04,1-A/A,Y
|
||||
1043150,"Eline Entertainment Group, Inc.",Eline Entertainment Group,"Eline Entertainment Group, Inc.",EEGI,EEGI,OTC,WY,WY,Y,1520,General Bldg Contractors - Residential Bldgs,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"113, TOWER 2, LIPPO CENTRE",89 QUEENSWAY,ADMIRALTY,K3,00000,"113, TOWER 2, LIPPO CENTRE",ADMIRALTY,K3,00000,852-3703-6155,,,880429856,ELINE ENTERTAINMENT GROUP INC|ELINE MUSIC COM INC|RAPID RETRIEVAL SYSTEMS INC,2026-05-20,10-Q,Y
|
||||
1939937,"Exousia Bio, Inc.",Exousia Bio,"Exousia Bio, Inc.",LMMY,LMMY,OTC,WY,WY,Y,8200,Services-Educational Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,7901 4TH STREET N #23494,,ST. PETERSBURG,FL,33702,7901 4TH STREET N #23494,ST. PETERSBURG,FL,33702,940-367-6154,,,372039216,LAMY|L A M Y,2026-04-14,NT 10-Q,Y
|
||||
1807689,"FAST CASUAL CONCEPTS, INC.",Fast Casual Concepts,"Fast Casual Concepts, Inc.",FCCI,FCCI,OTC,WY,WY,Y,5810,Retail-Eating & Drinking Places,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,141 AMSTERDAM RD.,,GROVE CITY,PA,16127,PO BOX 1832,DRAPER,UT,84020,801-871-5225,,,834100110,,2026-05-01,10-Q,Y
|
||||
1871890,Galaxy Enterprises Inc. /WY/,Galaxy Enterprises,Galaxy Enterprises Inc.,GLEI,GLEI,OTC,WY,WY,Y,6531,Real Estate Agents & Managers (For Others),operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1701 CHARLES LAM COURT,,LAS VEGAS,NV,89117,1701 CHARLES LAM COURT,LAS VEGAS,NV,89117,702-596-9628,,,861370102,,2026-03-25,10-Q,Y
|
||||
55234,"Global Asset Management Group, Inc.",Global Asset Management Group,"Global Asset Management Group, Inc.",GAMG,GAMG,OTC,WY,WY,Y,7990,Services-Miscellaneous Amusement & Recreation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"1505 MONROE STREET, SUITE 1505",,ROCKVILLE,MD,20852,"1505 MONROE STREET, SUITE 1505",ROCKVILLE,MD,20852,312-372-6900,,,132610105,KENILWORTH SYSTEMS CORP,2026-05-20,10-Q,Y
|
||||
1940243,Global-Smart.Tech,Global-Smart.Tech,Global-Smart.Tech,GSMT,GSMT,OTC,WY,WY,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"KAVA B.B.,",,TIVAT,,85320,"KAVA B.B.,",TIVAT,,85320,12052165924,,,981664763,Global-Smart.Tech Inc.,2026-04-09,10-Q,Y
|
||||
1081188,GOLD ENTERPRISE GROUP INC,Gold Enterprise Group,Gold Enterprise Group Inc,GEGP,GEGP,OTC,WY,WY,Y,3842,"Orthopedic, Prosthetic & Surgical Appliances & Supplies",operating,,smaller_reporting_<75M,16034 US HWY 19,,HUDSON,FL,34667,PO BOX 690041,VERO BEACH,FL,32969,561-210-7553,,,980206212,GOLD ENTERTAINMENT GROUP INC|ADVANCED MEDICAL TECHNOLOGIES INC/CANADA,2025-11-24,8-K,Y
|
||||
1084937,Green Rain Energy Holdings Inc.,Green Rain Energy Holdings,Green Rain Energy Holdings Inc.,GREH,GREH,OTC,WY,WY,Y,9995,Non-Operating Establishments,operating, / Emerging growth company,smaller_reporting_<75M,109 EAST 17TH STREET,SUITE 80,CHEYENNE,WY,82001,109 EAST 17TH STREET,CHEYENNE,WY,82001,310-714-2950,,,880395372,NOW Corp I|NOW CORPORATION/NV|HEALTHCOMP EVALUATION SERVICES CORP,2026-03-13,8-K,Y
|
||||
1409253,"Havana Roasters Coffee Companies, Inc.",Havana Roasters Coffee Companies,"Havana Roasters Coffee Companies, Inc.",NAFS,NAFS|THRC,,WY,WY,Y,8742,Services-Management Consulting Services,operating,Smaller reporting company,smaller_reporting_<75M,3445 HOLLYWOOD BLVD,SUITE 415,HOLLYWOOD,FL,33302,3445 HOLLYWOOD BLVD,HOLLYWOOD,FL,33302,786-510-8899,,,208926549,"North America Frac Sand, Inc.|Xterra Building Systems, Inc.|Innovate Building Systems, Inc.|NEW FOUND SHRIMP INC",2026-04-27,1-A/A,Y
|
||||
1721056,HOOPS SCOUTING USA,Hoops Scouting Usa,Hoops Scouting Usa,HSCT,HSCT,OTC,WY,WY,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,63 ROCIO CT,,PALM DESERT,CA,92260,63 ROCIO CT,PALM DESERT,CA,92260,760-636-4353,,,000000000,,2026-05-13,10-Q,Y
|
||||
1070789,HyOrc Corp,HyOrc,HyOrc Corp,HYOR,HYOR,OTC,WY,WY,Y,8711,Services-Engineering Services,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,12707 HIGH BLUFF DRIVE 2ND FL,,SAN DIEGO,CA,92130,114 MAGNOLIA STREET,BELLINGHAM,WA,98225,6193504288,,,470855301,ASIA PROPERTIES INC,2026-05-14,8-K,Y
|
||||
1919191,"Intelithrive, Inc.",Intelithrive,"Intelithrive, Inc.",ITHR,ITHR,OTC,WY,WY,Y,3690,"Miscellaneous Electrical Machinery, Equipment & Supplies",other,,smaller_reporting_<75M,7306 SKYVIEW AVE,,NEW PORT RICHEY,FL,34653,7306 SKYVIEW AVE,NEW PORT RICHEY,FL,34653,8018715225,,,872433982,PGD ECO SOLUTIONS,2026-04-21,1-K,Y
|
||||
1657214,International Land Alliance Inc.,International Land Alliance,International Land Alliance Inc.,ILAL,ILAL,OTC,WY,WY,Y,6552,Land Subdividers & Developers (No Cemeteries),operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,350 10TH AVENUE,SUITE 1000,SAN DIEGO,CA,92101,350 10TH AVENUE,SAN DIEGO,CA,92101,(858) 692-2677,,,463752361,,2026-06-02,8-K,Y
|
||||
1413119,"Kraig Biocraft Laboratories, Inc.",Kraig Biocraft Laboratories,"Kraig Biocraft Laboratories, Inc.",KBLB,KBLB,OTC,WY,WY,Y,2820,"Plastic Material, Synth Resin/Rubber, Cellulos (No Glass)",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,2723 SOUTH STATE STREET,SUITE 150,ANN ARBOR,MI,48104,2723 SOUTH STATE STREET,ANN ARBOR,MI,48104,(734) 619-8066,,,830459707,"Kraig Biocraft Laboratories, Inc",2026-05-22,424B3,Y
|
||||
1985554,Londax Corp.,Londax,Londax Corp.,LDXC,LDXC,OTC,WY,WY,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,YIANGOU POTAMITI 27,,LIMASSOL,,3010,YIANGOU POTAMITI 27,LIMASSOL,,3010,3727121419,,,352807931,,2026-04-07,10-Q,Y
|
||||
1888740,LSEB Creative Corp.,LSEB Creative,LSEB Creative Corp.,LSEB,LSEB,OTC,WY,WY,Y,2320,"Men's & Boys' Furnishgs, Work Clothg, & Allied Garments",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,30 N. GOULD STREET,#4000,SHERIDAN,WY,82801,30 N. GOULD STREET,SHERIDAN,WY,82801,(902) 305-4177,,,834415385,,2026-03-02,8-K,Y
|
||||
1949864,Mag Magna Corp,Mag Magna,Mag Magna Corp,MGNC,MGNC,OTC,WY,WY,Y,1400,Mining & Quarrying of Nonmetallic Minerals (No Fuels),operating, / Emerging growth company,smaller_reporting_<75M,4005 WEST RENO AVENUE,SUITE F,LAS VEGAS,NV,89118,4005 WEST RENO AVENUE,LAS VEGAS,NV,89118,8617823500944,,,981626237,Mag Magna Corp.,2026-06-05,8-K,Y
|
||||
1978111,Naploy Corp.,Naploy,Naploy Corp.,NPLY,,OTC,WY,WY,Y,8000,Services-Health Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,95 LIAS ESTATE KAFE,,"DISTRICT ABUJA, FCT",Q5,900108,95 LIAS ESTATE KAFE,"DISTRICT ABUJA, FCT",Q5,900108,13072133163,,,000000000,,2026-05-21,10-Q,Y
|
||||
1933359,Natics Corp.,Natics,Natics Corp.,NTCS,NTCS,OTC,WY,WY,Y,7374,Services-Computer Processing & Data Preparation,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,"APP 6, YEHUDA GORODISKI 1",,REHOVOT,L3,7623101,"APP 6, YEHUDA GORODISKI 1",REHOVOT,L3,7623101,130-722-20096,,,981660105,,2026-02-17,10-Q,Y
|
||||
1941360,Neolara Corp.,Neolara,Neolara Corp.,NELR,NELR,OTC,WY,WY,Y,1520,General Bldg Contractors - Residential Bldgs,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,C/O REGISTERED AGENTS INC.,30 N. GOULD ST. STE R,SHERIDAN,WY,82801,C/O REGISTERED AGENTS INC.,SHERIDAN,WY,82801,307-269-0177,,,981674969,,2026-05-14,10-Q,Y
|
||||
1059689,North America Lithium & Gold Corp,North America Lithium & Gold,North America Lithium & Gold Corp,NALG,NALG,OTC,WY,WY,Y,9995,Non-Operating Establishments,operating,,smaller_reporting_<75M,6615 GRAND AVENUE,#428,GURNEE,WY,,6615 GRAND AVENUE,GURNEE,WY,,8666005444,,,650794980,BrightRock Gold Corp|GO CALL INC,2025-12-09,D,Y
|
||||
1107280,OCULUS INC.,Oculus,Oculus Inc.,OVTZ,OVTZ,OTC,WY,WY,Y,7389,"Services-Business Services, NEC",operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,837 WEST HASTINGS STREET,SUITE 507,VANCOUVER,,V6C 3N6,837 WEST HASTINGS STREET,VANCOUVER,,V6C 3N6,6046851017,,,061576391,OCULUS VISIONTECH INC.|OCULUS VISION TECH INC.|USA VIDEO INTERACTIVE CORP,2026-05-12,10-Q,Y
|
||||
1733861,REST EZ Inc.,REST EZ,REST EZ Inc.,RTEZ,RTEZ,OTC,WY,WY,Y,2834,Pharmaceutical Preparations,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,1398 WEST MASON HOLLOW DRIVE,,RIVERTON,UT,84065,1398 WEST MASON HOLLOW DRIVE,RIVERTON,UT,84065,801-300-2542,,,824268982,,2026-02-10,10-Q,Y
|
||||
1703157,"Securetech Innovations, Inc.",Securetech Innovations,"Securetech Innovations, Inc.",SCTH,SCTH,OTC,WY,WY,Y,3714,Motor Vehicle Parts & Accessories,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,"2355 HIGHWAY 36 WEST, SUITE 400",,ROSEVILLE,MN,55113,"2355 HIGHWAY 36 WEST, SUITE 400",ROSEVILLE,MN,55113,612-317-8990,,,820972782,"Securetech, Inc.",2026-05-21,4,Y
|
||||
2029303,Tech Tonic Group Corp.,Tech Tonic Group,Tech Tonic Group Corp.,THTG,THTG,OTC,WY,WY,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,REMSCHEIDER STR. 54,,KREFELD,2M,47807,REMSCHEIDER STR. 54,KREFELD,2M,47807,307-855-1550,,,365075435,,2026-05-06,10-Q,Y
|
||||
1919182,Universal Token,Universal Token,Universal Token,UTKN,UTKN,OTC,WY,WY,Y,6199,Finance Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,WORLD TRADE CENTER,"CALLE EL MIRADOR, 87 AVE NORTE",SAN SALVADOR,,,5211 READING CIR,ROSENBERG,TX,77471,8018715225,,,872595314,"Eco Bright Future, Inc.",2026-05-11,10-Q,Y
|
||||
1880431,Vocodia Holdings Corp,Vocodia Holdings,Vocodia Holdings Corp,VHAI,VHAI|VHABW|VHAIW,OTC,WY,WY,Y,7371,Services-Computer Programming Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,7781 NW BEACON SQUARE BLVD.,UNIT 102-V64,BOCA RATON,FL,33487,7781 NW BEACON SQUARE BLVD.,BOCA RATON,FL,33487,(561) 484-5234,,,863519415,,2026-05-13,SCHEDULE 13G,Y
|
||||
1645155,Webstar Technology Group Inc.,Webstar Technology Group,Webstar Technology Group Inc.,WBSR,WBSR,OTC,WY,WY,Y,7372,Services-Prepackaged Software,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,4231 WALNUT BEND,,JACKSONVILLE,FL,32257,4231 WALNUT BEND,JACKSONVILLE,FL,32257,8006086344,,,371780261,,2026-05-22,SEC STAFF ACTION,Y
|
||||
1887912,Welsis Corp.,Welsis,Welsis Corp.,WLSS,WLSS,OTC,WY,WY,Y,8000,Services-Health Services,operating,Non-accelerated filer / Smaller reporting company / Emerging growth company,smaller_reporting_<75M,701 E CATHEDRAL RD,STE 45 PMB 405,PHILADELPHIA,PA,19128,701 E CATHEDRAL RD,PHILADELPHIA,PA,19128,215-552-8991,,,000000000,,2026-05-15,NT 10-Q,Y
|
||||
1438461,Yinfu Gold Corp.,Yinfu Gold,Yinfu Gold Corp.,ELRE,ELRE,OTC,WY,WY,Y,1090,Miscellaneous Metal Ores,operating,Non-accelerated filer / Smaller reporting company,smaller_reporting_<75M,DONGFANG SCIENCE AND TECHNOLOGY MANSION,"SUITE 2313, NANSHAN DISTRICT",SHENZHEN,F4,518000,DONGFANG SCIENCE AND TECHNOLOGY MANSION,SHENZHEN,F4,518000,86-755-8316-0998,,,208531222,Element92 Resources Corp.,2026-02-23,10-Q,Y
|
||||
|
1808
data/otc_leads_rejected.csv
Normal file
1808
data/otc_leads_rejected.csv
Normal file
File diff suppressed because it is too large
Load diff
43
data/trucking_campaigns/ifta_quarterly_reminder.html
Normal file
43
data/trucking_campaigns/ifta_quarterly_reminder.html
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<div style="font-family:-apple-system,system-ui,sans-serif;max-width:600px;margin:0 auto">
|
||||
<div style="background:#1a2744;padding:24px;text-align:center;border-radius:12px 12px 0 0">
|
||||
<img src="https://performancewest.net/images/logo.png" alt="Performance West" style="height:40px">
|
||||
</div>
|
||||
<div style="background:#fff;border:1px solid #e2e8f0;padding:32px;border-radius:0 0 12px 12px">
|
||||
<p style="font-size:15px;color:#374151;line-height:1.6">{{ .Subscriber.Attribs.company }},<br>DOT# {{ .Subscriber.Attribs.dot_number }}</p>
|
||||
<h1 style="font-size:22px;color:#dc2626;margin:16px 0">{{ .Subscriber.Attribs.ifta_headline }}</h1>
|
||||
<p style="font-size:15px;color:#374151;line-height:1.6">{{ .Subscriber.Attribs.ifta_urgency }}</p>
|
||||
<p style="font-size:15px;color:#374151;line-height:1.6">Your IFTA fuel-tax return for <strong>{{ .Subscriber.Attribs.ifta_quarter }}</strong> is due <strong>{{ .Subscriber.Attribs.ifta_due_date }}</strong>. Miss it and you face:</p>
|
||||
<ul style="font-size:15px;color:#374151;line-height:1.8">
|
||||
<li><strong>Late penalties</strong> ($50 or 10% of net tax due, whichever is greater)</li>
|
||||
<li><strong>Interest</strong> on unpaid tax in every member jurisdiction</li>
|
||||
<li>Risk of your <strong>IFTA license being suspended</strong> - which can put you out of service</li>
|
||||
</ul>
|
||||
{{ if .Subscriber.Attribs.coupon_code }}
|
||||
<div style="background:#fff7ed;border:2px solid #f97316;border-radius:10px;padding:20px;margin:20px 0;text-align:center">
|
||||
<p style="font-size:13px;font-weight:700;color:#9a3412;letter-spacing:.04em;margin:0 0 6px">TODAY ONLY - {{ .Subscriber.Attribs.coupon_pct }}% OFF</p>
|
||||
<p style="font-size:18px;font-weight:700;color:#9a3412;margin:0 0 4px">We file your IFTA quarterly return for <span style="text-decoration:line-through;color:#c2410c;font-weight:600">$109</span> <span style="color:#15803d">$65</span>.</p>
|
||||
<p style="font-size:14px;color:#9a3412;margin:0 0 4px">Use code <strong style="font-size:16px;letter-spacing:.08em">{{ .Subscriber.Attribs.coupon_code }}</strong> at checkout.</p>
|
||||
<p style="font-size:12px;color:#b91c1c;font-weight:700;margin:0">Expires {{ .Subscriber.Attribs.coupon_expires }}.</p>
|
||||
</div>
|
||||
{{ else }}
|
||||
<div style="background:#f0fdf4;border:2px solid #86efac;border-radius:10px;padding:20px;margin:20px 0;text-align:center">
|
||||
<p style="font-size:18px;font-weight:700;color:#166534;margin:0 0 4px">We file your IFTA quarterly return for $109.</p>
|
||||
<p style="font-size:14px;color:#15803d;margin:0">Send us your miles and fuel by state - we calculate and file. No portals, no math.</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin:20px 0">
|
||||
<p style="font-size:14px;color:#374151;margin:0 0 6px"><strong>We do the math for you.</strong></p>
|
||||
<p style="font-size:13px;color:#64748b;margin:0;line-height:1.6">Send us your total miles and gallons by jurisdiction for the quarter. We calculate the tax owed for every state you ran in, prepare the return, and file it. You just review and we handle the rest - so you can get back to driving.</p>
|
||||
</div>
|
||||
<div style="text-align:center;margin:24px 0">
|
||||
<a href="{{ .Subscriber.Attribs.lp_link }}&utm_source=listmonk&utm_medium=email&utm_campaign=ifta-quarterly" style="display:inline-block;padding:14px 36px;background:#f97316;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:16px">10-4 - File My IFTA Return →</a>
|
||||
</div>
|
||||
<p style="font-size:14px;color:#64748b;line-height:1.6">Or call us directly at <a href="tel:8884110383" style="color:#f97316;font-weight:600">(888) 411-0383</a>.</p>
|
||||
<div style="text-align:center;margin:18px 0 4px;padding-top:14px;border-top:1px solid #e5e7eb">
|
||||
<p style="font-size:13px;color:#94a3b8;margin:0 0 6px">Already took care of this quarter?</p>
|
||||
<a href="{{ .Subscriber.Attribs.ifta_filed_link }}" style="font-size:13px;color:#64748b;text-decoration:underline">I already filed it - stop reminding me</a>
|
||||
</div>
|
||||
<p style="font-size:14px;color:#64748b">Performance West Inc.<br>DOT Compliance Services</p>
|
||||
</div>
|
||||
<div style="text-align:center;padding:16px;font-size:11px;color:#94a3b8"><a href="https://performancewest.net" style="color:#94a3b8">performancewest.net</a> · (888) 411-0383</div><div style="text-align:center;padding:0 16px 18px;font-size:11px;color:#94a3b8;line-height:1.7">Gotta hit a 10-100 and pull off this channel? <a href="{{ UnsubscribeURL }}" style="color:#94a3b8;text-decoration:underline">Unsubscribe here</a>.<br>Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001</div>
|
||||
</div>
|
||||
43
data/trucking_campaigns/ucr_annual_reminder.html
Normal file
43
data/trucking_campaigns/ucr_annual_reminder.html
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<div style="font-family:-apple-system,system-ui,sans-serif;max-width:600px;margin:0 auto">
|
||||
<div style="background:#1a2744;padding:24px;text-align:center;border-radius:12px 12px 0 0">
|
||||
<img src="https://performancewest.net/images/logo.png" alt="Performance West" style="height:40px">
|
||||
</div>
|
||||
<div style="background:#fff;border:1px solid #e2e8f0;padding:32px;border-radius:0 0 12px 12px">
|
||||
<p style="font-size:15px;color:#374151;line-height:1.6">{{ .Subscriber.Attribs.company }},<br>DOT# {{ .Subscriber.Attribs.dot_number }}</p>
|
||||
<h1 style="font-size:22px;color:#dc2626;margin:16px 0">{{ .Subscriber.Attribs.ucr_headline }}</h1>
|
||||
<p style="font-size:15px;color:#374151;line-height:1.6">{{ .Subscriber.Attribs.ucr_urgency }}</p>
|
||||
<p style="font-size:15px;color:#374151;line-height:1.6">Your <strong>{{ .Subscriber.Attribs.ucr_year }} Unified Carrier Registration</strong> is due by <strong>{{ .Subscriber.Attribs.ucr_due_date }}</strong>. If you run interstate, UCR is mandatory. Skip it and you face:</p>
|
||||
<ul style="font-size:15px;color:#374151;line-height:1.8">
|
||||
<li><strong>Fines from $100 to $5,000</strong> depending on the state</li>
|
||||
<li>Being <strong>placed out of service</strong> at the roadside or a weigh station</li>
|
||||
<li>Held loads and lost revenue while you sort it out</li>
|
||||
</ul>
|
||||
{{ if .Subscriber.Attribs.coupon_code }}
|
||||
<div style="background:#fff7ed;border:2px solid #f97316;border-radius:10px;padding:20px;margin:20px 0;text-align:center">
|
||||
<p style="font-size:13px;font-weight:700;color:#9a3412;letter-spacing:.04em;margin:0 0 6px">TODAY ONLY - {{ .Subscriber.Attribs.coupon_pct }}% OFF</p>
|
||||
<p style="font-size:18px;font-weight:700;color:#9a3412;margin:0 0 4px">We file your UCR for <span style="text-decoration:line-through;color:#c2410c;font-weight:600">$39</span> <span style="color:#15803d">$23</span> + the state fee.</p>
|
||||
<p style="font-size:14px;color:#9a3412;margin:0 0 4px">Use code <strong style="font-size:16px;letter-spacing:.08em">{{ .Subscriber.Attribs.coupon_code }}</strong> at checkout.</p>
|
||||
<p style="font-size:12px;color:#b91c1c;font-weight:700;margin:0">Expires {{ .Subscriber.Attribs.coupon_expires }}.</p>
|
||||
</div>
|
||||
{{ else }}
|
||||
<div style="background:#f0fdf4;border:2px solid #86efac;border-radius:10px;padding:20px;margin:20px 0;text-align:center">
|
||||
<p style="font-size:18px;font-weight:700;color:#166534;margin:0 0 4px">We file your UCR for $39 + the state fee.</p>
|
||||
<p style="font-size:14px;color:#15803d;margin:0">Two minutes of your time, we handle the rest. No portals, no guesswork on your fee tier.</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin:20px 0">
|
||||
<p style="font-size:14px;color:#374151;margin:0 0 6px"><strong>We figure out your exact fee tier.</strong></p>
|
||||
<p style="font-size:13px;color:#64748b;margin:0;line-height:1.6">UCR fees are based on your fleet size, and getting the tier wrong causes rejections and delays. Tell us your power-unit count and we file it correctly the first time, so you stay legal and on the road.</p>
|
||||
</div>
|
||||
<div style="text-align:center;margin:24px 0">
|
||||
<a href="{{ .Subscriber.Attribs.lp_link }}&utm_source=listmonk&utm_medium=email&utm_campaign=ucr-annual" style="display:inline-block;padding:14px 36px;background:#f97316;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:16px">10-4 - File My UCR Now →</a>
|
||||
</div>
|
||||
<p style="font-size:14px;color:#64748b;line-height:1.6">Or call us directly at <a href="tel:8884110383" style="color:#f97316;font-weight:600">(888) 411-0383</a>.</p>
|
||||
<div style="text-align:center;margin:18px 0 4px;padding-top:14px;border-top:1px solid #e5e7eb">
|
||||
<p style="font-size:13px;color:#94a3b8;margin:0 0 6px">Already registered for this year?</p>
|
||||
<a href="{{ .Subscriber.Attribs.filed_link }}" style="font-size:13px;color:#64748b;text-decoration:underline">I already did it - stop reminding me</a>
|
||||
</div>
|
||||
<p style="font-size:14px;color:#64748b">Performance West Inc.<br>DOT Compliance Services</p>
|
||||
</div>
|
||||
<div style="text-align:center;padding:16px;font-size:11px;color:#94a3b8"><a href="https://performancewest.net" style="color:#94a3b8">performancewest.net</a> · (888) 411-0383</div><div style="text-align:center;padding:0 16px 18px;font-size:11px;color:#94a3b8;line-height:1.7">Gotta hit a 10-100 and pull off this channel? <a href="{{ UnsubscribeURL }}" style="color:#94a3b8;text-decoration:underline">Unsubscribe here</a>.<br>Performance West Inc. · 525 Randall Ave Ste 100-1195, Cheyenne, WY 82001</div>
|
||||
</div>
|
||||
65
deploy.sh
65
deploy.sh
|
|
@ -6,7 +6,14 @@
|
|||
# ./deploy.sh erpnext (rebuild + migrate ERPNext, re-extract assets)
|
||||
# ./deploy.sh api workers (rebuild a custom set)
|
||||
set -euo pipefail
|
||||
cd /opt/performancewest
|
||||
# cd to this script's own directory so the deploy operates on the clone it lives
|
||||
# in. Previously this was hardcoded `cd /opt/performancewest`, which meant
|
||||
# running /opt/performancewest-dev/deploy.sh silently rebuilt PROD instead of
|
||||
# dev (the dev script is an identical copy). Resolving the real path makes the
|
||||
# same script correct in every clone; docker compose then derives the project
|
||||
# name + auto-loads docker-compose.override.yml from this directory, so dev
|
||||
# (project performancewest-dev, dev port remaps) and prod stay isolated.
|
||||
cd "$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
|
||||
|
||||
SERVICES="${@:-site api workers proxy-relay listmonk-hc}"
|
||||
|
||||
|
|
@ -21,7 +28,28 @@ SERVICES="${@:-site api workers proxy-relay listmonk-hc}"
|
|||
BUILD_SERVICES="$(echo "$SERVICES" | tr ' ' '\n' | grep -vE '^(proxy-relay|listmonk-hc)$' | tr '\n' ' ')"
|
||||
|
||||
echo "=== Pulling latest from git ==="
|
||||
git pull origin main
|
||||
# deploy steps below (sync_nav.py, gen-service-catalog.py) rewrite generated
|
||||
# files under site/public + site/src in place, leaving the tree dirty. That dirty
|
||||
# tree makes `git pull` abort ("local changes would be overwritten"), silently
|
||||
# stranding new commits on an old checkout. Discard those generated changes first
|
||||
# so the pull always fast-forwards. (Only generated paths are reset.)
|
||||
git checkout -- site/public site/src 2>/dev/null || true
|
||||
git fetch origin main
|
||||
# Hard-reset the tracked tree to origin/main: the deploy box is a pure mirror of
|
||||
# origin (all real changes land via git), so any other tracked-file drift is also
|
||||
# generated/stale and must not be allowed to abort the pull. Untracked files
|
||||
# (data/*, .secrets/) are preserved. This makes "stranded on an old commit"
|
||||
# impossible — the previous `git pull` could silently abort, this cannot.
|
||||
git reset --hard origin/main
|
||||
# Assert we actually advanced to the just-fetched origin tip; fail LOUDLY (not
|
||||
# masked by a `| tail` in the caller) if somehow we did not.
|
||||
LOCAL_HEAD="$(git rev-parse HEAD)"
|
||||
ORIGIN_HEAD="$(git rev-parse origin/main)"
|
||||
if [ "$LOCAL_HEAD" != "$ORIGIN_HEAD" ]; then
|
||||
echo "FATAL: working tree is at $LOCAL_HEAD but origin/main is $ORIGIN_HEAD — deploy aborting." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "Deploying commit $LOCAL_HEAD"
|
||||
|
||||
# Single source of truth for the site header: rewrite every static page's
|
||||
# <nav> block from site/src/partials/nav.html so the Services dropdown stays
|
||||
|
|
@ -31,6 +59,39 @@ echo ""
|
|||
echo "=== Syncing canonical site header (Services dropdown) ==="
|
||||
python3 scripts/sync_nav.py
|
||||
|
||||
# Single source of truth for service pricing: the API catalog
|
||||
# (api/src/service-catalog.ts) is the authority (it is what checkout charges).
|
||||
# The site build context is ./site only and cannot read ../api, so we generate
|
||||
# site/src/lib/service-catalog.generated.ts here on the host before the docker
|
||||
# build. This guarantees displayed prices == charged prices. (Python because the
|
||||
# prod box has python3 but not node; matches scripts/sync_nav.py.)
|
||||
echo ""
|
||||
echo "=== Generating site service catalog from API source ==="
|
||||
python3 scripts/gen-service-catalog.py
|
||||
python3 scripts/check-service-catalog-drift.py
|
||||
|
||||
# Render the Alertmanager config from its template. Alertmanager does NOT expand
|
||||
# ${ENV} placeholders in its YAML, so the raw template (with ${TELEGRAM_BOT_TOKEN}
|
||||
# / ${TELEGRAM_CHAT_ID}) crash-loops it ("cannot unmarshal !!str `${TELEG...`").
|
||||
# We substitute the real values here from .env at deploy time. Only those two
|
||||
# vars are expanded so Alertmanager's own {{ }} Go-template message is untouched.
|
||||
# NB: we extract just these two keys (not `source .env`) because .env holds values
|
||||
# with shell-hostile chars (e.g. SMTP_PASS) that break `. ./.env`.
|
||||
echo ""
|
||||
echo "=== Rendering monitoring/alertmanager.yml from template ==="
|
||||
if [ -f monitoring/alertmanager.yml.template ]; then
|
||||
get_env() { sed -n "s/^$1=//p" .env | head -n1; }
|
||||
TELEGRAM_BOT_TOKEN="$(get_env TELEGRAM_BOT_TOKEN)"
|
||||
TELEGRAM_CHAT_ID="$(get_env TELEGRAM_CHAT_ID)"
|
||||
export TELEGRAM_BOT_TOKEN TELEGRAM_CHAT_ID
|
||||
envsubst '${TELEGRAM_BOT_TOKEN} ${TELEGRAM_CHAT_ID}' \
|
||||
< monitoring/alertmanager.yml.template > monitoring/alertmanager.yml
|
||||
if grep -q '\${TELEGRAM' monitoring/alertmanager.yml \
|
||||
|| [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ]; then
|
||||
echo "WARN: TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID missing in .env; Alertmanager will crash-loop." >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Building: $SERVICES ==="
|
||||
# ERPNext bakes the custom Frappe apps into its image, so they must be staged
|
||||
|
|
|
|||
|
|
@ -119,7 +119,20 @@ services:
|
|||
- OPS_IMAP_PORT=${OPS_IMAP_PORT:-993}
|
||||
- OPS_IMAP_USER=${OPS_IMAP_USER}
|
||||
- OPS_IMAP_PASS=${OPS_IMAP_PASS}
|
||||
# DMARC aggregate-report ingestion mailbox (scripts.dmarc_report_parser)
|
||||
- DMARC_IMAP_HOST=${DMARC_IMAP_HOST:-mail.performancewest.net}
|
||||
- DMARC_IMAP_PORT=${DMARC_IMAP_PORT:-993}
|
||||
- DMARC_IMAP_USER=${DMARC_IMAP_USER:-dmarc@performancewest.net}
|
||||
- DMARC_IMAP_PASS=${DMARC_IMAP_PASS}
|
||||
- FROM_EMAIL=Performance West <noreply@performancewest.net>
|
||||
# Cold-campaign operator exclusion (scripts.build_trucking_campaigns).
|
||||
# After the Jun 2026 no-DKIM incident (campaign mail went out unsigned and
|
||||
# was junked/blocked) DKIM is fixed, so we re-send to the whole now-signed
|
||||
# audience but still hold Google's consumer inboxes back while their
|
||||
# reputation recovers. Empty list ("") => exclude nobody; unset => default
|
||||
# warmup exclusion (Google+Microsoft+consumer MX). Microsoft/Hotmail and the
|
||||
# long tail are intentionally INCLUDED here.
|
||||
- MAIN_EXCLUDE_OPERATORS=google
|
||||
- CRYPTO_SWEEP_ADMIN_EMAIL=${ADMIN_EMAIL:-ops@performancewest.net}
|
||||
- USAC_USERNAME=${USAC_USERNAME}
|
||||
- USAC_PASSWORD=${USAC_PASSWORD}
|
||||
|
|
@ -183,6 +196,14 @@ services:
|
|||
# shows "Link invalid" and the portal Compliance section is empty.
|
||||
- CUSTOMER_JWT_SECRET=${CUSTOMER_JWT_SECRET}
|
||||
- DATABASE_URL=postgresql://pw:${DB_PASSWORD:-pw_dev_2026}@api-postgres:5432/performancewest
|
||||
# Outgoing mail: the "Performance West Outgoing" Email Account password is
|
||||
# reconciled from these on `bench migrate` (after_migrate hook), so the
|
||||
# account can never be left with awaiting_password=1 / empty password.
|
||||
- SMTP_HOST=${SMTP_HOST}
|
||||
- SMTP_PORT=${SMTP_PORT}
|
||||
- SMTP_USER=${SMTP_USER}
|
||||
- SMTP_PASS=${SMTP_PASS}
|
||||
- SMTP_FROM=${SMTP_FROM}
|
||||
volumes:
|
||||
- erpnext-frappe-public:/home/frappe/frappe-bench/apps/frappe/frappe/public
|
||||
- erpnext-erpnext-public:/home/frappe/frappe-bench/apps/erpnext/erpnext/public
|
||||
|
|
@ -219,6 +240,14 @@ services:
|
|||
- REDIS_CACHE=redis://erpnext-redis:6379/0
|
||||
- REDIS_QUEUE=redis://erpnext-redis:6379/1
|
||||
- REDIS_SOCKETIO=redis://erpnext-redis:6379/2
|
||||
# Daily scheduler self-heals the outgoing Email Account password from these
|
||||
# (email_account_sync.sync_outgoing_password), covering drift from
|
||||
# out-of-band restarts / DB restores.
|
||||
- SMTP_HOST=${SMTP_HOST}
|
||||
- SMTP_PORT=${SMTP_PORT}
|
||||
- SMTP_USER=${SMTP_USER}
|
||||
- SMTP_PASS=${SMTP_PASS}
|
||||
- SMTP_FROM=${SMTP_FROM}
|
||||
depends_on:
|
||||
- erpnext-mariadb
|
||||
- erpnext-redis
|
||||
|
|
@ -284,6 +313,11 @@ services:
|
|||
|
||||
listmonk:
|
||||
image: listmonk/listmonk:latest
|
||||
# Stable hostname so the Message-ID Listmonk derives from the container OS
|
||||
# hostname is perfwest.performancewest.net, NOT the random docker container
|
||||
# id -> @localhost.localdomain (a spam-score signal; see deliverability
|
||||
# runbook). Matches Listmonk's SMTP hello_hostname.
|
||||
hostname: perfwest.performancewest.net
|
||||
ports:
|
||||
- "9100:9000"
|
||||
environment:
|
||||
|
|
@ -319,6 +353,9 @@ services:
|
|||
# mynetworks 172.16/12). host.docker.internal is mapped for convenience.
|
||||
listmonk-hc:
|
||||
image: listmonk/listmonk:latest
|
||||
# Stable hostname -> Message-ID @perfwest.performancewest.net, not the random
|
||||
# container id -> @localhost.localdomain (spam-score signal). See listmonk above.
|
||||
hostname: perfwest.performancewest.net
|
||||
ports:
|
||||
- "9101:9000"
|
||||
extra_hosts:
|
||||
|
|
|
|||
BIN
docs/CMS-10114 Form.pdf
Normal file
BIN
docs/CMS-10114 Form.pdf
Normal file
Binary file not shown.
BIN
docs/CMS-116 Form.pdf
Normal file
BIN
docs/CMS-116 Form.pdf
Normal file
Binary file not shown.
BIN
docs/MCR Revalidaton Acceptance Letter_05 01 2026.pdf
Normal file
BIN
docs/MCR Revalidaton Acceptance Letter_05 01 2026.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
docs/SC COC Form.pdf
Normal file
BIN
docs/SC COC Form.pdf
Normal file
Binary file not shown.
30
docs/TODO.md
Normal file
30
docs/TODO.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
# Performance West — TODO / Backlog
|
||||
|
||||
## Analytics / Umami
|
||||
- [x] **Fix Umami Goals and Funnels "Something went wrong"** — RESOLVED 2026-06-13.
|
||||
Root cause: the saved Goal and Funnel reports were created in an older umami
|
||||
version and stored `parameters` in a pre-v3.1.0 shape. umami 3.1.0's
|
||||
funnelReportSchema / goalReportSchema reject the old shape (HTTP 400 ->
|
||||
client shows "Something went wrong").
|
||||
- Funnel old: {urls:[...], window, dateRange:{startDate,endDate}}
|
||||
v3.1.0 needs: {startDate, endDate, window, steps:[{type:'path',value,filters:[]}]}
|
||||
- Goal old: {dateRange:{...}} (no type/value)
|
||||
v3.1.0 needs: {startDate, endDate, type, value}
|
||||
Fix: migrated the two saved reports in the umami DB to the v3.1.0 schema
|
||||
(urls->steps, lifted dateRange to top-level dates, set goal type=url/value).
|
||||
Verified: the funnel route now returns 401 (auth-gated, schema valid) instead
|
||||
of 400; underlying data exists (3,195 -> 86 on the compliance funnel paths).
|
||||
NOTE: running v3.1.0 = latest; the "Failed to find Server Action ... older/
|
||||
newer deployment" log lines are unrelated stale-browser-cache noise.
|
||||
|
||||
## Analytics / Umami — Goals & Funnels coverage (2026-06-13)
|
||||
- [x] **Added Goals + Funnels for DOT/Trucking, CRTC, and Healthcare/NPI** (previously
|
||||
only FCC was tracked). Created in the umami DB with the v3.1.0 schema:
|
||||
Funnels: DOT/Trucking (/tools/dot-compliance-check -> /order/dot-compliance),
|
||||
CRTC/Canada (/services/telecom/canada-crtc -> /order/canada-crtc),
|
||||
Healthcare/NPI (/tools/npi-compliance-check -> /order/npi-revalidation).
|
||||
Goals: DOT (/order/dot-compliance), CRTC (/order/canada-crtc),
|
||||
Healthcare (/order/oig-sam-screening).
|
||||
Paths chosen from real 45-day traffic (CRTC 701 + 285 order, DOT 616 + 320 order).
|
||||
All pass v3.1.0 schema validation. Tune the exact goal/funnel paths in the UI
|
||||
as needed.
|
||||
|
|
@ -106,8 +106,8 @@ ERPNext custom Frappe apps (baked into `performancewest-erpnext:latest`):
|
|||
│ │ Office 365 Word (COM automation) │ │
|
||||
│ │ Python 3.13 + pywin32 + minio SDK │ │
|
||||
│ │ docserver_worker.py (MinIO poller, 12s interval) │ │
|
||||
│ │ Task Scheduler: PW-DocserverWorker (AtLogOn) │ │
|
||||
│ │ Auto-logon configured (requires RDP after cold reboot) │ │
|
||||
│ │ Task Scheduler: PW-DocserverWorker (AtStartup + 5-min) │ │
|
||||
│ │ Self-healing: restart-on-fail + MinIO-retry (no RDP) │ │
|
||||
│ │ Private network: 10.4.20.247 → MinIO via nginx │ │
|
||||
│ └──────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
|
|
@ -284,6 +284,10 @@ Workers: upload DOCX to minio://performancewest/to-convert/{uuid}.docx
|
|||
|
||||
- **Heartbeat:** DocServer writes `docserver-heartbeat.json` to MinIO every 60 seconds
|
||||
- **Fallback:** If heartbeat is stale (>5 min), workers auto-switch to LibreOffice headless
|
||||
- **Self-healing:** the worker retries MinIO with backoff instead of exiting on an
|
||||
outage; the `PW-DocserverWorker` task restarts on failure (99×/1 min) and has a
|
||||
5-min repeating trigger, so a crash/missed boot self-recovers without RDP. See
|
||||
`docserver/README.md`.
|
||||
|
||||
## Boot Sequence
|
||||
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@
|
|||
<rect x="487" y="524" width="72" height="18" rx="3" fill="#fed7aa" stroke="#f97316"/>
|
||||
<text x="523" y="537" text-anchor="middle" font-size="8" fill="#9a3412">Anytime MB</text>
|
||||
<rect x="564" y="524" width="72" height="18" rx="3" fill="#e0f2fe" stroke="#7dd3fc"/>
|
||||
<text x="600" y="537" text-anchor="middle" font-size="8" fill="#0c4a6e">SMTP2GO</text>
|
||||
<text x="600" y="537" text-anchor="middle" font-size="8" fill="#0c4a6e">Local MTA</text>
|
||||
<rect x="641" y="524" width="72" height="18" rx="3" fill="#f1f5f9" stroke="#cbd5e1"/>
|
||||
<text x="677" y="537" text-anchor="middle" font-size="8" fill="#475569">TronGrid</text>
|
||||
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
|
@ -0,0 +1,37 @@
|
|||
# CommLaw Page Re-Check — 2026-06-13
|
||||
|
||||
Re-checked the archived CommLaw "deficiency-warning" attack page against the
|
||||
current live version, and captured a newly-published related article.
|
||||
|
||||
## 1. Original attack article — UNCHANGED
|
||||
"WARNING: Do Not Let Automated FCC 'Deficiency' Solicitations Create New
|
||||
Compliance Risk" (deficiency-warning/) is still live and **byte-for-byte
|
||||
identical** in article body/title to the May 20, 2026 archive (8,732 chars of
|
||||
extracted article text match exactly). The only page differences are the
|
||||
dynamic "recent posts" sidebar. CommLaw did NOT edit or soften the attack page.
|
||||
|
||||
## 2. NEW article published — names Performance West (captured here)
|
||||
"Setting the Record Straight: Accuracy, Accountability, and Professional
|
||||
Judgment in AI-Assisted Telecom Compliance" — by Managing Partner
|
||||
Jonathan S. Marashlian.
|
||||
URL: https://commlawgroup.com/2026/setting-the-record-straight-accuracy-accountability-and-professional-judgment-in-ai-assisted-telecom-compliance/
|
||||
Saved: record-straight-may2026/page.html + article.md
|
||||
|
||||
Key points (favorable / relevant to PW):
|
||||
- References a controversy in a 3rd-party publication, **Prescott-Martini's
|
||||
weekly "Martini Brief"**, that named The CommLaw Group AND Performance West.
|
||||
- The Martini Brief alleged CommLaw scraped the FCC RMD, harvested emails, and
|
||||
mass-emailed the entire RMD list. CommLaw calls these allegations "false" and
|
||||
says it only emailed its own Client Advisory list.
|
||||
- CommLaw states **Prescott-Martini published a retraction/correction**
|
||||
acknowledging it had not independently verified the allegations, and withdrew
|
||||
the "legacy / technologically backward law firm" characterization. CommLaw
|
||||
links to "Retraction and CommLaw Group Response."
|
||||
- This piece is measured and does NOT directly attack/defame Performance West;
|
||||
it reframes the dispute as "responsible AI adoption" + general "be cautious
|
||||
with automated compliance tools" cautioning.
|
||||
|
||||
## To do / follow up
|
||||
- Obtain the **Prescott-Martini retraction** (linked from the CommLaw article)
|
||||
for the file — it is a third-party retraction in this same dispute.
|
||||
- Keep monitoring; the original attack page remains live (evidence intact).
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
117
docs/billing.md
117
docs/billing.md
|
|
@ -1,6 +1,20 @@
|
|||
# Billing & Payments Architecture
|
||||
|
||||
**Last updated:** 2026-04-05
|
||||
**Last updated:** 2026-06-18
|
||||
|
||||
> ⚠️ **Reality check (2026-06):** Large parts of this doc describe a *planned*
|
||||
> "ERPNext owns all billing via Adyen" architecture that is **NOT live**. What is
|
||||
> actually wired today:
|
||||
> - **Live payment rail = Stripe Checkout** (card + ACH), plus **PayPal** (direct
|
||||
> Orders v2) and **crypto** (SHKeeper) — all in `api/src/routes/checkout.ts`.
|
||||
> **Klarna** runs via Stripe.
|
||||
> - **Adyen is NOT integrated** (account approval never completed). The
|
||||
> `Adyen-*` gateway names below are aspirational labels, not active gateways.
|
||||
> - **Recurring billing = Stripe Subscriptions** (see "Stripe-native
|
||||
> Subscriptions"), the only recurring billing actually shipping, used by
|
||||
> `oig-sam-screening` ($79/mo). ERPNext `createSubscription()` is unused.
|
||||
> ERPNext is still the system of record for invoices/accounting, but it is **not**
|
||||
> the payment gateway. Treat Adyen/ERPNext-gateway sections as future plan.
|
||||
|
||||
## Principle: ERPNext Owns All Billing
|
||||
|
||||
|
|
@ -138,14 +152,111 @@ Sales Invoice:
|
|||
```
|
||||
|
||||
### Recurring Services (Subscriptions)
|
||||
ERPNext Subscription DocType handles:
|
||||
|
||||
> **Status:** the only recurring billing actually wired today is **Stripe-native
|
||||
> Subscriptions** (see next section), used by `oig-sam-screening` ($79/mo). The
|
||||
> ERPNext-Subscription / Adyen model below is **planned, not yet live** — Adyen
|
||||
> is not integrated and ERPNext `createSubscription()` is currently unused. The
|
||||
> services listed here are aspirational pricing, not active subscriptions.
|
||||
|
||||
ERPNext Subscription DocType is intended to handle (NOT YET LIVE):
|
||||
- Registered Agent: $99/year per state (Wyoming: $49/year)
|
||||
- Annual Report Filing: $99/year per state
|
||||
- Canada CRTC Annual Maintenance: $349/year
|
||||
- US Formation Maintenance Bundle: $179/year (annual report + RA renewal)
|
||||
- CA Formation Maintenance Bundle: $179/year (annual return + AMB/RA renewal)
|
||||
|
||||
Subscriptions auto-generate invoices. Payment collected via Adyen (saved payment method) or manual payment link.
|
||||
When built, subscriptions would auto-generate invoices (payment via a saved
|
||||
payment method or manual payment link).
|
||||
|
||||
### Stripe-native Subscriptions (healthcare monitoring)
|
||||
|
||||
Some compliance services are sold as **Stripe Subscriptions** (the billing engine
|
||||
is Stripe, not ERPNext). A service opts in via the catalog
|
||||
(`api/src/service-catalog.ts`):
|
||||
|
||||
```ts
|
||||
"oig-sam-screening": {
|
||||
name: "OIG/SAM Exclusion Screening (Monthly Monitoring)",
|
||||
price_cents: 7900, // $79/month
|
||||
billing_interval: "month", // -> checkout builds mode:"subscription"
|
||||
allowed_methods: ["card", "ach"], // recurring needs off-session-capable rails
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Flow:
|
||||
1. `checkout.ts` sees `billing_interval` -> creates a `mode:"subscription"`
|
||||
Checkout Session with recurring `price_data`. The gateway surcharge is
|
||||
**absorbed** (a subscription can't carry a one-time surcharge line) so the
|
||||
customer is billed a clean `$79/month`.
|
||||
2. `allowed_methods` filters the picker in `PaymentStep.astro` (PayPal/Klarna/
|
||||
crypto are one-time only and disappear) and is **re-validated server-side**
|
||||
in `checkout.ts` (`METHOD_NOT_ALLOWED`).
|
||||
3. `webhooks.ts` handles the subscription lifecycle:
|
||||
- `checkout.session.completed` (mode=subscription) -> records
|
||||
`compliance_orders.stripe_subscription_id`, then first fulfillment.
|
||||
- `invoice.paid` with `billing_reason=subscription_cycle` -> re-dispatches the
|
||||
service handler (`recurring_cycle:true`) to re-run the screening + deliver a
|
||||
fresh dated certificate. (The first invoice is skipped here — already handled
|
||||
by `checkout.session.completed`.)
|
||||
- `invoice.payment_failed` -> admin alert + first-failure customer nudge.
|
||||
- `customer.subscription.deleted` -> order marked `cancelled`, fulfillment stops.
|
||||
|
||||
**Stripe webhook events (ENABLED on the live prod endpoint** `we_1THBjyB46qMvF2jnYyN8IfkK`
|
||||
= `https://api.performancewest.net/api/v1/webhooks/stripe`**):**
|
||||
The 6 currently enabled events are `checkout.session.completed`,
|
||||
`payment_intent.succeeded`, `payment_intent.payment_failed`, plus the three
|
||||
subscription-lifecycle events added 2026-06-18:
|
||||
- `invoice.paid`
|
||||
- `invoice.payment_failed`
|
||||
- `customer.subscription.deleted`
|
||||
|
||||
Without these three the monthly cycles would charge but never fulfill/alert.
|
||||
(Note: the code also *handles* `charge.dispute.created` and `balance.available`
|
||||
but those are NOT yet enabled on the endpoint — enable them if/when needed.)
|
||||
|
||||
To add events without clobbering existing ones, read `enabled_events`, union,
|
||||
and PUT the union back via `POST /v1/webhook_endpoints/{id}` with repeated
|
||||
`enabled_events[]=` params (re-running is idempotent).
|
||||
|
||||
> **API-version caveat (important):** this endpoint has **no pinned
|
||||
> `api_version`**, so it follows the Stripe *account default* (currently
|
||||
> `2024-12-18.acacia`), NOT the `2026-03-25.dahlia` the SDK is pinned to. In
|
||||
> acacia the subscription link is the **top-level `invoice.subscription`**; in
|
||||
> dahlia it moved to `invoice.parent.subscription_details.subscription`.
|
||||
> `invoiceSubscriptionId()` in `webhooks.ts` reads **both** shapes so renewals
|
||||
> map back to the order regardless. If you ever pin the endpoint to dahlia, the
|
||||
> handler still works; do NOT remove the legacy fallback while the endpoint is
|
||||
> unpinned.
|
||||
|
||||
The `provider-compliance-bundle` ($899/yr) includes **only the first** OIG/SAM
|
||||
screening; customers are converted to the $79/mo monitoring subscription after
|
||||
that first cycle (the standalone $948/yr of monitoring is no longer given away
|
||||
inside the bundle).
|
||||
|
||||
**Validation status (2026-06-18):**
|
||||
- ✅ *Checkout half — proven against LIVE Stripe.* A dry-run created a real
|
||||
`mode:subscription` Checkout Session with the exact production params
|
||||
(recurring `price_data`, `unit_amount=7900`, `recurring.interval=month`,
|
||||
`card`+`us_bank_account`, metadata) — Stripe returned `amount_total=7900`,
|
||||
`type=recurring`, then the session was immediately **expired** (creating a
|
||||
session never charges anyone; only a completed hosted page does). Net effect
|
||||
on prod: zero.
|
||||
- ✅ *Webhook subscription-id extraction* — `invoiceSubscriptionId()` unit tests
|
||||
(31 in `api/tests/recurring-subscription.test.ts`) cover acacia (top-level)
|
||||
AND dahlia (nested) invoice shapes, renewal-cycle gating, surcharge
|
||||
suppression, recurring line-item build.
|
||||
- ✅ *Worker renewal fulfillment* — `scripts/workers/services/test_npi_recurring.py`
|
||||
(13 assertions) runs the real handler and asserts the `[Monthly cycle]` /
|
||||
re-screen behaviour; passes locally + in the deployed workers container.
|
||||
- ⏳ *Full end-to-end with a Stripe test clock* — NOT yet run. Requires
|
||||
`STRIPE_TEST_SECRET_KEY` / `STRIPE_TEST_WEBHOOK_SECRET` in the server `.env`
|
||||
(currently unset; prod is `NODE_ENV=production`). Once those exist: place a
|
||||
test-card subscription, advance a billing cycle via a test clock, and confirm
|
||||
the live `invoice.paid` (subscription_cycle) re-dispatches the screening
|
||||
worker and a fresh certificate is issued. This is the last gap before a real
|
||||
recurring charge should be marketed.
|
||||
|
||||
### Formation Maintenance Bundles
|
||||
|
||||
|
|
|
|||
120
docs/campaign-deliverability-plan.md
Normal file
120
docs/campaign-deliverability-plan.md
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
# Campaign Deliverability — Diagnosis & List-Verification Plan
|
||||
|
||||
_Created 2026-06-17 after trucking conversions went to zero._
|
||||
|
||||
## TL;DR
|
||||
|
||||
Trucking conversions stopped on **June 9** not because campaigns stopped sending
|
||||
(they send ~2,400/day with ~1,800 opens/3 days) but because a **filter bug was
|
||||
blasting ~438k dead `mx_unreachable` domains**, producing a **~47% hard-bounce
|
||||
rate (~1,100/day)** that blocklisted **half the 120k subscriber base** and
|
||||
torched sender reputation, so real prospects never saw the offer.
|
||||
|
||||
- **Fixed** (`build_trucking_campaigns.py`): send filter now keys only off
|
||||
`email_verify_result` (never the broken `email_verified` boolean), and defaults
|
||||
to **recovery mode = `smtp_valid` only** until reputation recovers. Set
|
||||
`CAMPAIGN_INCLUDE_CATCH_ALL=1` to re-add catch-all domains afterward.
|
||||
- **Healthcare is fine** — separate instance (`listmonk-hc` / DB `listmonk_hc`),
|
||||
cleaned list (`clean_hc_warmup_list.py` already drops `mx_unreachable`), bounce
|
||||
rate ~2-3%. No change needed; it proves the fix is correct.
|
||||
|
||||
## Why the SMTP-probe verification under-counts deliverable addresses
|
||||
|
||||
`email_verifier.py` does syntax → MX → SMTP `RCPT TO`. Results:
|
||||
|
||||
| result | count | sendable? | why |
|
||||
|---|---|---|---|
|
||||
| `catch_all_domain` | 1,082,817 | risky | domain accepts ALL rcpts at SMTP time, then may bounce later |
|
||||
| `mx_unreachable` | 438,163 | **NO** | MX exists but never answered the probe — **hard-bounces on real send** |
|
||||
| `smtp_valid` | 11,774 | **YES** | an MX explicitly accepted this exact mailbox |
|
||||
| `no_mx_records` / `invalid_syntax` / `smtp_rejected_550` | ~46k | no | dead |
|
||||
|
||||
The probe can only *confirm* a mailbox on non-catch-all domains that answer the
|
||||
RCPT handshake — which is a small slice. Only **~3,042 `smtp_valid` are still
|
||||
unsent**, so recovery mode will exhaust the clean pool in ~1 day. **We need a way
|
||||
to grow the verified-deliverable list without burning PW's reputation.**
|
||||
|
||||
## The real fix: burner-domain bounce verification
|
||||
|
||||
SMTP-probe verification is unreliable (catch-alls mask validity; many MTAs refuse
|
||||
probes but accept real mail). The only ground truth is **actually send a message
|
||||
and see if it bounces.** But doing that from PW's domain is what got us here. So:
|
||||
|
||||
### Design
|
||||
|
||||
1. **Dedicated throwaway verification domain** (NOT performancewest.net and NOT
|
||||
carrierone.com — both are reputation assets we must protect). Register a cheap
|
||||
neutral `.com` via Porkbun (we already have the Porkbun integration). Give it
|
||||
its own SPF/DKIM/DMARC and a dedicated sending IP/identity (separate postfix
|
||||
instance or a transactional provider sub-account that isolates reputation).
|
||||
|
||||
2. **Send a low-key, CAN-SPAM-compliant, non-commercial verification email** to
|
||||
the unverified pool (e.g. a plain "is this the right contact for <DOT#>?" or a
|
||||
bland newsletter-style note with a working unsubscribe). It must be a real,
|
||||
legitimate message — never deceptive — but its ONLY purpose is to elicit a
|
||||
delivered-vs-bounced signal. Throttled and warmed like any send.
|
||||
|
||||
3. **Catch bounces from that domain's own MTA log** (reuse `bounce-watcher.sh`'s
|
||||
`status=bounced` tail pattern) and **write the result back to
|
||||
`fmcsa_carriers.email_verify_result`**:
|
||||
- delivered (no bounce within N hours) → upgrade to a new `send_confirmed`
|
||||
result that the PW campaign filter treats as sendable.
|
||||
- hard-bounced → mark `hard_bounced`, permanently excluded from PW sends.
|
||||
|
||||
4. **PW campaigns then send only to `smtp_valid` + `send_confirmed`** — addresses
|
||||
proven deliverable by a real send — keeping PW's bounce rate near zero.
|
||||
|
||||
### Why a separate domain/IP
|
||||
|
||||
Reputation is per sending-domain + per-IP. If the burner domain gets blocklisted
|
||||
from the inevitable bounces during scrubbing, **PW and carrierone are untouched.**
|
||||
The burner is disposable: if it burns, rotate to a new one. PW only ever sends to
|
||||
the cleaned output.
|
||||
|
||||
### Compliance guardrails (must-haves)
|
||||
|
||||
- Real **CAN-SPAM** compliance: truthful from/subject, physical address, working
|
||||
one-click unsubscribe, honor opt-outs immediately (sync opt-outs back to PW's
|
||||
suppression list too).
|
||||
- **Not deceptive**: the email is a genuine message (these are public FMCSA
|
||||
business contacts for B2B outreach), not a fake/pretext. The bounce signal is a
|
||||
byproduct, not a trick.
|
||||
- Suppress anyone who ever bounced or opted out from ALL future sends (burner and
|
||||
PW).
|
||||
|
||||
## Status / next steps
|
||||
|
||||
- [x] Fix the PW trucking send filter (drop `mx_unreachable`; recovery mode).
|
||||
- [x] Confirm healthcare unaffected.
|
||||
- [x] Add `send_confirmed` / `hard_bounced` result handling to the campaign
|
||||
filter + a writeback path from bounce processing (`burner_list_verify.py`).
|
||||
- [x] **Catch-all auto-rollout instead of the burner domain (2026-06-18).** After
|
||||
the DKIM signing fix landed, a root-cause classification of the 75k
|
||||
pre-fix bounces showed the damage was ~55% reputation/auth (which DKIM
|
||||
fixes) and only ~29% genuinely-dead mailboxes. The catch-all pool accepts
|
||||
at RCPT time by definition, so it does not user-unknown bounce at send
|
||||
time -- it is far safer to bleed directly in warmed batches than to stand
|
||||
up + warm a whole separate burner domain/IP/SPF/DKIM identity. So the
|
||||
catch-all pool is now gated by an **automatic in-house rollout** in
|
||||
`build_trucking_campaigns.py` (`catch_all_enabled()`):
|
||||
- enables only when `warmup_day() >= CAMPAIGN_CATCH_ALL_MIN_DAY` (21)
|
||||
AND the **recent** (2-day) live campaign bounce rate is below
|
||||
`CAMPAIGN_CATCH_ALL_MAX_BOUNCE_PCT` (8%) on a trustworthy sample
|
||||
(>= 300 sent);
|
||||
- **auto-reverts** to the clean `smtp_valid`/`send_confirmed` pool on the
|
||||
next run if bounces spike back above the ceiling;
|
||||
- a deliberately SHORT window so a past disaster (the Jun-16 ~45% 7-day
|
||||
rate) cannot block the rollout forever, and a fresh spike trips it fast;
|
||||
- `CAMPAIGN_INCLUDE_CATCH_ALL=1/0` still hard-overrides the auto decision.
|
||||
Applied uniformly to trucking + IFTA + UCR builders (`tc.usable_filter()`).
|
||||
The bounce-watcher continues to auto-suppress any individual hard bounces
|
||||
in real time, so PW's own bounce rate stays bounded during the rollout.
|
||||
- [ ] ~~Stand up the burner verification domain + isolated MTA identity.~~
|
||||
**Dropped** -- superseded by the catch-all auto-rollout above (the burner
|
||||
was a panic-era design from before the DKIM fix + per-subscriber bounce
|
||||
tracking made an in-house controlled rollout safe). The `mx_probe_blocked`
|
||||
consumer-ISP pool (438k, highest dead-mailbox risk) is the only case where
|
||||
a burner would still help; revisit only if that pool is ever needed.
|
||||
- [x] ~~Build the verification-send + bounce-writeback worker.~~ Not needed for
|
||||
catch-all (see above). `burner_list_verify.py` remains available if the
|
||||
`mx_probe_blocked` pool is ever scrubbed via a burner.
|
||||
114
docs/carbonio-reval-autoreply-setup.md
Normal file
114
docs/carbonio-reval-autoreply-setup.md
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
# Carbonio auto-reply: "my Medicare revalidation is already complete" replies
|
||||
|
||||
Recurring pattern (Pangea Lab/Sue Kincer; Yakima Valley Farm Workers/Sheila
|
||||
Robertson, both same day). Root cause is the CMS data-lag window: the public CMS
|
||||
Medicare Revalidation Due Date List still shows a provider as due for several
|
||||
weeks after they have actually been approved, so a recently completed
|
||||
revalidation can still look overdue in the published data we target from. Our
|
||||
outreach matched the official list; the list was just behind reality.
|
||||
|
||||
## How it's deployed (Carbonio / co.carrierone.com)
|
||||
|
||||
`info@performancewest.net` is a Carbonio **distribution list**, and EVERY PW
|
||||
campaign (healthcare, trucking, telecom) uses `info@` as its reply-to. So the
|
||||
auto-reply must (a) live on a mailbox that receives `info@` mail and (b) be
|
||||
anchored to Medicare/revalidation context so it never fires on a trucking
|
||||
(MCS-150/UCR) or telecom (FCC/RMD) reply.
|
||||
|
||||
Setup that is LIVE:
|
||||
- Created mailbox `hc-replies@performancewest.net` and added it as a second
|
||||
member of the `info@` distribution list (justin@ stays on it too).
|
||||
- Installed the Sieve below on hc-replies@ via
|
||||
`zmprov ma hc-replies@performancewest.net zimbraMailSieveScript "<script>"`
|
||||
then `zmprov fc account hc-replies@performancewest.net`.
|
||||
- Created folder "Reval Completed (auto-acked)" on hc-replies@.
|
||||
|
||||
Carbonio Sieve gotchas learned the hard way (this version = 25.3.1 Zextras):
|
||||
- `vacation` is NOT supported as an incoming-filter action -> use `reply`.
|
||||
- `imap4flags` / `addflag` are NOT supported -> use `flag "read"`.
|
||||
- `body :text :contains` fails ("Subnode null") -> use `body :contains`.
|
||||
- Tagging uses the `tag` action, not addflag.
|
||||
|
||||
## The working Sieve (as deployed)
|
||||
|
||||
require ["fileinto", "reply", "tag", "flag", "body"];
|
||||
|
||||
# 1) Genuine healthcare service request -> do nothing, a human handles the sale.
|
||||
if allof (
|
||||
anyof (
|
||||
body :contains "revalidation",
|
||||
body :contains "medicare",
|
||||
body :contains "pecos",
|
||||
body :contains "npi"
|
||||
),
|
||||
anyof (
|
||||
body :contains "please file",
|
||||
body :contains "sign me up",
|
||||
body :contains "get started",
|
||||
body :contains "how much",
|
||||
body :contains "interested"
|
||||
)
|
||||
) {
|
||||
stop;
|
||||
}
|
||||
|
||||
# 2) Healthcare reval "already complete / objection" -> auto-acknowledge, tag,
|
||||
# mark read, file into the auto-acked folder. The Medicare/reval ANCHOR (first
|
||||
# anyof) is mandatory so trucking/telecom replies on the shared info@ list
|
||||
# (MCS-150, UCR, FCC, RMD, etc.) never trigger this.
|
||||
if allof (
|
||||
anyof (
|
||||
body :contains "revalidation",
|
||||
header :contains "subject" "revalidation",
|
||||
body :contains "medicare",
|
||||
body :contains "pecos"
|
||||
),
|
||||
anyof (
|
||||
body :contains "was completed",
|
||||
body :contains "already revalidated",
|
||||
body :contains "was approved",
|
||||
body :contains "already completed",
|
||||
body :contains "already done",
|
||||
body :contains "this is bogus",
|
||||
body :contains "is bogus",
|
||||
body :contains "completed on"
|
||||
)
|
||||
) {
|
||||
tag "reval-already-complete";
|
||||
flag "read";
|
||||
reply "Hi,
|
||||
|
||||
Thank you for letting us know, and congratulations on completing your revalidation. We have noted it and removed your practice from any further revalidation reminders.
|
||||
|
||||
For context: our notice was based on the CMS public Medicare Revalidation Due Date List, which CMS refreshes periodically. There is often a lag of several weeks between when a providers revalidation is approved and when CMS updates that public list, so a recently completed revalidation can still show as due in the published data. That appears to be exactly what happened here.
|
||||
|
||||
No action is needed on your part. If we can ever help with NPI/NPPES updates, enrollment, reactivation, or OIG/SAM exclusion screening, we are glad to assist.
|
||||
|
||||
Thank you again for the heads-up, and apologies for any confusion.
|
||||
|
||||
Best regards,
|
||||
Performance West Compliance
|
||||
(888) 411-0383 - info@performancewest.net
|
||||
Performance West is an independent compliance firm, not affiliated with CMS or Medicare.";
|
||||
fileinto "Reval Completed (auto-acked)";
|
||||
stop;
|
||||
}
|
||||
|
||||
## Tested
|
||||
- Healthcare "Medicare revalidation was completed / this is bogus" -> auto-reply
|
||||
sent, tagged, marked read, filed into Reval Completed (auto-acked). PASS.
|
||||
- Trucking "MCS-150 already completed, this is bogus" -> NO reply, stays in
|
||||
Inbox for a human. PASS.
|
||||
- Telecom "RMD filing completed, this is bogus" -> NO reply, stays in Inbox.
|
||||
PASS.
|
||||
- Healthcare "please file it for me, how much" -> NO auto-reply (buyer guard),
|
||||
stays in Inbox. PASS.
|
||||
|
||||
## Suppression (so the warmup never re-mails a completed provider)
|
||||
Append the provider's email to data/hc_suppress.txt, then run:
|
||||
python3 scripts/build_healthcare_campaigns_cron.py --prune-only
|
||||
The cron skips suppressed emails at import, and --prune removes them from the
|
||||
warmup lists. Done for:
|
||||
- Pangea Laboratory LLC, NPI 1851915888 (reval approved 05/01/2026) -- skincer@medicalpracticepartner.com
|
||||
- Yakima Valley Farm Workers Clinic, NPI 1710422407 (approved 04/29/2026) -- sheilar@yvfwc.org
|
||||
Both also blocklisted in listmonk_hc and removed from lists 3 + 4.
|
||||
153
docs/clia-enrichment-plan.md
Normal file
153
docs/clia-enrichment-plan.md
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
# CLIA (and multi-vertical) Email Enrichment Plan
|
||||
|
||||
**Status:** planning / partially built
|
||||
**Owner:** Performance West
|
||||
**Last updated:** 2026-06-13
|
||||
|
||||
## Goal
|
||||
|
||||
Turn the CMS CLIA laboratory file (676k labs; ~161k expiring in the next 12
|
||||
months, ~13.4k/month) into a **deliverable, emailable** audience for the CLIA
|
||||
Certificate Renewal service, without harming the warming mail-sender pool, and
|
||||
build a **reusable enrichment pipeline** that works for trucking and telecom too.
|
||||
|
||||
## Why this is needed
|
||||
|
||||
- CLIA POS file has **no NPI and no email** -- only facility name, mailing
|
||||
address, phone, and the certificate expiration date (`TRMNTN_EXPRTN_DT`, the
|
||||
recurring 2-year renewal trigger).
|
||||
- Direct NPI->email join failed: matching CLIA -> emailable NPPES org by
|
||||
name+zip yielded only **186 / 69,791 (0.3%)**. Email-first via NPPES is dead.
|
||||
- DirectTrust / Direct Secure Messaging is a **closed clinical trust network**
|
||||
(referrals/TOC/fax-replacement), not cold-mailable from a normal MTA -- verified,
|
||||
not viable for marketing.
|
||||
- Datacenter IPs get **bot-blocked by search engines** almost immediately
|
||||
(15/15 rapid DDG queries blocked from the prod datacenter IP). Custom rDNS does
|
||||
NOT fix this (detection is ASN/rate-based, not PTR-based).
|
||||
|
||||
## Channels by viability (CLIA audience)
|
||||
|
||||
| Channel | Viable? | Why |
|
||||
|---|---|---|
|
||||
| Cold email via NPPES NPI match | No | 0.3% match |
|
||||
| DirectTrust / Direct Secure Messaging | No | closed clinical network, AUP-restricted |
|
||||
| Self-scrape search from datacenter IPs | Fragile | search engines bot-block datacenter IPs |
|
||||
| Self-scrape search via residential proxy | Yes | residential exit IPs avoid bot detection |
|
||||
| **B2B append list ($99, monthly-updated)** | **Test first** | gives email + DOMAIN; cheap + reusable |
|
||||
| Phone | Yes | clean phone for ~all 161k |
|
||||
| Direct mail / postcard | Yes | clean name+address for ~all 161k (~3,100/wk for full coverage) |
|
||||
|
||||
## Chosen approach: $99 B2B append list -> domain -> scrape current email -> verify
|
||||
|
||||
The append list's most **durable** asset is the email **domain** (practices keep
|
||||
their domain for years even as staff turn over). So:
|
||||
|
||||
1. Buy the **$99 B2B list** (nationalemails.com, claims monthly updates;
|
||||
reusable across all verticals).
|
||||
2. **Append/join** the list to the CLIA file.
|
||||
3. **Confidence filter:** keep only rows where **address OR phone matches** the
|
||||
CMS CLIA record (confirms right entity, discards same-name mismatches).
|
||||
4. **Extract the email domain** from each matched record (durable even if the
|
||||
specific mailbox is stale).
|
||||
5. **Fetch that known domain's website** (home + /contact) and scrape the
|
||||
**current** contact email. Fetching KNOWN domains is cheap + reliable and may
|
||||
not even need the proxy (it is not search-engine scraping).
|
||||
6. **Merge:** prefer the freshly-scraped current email, fall back to the list email.
|
||||
7. **Verify** everything through the existing verifier (`verify_csv_emails.py` on
|
||||
the non-sending **.72** IP: MX + SMTP RCPT + catch-all detection) BEFORE
|
||||
anything touches a warming IP.
|
||||
8. Output a **send-ready CSV** with `mx_provider` tags (for per-operator throttling).
|
||||
|
||||
### Pipeline diagram
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["$99 B2B list (name, addr, phone, email)"] --> B["Append/join to CLIA file"]
|
||||
C["CMS CLIA file (name, addr, phone, expiry)"] --> B
|
||||
B --> D{"address OR phone matches?"}
|
||||
D -->|no| X["discard (wrong entity)"]
|
||||
D -->|yes| E["extract email DOMAIN"]
|
||||
E --> F["fetch known domain site\n(home + /contact)\ngzip, HTML-only, early-abort"]
|
||||
F --> G["scrape current contact email"]
|
||||
G --> H["merge: prefer scraped, fallback list email"]
|
||||
H --> I["verify via .72\n(MX + SMTP RCPT + catch-all)"]
|
||||
I --> J["send-ready CSV + mx_provider tags"]
|
||||
```
|
||||
|
||||
## Hard rules (non-negotiable)
|
||||
|
||||
- **NEVER load a purchased/scraped list directly into the warming pool.**
|
||||
Everything goes through the verifier first. We are mid reputation-recovery
|
||||
(Gmail/Outlook throttled us after the 4k/day spike) -- a bad list re-tanks it.
|
||||
- **Mail-sender pool (.94-.98) stays untouched by any scraping.** Scraping
|
||||
egresses via residential proxy or the non-sending .72 IP only.
|
||||
- Address/phone match = right ENTITY confidence; verifier = DELIVERABLE
|
||||
confidence. Need both before sending.
|
||||
- CAN-SPAM: every commercial email carries the full postal address + unsubscribe
|
||||
(already enforced across templates).
|
||||
|
||||
## Bandwidth optimization (if proxy is used, billed per GB)
|
||||
|
||||
- Request `Accept-Encoding: gzip, deflate, br` (measured ~76% off a real clinic
|
||||
site: 68KB -> 16KB).
|
||||
- HTML document only -- skip images/CSS/JS.
|
||||
- Early-abort once a valid email is found (do not fetch /contact if home page had it).
|
||||
- Cap max bytes per page.
|
||||
- Net: ~161k run likely well under 5 GB -> ~$15-40 on a cheap residential proxy.
|
||||
|
||||
## Residential proxy options (if needed for the search/scrape fallback)
|
||||
|
||||
Cheapest well-known, pay-as-you-go preferred:
|
||||
- **IPRoyal** (~$3.50-7/GB, credits do not expire) -- top pick for one-off + reusable
|
||||
- **Webshare** (~$3-5/GB) -- cheapest sticker if running regularly
|
||||
- **Decodo / ex-Smartproxy** (~$3.5-7/GB) -- smoothest dashboard
|
||||
- Avoid Bright Data / Oxylabs for this (premium price, reliability not needed on
|
||||
easy targets like direct site fetches).
|
||||
|
||||
## Decision gate before committing
|
||||
|
||||
Get a **sample export (50-100 rows)** from nationalemails.com and:
|
||||
1. Confirm column format.
|
||||
2. Check actual **coverage of small healthcare facilities** (the CLIA long tail --
|
||||
solo-doc labs. If coverage is thin like the NPPES match was, the domain will
|
||||
not be there to extract and this approach yields little).
|
||||
3. Append the sample to CLIA, measure address/phone match rate.
|
||||
4. Run matched emails through the verifier; measure verified-deliverable rate.
|
||||
5. If verified-deliverable rate is decent at $99 reusable -> proceed full.
|
||||
If poor -> fall back to postcard/phone channel for CLIA.
|
||||
|
||||
## Already built (this session)
|
||||
|
||||
- `scripts/harvest_clia_renewals.py` -- parse CMS CLIA file, filter to labs
|
||||
expiring within a window (default 120d), emit name/addr/phone/expiry.
|
||||
(676k scanned -> 69,791 expiring in [-30d, +120d]; on prod at
|
||||
`data/npi_build/clia_renewals.csv`.)
|
||||
- `scripts/match_clia_to_nppes.py` -- NPI bridge attempt (0.3% yield; kept for
|
||||
reference, not the path forward).
|
||||
- `clia-renewal` service in `api/src/service-catalog.ts` ($449, discountable) +
|
||||
order page `site/src/pages/order/clia-renewal.astro` + intake-manifest entry.
|
||||
- `data/hc_campaigns/hc_clia_renewal.html` -- warm turnover-safety-net email with
|
||||
the striped official-record card (CLIA #, expiry, status), verify-on-CMS-QCOR,
|
||||
founder guarantee card, full CAN-SPAM address.
|
||||
|
||||
## To build (once list sample is validated)
|
||||
|
||||
1. `scripts/append_match.py` -- join purchased list to a vertical file
|
||||
(CLIA/trucking/telecom), keep address/phone-matched rows, flag confidence,
|
||||
extract domain.
|
||||
2. `scripts/scrape_domain_emails.py` -- fetch known domains (home + /contact),
|
||||
gzip + HTML-only + early-abort, scrape current contact email; optional
|
||||
`--proxy` for residential egress.
|
||||
3. Wire output into `verify_csv_emails.py` -> send-ready CSV with `mx_provider`.
|
||||
4. Add `clia_renewal` segment to `scripts/build_healthcare_campaigns.py` SEGMENTS
|
||||
+ cron, MX-throttled, once a verified emailable list exists.
|
||||
|
||||
## Postcard alternative (if email yield stays poor)
|
||||
|
||||
- ~161k labs/yr, avg ~13.4k/month (spikes: Aug ~26k, Mar ~20k = CMS batch months).
|
||||
- Mail ~90 days before expiry: **~3,100 postcards/week** for full coverage
|
||||
(~620/day, 5-day). Smooth the Aug/Mar spikes over a 60-120d pre-expiry window.
|
||||
- All-in ~$0.40-0.75/card -> ~$5.4k-10k/month full coverage. Break-even ~12-22
|
||||
conversions/month at the $449 service fee (~0.1-0.15% response).
|
||||
- Drive responders to a "check my CLIA" tool on the site to capture email at the
|
||||
point of interest (converts the unreachable-by-email audience into warm leads).
|
||||
|
|
@ -270,7 +270,7 @@ store customer orders or tickets — ERPNext is the CRM source of truth.
|
|||
3. Listmonk tracks email opens/clicks and manages subscriber lists
|
||||
4. Bounce processing via POP3 from Carbonio (`co.carrierone.com`)
|
||||
|
||||
**Mass email:** SMTP2GO is used for Listmonk campaign sends (not Carbonio — Carbonio is for transactional email only).
|
||||
**Mass email:** Listmonk campaign sends relay through the local Postfix MTA (172.18.0.1:25 from the Docker network), which DKIM-signs and delivers direct-to-recipient-MX. Carbonio (co.carrierone.com) is for transactional email only. (SMTP2GO was decommissioned — no external relay is used.)
|
||||
|
||||
**Campaigns:**
|
||||
|
||||
|
|
|
|||
378
docs/deliverability.md
Normal file
378
docs/deliverability.md
Normal file
|
|
@ -0,0 +1,378 @@
|
|||
# Email Deliverability Runbook
|
||||
|
||||
**Owner action items are marked 🔴 MANUAL. Everything else is already done/automated.**
|
||||
|
||||
Last updated: 2026-06-19 (bulk subdomain + SPF trim + Microsoft/audience analysis).
|
||||
|
||||
---
|
||||
|
||||
## TL;DR of the 2026-06-18/19 deliverability incident
|
||||
|
||||
- **Symptom:** ~30% "open" rates but **0 human clicks, 0 sales** across both trucking
|
||||
and healthcare streams.
|
||||
- **Root cause:** NOT a blocklist, NOT the IPs. Proven by a controlled A/B test
|
||||
(2026-06-19): from the **same mail server / same IPs**, a message From
|
||||
`justin@carrierone.com` landed in the **Inbox** while From
|
||||
`justin@performancewest.net` went to **Junk**. The variable is the **From
|
||||
domain's reputation**. `carrierone.com` (reg. 2006, years of steady low-volume
|
||||
mail, tight 2-IP SPF) is trusted; `performancewest.net` (only started bulk in
|
||||
~May 2026, broken DKIM until 2026-06-17, 21-IP snowshoe SPF, May 30-31
|
||||
over-volume blast) is cold/damaged.
|
||||
- **Where the audience actually is (24h receiver mix):** **~85% Microsoft**
|
||||
(M365/Outlook/Hotmail), ~14% Google, <1% Yahoo. Our list is B2B, so Microsoft
|
||||
is the game, not Gmail. **Microsoft is NOT reputation-blocking us** (only ~1.6%
|
||||
5.7.x/S3150 rejects; it accepts ~2,138 msgs/24h) — but acceptance != inbox, so
|
||||
the engagement problem there is likely Junk-foldering, same domain-reputation
|
||||
cause. Gmail rejects ~95% of its (smaller) slice on `550-5.7.1 ... very low
|
||||
reputation of the sending domain`. The single biggest bounce bucket is actually
|
||||
**list hygiene**: ~1,012/24h Microsoft `451 4.4.4 no mail-enabled subscriptions`
|
||||
(dead tenant domains) + dead recipients.
|
||||
- **Fixes applied (2026-06-18/19):**
|
||||
1. Consolidated to ONE IP per stream (snowshoe was a band-aid for broken DKIM).
|
||||
2. **Dedicated bulk subdomain** `send.performancewest.net` so bulk reputation is
|
||||
isolated from the root domain (which stays clean for transactional mail).
|
||||
3. Trimmed root SPF from 21 IPs to the real 3 (the bloated record was itself a
|
||||
snowshoe signal).
|
||||
4. Disabled the pointless `pw-ip-rehab` cron (we have no IP reputation problem).
|
||||
|
||||
---
|
||||
|
||||
## Bulk subdomain: send.performancewest.net (2026-06-19)
|
||||
|
||||
**Why:** isolate bulk/cold-campaign sending reputation from the root domain. The
|
||||
root domain carries transactional/verification/receipt mail (via co.carrierone.com
|
||||
relay + the .71 default egress) and must stay clean; cold campaigns are inherently
|
||||
reputation-risky. Industry-standard (SendGrid/Mailchimp/etc.) split.
|
||||
|
||||
**Customer experience is unchanged:** From is the subdomain, but **Reply-To stays
|
||||
`info@performancewest.net`**, so replies land in the real inbox and look normal.
|
||||
|
||||
| Piece | Value |
|
||||
|-------|-------|
|
||||
| Trucking From | `Performance West <noreply@send.performancewest.net>` |
|
||||
| Healthcare From | `Performance West Compliance <compliance@send.performancewest.net>` |
|
||||
| Reply-To (both) | `info@performancewest.net` |
|
||||
| DKIM selector | `send` (`send._domainkey.send.performancewest.net`), 2048-bit |
|
||||
| SPF | `v=spf1 ip4:207.174.124.94 ip4:207.174.124.107 -all` |
|
||||
| DMARC | inherits root `p=reject` (explicit `_dmarc.send` also published) |
|
||||
| MX / Return-Path | `co.carrierone.com` (bounces) |
|
||||
| Egress IPs | .94 (trucking) / .107 (HC) — unchanged |
|
||||
|
||||
**Code:** `from_email` is set in `scripts/build_trucking_campaigns.py` (`FROM_EMAIL`,
|
||||
env `CAMPAIGN_FROM`) and `scripts/build_healthcare_campaigns_cron.py` (`FROM_EMAIL`,
|
||||
env `HC_CAMPAIGN_FROM`). Bounce-watchers (`scripts/bounce-watcher.sh`,
|
||||
`scripts/hc-bounce-watcher.sh`) track the new subdomain sender (and keep the legacy
|
||||
root sender so the pre-cutover queue drains).
|
||||
|
||||
**Infra:** OpenDKIM signs both domains — see `infra/ansible/roles/mail`
|
||||
(`opendkim_signing_domains` list generates per-domain keys + KeyTable/SigningTable).
|
||||
DNS published on the Hestia master (see DNS automation note below). Verified
|
||||
end-to-end 2026-06-19: a test send signs `d=send.performancewest.net; s=send;` and
|
||||
egresses out05/.94.
|
||||
|
||||
**Listmonk global `app.from_email`** was also updated in both DBs as a fallback for
|
||||
any UI/test send that doesn't set From explicitly.
|
||||
|
||||
> ⚠️ The subdomain starts at NEUTRAL reputation (not negative, not warm). It still
|
||||
> needs the same warm-up discipline: steady low volume to engaged recipients. It is
|
||||
> NOT a magic reset — but it protects the root domain and starts cleaner than the
|
||||
> damaged root.
|
||||
|
||||
---
|
||||
|
||||
## Sending architecture (after 2026-06-18/19 consolidation)
|
||||
|
||||
| Stream | IP | PTR / HELO | Path |
|
||||
|--------|----|-----------|----|
|
||||
| **Trucking** (listmonk) | **207.174.124.94** | mta05.performancewest.net | listmonk -> :25 -> `randmap:{out05:}` |
|
||||
| **Healthcare** (listmonk-hc) | **207.174.124.107** | hcmta01.performancewest.net | listmonk-hc SMTP server 1 -> :2526 -> hcout1 |
|
||||
| Transactional / verification | 207.174.124.71 + co.carrierone.com (.15) | perfwest | default `smtp_bind_address` (.71) + :587 relay (.15) |
|
||||
| Removed 2026-06-23 (snowshoe cleanup) | .90-.93, .95-.106, .108-.109 | mta01-04/06-17, hcmta02-03 | transports + host IP bindings DELETED |
|
||||
|
||||
**Snowshoe IP cleanup (2026-06-23):** the 18 dormant sending IPs (.90-.93,
|
||||
.95-.106, .108-.109) were fully removed from BOTH postfix (`master.cf`
|
||||
transports `yahooslow`/`out02-04`/`out06-20`/`rehab02-04`/`2527`/`2528`/
|
||||
`hcout2`/`hcout3`) AND the host (`/etc/network/interfaces` + live `ip addr del`).
|
||||
Only the two warm sending IPs (.94 trucking, .107 HC) plus infra (.71/.72)
|
||||
remain bound. A 20-IP footprint reads as snowshoe spam and was hurting domain
|
||||
reputation; the SPF was already trimmed to .94/.107 on 2026-06-19, so this just
|
||||
makes the host/postfix match the SPF intent. Verified live: `postfix check` OK,
|
||||
both streams still `status=sent` post-change, SSH unaffected. Reference snapshots
|
||||
committed at `infra/postfix/live-snapshots/master.cf` + `infra/network/interfaces`
|
||||
(live backups `/root/master.cf.bak_snowshoe_*` + `/root/interfaces.bak_snowshoe_*`).
|
||||
|
||||
**Root SPF (trimmed 2026-06-19):** `v=spf1 a mx ip4:207.174.124.15
|
||||
ip4:207.174.124.94 ip4:207.174.124.107 -all` — `a`=.71, `mx`=co.carrierone.com(.15),
|
||||
plus the two bulk IPs. The old 21-IP record was a snowshoe signal; this matches
|
||||
carrierone.com's tight style.
|
||||
|
||||
**To re-expand after reputation is established:** add transports back to `ALL=()`
|
||||
in `infra/postfix/pw-mta-warmup.sh` and re-enable the HC SMTP servers (ports
|
||||
2527/2528) in the `listmonk_hc` DB `settings.smtp`. Re-expand SLOWLY (one IP at a
|
||||
time, days apart) and only after Postmaster Tools shows a green/medium reputation.
|
||||
If you re-expand, also add the IPs back to BOTH the root SPF and the `send`
|
||||
subdomain SPF.
|
||||
|
||||
---
|
||||
|
||||
## Resuming Gmail sends: the stale-Date / inbox-burial problem (READ BEFORE re-enabling Gmail)
|
||||
|
||||
**Status:** Gmail is currently EXCLUDED from all sends (`scripts/_email_exclusions.py`
|
||||
`BLOCKED_EMAIL_DOMAINS` includes gmail/google). This section is the documented
|
||||
procedure for when we resume Gmail, and the reasoning for the chosen design. It is
|
||||
NOT yet implemented — implement it at the moment Gmail is re-enabled.
|
||||
|
||||
### The problem
|
||||
We inject the whole daily batch into Postfix in a ~2.5h burst (today: 1,430 + 1,419
|
||||
+ 1,077 messages in the 07:00-09:30 window, with a 932-in-one-minute spike at
|
||||
08:30), then Postfix slow-drains the queue over ~24h because receivers throttle a
|
||||
warming IP/domain (Microsoft `451 4.7.500 Server busy`).
|
||||
|
||||
**Listmonk stamps the `Date:` header at the moment it hands each message to Postfix
|
||||
(injection time), NOT at delivery time.** Empirically verified 2026-06-23: a queued
|
||||
message had `Date: 19:47:28` matching its Postfix arrival log line exactly, and was
|
||||
still deferred ~4h47m later. So a message injected at 08:00 keeps an 08:00 `Date:`
|
||||
even when the receiver finally accepts it at 14:00.
|
||||
|
||||
**Why this matters ONLY for Gmail:** inbox sort order depends on the client.
|
||||
- **Outlook / Exchange / M365** (our current #1 audience, ~2,000 delivered/day) and
|
||||
most webmail (Proton, etc.) sort by **received time** (`PR_MESSAGE_DELIVERY_TIME`)
|
||||
= when THEIR server accepted it. A late-delivered message surfaces fresh at the
|
||||
top on arrival; only the *displayed* date looks old. So for today's audience the
|
||||
burial is cosmetic and NOT worth fixing.
|
||||
- **Gmail sorts the inbox by the `Date:` header.** A message accepted at 14:00 but
|
||||
Date-stamped 08:00 is filed **6h down** the inbox, below mail the user has already
|
||||
read. That is real burial and real lost opens — and it only bites once we send
|
||||
Gmail again (which is ~85% Microsoft / ~14% Google for our B2B list, so Gmail is
|
||||
a meaningful slice).
|
||||
|
||||
### Why NOT to future-date / spoof the `Date:` header
|
||||
The tempting "just stamp a future Date" fix is a net negative:
|
||||
1. **Spam signal.** A `Date:` in the future is a classic filter heuristic —
|
||||
Proofpoint, Mimecast, and Microsoft all penalize it. We'd trade a cosmetic
|
||||
timestamp for WORSE inbox placement.
|
||||
2. **It breaks our DKIM.** OpenDKIM signs the `Date` header (only `From` is
|
||||
over-signed, but `Date` is in the signed set). Rewriting `Date` after signing
|
||||
invalidates the signature -> DMARC `p=reject` -> hard bounce.
|
||||
3. **It doesn't even help Outlook** (received-time sort) and is the wrong lever for
|
||||
Gmail (see the real fix below).
|
||||
|
||||
### The fix: pace Listmonk INJECTION to match Gmail's accept rate (just-in-time Date)
|
||||
Because `Date:` is stamped at injection, the solution is to **release each Gmail
|
||||
message close to when Gmail will actually accept it**, so `Date:` ≈ received time ≈
|
||||
now, and it lands at the top of the Gmail inbox. Keep the Postfix queue shallow for
|
||||
the Gmail stream so no message sits for hours collecting a stale Date.
|
||||
|
||||
Implementation when re-enabling Gmail:
|
||||
1. **Segment Gmail into its OWN Listmonk campaign on its OWN single IP** (snowshoe-
|
||||
safe), separate from the Microsoft/Proofpoint stream, so its deliberately slow
|
||||
pace does not bottleneck the fast stream. Each stream gets its own injection
|
||||
cadence. (Add the new IP to host + Postfix transport + BOTH SPF records first,
|
||||
per the re-expand note above.)
|
||||
2. **Set the Gmail campaign's sliding-window injection rate at or below Gmail's
|
||||
sustained cold-domain accept rate** (`app.message_sliding_window_rate` /
|
||||
`_duration` on that Listmonk instance). Start low (~20-30/hr/IP for a cold
|
||||
domain) and ramp as Postmaster Tools reputation climbs. This spreads injection
|
||||
across the whole sending window instead of front-loading it, so the queue never
|
||||
builds a backlog of stale-dated Gmail mail.
|
||||
3. **Queue-age guard.** Monitor the inject->deliver gap for the Gmail stream
|
||||
(`delay=` in the maillog). If it exceeds ~30 min, injection is outrunning
|
||||
acceptance -> throttle the sliding-window rate down further. Verify after a day
|
||||
that the Gmail stream's `delay=` stays small and the "6-24h late" bucket is ~0.
|
||||
|
||||
This is strictly better than date-spoofing: no spam signal, no DKIM break, and
|
||||
because Gmail/Microsoft both reward steady paced volume, pacing injection also
|
||||
RAISES the accept quota over time (the deliverability principle "concentrated low
|
||||
volume beats bursts"). Win-win.
|
||||
|
||||
> Note: this same pacing slightly helps Outlook's *displayed* date too, but since
|
||||
> Outlook sorts by received time it is not necessary there. Only spend the effort on
|
||||
> the Gmail stream.
|
||||
|
||||
---
|
||||
|
||||
## DNS automation (Hestia is the master)
|
||||
|
||||
**DNS is fully automatable** — Hestia (`cp.carrierone.com`, 207.174.124.22) is the
|
||||
DNS master; HE.net are slaves. Access: `ssh -p 22022 root@cp.carrierone.com` using
|
||||
the **local workstation's** `~/.ssh/id_ed25519` (NOT the app server, NOT justin@
|
||||
which is SFTP-only). The `justin` Hestia user owns the `performancewest.net` zone.
|
||||
|
||||
```
|
||||
# add (note: Hestia appends the base domain to the RECORD name, so a record at
|
||||
# send._domainkey.send.performancewest.net needs RECORD = "send._domainkey.send")
|
||||
v-add-dns-record justin performancewest.net "<record>" <TYPE> "<value>" [prio]
|
||||
# change / delete (find the numeric id with v-list-dns-records ... plain)
|
||||
v-change-dns-record justin performancewest.net <id> "<record>" <TYPE> "<value>" "" yes <ttl>
|
||||
v-delete-dns-record justin performancewest.net <id>
|
||||
# list
|
||||
v-list-dns-records justin performancewest.net plain
|
||||
```
|
||||
|
||||
Each write triggers a ~30s zone rebuild + DNSSEC re-sign; slaves sync via NOTIFY /
|
||||
SOA refresh, usually within a minute. Verify on `@8.8.8.8` AND the master
|
||||
`@207.174.124.22` (the master is authoritative; public resolvers may lag).
|
||||
|
||||
---
|
||||
|
||||
## Monitoring tools (set these up to SEE reputation directly)
|
||||
|
||||
These all require a provider account login + (for Google) a DNS TXT record on
|
||||
HE.net, so they can't be fully automated. Steps are pre-filled below.
|
||||
|
||||
### 🔴 MANUAL 1 — Google Postmaster Tools (Gmail is our biggest blocker)
|
||||
Gmail's verbatim rejection names "the sending **domain**", so this is priority #1.
|
||||
|
||||
**DNS is fully automatable** — Hestia (cp.carrierone.com) is the DNS master,
|
||||
HE.net are slaves. Add records as root: `ssh -p 22022 root@cp.carrierone.com`
|
||||
then `v-add-dns-record justin performancewest.net "@" TXT '"'"'"<value>"'"'"'`
|
||||
(zone owner is the `justin` Hestia user; ~30s zone rebuild + slaves sync via the
|
||||
2h SOA refresh / NOTIFY, usually within a minute).
|
||||
|
||||
Status 2026-06-18: **TXT added + verified live** (record id 14464,
|
||||
`google-site-verification=p8s3RaN5wi81350wToMpdPMho5Gcel4RGT1Q1SXj7vg`),
|
||||
resolving on 8.8.8.8/1.1.1.1/9.9.9.9 and 4/5 HE.net slaves. Owner just needs to
|
||||
click **Verify** in the Postmaster console once. Data populates 24-48h after
|
||||
volume flows from the consolidated IP.
|
||||
|
||||
To set up from scratch next time: postmaster.google.com -> +Add domain ->
|
||||
performancewest.net -> copy the `google-site-verification=...` token -> add via
|
||||
the Hestia command above -> Verify.
|
||||
|
||||
### ✅ MANUAL 2 — Microsoft SNDS + JMRP (Outlook/Hotmail/Live) — **DONE 2026-06-19**
|
||||
**85% of our audience is Microsoft-hosted** (M365/Outlook/Hotmail), so this is the
|
||||
single most important monitoring tool. Microsoft already *accepts* our mail (~1.6%
|
||||
reputation rejects), so this tells us inbox-vs-junk + complaint rates.
|
||||
SNDS is **IP-based** (register the sending IPs), JMRP is the complaint feedback loop.
|
||||
**Both SNDS access and JMRP are now registered for 207.174.124.94 + .107.**
|
||||
|
||||
> **2026 URL MIGRATION:** Microsoft moved SNDS off
|
||||
> `sendersupport.olc.protection.outlook.com`. The old `/snds/` and `/pm/` links now
|
||||
> 308-redirect to the new app at **`substrate.office.com/ip-domain-management-snds/`**.
|
||||
> The *footer/help* links on that page ("contact sender support", "Privacy",
|
||||
> "Microsoft Services Agreement") go to generic `microsoft.com` pages — that is
|
||||
> normal, they are boilerplate, NOT the broken task. **You must click "Log in"
|
||||
> (top-right) with a personal Microsoft account FIRST**; until you authenticate the
|
||||
> "Request Access" / "Junk Mail Reporting Program" links just bounce to
|
||||
> `login.microsoftonline.com`, which looks like a dead redirect but is the expected
|
||||
> auth step. After login the real forms render.
|
||||
|
||||
1. **SNDS — Request Access:** open the SNDS app — either the legacy entry
|
||||
<https://sendersupport.olc.protection.outlook.com/snds/> (it 308-redirects to the
|
||||
new app) or directly
|
||||
`https://substrate.office.com/ip-domain-management-snds/SNDS` — then **Log in** ->
|
||||
left-nav **"Request Access"** (direct:
|
||||
`https://substrate.office.com/ip-domain-management-snds/SNDS/AddNetwork`) ->
|
||||
register IPs **207.174.124.94** and **207.174.124.107** (the two live stream IPs;
|
||||
add .90 and .71 if you want full coverage). Verification goes to a role address
|
||||
on the IP's domain (use `postmaster@` or `abuse@performancewest.net`, now live).
|
||||
(NOTE: `snds.microsoft.com` does NOT resolve — do not use it.)
|
||||
**✅ DONE 2026-06-19:** access requested/granted for .94 + .107. Data populates
|
||||
over ~24-48h; then check the dashboard for the per-IP RED/YELLOW/GREEN status,
|
||||
spam-trap hits, and complaint rate.
|
||||
2. **JMRP:** same site, left-nav **"Junk Mail Reporting Program"** (direct:
|
||||
`https://substrate.office.com/ip-domain-management-snds/SNDS/Jmrp`) -> register
|
||||
the same IPs + complaint-destination mailbox **`fbl@performancewest.net`**.
|
||||
Complaints then arrive as ARF emails.
|
||||
**✅ DONE 2026-06-19:** both IPs registered as feeds — `pw1` = 207.174.124.94,
|
||||
`pw2` = 207.174.124.107, complaint destination set to **`fbl@performancewest.net`**
|
||||
(live, routes to ops@). ARF complaint reports now land there automatically.
|
||||
|
||||
**✅ PREREQ DONE (2026-06-19):** the role mailboxes Microsoft needs now exist and
|
||||
deliver. Created as Carbonio distribution lists routing to `ops@performancewest.net`:
|
||||
`postmaster@`, `abuse@`, `fbl@`, `dmarc@` — all verified ACCEPT at the MX +
|
||||
delivered end-to-end. (They previously REJECTED with 5.1.1, which would have blocked
|
||||
SNDS verification.) Use `postmaster@` or `abuse@` for SNDS verification and
|
||||
`fbl@performancewest.net` as the JMRP complaint destination.
|
||||
|
||||
> Carbonio mail admin: `ssh -p 22022 justin@207.174.124.15` (the **co.carrierone.com**
|
||||
> mail host; local workstation key, justin has NOPASSWD sudo). Run prov as zextras:
|
||||
> `sudo -u zextras /opt/zextras/bin/carbonio prov <cmd>` (e.g. `gaa`, `gadl`,
|
||||
> `cdl <addr>`, `adlm <dl> <member>`, `gdlm <dl>`).
|
||||
|
||||
### ✅ MANUAL 3 — Yahoo Complaint Feedback Loop — **keys added 2026-06-19**
|
||||
Lowest priority (<1% of audience), but cheap. CFL is DKIM-d= based.
|
||||
1. <https://senders.yahooinc.com/complaint-feedback-loop/> -> sign in -> register
|
||||
the domains `performancewest.net` **and** `send.performancewest.net` (CFL keys
|
||||
off the DKIM `d=` value; bulk mail now signs `d=send.performancewest.net`).
|
||||
2. Set the complaint destination to `fbl@performancewest.net` (now live, see above).
|
||||
|
||||
**✅ ENROLLED 2026-06-19** — both domains show **Enrolled** in the Yahoo Sender Hub
|
||||
CFL with reporting email `fbl@performancewest.net`:
|
||||
- `performancewest.net` — Enrolled, reporting `fbl@performancewest.net`
|
||||
- `send.performancewest.net` — Enrolled, reporting `fbl@performancewest.net`
|
||||
(Reporting-email code was delivered to fbl@ → ops@ and verified; the Selector
|
||||
column is intentionally blank = match any DKIM selector on the verified domain.)
|
||||
|
||||
**✅ DNS verification keys added + propagated 2026-06-19** (Hestia TXT, verified on
|
||||
all HE.net slaves + 8.8.8.8/1.1.1.1/9.9.9.9):
|
||||
- `performancewest.net` TXT `yahoo-verification-key=IMx+OO5aKUE1nu9JwP6eSBMfSYZu8VcXjpkvEVXS84w=`
|
||||
- `send.performancewest.net` TXT `yahoo-verification-key=Ps5hGjVxXgeQcLcxr671YG0/RxzjjL0eqh6vfULubEo=`
|
||||
(added alongside the existing `send` SPF record; both TXT coexist).
|
||||
|
||||
### ✅ DMARC aggregate reports — DONE 2026-06-19 (dedicated mailbox + parser)
|
||||
Gmail/Yahoo/Microsoft + dozens of operators (Comcast, Cox, Bell, Mimecast, Cisco
|
||||
ESA, GMX, mail.com, gosecure, ...) send daily per-IP auth+disposition XML to
|
||||
`dmarc@performancewest.net` (DMARC record: `p=reject; rua=mailto:dmarc@; ruf=mailto:dmarc@; fo=1`).
|
||||
**That mailbox was REJECTING (5.1.1) until 2026-06-19 — we silently lost every
|
||||
report.** Now fully wired:
|
||||
|
||||
1. **Dedicated mailbox.** `dmarc@performancewest.net` is its own Carbonio account
|
||||
(was a DL -> ops@, which buried ops@ under report XML). Isolated IMAP credential
|
||||
in the server `.env` (`DMARC_IMAP_{HOST,PORT,USER,PASS}`), surfaced to the workers
|
||||
container in `docker-compose.yml` (mirrors the `OPS_IMAP_*` pattern). The 29
|
||||
historical reports that had landed in ops@ were moved over via IMAP.
|
||||
2. **Parser worker.** `scripts/dmarc_report_parser.py` IMAP-fetches unseen messages,
|
||||
decompresses the `.gz`/`.zip`/`.xml` attachment (namespace-agnostic — handles both
|
||||
the classic and the `urn:ietf:params:xml:ns:dmarc-2.0` GMX/mail.com schema), parses
|
||||
the aggregate XML, and upserts one `dmarc_report` row (keyed `(org_name, report_id)`,
|
||||
so re-parsing is a no-op) + one `dmarc_record` row per source IP into the schema from
|
||||
`api/migrations/102_dmarc_aggregate.sql`. `dmarc_pass = dkim_aligned=pass OR
|
||||
spf_aligned=pass`. Marks each message `\Seen` so each run only handles new reports.
|
||||
Flags: `--dry-run`, `--all` (backfill seen), `--alert` (7-day per-IP summary +
|
||||
Telegram if one of OUR IPs drops below 95% pass, or an EXTERNAL IP sends >=20 failing
|
||||
msgs as us = spoofing under `p=reject`).
|
||||
3. **Cron.** `/etc/cron.d/pw-dmarc-parser` (tracked at `infra/cron/pw-dmarc-parser`)
|
||||
runs `... workers python3 -m scripts.dmarc_report_parser --alert` daily at 06:20 UTC.
|
||||
|
||||
Query examples once populated:
|
||||
```sql
|
||||
-- who sends as us, and are they aligning? (the payoff of the DKIM/subdomain fixes)
|
||||
SELECT source_ip, sum(msg_count) total,
|
||||
sum(msg_count) FILTER (WHERE dmarc_pass) pass,
|
||||
round(100.0*sum(msg_count) FILTER (WHERE dmarc_pass)/sum(msg_count)) pass_pct
|
||||
FROM dmarc_record r JOIN dmarc_report rep ON rep.id=r.report_id
|
||||
WHERE rep.date_begin >= now()-interval '7 days'
|
||||
GROUP BY source_ip ORDER BY total DESC;
|
||||
-- any UNKNOWN IP failing alignment = spoofing/forgotten relay (reputation poison)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Ongoing hygiene (reduce reputation damage)
|
||||
|
||||
- **Dead-address scrub:** ~110 genuine `5.1.1 user unknown` bounces/day. listmonk
|
||||
already blocklists hard bounces after 1 (`bounce.actions hard->blocklist`), so
|
||||
these self-clean, but pre-scrubbing the dirtiest segments before send avoids the
|
||||
reputation hit. See `data/` segment exports.
|
||||
- **Consumer-domain exclusion (two layers).** The authoritative list lives in
|
||||
`scripts/_email_exclusions.py` (`BLOCKED_EMAIL_DOMAINS`): gmail/google, the full
|
||||
Yahoo/Verizon-Media family, Microsoft consumer, **Apple/iCloud (added 2026-06-19)**,
|
||||
dead/legacy ISPs, and the legal do-not-contact list.
|
||||
1. *NEW selections:* the per-vertical builders filter it out of audience SQL and
|
||||
`listmonk_import.py` refuses to import a blocked address.
|
||||
2. *Already-imported subs:* LIST-BASED campaigns (FCC Direct Contacts list 3,
|
||||
CRTC/USF blasts) can still hit consumer subs imported BEFORE a domain joined
|
||||
the list. `scripts/scrub_listmonk_consumer.py` reconciles the live subscriber
|
||||
table against the exclusion list and blocklists any ENABLED match (idempotent;
|
||||
`--dry-run` supported; both `listmonk` + `listmonk_hc`). Runs daily 06:30 UTC
|
||||
via `/etc/cron.d/pw-listmonk-scrub` (tracked at `infra/cron/pw-listmonk-scrub`).
|
||||
First run 2026-06-19 blocklisted **7,943** trucking + **21** HC stale consumer
|
||||
subs (1,321 iCloud, 267 gmail, etc.) that were leaking via the running CRTC
|
||||
campaign. Re-run the scrub whenever you add a domain to the exclusion list.
|
||||
- **Don't re-expand IPs** until Postmaster Tools shows recovered reputation.
|
||||
- **Volume discipline:** keep the global 200/hr sliding window until reputation is
|
||||
green; concentrated low volume on one warm IP beats bursts.
|
||||
- **Watch the rejection mix:** `5.7.1 reputation/spam/blocked` should fall over the
|
||||
next 1-2 weeks as the single-IP reputation builds. Track via:
|
||||
`ssh ... 'sudo grep status=bounced /var/log/mail.log | grep -c 5.7.1'`
|
||||
80
docs/dexit-cited-filings.md
Normal file
80
docs/dexit-cited-filings.md
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# DEXIT outreach: cited SEC filings (proof for copy + a "verify it yourself" block)
|
||||
|
||||
Real reincorporation filings from OTC/microcap issuers, with verbatim excerpts and
|
||||
links. Use these to back the email claims and on any proof page. All are public on
|
||||
SEC EDGAR; the recipient can open them and verify in under a minute. Pulled
|
||||
2026-06-09.
|
||||
|
||||
---
|
||||
|
||||
### 1. Oracle Health, Inc. - DE -> NV (the dollar-figure proof)
|
||||
Definitive proxy explaining the reincorporation. The single best citation because
|
||||
it puts a hard number on the Delaware franchise-tax pain for a microcap.
|
||||
|
||||
> "we anticipate that the Reincorporation will result in reduced corporate tax
|
||||
> obligations, as Nevada currently imposes no corporate income or franchise tax,
|
||||
> while Delaware imposes an annual franchise tax, ranging from $175 to a maximum
|
||||
> of $200,000. **Despite that we are a pre-revenue startup, our Delaware franchise
|
||||
> tax obligation for fiscal year 2021 reached $23,600.** Nevada only charges
|
||||
> corporations incorporated in Nevada nominal annual corporate fees ... We
|
||||
> anticipate that our obligation for this annual fee will be **approximately
|
||||
> $1,000** ..."
|
||||
|
||||
> "Nevada is a nationally-recognized leader in adopting and implementing
|
||||
> comprehensive and flexible corporation laws ... Nevada courts have developed
|
||||
> considerable expertise in dealing with corporate legal issues and have produced
|
||||
> a substantial body of case law construing Nevada corporation laws."
|
||||
|
||||
> "The Articles of Incorporation of Oracle NV limit the liability of its directors
|
||||
> and officers to the maximum extent permitted by Nevada law. As a result, a
|
||||
> director or officer will have no personal liability ... except for (a) acts or
|
||||
> omissions which involve intentional misconduct, fraud or a knowing violation of
|
||||
> law, or (b) the payment of distributions in violation of section 78.300 of the
|
||||
> Nevada Revised Statutes."
|
||||
|
||||
Link: https://www.sec.gov/Archives/edgar/data/1777274/000121390022032759/ea161576-1u_oraclehealth.htm
|
||||
(CIK 0001777274, accession 0001213900-22-032759)
|
||||
|
||||
---
|
||||
|
||||
### 2. FG Financial Group, Inc. (FGF) - DE -> NV (shareholder-approved, by merger)
|
||||
8-K reporting the vote. Shows the standard mechanic: a plan of merger into a wholly
|
||||
owned Nevada sub.
|
||||
|
||||
> "Approval of Reincorporation from Delaware to Nevada - Stockholders approved the
|
||||
> Agreement and Plan of Merger, dated as of October 19, 2022, by and between the
|
||||
> Company and FG Financial Group, Inc., a Nevada corporation and a wholly owned
|
||||
> subsidiary of the Company ..."
|
||||
|
||||
Link: https://www.sec.gov/Archives/edgar/data/1591890/000149315222034739/form8-k.htm
|
||||
(CIK 0001591890, accession 0001493152-22-034739)
|
||||
|
||||
---
|
||||
|
||||
### 3. LogicMark, Inc. (LGMK) - DE -> NV (proxy advisor endorsed it)
|
||||
DEFA14A noting the proxy-advisory firm ISS recommended a "For" vote on the move -
|
||||
useful third-party validation that this is mainstream, not fringe.
|
||||
|
||||
> "ISS endorsed the Company's proxy proposals ... approve the reincorporation from
|
||||
> Delaware to Nevada and recommended a vote 'For' ..."
|
||||
|
||||
Link: https://www.sec.gov/Archives/edgar/data/1566826/000121390022047897/ea164428-defa14a_logicmark.htm
|
||||
(CIK 0001566826, accession 0001213900-22-047897)
|
||||
|
||||
---
|
||||
|
||||
### How big is the trend (also citable)
|
||||
EDGAR full-text search (efts.sec.gov), reincorporation/redomestication mentions by
|
||||
destination state, pulled 2026-06-09:
|
||||
- Nevada: 281 filings (all-time), 33 since 2024
|
||||
- Texas: 99 filings (all-time), 27 since 2024
|
||||
- Surge Components, Integrated Media Holdings, and ~220 more DE->NV filings exist
|
||||
via the query `"reincorporation from Delaware to Nevada"`:
|
||||
https://efts.sec.gov/LATEST/search-index?q=%22reincorporation+from+Delaware+to+Nevada%22
|
||||
|
||||
### Statutory / fee sources to cite (let a CFO fact-check in 60s)
|
||||
- Delaware franchise tax + calculator: https://corp.delaware.gov/frtaxcalc/ (min $175, max $200,000; "authorized shares method" default)
|
||||
- Nevada NRS 78.138 (director/officer liability): https://www.leg.state.nv.us/nrs/nrs-078.html
|
||||
- Nevada NRS Chapter 92A (conversion/merger mechanic): https://www.leg.state.nv.us/nrs/nrs-092a.html
|
||||
- Texas Business Organizations Code Ch. 10 (conversion/domestication): https://statutes.capitol.texas.gov/Docs/BO/htm/BO.10.htm
|
||||
- Texas Business Court (operational 2024-09-01): https://www.txcourts.gov/businesscourt/
|
||||
262
docs/dexit-readiness-assessment.md
Normal file
262
docs/dexit-readiness-assessment.md
Normal file
|
|
@ -0,0 +1,262 @@
|
|||
# Readiness: corporate orders + "move a company" (conversion / domestication)
|
||||
|
||||
Honest assessment as of 2026-06-09. Question: are we ready to take Nevada/Texas
|
||||
incorporation orders end-to-end (name search, accept into ERPNext, etc.), and the
|
||||
mechanics of moving a corp out of Delaware + annual report + EIN.
|
||||
|
||||
## Short answer
|
||||
- **New NV/TX formation orders - order intake + ERPNext VERIFIED e2e; name search
|
||||
now FIXED for TX, and honest for NV.** The e2e harness (`scripts/e2e-formation-order.mjs`)
|
||||
confirms: live name search -> formation_orders insert -> ERPNext customer -> Sales
|
||||
Order with the correct `BUSINESS-FORMATION` + `STATE-FILING-FEE` line items and
|
||||
totals ($254 NV LLC, $479 TX corp) -> DB linkage, all PASS.
|
||||
- **TX name search now works** via the Texas open-data API (no scraping). Returns
|
||||
real availability (exact match => taken; no rows => available; error => unknown).
|
||||
- **NV name search returns "unknown"** (available=None) by design: the NV portal is
|
||||
behind Incapsula bot protection with no public API, so we flag NV names for a
|
||||
manual admin check rather than fake a result. Never a false "taken".
|
||||
- Still pending before a self-serve checkout: the actual NV/TX *filing* automation
|
||||
(SOSDirect login flow / SilverFlume) is unverified, and NV name search is manual.
|
||||
The DEXIT page points at a contact form, not this checkout.
|
||||
- **"Move a company" (DE -> NV/TX conversion/domestication):** **NOT built.** There
|
||||
is no order type, no SKU, and no fulfillment for a conversion. This is the core of
|
||||
the DEXIT promise and is the biggest gap.
|
||||
- **Annual report filing in the new state:** **NOT built** as automation. There is an
|
||||
`annual-report-filing` slug, but it is wired to the trucking admin-assisted handler
|
||||
(`MCS150UpdateHandler`), not a corporate state-filing flow.
|
||||
- **EIN:** for a move you generally do NOT get a new EIN (see mechanics below); our
|
||||
`ein_worker` only obtains a NEW EIN, which is the wrong operation for a conversion.
|
||||
|
||||
So: **do not turn on a "buy now" DEXIT checkout yet.** Keep the page as a lead-gen
|
||||
"get my estimate" CTA (which it currently is) until the flow below is built + tested.
|
||||
|
||||
## E2E test results (2026-06-09) and the name-search bug
|
||||
Ran `scripts/e2e-formation-order.mjs` inside the api container against live prod
|
||||
(real DB + real ERPNext, no real Stripe charge, no real state filing).
|
||||
|
||||
**PASS - order intake + ERPNext Sales Order (both NV and TX):**
|
||||
- live formation_orders insert,
|
||||
- ERPNext customer find/create,
|
||||
- Sales Order created with `BUSINESS-FORMATION` + `STATE-FILING-FEE` line items,
|
||||
correct totals ($254 NV LLC = $179 + $75; $479 TX corp = $179 + $300),
|
||||
- `formation_orders.erpnext_sales_order` linkage written,
|
||||
- cleanup (cancel+delete SO, delete order row).
|
||||
|
||||
Bugs the harness caught and we fixed:
|
||||
- The formation Sales Order referenced ERPNext Items `BUSINESS-FORMATION` and
|
||||
`STATE-FILING-FEE` (and `FOREIGN-QUAL-SINGLE/MULTI`) that **did not exist** -> the
|
||||
SO creation was silently failing on every formation order. Created the Items.
|
||||
- `entity_type` check constraint requires lowercase (`llc`, `corporation`, ...).
|
||||
- The API's `GET /states/:code/name-search` called `WORKER_URL/name-search`, but the
|
||||
worker had **no such route** (404 -> silent fallback to stale `entity_cache`).
|
||||
Added a synchronous `/name-search` worker route, and fixed `handle_name_search`
|
||||
(both referenced a nonexistent `search_name_sync`).
|
||||
|
||||
**FAIL (open) - live name search silently returns "unavailable" for everything.**
|
||||
After wiring the route, a deliberately unique nonsense name still returns
|
||||
`available=false` with no similar names. Root cause: the **NV state-portal adapter
|
||||
times out** (`Page.fill: Timeout ... waiting for locator("input[type=text], ...")`)
|
||||
because the Nevada SOS / SilverFlume search page no longer matches the adapter's
|
||||
input selector, and `search_name()` swallows the exception and **defaults to
|
||||
`available=False`**. So:
|
||||
- We would wrongly tell customers an available name is taken (or never validate it).
|
||||
- This is a **portal-scraping maintenance task**: inspect the current NV (and verify
|
||||
TX) name-search DOM, update `states/nv/adapter.py` (and `tx`) selectors/flow, and
|
||||
make `search_name()` distinguish a real "taken" result from an adapter error
|
||||
(return an explicit error/unknown state, never a false "taken"). NOTE the adapter
|
||||
also MIS-PARSES on its happy path: via the route a unique name still returns
|
||||
available=false (the search page content does not match the adapter's "no results"
|
||||
phrases), so the fix must update both the input selector AND the results parsing.
|
||||
We did harden the error path: search_name() now returns available=None on a thrown
|
||||
adapter error. The harness re-run is the acceptance test.
|
||||
|
||||
**Conclusion:** the ERPNext/order plumbing is sound and verified; **do not enable a
|
||||
self-serve formation checkout until name search is fixed** (a customer must be able
|
||||
to trust the availability check), and the "move a company" flow is still unbuilt.
|
||||
|
||||
## What already exists (the good news)
|
||||
The corporate/formation machinery is real and reusable:
|
||||
- **Checkout + order intake:** `api/src/routes/checkout.ts` has `order_type: "formation"`,
|
||||
builds a Stripe line item `Business Formation (<state> <LLC|CORP>)`, and the
|
||||
`formation_orders` table carries `stripe_session_id`, `payment_status`,
|
||||
`erpnext_sales_order`, etc. ERPNext SO creation is wired for formation orders.
|
||||
- **Name search:** `GET /api/v1/states/:code/name-search` (24h cache in
|
||||
`name_search_cache`) -> calls the worker -> per-state adapter. **TX** uses the
|
||||
Comptroller Taxable Entity Search (free, no login); **NV** has an adapter too.
|
||||
- **Filing automation:** `scripts/formation/` is a full subsystem -
|
||||
`formation_worker.py` polls `formation_orders`, `states/tx/adapter.py` +
|
||||
`states/nv/adapter.py` implement `search_name` / `file_llc` / `file_corporation`
|
||||
via Playwright (TX = SOSDirect, requires login + ASP.NET viewstate handling),
|
||||
plus `ein_worker.py`, `operating_agreement.py`, `document_delivery.py`,
|
||||
registered-agent via Northwest RA, and ~55 state adapters scaffolded.
|
||||
- **The `FormationOrder` model** carries entity name/alt, members, RA, addresses,
|
||||
shares_authorized, par_value, expedited, payment card (Relay virtual debit), and
|
||||
result fields (filing number, confirmation, documents).
|
||||
|
||||
## What's missing for NEW NV/TX formation (smaller gap)
|
||||
1. **E2E verification.** The TX/NV adapters target live state portals (SOSDirect
|
||||
needs an account login; both are ASP.NET/viewstate + possible CAPTCHA). We have
|
||||
not confirmed a clean run recently. Need: a staged dry-run (name search ->
|
||||
formation_orders insert -> worker pick-up -> ERPNext SO -> filing in a sandbox or
|
||||
a real low-stakes filing) with screenshots, and CAPTCHA handling confirmed.
|
||||
2. **ERPNext SO for formation** exists in code; verify it actually creates the SO
|
||||
with the right items + state gov fee line (we hit a gap like this on the trucking
|
||||
compliance_batch flow - SOs weren't being created). Add NV/TX formation Items if
|
||||
missing (we created LLC-FORMATION / CORP-FORMATION recently).
|
||||
3. **Pricing/SKU sanity:** TX/NV LLC = $300 gov fee, Corp = $300; expedite +$25/$50.
|
||||
Our `corp-formation` / `llc-formation` catalog entries need gov_fee plumbed.
|
||||
|
||||
## What's missing for "MOVE a company" (the big gap)
|
||||
This is a different operation from formation. Real-world mechanics:
|
||||
|
||||
### The legal mechanic (two paths)
|
||||
A company changes its state of incorporation by either:
|
||||
- **(A) Statutory conversion / domestication** (preferred, cleaner): the entity
|
||||
re-domiciles. **Delaware** files a **Certificate of Conversion** to convert OUT
|
||||
(DGCL 266) and the **destination state** files a conversion/domestication in:
|
||||
- **Texas:** TBOC Ch. 10, Subch. C - "Certificate of Conversion" + new Certificate
|
||||
of Formation. The TX entity is a continuation of the DE entity (same legal person).
|
||||
- **Nevada:** NRS Ch. 92A.105+ "conversion"; file Articles of Conversion + new
|
||||
Nevada charter (NRS 78).
|
||||
- **Florida:** F.S. 607.11921+ conversion.
|
||||
Both DE-out and new-state-in filings are required. The entity keeps its identity,
|
||||
contracts, and history.
|
||||
- **(B) Reincorporation merger** (older method, what FG Financial used): form a new
|
||||
NV/TX subsidiary and merge the DE parent INTO it. Requires an Agreement and Plan
|
||||
of Merger + stockholder vote. More moving parts; still common.
|
||||
|
||||
### Steps a real DEXIT order involves (none automated yet)
|
||||
1. **Diagnose**: pull the entity's current DE status, authorized shares (to estimate
|
||||
the franchise tax saving), good-standing, foreign qualifications.
|
||||
2. **Board + stockholder approval**: a board resolution and (usually) a stockholder
|
||||
vote/consent approving the conversion or merger. **This needs the client's counsel
|
||||
- it is NOT something we file.** Our role is to prepare the plan-of-conversion /
|
||||
plan-of-merger documents for their counsel to review and their board to adopt.
|
||||
3. **Pay DE to leave**: DE requires the franchise tax to be **current** before it
|
||||
will accept the Certificate of Conversion (you can't leave owing tax). So step 0
|
||||
is often "file/pay the final DE franchise tax + annual report."
|
||||
4. **File the conversion**: Certificate of Conversion OUT of DE (DGCL 266) +
|
||||
Certificate of Conversion/Formation INTO the destination state. Both have fees.
|
||||
5. **New registered agent** in the destination state (recurring; we use Northwest RA).
|
||||
6. **First annual report / state list** in the new state (NV requires an Initial List
|
||||
+ State Business License at formation/domestication; TX has the Public Information
|
||||
Report / franchise tax with the ~$2.47M no-tax-due threshold).
|
||||
7. **Update downstream**: foreign-qualification re-registration in states where the
|
||||
company operates (the domestication may need to be reflected), update the transfer
|
||||
agent / DTC, update EDGAR (state-of-incorporation on the next cover page), bank, etc.
|
||||
|
||||
### EIN reality
|
||||
- A **conversion/domestication generally KEEPS the same EIN** - the IRS treats a mere
|
||||
change of state of incorporation (same entity continuing) as not requiring a new
|
||||
EIN in most cases. So our `ein_worker` (which obtains a NEW EIN) is the wrong tool
|
||||
for a move; for a conversion we typically do nothing with the EIN, or at most file a
|
||||
name/address change with the IRS.
|
||||
- A **reincorporation MERGER into a new subsidiary** can be different: if the surviving
|
||||
entity is genuinely new, the IRS may require a new EIN. This is a fact-specific,
|
||||
counsel-driven determination - **we should not auto-decide it.**
|
||||
- Net: EIN handling for a move is **advisory + occasionally a name/address update**,
|
||||
not the automated SS-4 flow we have.
|
||||
|
||||
### Why we can't fully automate the move
|
||||
Unlike a fresh formation, a conversion is **counsel-gated** (board/stockholder
|
||||
approval, plan-of-conversion review) and **DE-clearance-gated** (must be current on
|
||||
franchise tax). The honest product is **admin-assisted**: we prepare and file the
|
||||
state paperwork and set up RA + first annual report; the client's lawyer handles the
|
||||
corporate-approval documents. That matches how the DEXIT page is already written
|
||||
("your counsel just reviews the board and stockholder consent").
|
||||
|
||||
## Complication: the company has foreign qualifications in other states
|
||||
|
||||
This is common and important. A Delaware corp that operates in California, New York,
|
||||
Texas, etc. is "foreign qualified" (registered as a foreign entity / has a Certificate
|
||||
of Authority) in each of those states. When it domesticates DE -> NV/TX, every one of
|
||||
those foreign registrations is affected. Getting this wrong means the company is
|
||||
suddenly doing business unregistered in states where it operates - default judgments,
|
||||
loss of court access, penalties. So this is part of the core offer, not an afterthought.
|
||||
|
||||
### What actually has to happen to the foreign registrations
|
||||
After a conversion/domestication, the entity is the *same legal person* but its
|
||||
**home (domestic) state changed**. In each state where it was foreign-qualified:
|
||||
- **The state where it is moving TO** (say it domesticates to Texas but was foreign
|
||||
qualified in Texas): the foreign registration must be **withdrawn/cancelled** because
|
||||
the company is now a *domestic* Texas entity - you cannot be both foreign and
|
||||
domestic in the same state. (This is exactly why ~zero of our OTC sample were
|
||||
TX-incorporated even when TX-based: they were DE corps foreign-qualified in TX.)
|
||||
- **Every OTHER state it was qualified in** (CA, NY, FL, etc.): the foreign
|
||||
qualification generally **stays in place but must be updated** to reflect the new
|
||||
state of incorporation and (often) a new formation date / charter document. States
|
||||
differ:
|
||||
- Some accept an **amendment to the foreign registration** (file an amended
|
||||
Application for Authority / Statement of Change reflecting the new domestic state).
|
||||
- Some require you to **withdraw the old foreign registration and re-file a new one**
|
||||
from the new home state.
|
||||
- A handful treat the domestication as a non-event if the name + identity are
|
||||
unchanged, requiring only an informational update at the next annual report.
|
||||
- **Name conflicts** can surface: a name available to a DE corp as "foreign" in a state
|
||||
might collide on re-domestication; we should run name availability in each qualified
|
||||
state as part of the move.
|
||||
|
||||
### Good news: we already have the building block
|
||||
We have a working **foreign-qualification** capability:
|
||||
- SKUs `foreign-qualification-single` ($149 + state fee) and `foreign-qualification-multi`
|
||||
(discounted per-state), `ForeignQualificationHandler` that **fans out per state**,
|
||||
a `state_registrations`/foreign-qual schema (migration 066/073), and the same
|
||||
formation state-adapter pool. So re-qualifying or amending in N states reuses
|
||||
existing plumbing - we don't build it from scratch.
|
||||
- What's missing is the **amend / withdraw** modes (the handler today is oriented to
|
||||
*new* registration), and an intake step that asks "which states are you currently
|
||||
foreign-qualified in?" so we can fan the move out across them.
|
||||
|
||||
### Product implication
|
||||
The conversion offer should be **multi-part and priced per state touched**:
|
||||
1. Core domestication (DE-out + new-state-in) - the base fee.
|
||||
2. For each state the company is foreign-qualified in: an **amend / re-qualify /
|
||||
withdraw** line item (reuse foreign-qualification per-state pricing).
|
||||
3. Withdraw the now-redundant foreign registration in the destination state if one
|
||||
existed.
|
||||
4. Update the registered agent in each affected state where we maintain it.
|
||||
|
||||
This is also a **revenue multiplier**: a single DE corp qualified in 5 states is one
|
||||
domestication + ~5 foreign-qual amendments + recurring RA/annual-report in each. But
|
||||
it must be scoped at intake - we have to ASK for the list of states up front, estimate
|
||||
per-state, and disclose that government fees vary and are billed at cost.
|
||||
|
||||
### Intake + data we must capture for a move
|
||||
- current domestic state (DE), destination state (NV/TX/FL), entity type
|
||||
- entity name + EIN (kept), current good-standing + franchise-tax status in DE
|
||||
- **the full list of states where the company is foreign-qualified** (and its DBA/
|
||||
assumed names in each) - this drives the per-state fan-out
|
||||
- where it actually operates / has nexus (to advise whether to keep each qualification)
|
||||
- whether counsel is handling the board/stockholder consent (always yes)
|
||||
|
||||
## Recommended build plan (generic corporate flow + a "move" capability)
|
||||
Keep it generic, not DEXIT-specific:
|
||||
|
||||
1. **Catalog SKUs** (in `api/src/service-catalog.ts`):
|
||||
- `entity-conversion` (move a company; admin-assisted; flat service fee + state
|
||||
gov fees billed at cost; destination state chosen at intake).
|
||||
- Confirm `corp-formation` / `llc-formation` carry per-state gov_fee.
|
||||
- `annual-report-filing` for corporate (today it points at the trucking handler).
|
||||
2. **Order type**: add `order_type: "entity_conversion"` to checkout + a
|
||||
`from_state` / `to_state` / `entity_type` intake, persisted in `formation_orders`
|
||||
(or a sibling table). Reuse the Stripe + ERPNext SO path.
|
||||
3. **Fulfillment**: a `ConversionHandler` (admin-assisted) that:
|
||||
(a) runs name availability in the destination state (existing name-search),
|
||||
(b) generates the plan-of-conversion + new-state charter draft for client/counsel,
|
||||
(c) queues the DE-out + destination-in filings for the formation_worker once the
|
||||
signed board/stockholder consent + DE good-standing are confirmed,
|
||||
(d) sets up RA + files the first annual report/state list.
|
||||
4. **E2E test harness**: a scripted run that does name search -> creates a paid test
|
||||
order -> verifies `formation_orders` row + ERPNext SO + worker pickup, with the
|
||||
actual state filing stubbed/sandboxed so we don't make a real filing during tests.
|
||||
5. **Verify NV/TX formation e2e FIRST** (smaller scope) before layering conversion on
|
||||
top, since conversion reuses the same filing + ERPNext + worker plumbing.
|
||||
|
||||
## Bottom line
|
||||
- The page is fine to ship as **lead-gen** (estimate request), which is what it does.
|
||||
- We are **not** ready for a self-serve "buy a DE->NV/TX move" checkout. New NV/TX
|
||||
formation is close but unverified e2e; the conversion ("move") flow and corporate
|
||||
annual-report automation do not exist yet.
|
||||
- Next concrete step (if you want to proceed): verify NEW NV/TX formation e2e, then
|
||||
build the generic `entity-conversion` SKU + admin-assisted handler on the existing
|
||||
formation plumbing.
|
||||
|
|
@ -194,20 +194,36 @@ DOCX to PDF conversion uses a two-tier approach:
|
|||
|
||||
### PRIMARY: Windows DocServer (Microsoft Word COM)
|
||||
|
||||
A Windows server runs a Flask-based DocServer at `:5050` that uses Microsoft Word via COM
|
||||
automation for pixel-perfect DOCX → PDF conversion. This produces the highest-fidelity
|
||||
output (exact font rendering, correct page breaks, proper table formatting).
|
||||
A Windows server runs `docserver_worker.py` that uses Microsoft Word via COM
|
||||
automation for pixel-perfect DOCX → PDF conversion. This produces the highest-
|
||||
fidelity output (exact font rendering, correct page breaks, proper table
|
||||
formatting).
|
||||
|
||||
The transport is **MinIO, not HTTP** — the Windows VM only makes **outbound**
|
||||
connections to MinIO, so there are no open inbound ports / SSH tunnels and it
|
||||
works behind any NAT:
|
||||
|
||||
```text
|
||||
pdf_converter.py (Linux) MinIO (S3) docserver_worker.py (Windows)
|
||||
PUT docx → to-convert/{id}.docx ─────────► │
|
||||
│◄─ poll every 12s ───────┤
|
||||
│ ├─ Word.SaveAs → PDF
|
||||
GET pdf ← converted/{id}.pdf ◄──────────│◄─ PUT converted/{id}.pdf┘
|
||||
DEL docx / DEL pdf (cleanup)
|
||||
```
|
||||
|
||||
```python
|
||||
# pdf_converter.py — primary path
|
||||
response = requests.post(
|
||||
f"http://{DOCSERVER_HOST}:5050/convert",
|
||||
files={"file": open(docx_path, "rb")},
|
||||
timeout=60,
|
||||
)
|
||||
pdf_bytes = response.content
|
||||
# pdf_converter.py — primary path (simplified)
|
||||
mc.put_object(bucket, f"to-convert/{job_id}.docx", docx_stream, length)
|
||||
# ...poll until converted/{job_id}.pdf appears (DOCSERVER_TIMEOUT, default 120s)...
|
||||
pdf_bytes = mc.get_object(bucket, f"converted/{job_id}.pdf").read()
|
||||
```
|
||||
|
||||
The Windows worker is **self-healing**: it retries MinIO with backoff instead of
|
||||
exiting on a transient outage, and its `PW-DocserverWorker` scheduled task
|
||||
restarts on failure plus re-fires every 5 minutes if the process dies. See
|
||||
`docserver/README.md` → "Reliability / self-healing".
|
||||
|
||||
### FALLBACK: LibreOffice Headless
|
||||
|
||||
If DocServer is unavailable (network error, timeout, Windows server down), the converter
|
||||
|
|
|
|||
|
|
@ -163,16 +163,25 @@ Write `scripts/tests/e2e_crtc_pipeline.py`:
|
|||
|
||||
### DocServer Investigation
|
||||
|
||||
Word COM fails under SYSTEM account and "Run whether user is logged on or not" mode.
|
||||
Requires interactive desktop session (RDP login). Auto-logon configured (registry keys set)
|
||||
but blocked by hosting provider's Windows Server 2019 policy.
|
||||
As of 2026-06, the worker runs fine under the SYSTEM account in session 0 on
|
||||
this Windows Server 2019 box (Word COM initialises and converts normally), so the
|
||||
old "requires an interactive RDP login" workaround is no longer needed for normal
|
||||
operation. It is **self-healing**:
|
||||
|
||||
**Workaround:** RDP into the VM once after reboot → AtLogOn trigger fires → Word COM works.
|
||||
LibreOffice fallback handles conversions automatically when DocServer is unavailable.
|
||||
- It retries the MinIO connection with backoff instead of `sys.exit(1)`, so a
|
||||
transient MinIO 502 / outage no longer kills it (that was the cause of a
|
||||
multi-week outage in May 2026).
|
||||
- The `PW-DocserverWorker` task restarts on failure (99×/1 min) and has a
|
||||
5-minute repeating safety trigger (`MultipleInstances=IgnoreNew`), so a crash
|
||||
or missed boot trigger self-recovers within ~5 min without a reboot/RDP.
|
||||
|
||||
LibreOffice fallback still handles conversions automatically if DocServer is ever
|
||||
unavailable. See `docserver/README.md` → "Reliability / self-healing".
|
||||
|
||||
### Known Limitations
|
||||
|
||||
1. **DocServer** — requires RDP login after cold reboot (auto-logon blocked by hosting provider)
|
||||
1. **DocServer** — self-healing (auto-restarts on MinIO outage/crash); RDP only
|
||||
needed if Word COM itself breaks (DCOM misconfig → run `fix_dcom.bat`)
|
||||
2. **eSign JWT** — test uses different secret than dev API; falls back to PG simulation
|
||||
3. **Compliance Calendar** — DocType not imported to ERPNext; 417 error on query
|
||||
4. **ERPNext screenshots** — Playwright can't log into ERPNext from Docker (login page structure)
|
||||
|
|
|
|||
|
|
@ -115,3 +115,251 @@ echo $(( ($(date +%s) - $(sudo cat /etc/postfix/pw-warmup-start)) / 86400 ))
|
|||
- `/etc/postfix/main.cf.bak.*`
|
||||
- `/etc/postfix/transport.bak.*`
|
||||
- `/usr/local/bin/pw-mta-warmup.bak.*`
|
||||
|
||||
## Incident: Jun 17 2026 — campaign mail sent UNSIGNED (no DKIM)
|
||||
|
||||
**Symptom:** "no new sales." Campaigns were sending (~3-4k/day) but delivery was
|
||||
~23% (sent 1,802 vs deferred 5,143 + bounced 580), Gmail returned `550-5.7.1
|
||||
likely unsolicited mail`, and there were **zero clicks since Jun 8** despite
|
||||
~600 opens/day.
|
||||
|
||||
**Root cause:** OpenDKIM was signing **nothing** that came from Listmonk.
|
||||
`/etc/opendkim.conf` was in single-key mode with **no `InternalHosts`**, so it
|
||||
defaulted to signing only `127.0.0.1`. Cron/transactional mail is injected
|
||||
locally (127.0.0.1) so it WAS signed — but campaign mail is injected over the
|
||||
Docker bridge from the Listmonk containers (`172.18.0.5` trucking,
|
||||
`172.18.0.25` healthcare). Those clients were not "internal," so OpenDKIM
|
||||
*verified* (instead of *signed*) them: every cold email went out **unsigned**.
|
||||
Since Feb 2024 Gmail/Yahoo require DKIM on bulk mail, so unsigned campaigns were
|
||||
junked/blocked. Proof: `2,620` campaign messages that day, `0` "DKIM-Signature
|
||||
field added" events, while the every-5-min cron mail was signed.
|
||||
|
||||
The correct table files already existed (`/etc/opendkim/{key.table,
|
||||
signing.table,trusted.hosts}`, and `trusted.hosts` already listed
|
||||
`172.16.0.0/12`) — they were simply **never wired into `opendkim.conf`**.
|
||||
|
||||
**Fix (now codified in Ansible `roles/mail`):** point `opendkim.conf` at the
|
||||
tables and set the signing scope —
|
||||
```
|
||||
KeyTable refile:/etc/opendkim/key.table
|
||||
SigningTable refile:/etc/opendkim/signing.table
|
||||
InternalHosts /etc/opendkim/trusted.hosts # includes 172.16.0.0/12 (Docker)
|
||||
ExternalIgnoreList /etc/opendkim/trusted.hosts
|
||||
OversignHeaders From
|
||||
```
|
||||
then `systemctl restart opendkim`. This fixes BOTH streams at once: the
|
||||
healthcare submission instances (ports 2526-2528) inherit the global
|
||||
`smtpd_milters` and the `*@performancewest.net` signing table covers
|
||||
`compliance@`. Verified by injecting a message from a Docker IP through both
|
||||
port 25 and port 2526 and confirming "DKIM-Signature field added" for each.
|
||||
|
||||
**Verify DKIM is actually signing campaign mail:**
|
||||
```bash
|
||||
# Should be NON-ZERO and roughly track campaign volume:
|
||||
sudo journalctl -u opendkim --since today | grep -c 'DKIM-Signature field added'
|
||||
# Cross-check: campaign cleanup events today (should be similar order of magnitude)
|
||||
sudo grep "^$(date '+%b %e')" /var/log/mail.log | grep -c postfix/cleanup
|
||||
# Key still matches published DNS:
|
||||
sudo opendkim-testkey -d performancewest.net -s mail -vvv # expect "key OK"
|
||||
```
|
||||
|
||||
**Still TODO from this incident (list quality + content, not yet done):**
|
||||
- Throttle/pause Gmail until reputation recovers (`550-5.7.1` was still firing).
|
||||
The trucking ramp/cap (`pw-listmonk-rampcap`) currently holds at 200/h and the
|
||||
builder excludes the big-MX operators (Google/Microsoft/...) until warmup
|
||||
day 30; revisit once reputation recovers.
|
||||
- Dead M365 tenant scrub: HC defers are mostly `451 4.4.4` against dead M365
|
||||
tenants + `421` LuxSci throttle. Identify and suppress dead tenants.
|
||||
|
||||
### Re-send of the never-delivered (unsigned) audience — Jun 22 2026
|
||||
|
||||
The ~79k cold sends made during the broken window (Jun 1 - Jun 18 00:31 UTC) were
|
||||
stamped `listmonk_sent_at` at send time, so the builder permanently excluded them
|
||||
even though they were junked/blocked unsigned. With DKIM now fixed we re-send to
|
||||
the now-deliverable subset, **excluding Gmail** (Google consumer reputation is
|
||||
still recovering) but **including Microsoft/Hotmail** (the bulk of the list).
|
||||
|
||||
What was done (all reversible):
|
||||
1. `MAIN_EXCLUDE_OPERATORS` env override added to the builder (commit `5a3063e`):
|
||||
when set it REPLACES the default `WARMUP_EXCLUDE_OPERATORS`. Set to `google` in
|
||||
the `workers` service env so cold sends go to everything except Google, driving
|
||||
both the SQL exclude and the per-operator daily cap (google cap=0, others 120).
|
||||
2. Backed up the reset target to `performancewest.resend_dkim_backup_20260622`
|
||||
(6,461 rows = broken-window AND `email_verify_result IN (smtp_valid,
|
||||
send_confirmed)` AND `mx_provider <> google`), then `UPDATE fmcsa_carriers SET
|
||||
listmonk_sent_at = NULL` for exactly those rows so the builder re-queues them.
|
||||
3. Ran the builder with `--send-hour 17 --send-minute 30` (the default per-tz hours
|
||||
09-12 UTC were already past; **Listmonk rejects a past `send_at` with HTTP 400
|
||||
"Scheduled date should be in the future"** — always override the hour for a
|
||||
same-day manual re-run after the normal window). Result: 30 campaigns,
|
||||
queued_recipients=3000 (warmup cap), ~2,999 re-stamped. Provider mix: Microsoft
|
||||
1,272 / Comcast / Charter / Proofpoint / long-tail; **zero Google**.
|
||||
|
||||
The remaining ~3.5k of the 6,461 backup set drain on subsequent daily runs under
|
||||
the same cap. To revert a row: `UPDATE fmcsa_carriers c SET listmonk_sent_at =
|
||||
b.old_listmonk_sent_at FROM resend_dkim_backup_20260622 b WHERE c.dot_number =
|
||||
b.dot_number;`. To resume normal warmup exclusion later, unset
|
||||
`MAIN_EXCLUDE_OPERATORS` (reverts to Google+Microsoft+consumer-MX held to day 30).
|
||||
|
||||
### Incident: Jun 22 2026 — `@TrackLink` on per-subscriber CTAs = 404 + collapse
|
||||
|
||||
**Symptom.** The trucking "deficiency" CTA buttons (the primary order link and the
|
||||
secondary DOT-check link) rendered as Listmonk tracking redirects
|
||||
(`https://lists.performancewest.net/link/<uuid>/...`) that **404'd**. The redirect
|
||||
target (registered in `links.url`) was `https://performancewest.net/order/boc3-filing&utm_source=...`
|
||||
— note the `&` with **no `?`** — an invalid URL.
|
||||
|
||||
**Root cause.** Listmonk's `@TrackLink` marker registers **one static URL per
|
||||
tracked link** and points every recipient's `/link/<uuid>` redirect at that single
|
||||
row. This is fundamentally incompatible with a **per-subscriber** href such as
|
||||
`{{ .Subscriber.Attribs.lp_link }}&utm_source=...`:
|
||||
- The registered `links.url` was captured with the `{{ lp_link }}` token dropped,
|
||||
yielding `/order/slug&utm_source=...` (first `&`, no `?`) → **404 for everyone**.
|
||||
- Even if the URL had been valid, a static registration **collapses every carrier
|
||||
onto the first subscriber's** `?dot=` (or `?npi=`/`?clia=`) value — wrong order
|
||||
pre-fill for the entire blast.
|
||||
|
||||
By contrast, a **static** CTA (same URL for all recipients, e.g. the CRTC
|
||||
`?code=...` order link) tracks correctly — keep `@TrackLink` there.
|
||||
|
||||
**Why removing tracking loses nothing.** Real human clicks are already attributed
|
||||
via Umami's `campaign-click` event (bot-filtered by `pw-bot-filter.js`). Listmonk's
|
||||
own click counters were already established as unreliable for this stream. So
|
||||
Listmonk link tracking on per-subscriber CTAs is both redundant and destructive.
|
||||
|
||||
**Fix — live (already-sent + in-flight mail).** Rewrote the 10 broken registered
|
||||
rows in place (replace the first `&` with `?`) so the baked `/link/<uuid>` redirects
|
||||
resolve. Backup table `listmonk.pw_links_dkim_fix_bak_20260622` holds the old urls.
|
||||
Verified the exact redirect that 404'd now returns 200 → lands on the (generic,
|
||||
DOT-not-prefilled but fully functional) order page. To revert:
|
||||
```sql
|
||||
UPDATE links l SET url = b.url
|
||||
FROM pw_links_dkim_fix_bak_20260622 b WHERE l.id = b.id; -- in the `listmonk` DB
|
||||
```
|
||||
|
||||
**Fix — source (future builds, the real fix).** Stripped `@TrackLink` from every
|
||||
**per-subscriber / per-provider** CTA so each row renders its own direct link (no
|
||||
redirect, no collapse). Files changed:
|
||||
- `scripts/create_deficiency_source_campaigns.py` — `_cta()` (lp_link order button)
|
||||
and `_dot_check_cta()` (per-DOT tools link).
|
||||
- `data/trucking_campaigns/{ucr_annual_reminder,ifta_quarterly_reminder}.html`
|
||||
(per-carrier `lp_link`).
|
||||
- `data/hc_campaigns/*.html` (10 templates, per-provider `?npi=`/`?clia=`).
|
||||
`lp_link` already starts its query with `?dot=` (see `lp_link_with_coupon()`), so
|
||||
`{{ lp_link }}&utm...` renders to a valid per-carrier URL once the redirect is gone.
|
||||
|
||||
**Healthcare note.** The HC Listmonk DB (`listmonk_hc`) had **0 registered links**
|
||||
despite 13,425 sent — `@TrackLink` was not being stripped there at all, so the
|
||||
literal `@TrackLink` shipped as harmless trailing text in `utm_campaign` and the
|
||||
hrefs still 200'd (per-provider `?npi=` was present literally in the template, not
|
||||
via lp_link). No live HC breakage; source templates cleaned anyway to remove the
|
||||
collapse risk on the next send.
|
||||
|
||||
**Guardrail.** Never put `@TrackLink` on an href containing a `{{ .Subscriber... }}`
|
||||
token. Per-subscriber links must render directly; rely on Umami `campaign-click`
|
||||
for human-click attribution.
|
||||
|
||||
|
||||
### Follow-up hardening — DONE (Jun 17-18 2026)
|
||||
|
||||
All discovered during the post-incident technical audit; each fix is codified.
|
||||
|
||||
1. **OpenDKIM not signing** — fixed + codified in Ansible `roles/mail`
|
||||
(commit `4d59019`). Foundational fix above.
|
||||
2. **`mail.log` unbounded (~1 GB, no logrotate)** — this host logs via Postfix's
|
||||
built-in `postlogd` (no rsyslog), so a rename+create would strand the open
|
||||
inode. Added a `copytruncate` logrotate rule (daily, 14-day, compressed) to
|
||||
`roles/mail` (commit `2e4388a`). Applied live, 1 GB archive compressed.
|
||||
3. **Plaintext (altbody) MIME part** — all campaigns were HTML-only (a spam-score
|
||||
signal; Listmonk only emits multipart/alternative when altbody is set). New
|
||||
`scripts/_email_plaintext.py` renders a text/plain part from the HTML body
|
||||
(preserves Listmonk template tags, links -> "text (url)"); wired into the
|
||||
trucking builder (and thus UCR + IFTA) and the healthcare builder. Tests:
|
||||
`scripts/test_email_plaintext.py`. Commits `a32a3b0`, `4664601`.
|
||||
4. **`@localhost.localdomain` Message-IDs** — Listmonk derived the Message-ID
|
||||
from the random Docker container id. Pinned both listmonk + listmonk-hc
|
||||
`hostname: perfwest.performancewest.net` in `docker-compose.yml` (matches the
|
||||
SMTP `hello_hostname`). Commit `a32a3b0`.
|
||||
5. **Dead/legacy/satellite ISP scrub** — added `DEAD_ISP_DOMAINS` (52 domains,
|
||||
identified from our own Listmonk bounce table) to `BLOCKED_EMAIL_DOMAINS` in
|
||||
`_email_exclusions.py`, so every builder that imports it stops cold-mailing
|
||||
them. Deliberately keeps still-active large consumer ISPs (comcast/charter/
|
||||
cox/centurylink) — their bounces were the no-DKIM problem, not dead mailboxes.
|
||||
Commit `c183957`.
|
||||
6. **`deploy@performancewest.net` self-bounce** — the deploy user's crontab held
|
||||
3 jobs (payment_reminder, amb_location_scraper, renewal_worker) that are
|
||||
EXACT duplicates of systemd timers in the `worker-crons` role AND redirected
|
||||
to `/var/log` (which deploy cannot write), so they failed and cron mailed the
|
||||
error to `deploy@` (no mailbox -> self-bounce). Removed the redundant deploy
|
||||
crontab (backed up to `logs/deploy-crontab.bak.*`); the systemd timers carry
|
||||
the work. No IaC change needed (Ansible never created that crontab).
|
||||
7. **Entire campaign pipeline was not in IaC** — the campaign cron builders, IP
|
||||
warmup/ramp helpers, and bounce watchers lived ONLY on the host. New Ansible
|
||||
`mail-pipeline` role + `playbooks/deploy-mail-pipeline.yml` deploy them all
|
||||
from the canonical repo copies (`infra/cron/`, `infra/postfix/`,
|
||||
`infra/monitoring/`, `infra/systemd/`, `scripts/*bounce*`). Commit `4dc5690`.
|
||||
8. **Telecom + transactional email was also HTML-only** — the campaign-builder
|
||||
plaintext fix (#3) only covered Listmonk mass-mail. The telecom/filing/
|
||||
customer-transactional path (499-Q reminders, RMD/FCC filing review links,
|
||||
intake/completion/delivery/commission emails, order confirmations) builds its
|
||||
own `MIMEMultipart` / nodemailer messages, and ~17 of them attached ONLY an
|
||||
HTML part — a malformed single-part `multipart/alternative` and a spam signal.
|
||||
Fixed at the source so all callers are covered:
|
||||
- `scripts/workers/worker_email.py` `send_worker_email()` now auto-derives the
|
||||
text/plain part from HTML via `_email_plaintext.html_to_text` when the
|
||||
caller omits `text=`.
|
||||
- 16 rolled-their-own Python senders (`scripts/workers/**`, `scripts/formation/
|
||||
document_delivery.py`) attach an `html_to_text(...)` plaintext sibling
|
||||
before the HTML part (`job_server` + `document_delivery` wrap text+html in an
|
||||
`alternative` sub-part so PDF/DOCX still attach to the `mixed` root).
|
||||
- `api/src/email.ts` gained a dependency-free `htmlToText()` and `sendEmail`
|
||||
now defaults `text` to it (covers checkout/webhook HTML-only sends).
|
||||
NB: telecom campaigns themselves are still **manually** created+sent in the
|
||||
Listmonk UI (no send automation; `compliance_alert_list.py` /
|
||||
`rmd_deficiency_campaign.py` only populate lists). The one telecom send to
|
||||
date — campaign 407 "FCC Deficiency Report - FREEDOM249", Jun 08 — was
|
||||
HTML-only AND sent inside the DKIM-broken window: 384 sent / 343 views / **0
|
||||
clicks** (the same junked-mail signature as the trucking blasts). Any future
|
||||
telecom UI campaign should set an altbody (Listmonk "Plain text" toggle) and
|
||||
run through the same dead-ISP/suppression hygiene. Commit `b375385`.
|
||||
|
||||
## INCIDENT 2026-06-24: warmed sending IPs dropped off the interface after reboot
|
||||
|
||||
**Impact:** ~37h of degraded deliverability + a near-zero sales day (Jun 24 04:04 -> Jun 25 17:25). Root cause was infrastructure, not reputation.
|
||||
|
||||
**What happened.** An unattended kernel upgrade rebooted the host at Jun 24 04:04
|
||||
(6.12.90 -> 6.12.94). The warmed sending IPs `.94` (trucking/out05) and `.107`
|
||||
(HC/hcout1) are defined in `/etc/network/interfaces`, but **classic ifupdown
|
||||
(0.8.44) only applies the FIRST `address` line per stanza** -- so only `.71`
|
||||
(the primary) came back up. Postfix's `smtp_bind_address=.94/.107` then failed
|
||||
with `warning: smtp_connect_addr: bind ...: Cannot assign requested address` and
|
||||
**silently fell back to egressing from `.71`**. `.71` is (a) NOT in the SPF
|
||||
record (`v=spf1 ... ip4:.94 ip4:.107 -all`) so every fallback message **failed
|
||||
SPF**, and (b) listed on **RLR621** + **Trend Micro ERS-QIL**, so receivers
|
||||
deferred them (`451 ... blacklisted - RLR621 - ip=<207.174.124.71>`). Net: the
|
||||
IP warming was bypassed and mail either failed SPF or got reputation-deferred.
|
||||
|
||||
**Detection.** Tail of `/var/log/mail.log` showed `Cannot assign requested
|
||||
address` (16,993 in one log) + deferrals citing `ip=<207.174.124.71>`.
|
||||
`ip -4 addr show ens18` showed only `.71` bound (missing `.72/.94/.107`).
|
||||
`last reboot` pinned the start to the 04:04 boot. Major RBLs (Spamhaus ZEN/DBL,
|
||||
Barracuda, SpamCop, SORBS) were still **clean** for `.94/.107` and the domain --
|
||||
RLR621/ERS-QIL are proprietary soft listings keyed off `.71`/HELO and age off.
|
||||
|
||||
**Fix (all applied 2026-06-25 ~17:25 CDT).**
|
||||
1. Re-bound live: `ip addr add 207.174.124.{72,94,107}/23 dev ens18`, then `postqueue -f`.
|
||||
2. Reboot-persistence in `/etc/network/interfaces`: added explicit
|
||||
`up/down ip addr add/del ...` hooks for the 3 secondaries (classic ifupdown
|
||||
ignores 2nd+ `address` lines; the hooks are honored). Backup at
|
||||
`/etc/network/interfaces.bak-*`.
|
||||
3. Belt-and-suspenders systemd oneshot `pw-mail-ips.service` (in repo at
|
||||
`infra/mail/pw-mail-ips.service`) re-binds the IPs + flushes the queue on boot.
|
||||
4. Watchdog cron `*/5` `pw-mail-ip-watchdog` (repo `infra/mail/`) re-binds any
|
||||
missing sending IP and flushes if it had to act or sees `Cannot assign` lines.
|
||||
|
||||
**Lesson / TODO.** The host does unattended-upgrade reboots ~weekly (seen
|
||||
05-25, 05-30, 06-24, all ~04:04). Any IP/transport change must be reboot-tested.
|
||||
Consider migrating ifupdown -> netplan with all addresses, or pin
|
||||
`unattended-upgrades` to skip auto-reboot. The `mail_reputation_monitor.py`
|
||||
attributes egress to `.71` as "transactional default" -- after this incident, a
|
||||
spike of `.71` egress in the bulk streams is itself an alarm.
|
||||
|
|
|
|||
|
|
@ -137,7 +137,11 @@
|
|||
- Same Listmonk infrastructure as FCC campaigns
|
||||
- Warmup schedule (200/day → ramp up)
|
||||
- Link to DOT compliance checker with `?dot={DOT#}&email={email}` pre-filled
|
||||
- Use `@TrackLink` on all CTAs (learned from FCC campaign mistake)
|
||||
- Use `@TrackLink` ONLY on **static** CTAs (same URL for all recipients). NEVER on
|
||||
a per-subscriber href such as `{{ lp_link }}` / `?dot={DOT#}` — Listmonk registers
|
||||
one static URL per tracked link and would 404 + collapse every carrier onto one
|
||||
DOT (see runbook "Jun 22 2026 — @TrackLink on per-subscriber CTAs"). Per-subscriber
|
||||
links render directly; human clicks are tracked via Umami `campaign-click`.
|
||||
- Free compliance check as the CTA (not direct sell)
|
||||
|
||||
## Phase 5: Automation (Future)
|
||||
|
|
@ -195,3 +199,15 @@ FMCSA QCMobile API ← /api/v1/dot/lookup (real-time per carrier)
|
|||
- **Email outreach to 1.5M+ carriers** with specific deficiency data
|
||||
- **Lower pricing** through automation (no manual data entry)
|
||||
- **Bundled services** (telecom + trucking for carriers that do both)
|
||||
|
||||
## IRP filing — known follow-ups (2026-06)
|
||||
|
||||
- **POA signer name/title on auto-signed orders**: dot-compliance-remediation
|
||||
orders auto-sign the state-trucking authorization without capturing the
|
||||
signer's printed name/title, so the POA PDF attached to IRP submissions has a
|
||||
blank printed-name/title (the date IS rendered). We are sending these as-is to
|
||||
see if base states accept them; if a state rejects for an incomplete POA,
|
||||
capture signer_name/signer_title in the remediation auth flow (or re-issue the
|
||||
POA for signature) before submitting. Code: state_trucking_authorization.py
|
||||
(template has name/title/date fields + a date anchor), esign_stamp.py (stamps
|
||||
signature + date).
|
||||
|
|
|
|||
|
|
@ -238,7 +238,7 @@ Flags for support conversations (escalation, priority, category).
|
|||
- Converts via Word COM, drops PDF in `converted/` bucket
|
||||
- Heartbeat file at `minio://performancewest/docserver-heartbeat.json` (60s interval)
|
||||
- Atomic uploads via `.tmp_` prefix + `copy_object` rename
|
||||
- Task Scheduler: `PW-DocserverWorker` — auto-restart on failure
|
||||
- Task Scheduler: `PW-DocserverWorker` — self-healing: restarts on failure (99×/1 min) + AtStartup and a 5-min repeating trigger (relaunches within ~5 min if the process dies). The worker also retries MinIO on outage instead of exiting.
|
||||
- **Fallback:** LibreOffice headless (`soffice --headless --convert-to pdf`) auto-activates when DocServer heartbeat stale (>5 min)
|
||||
- **E2E tested:** 36KB DOCX → 82KB PDF in 12 seconds total round-trip
|
||||
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@
|
|||
## PRIORITY 7 — Listmonk (Email Marketing) ~~COMPLETE~~
|
||||
|
||||
- [x] Deploy Listmonk at lists.performancewest.net (Docker, PostgreSQL-backed)
|
||||
- [x] Configure SMTP2GO outbound email (separate from Carbonio transactional SMTP)
|
||||
- [x] Configure Listmonk mass-mail via the local Postfix MTA (SMTP2GO decommissioned; separate from Carbonio transactional SMTP)
|
||||
- [x] Import 10,191 FCC RMD contacts into Listmonk (3 subscriber lists)
|
||||
- [x] Configure bounce processing via POP3 from Carbonio (bounces@performancewest.net)
|
||||
- [x] Create 22 scheduled campaigns across 4 lists
|
||||
|
|
|
|||
23
docs/hc-reval-already-completed-reply.txt
Normal file
23
docs/hc-reval-already-completed-reply.txt
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
SUBJECT: Re: Your Medicare revalidation — thank you for confirming
|
||||
|
||||
Hi {{first name}},
|
||||
|
||||
Thank you for letting us know, and congratulations on completing your
|
||||
revalidation. We have noted it and removed your practice from any further
|
||||
revalidation reminders.
|
||||
|
||||
For context: our notice was based on the CMS public Medicare Revalidation
|
||||
Due Date List, which CMS refreshes periodically. There is often a lag of
|
||||
several weeks between when a provider's revalidation is approved and when CMS
|
||||
updates that public list, so a recently completed revalidation can still show
|
||||
as due in the published data. That appears to be exactly what happened here.
|
||||
|
||||
No action is needed on your part. If we can ever help with NPI/NPPES updates,
|
||||
enrollment, reactivation, or OIG/SAM exclusion screening, we are glad to assist.
|
||||
|
||||
Thank you again for the heads-up, and apologies for any confusion.
|
||||
|
||||
Best regards,
|
||||
Performance West Compliance
|
||||
(888) 411-0383 · info@performancewest.net
|
||||
Performance West is an independent compliance firm, not affiliated with CMS or Medicare.
|
||||
126
docs/healthcare-competitive-pricing.md
Normal file
126
docs/healthcare-competitive-pricing.md
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
# Healthcare services — competitive pricing research
|
||||
|
||||
**Date:** 2026-06-20
|
||||
**Purpose:** Benchmark our healthcare compliance prices against what other firms
|
||||
charge, to inform email copy (price removal), landing-page pricing, and offer design.
|
||||
|
||||
## Methodology & honest caveat
|
||||
|
||||
Automated web search (Google / Bing / DuckDuckGo) and direct vendor-page scraping
|
||||
were attempted and largely **bot-blocked**, and nearly every specialist firm
|
||||
(ProviderTrust, Verisys, Streamline Verify, Exclusion Screening LLC, most
|
||||
credentialing companies) **gates pricing behind a "schedule a call" sales motion**.
|
||||
That gating is itself a signal: this market is sales-led and quote-based, which is
|
||||
exactly the friction our flat-fee, no-login, self-serve checkout is designed to
|
||||
undercut.
|
||||
|
||||
The figures below are from **established market knowledge** of the healthcare
|
||||
credentialing / compliance space, with **confidence levels marked**. Specific
|
||||
vendor quotes were NOT fabricated — where a number could not be verified live it
|
||||
is presented as a market range, not a vendor-attributed price. Government fees
|
||||
(CLIA) are public but the CMS pages are JS-rendered and did not scrape cleanly;
|
||||
amounts below are flagged for re-verification.
|
||||
|
||||
> **Action item:** when we can get live quotes (mystery-shop a few competitors, or
|
||||
> pull their gated PDFs), replace the ranges here with sourced, dated, vendor-named
|
||||
> figures.
|
||||
|
||||
## Our current prices (source of truth: `api/src/service-catalog.ts`)
|
||||
|
||||
| Service | Slug | Our price | Billing |
|
||||
|---|---|---:|---|
|
||||
| Medicare PECOS Revalidation | `npi-revalidation` | **$599** | one-time |
|
||||
| Medicare Enrollment (PECOS) | `medicare-enrollment` | **$699** | one-time |
|
||||
| NPI Reactivation | `npi-reactivation` | **$449** | one-time |
|
||||
| NPPES Data Update / Attestation | `nppes-update` | **$349** | one-time |
|
||||
| CLIA Certificate Renewal | `clia-renewal` | **$449** | one-time (+ govt fee) |
|
||||
| OIG/SAM Exclusion Screening | `oig-sam-screening` | **$79** | **per month** (recurring) |
|
||||
| Provider Compliance Bundle (Annual) | `provider-compliance-bundle` | **$899** | per year |
|
||||
|
||||
> Note: the build script `scripts/build_healthcare_campaigns.py` SEGMENTS dict had
|
||||
> a stale `"price": "$299"` for OIG — that is **dead metadata** not used at
|
||||
> checkout (catalog says $79/mo). Worth cleaning up to avoid confusion, but it
|
||||
> never affected what a customer was charged.
|
||||
|
||||
## Benchmarks by service
|
||||
|
||||
### 1. Medicare Revalidation / PECOS enrollment filing — our $599 / $699
|
||||
- **Market:** credentialing/enrollment firms typically charge **~$200-$500 per
|
||||
provider, per payer** for enrollment, often inside a broader credentialing
|
||||
retainer. Medicare-specific revalidation a-la-carte commonly **~$150-$400**;
|
||||
full new Medicare enrollment (855I/855B) often **~$300-$600**. Many bill hourly
|
||||
($50-$150/hr) inside a retainer rather than flat.
|
||||
- **Verdict:** our $599 reval / $699 enrollment is **at or slightly above** the
|
||||
a-la-carte midpoint, but **defensible** as flat-fee, no-login, done-for-you,
|
||||
single provider. Confidence: **medium-high** (the per-payer model is well
|
||||
established).
|
||||
|
||||
### 2. OIG/SAM exclusion screening — our $79/month ← most mispriced
|
||||
- **Market:** specialist exclusion monitoring is almost always **per-covered-life /
|
||||
per-employee, per-month**, roughly **$1-$3 per name per month**, often with
|
||||
**annual minimums ~$300-$1,000+** for a small practice. One-time single-name
|
||||
searches run **~$5-$15**.
|
||||
- **Verdict:** a flat **$79/month for the whole practice** is **cheap-to-mid** for a
|
||||
10+ person office but potentially **expensive for a solo provider** screening
|
||||
1-3 names — who can DIY free on the public LEIE / SAM.gov sites (which our own
|
||||
email tells them to do). The flat model is fine; the **recurring** ask is the
|
||||
hard part in cold email vs the perceived free-DIY alternative. Confidence:
|
||||
**medium-high** on the per-life model.
|
||||
|
||||
### 3. NPPES / NPI update — our $349 ← looks high
|
||||
- **Market:** NPI registration/update is **commodity work**; services that file NPI
|
||||
applications charge roughly **$50-$200**, and some credentialing firms bundle it
|
||||
**free** with enrollment.
|
||||
- **Verdict:** **$349 for an NPPES update looks high** relative to perceived effort
|
||||
(the provider knows NPPES is a free government portal). Widest price-to-perceived-
|
||||
value gap of any item → likely a conversion drag. Confidence: **medium**.
|
||||
|
||||
### 4. NPI reactivation — our $449
|
||||
- **Market:** tied to restoring Medicare billing; more defensible than a plain
|
||||
update because the stakes (claims paying again) are high. Comparable to a reval
|
||||
filing in effort. Confidence: **medium**.
|
||||
|
||||
### 5. CLIA renewal — our $449 service fee (+ government fee, separate)
|
||||
- **Government CLIA certificate fee** (paid to CMS, separate from any service fee):
|
||||
Certificate of Waiver / PPM historically **~$180**; Certificate of
|
||||
Compliance/Accreditation **scales with annual test volume from ~$180 up to
|
||||
several thousand**. *(Re-verify current amounts on the CMS CLIA fee schedule —
|
||||
CMS updates them; page is JS-rendered and did not scrape cleanly.)*
|
||||
- **Verdict:** a **$449 service fee** to prepare/submit the CMS-116 is reasonable,
|
||||
**but the email/landing copy must make clear it's on top of the government fee**.
|
||||
Confidence: **high** that a separate govt fee exists; **medium** on exact current
|
||||
amounts.
|
||||
|
||||
## Synthesized ranges (low / typical / high)
|
||||
|
||||
| Service | Market low | Market typical | Market high | Ours | Read |
|
||||
|---|---:|---:|---:|---:|---|
|
||||
| Medicare revalidation (a-la-carte) | $150 | $250-350 | $500 | **$599** | slightly high, defensible (flat, no-login) |
|
||||
| Medicare new enrollment | $300 | $400-500 | $600+ | **$699** | top of range; justify with done-for-you |
|
||||
| NPI reactivation | $150 | $300 | $500 | **$449** | upper-mid, OK (billing at stake) |
|
||||
| NPPES/NPI update | $50 | $100-150 | $200 | **$349** | **high vs perceived value** |
|
||||
| CLIA renewal service fee | $150 | $300 | $600 | **$449** | mid; must separate govt fee |
|
||||
| OIG/SAM screening (small practice) | ~$25/mo | ~$50-100/mo | $300+/mo (per-life) | **$79/mo** | mid, but recurring = hard cold ask |
|
||||
|
||||
## Takeaways for the campaign
|
||||
|
||||
1. **Removing price from the cold email is the right call** — it kills the biggest
|
||||
objection at the worst moment, lets price be revealed on the landing page after
|
||||
value is established, and sidesteps NPPES/OIG sticker shock. Catalog prices stay
|
||||
the source of truth at checkout.
|
||||
2. **Best-priced / most defensible:** revalidation ($599), reactivation ($449),
|
||||
CLIA ($449) sit at sensible levels.
|
||||
3. **Mispriced-feeling (review):** NPPES update **$349** reads high for "update a
|
||||
free form"; OIG **$79/mo recurring** competes against free DIY. Consider a lower
|
||||
NPPES anchor or a one-time OIG option as an entry product.
|
||||
4. **Differentiator to lean on:** competitors are sales-led and quote-gated. Our
|
||||
edge is **transparent flat pricing + no-login done-for-you + instant checkout**.
|
||||
That should be the wedge, not undercutting on raw price.
|
||||
|
||||
## Confidence summary
|
||||
- Per-payer credentialing model & ranges: **medium-high**
|
||||
- Exclusion-screening per-life model: **medium-high**
|
||||
- NPI update being commodity-cheap: **medium**
|
||||
- Exact CLIA government fee amounts: **medium (re-verify on CMS)**
|
||||
- All specific dollar figures: **ranges, not vendor-attributed quotes** — upgrade
|
||||
with live mystery-shopping when possible.
|
||||
104
docs/healthcare-email-compliance-review.md
Normal file
104
docs/healthcare-email-compliance-review.md
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
# Healthcare cold-email compliance review (2026-06-20)
|
||||
|
||||
Reviewed all 10 templates in `data/hc_campaigns/` after removing prices, fixing
|
||||
click tracking, and de-risking unsubstantiated status claims.
|
||||
|
||||
## Scope of the pass
|
||||
1. **Removed all service prices** from the emails (price is now revealed on the
|
||||
order page, after value is established). Catalog (`api/src/service-catalog.ts`)
|
||||
remains the source of truth.
|
||||
2. **Click tracking** — originally appended `@TrackLink` + UTM to every conversion
|
||||
CTA. **SUPERSEDED (Jun 22 2026):** `@TrackLink` must NOT be used on per-provider
|
||||
hrefs (`?npi=`/`?clia=`/`{{ lp_link }}`) — Listmonk registers one static URL per
|
||||
tracked link, which 404s and collapses every provider onto one NPI. `@TrackLink`
|
||||
removed from all HC templates; per-provider links render directly and human clicks
|
||||
are tracked via Umami `campaign-click`. See runbook "Jun 22 2026 — @TrackLink on
|
||||
per-subscriber CTAs."
|
||||
3. **Reframed unsubstantiated per-record status assertions** to honest, hedged,
|
||||
generally-true statements (defamation / FTC-deception risk).
|
||||
4. This compliance review.
|
||||
|
||||
## Compliance posture — item by item
|
||||
|
||||
### CAN-SPAM (US) — PASS
|
||||
- **Physical postal address** present in every footer (Performance West Inc., 525
|
||||
Randall Ave Ste 100-1195, Cheyenne, WY 82001). ✓
|
||||
- **Unsubscribe** present in every template + `List-Unsubscribe` /
|
||||
`List-Unsubscribe-Post` one-click headers set by the build script. ✓
|
||||
- **No deceptive subject lines** — subjects are hedged ("may be out of date",
|
||||
"appears deactivated", "Are you screening for…"). ✓
|
||||
- **Accurate From / Reply-To** — `FROM_EMAIL` / `REPLY_TO` real, monitored. ✓
|
||||
|
||||
### Truth-in-advertising / FTC deception — FIXED
|
||||
The biggest risk was **asserting a specific provider's record status as fact when
|
||||
we don't actually measure it**. Addressed:
|
||||
|
||||
| Template | Was | Now |
|
||||
|---|---|---|
|
||||
| `nppes_outdated` | "record … appears **out of date**", header "Outdated registry information **detected**", row "**FLAGGED OUT OF DATE**", footnote "Staleness **flagged by our compliance monitoring**" | General true statement ("most practices drift out of date over time"), header "NPPES Data Check / keep your record current & attested", row "**PERIODIC REVIEW REQUIRED**", footnote cites the real CMS periodic-attestation requirement |
|
||||
| `npi_reactivation` | header "Deactivated enrollment **detected**", body "**flagged** … as deactivated" | header "Provider Enrollment Check", body "**may be** deactivated … worth confirming on the official sources" |
|
||||
|
||||
**Why this matters:** the `nppes_outdated` audience selector (`institutional_verified`)
|
||||
only checks **deliverability**, never staleness — and the harvested data has **no
|
||||
NPPES last-updated field**, so a per-record "out of date / FLAGGED" claim was
|
||||
literally unsubstantiated for every recipient. Now the copy is true for everyone
|
||||
(CMS does require periodic NPPES attestation) and still invites them to self-verify.
|
||||
|
||||
### Substantiated claims that were KEPT (verified backed by data)
|
||||
- `revalidation_overdue` "**is past due** / PAST DUE · N days overdue" — **OK**: the
|
||||
`reval_overdue` selector requires `reval_status == "overdue"` AND a real overdue
|
||||
day count derived from the **public CMS Revalidation Due Date List**. The email
|
||||
also links the provider to that exact government list to self-verify. Legitimate.
|
||||
- `revalidation_due_soon` "deadline is coming up" — backed by `reval_status ==
|
||||
"upcoming"` from the same CMS list. ✓
|
||||
- OIG "**civil monetary penalties up to $20,000 per claim**" — this is a real OIG
|
||||
penalty figure (kept; it is a regulatory fact, not a price). ✓
|
||||
|
||||
### Government-affiliation / impersonation — PASS
|
||||
- Every template carries the disclaimer **"Performance West is an independent
|
||||
compliance firm, not affiliated with CMS / Medicare / OIG / SAM.gov."** ✓
|
||||
- "Official record · CMS Medicare Revalidation Due Date List" refers to the **CMS
|
||||
public dataset we cite** (and link to), not a claim that we are CMS. The
|
||||
"Don't take our word for it — check the official CMS record" framing reinforces
|
||||
that we are pointing them AT the government source, not posing as it. ✓
|
||||
- No CMS/HHS logos, seals, or government-lookalike sender identity. ✓
|
||||
|
||||
### "No-login / done-for-you" claims — PASS (already vetted)
|
||||
- Matches the verified capability map in `docs/healthcare-no-login-value-add.md`
|
||||
and `docs/healthcare-filing-tiers-verified.md`. The one honesty caveat (the
|
||||
provider must personally **sign** the 855; we cannot sign for them) is respected:
|
||||
copy says "the only thing we may need is a one-minute e-signature," never claims
|
||||
we sign on their behalf. ✓
|
||||
|
||||
### Guarantee / absolute-language scan — ACCEPTABLE
|
||||
Scanner flagged `guarantee / never / 100% / will not`. Reviewed in context — all
|
||||
benign and substantiable:
|
||||
- "**100% satisfaction guarantee**" + "we'll make it right" — standard puffery /
|
||||
service promise, paired with "fixed pricing, no billable hours." Acceptable.
|
||||
- "You **never** share your password / you **will not** pay billable hours" —
|
||||
factual descriptions of how the service works, not outcome guarantees. ✓
|
||||
- No claims guaranteeing a CMS approval/outcome (which WOULD be a problem). ✓
|
||||
|
||||
### Trust/credibility badges — VERIFY (flag for owner)
|
||||
Footers assert **"SOC 2 Type II hosting · HIPAA & PCI compliant · 256-bit TLS."**
|
||||
These are factual compliance claims and must be **literally true**:
|
||||
- ⚠️ **Action for Justin:** confirm we can substantiate SOC 2 Type II + HIPAA + PCI
|
||||
(or soften to "encrypted, secure Stripe payments" if any is aspirational). False
|
||||
compliance badges are an FTC and contractual risk. Not changed in this pass —
|
||||
needs owner confirmation.
|
||||
|
||||
## HTML / deliverability QA — PASS
|
||||
- All 10 templates render with **0 JS errors** headless, each has **exactly one
|
||||
per-provider `/order/...` CTA** (direct link, `@TrackLink` removed Jun 22 2026 —
|
||||
see item 2), and **no price leaks** (only the $20,000 OIG penalty stat remains,
|
||||
intentionally).
|
||||
- External self-verify links (oig.hhs.gov, sam.gov, npiregistry, data.cms.gov) left
|
||||
**untracked** on purpose (they're trust links, not conversions).
|
||||
|
||||
## Outstanding (not blocking, recommended next)
|
||||
1. **Confirm SOC 2 / HIPAA / PCI badge claims** are literally true (above).
|
||||
2. **OIG $79/mo & NPPES $349 pricing** flagged as high/hard in
|
||||
`docs/healthcare-competitive-pricing.md` — consider a one-time OIG entry option
|
||||
and a lower NPPES anchor. (Pricing strategy, separate from compliance.)
|
||||
3. **Add the free `/tools/npi-compliance-check`** as a soft secondary CTA / lead
|
||||
magnet so non-buyers are captured and nurtured (funnel, separate effort).
|
||||
|
|
@ -293,3 +293,17 @@ Committed and validated on dev:
|
|||
|
||||
|
||||
```
|
||||
|
||||
## Campaign tracking (opens/clicks) — fixed 2026-06-06
|
||||
listmonk-hc was installed with the default `app.root_url=http://localhost:9000`,
|
||||
so every tracking pixel + click-link in sent emails pointed at localhost ->
|
||||
recipients couldn't reach them -> **views/clicks always showed 0**. Fixed:
|
||||
- `app.root_url` -> `https://lists-hc.performancewest.net` (the public portal vhost)
|
||||
- `privacy.individual_tracking` -> `true` (per-subscriber opens/clicks)
|
||||
- `privacy.disable_tracking` -> `false`
|
||||
- restarted listmonk-hc to load the new root_url.
|
||||
Verified: hitting the tracking pixel publicly records a `campaign_views` row, and
|
||||
the campaign preview renders pixel+links as `lists-hc.performancewest.net/...`
|
||||
with zero `localhost` references. NOTE: emails sent BEFORE this fix (the first
|
||||
~100 warmup) had localhost tracking baked in and won't track retroactively; all
|
||||
future sends track correctly.
|
||||
|
|
|
|||
158
docs/healthcare-filing-tiers-verified.md
Normal file
158
docs/healthcare-filing-tiers-verified.md
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
# Healthcare filing: Standard (no-login) vs Expedited (surrogate) — VERIFIED matrix
|
||||
|
||||
Internal capability map. Confirms how each healthcare service is fulfilled with
|
||||
**no client login and no credential sharing**, and where the optional
|
||||
**Expedited (CMS I&A Surrogate)** path applies.
|
||||
|
||||
> **Client-facing rule (do not break):** never expose mechanics to the client.
|
||||
> No "paper", "CMS-855", "CMS-10114", "MAC", "Fargo", or form numbers in any
|
||||
> client copy. The only client-visible choice is the positive surrogate question
|
||||
> ("electronically granting us I&A Surrogate access lets us bulk-file faster /
|
||||
> fewer steps on our end"). Declining is silent; we just "file it for you."
|
||||
> Same price either way — Expedited is NOT a paid tier.
|
||||
|
||||
## Two service tiers (internal)
|
||||
- **Standard (default):** we complete the official form, client signs ONE
|
||||
certification (e-sign link), we submit + track. For CMS-855s the signed form is
|
||||
mailed to the provider's MAC; for NPPES-only changes via the NPI Enumerator
|
||||
paper path. Daily batched mailing (see §Daily batch).
|
||||
- **Expedited (if client grants I&A Surrogate):** we file online in PECOS/NPPES
|
||||
under our own login (surrogate), same-day tracking. Surrogacy is a delegation,
|
||||
NOT a password handover.
|
||||
|
||||
## VERIFIED from the official CMS form PDFs in `docs/` (primary source)
|
||||
|
||||
### CMS-855I (05/23) — individual practitioner [CONFIRMED, quoted]
|
||||
- Valid reasons include: **revalidation**, **reactivation** ("reactivate your
|
||||
Medicare billing number to resume billing"), **changes to enrollment info**,
|
||||
and enrolling with another MAC. → revalidation/reactivation/enrollment all
|
||||
ride the 855I paper path.
|
||||
- Paper submission: *"Send this completed application with **original signatures**
|
||||
and all required documentation to your **designated MAC**. The MAC that services
|
||||
your State is responsible for processing your enrollment application."*
|
||||
→ **no login required; routed by STATE.**
|
||||
- Signature caveat: *"As an individual practitioner, you are the only person who
|
||||
can sign this application. The authority to sign the application on your behalf
|
||||
**may not be delegated** to any other person."* → client must personally sign
|
||||
(pen/e-sign), but that is NOT a login. A surrogate **cannot** sign the 855 for
|
||||
them — surrogacy speeds the *online filing*, the cert signature is still theirs.
|
||||
|
||||
### CMS-855B (12/2025) — clinic/group/supplier [CONFIRMED, quoted]
|
||||
- Same paper-to-MAC, original-signatures, routed-by-State rule.
|
||||
- Org signer: a **delegated/authorized official** signs §15B/15D (not the
|
||||
individual) — still a signature, no login.
|
||||
- **Application FEE** required (paid via PECOS feePaymentWelcome) on initial
|
||||
enrollment, new location, and revalidation BEFORE mailing. → org standard path
|
||||
has a fee-payment step we must handle/route; individual 855I does not.
|
||||
|
||||
### CMS-855O (09/23) — ordering/referring only [CONFIRMED, quoted]
|
||||
- Paper-to-MAC, original signatures, routed by state. "Sign and date section 8
|
||||
using ink."
|
||||
|
||||
### NPPES data update / NPI reactivation (CMS-10114 paper path) [CONFIRMED]
|
||||
- **VERIFIED firsthand** against the live CMS-10114 PDF (Rev. 02/25, OMB
|
||||
0938-0931, exp. 03/2028) downloaded from
|
||||
`cms.gov/Medicare/CMS-Forms/CMS-Forms/downloads/CMS10114.pdf`, and the CMS
|
||||
"How to Apply" page which titles it the **"NPI Application/Update Form"**.
|
||||
- The form's Section 1A "Reason for Submittal" has four checkboxes:
|
||||
**#1 Initial Application, #2 Change of Information, #3 Deactivation,
|
||||
#4 Reactivation** — all completed on the SAME paper form, each requiring a
|
||||
signed + dated certification (Section 4A individual / 4B organization).
|
||||
Verbatim: *"If changing information, check box #2... then sign and date the
|
||||
certification... All changes must be reported to the NPI Enumerator within 30
|
||||
days."* and *"If you are reactivating the NPI, check box #4... Sign and date
|
||||
the certification."*
|
||||
- So paper CMS-10114 is a valid no-login path for **changes AND reactivation**,
|
||||
not just initial enumeration. UNCERTAIN flag resolved.
|
||||
- **Mailing address (current, printed on the form page 5):**
|
||||
```
|
||||
CMS NPI Enumerator Services
|
||||
Mail Stop DO-01-51
|
||||
7500 Security Blvd.
|
||||
Baltimore, MD 21244
|
||||
```
|
||||
The previously-documented **Fargo, ND PO Box 6059 address is RETIRED** — code
|
||||
(`mac_routing.NPI_ENUMERATOR`) and docs updated to the Baltimore address.
|
||||
Enumerator phone for questions: 1-800-465-3203.
|
||||
- **No electronic no-login equivalent exists for CMS.** Unlike FMCSA (whose
|
||||
`ask.fmcsa.dot.gov/app/ticket` accepts an MCS-150 update + attachments with no
|
||||
account), CMS has no public web form to submit an NPPES change without a login.
|
||||
Probed live: the NPI Registry API (`npiregistry.cms.hhs.gov/api`) is
|
||||
**read-only lookup**; PECOS and NPPES I&A both require login. Therefore for
|
||||
NPPES changes the two genuine tiers are: **Standard = paper CMS-10114 to
|
||||
Baltimore (no login)**, **Expedited = surrogate files in NPPES online**.
|
||||
- **Decision (updated):** offer Expedited (surrogate → NPPES online) as the fast
|
||||
path and the CMS-10114 paper-to-Baltimore path as the Standard default. Build
|
||||
`cms10114_pdf_filler.py` to produce the signable form (Reason checkbox driven
|
||||
by service: change vs reactivation vs deactivation).
|
||||
|
||||
## CMS I&A Surrogate (Expedited path)
|
||||
- Provider adds Performance West as a **Surrogate** in CMS I&A; we then file in
|
||||
PECOS/NPPES under our own credentials. No password shared.
|
||||
- Scope nuance to verify in copy: confirm a single surrogacy grant covers the
|
||||
PECOS and NPPES functions we need (the checkout copy currently asks for both).
|
||||
|
||||
## Per-service tier table
|
||||
| Service | Standard (no-login) | Expedited (surrogate) | Fee? |
|
||||
|---|---|---|---|
|
||||
| Medicare revalidation | 855I/B → MAC, client signs | file in PECOS | 855B yes |
|
||||
| Medicare enrollment | 855I/B/O → MAC, client signs | file in PECOS | 855B yes |
|
||||
| NPI reactivation | 855I → MAC (reactivation reason) | PECOS/NPPES | no |
|
||||
| NPPES data update | CMS-10114 → NPI Enumerator (Baltimore), client signs | NPPES online | no |
|
||||
| OIG/SAM screening | public DBs, **zero client action** | n/a (no portal) | no |
|
||||
| Provider compliance bundle | spawns reval + screening + NPPES | mixed | per-piece |
|
||||
|
||||
## Daily batch (Standard-path mailing)
|
||||
Each **postal working day morning** (skip weekends + USPS/federal holidays — use
|
||||
`scripts/workers/business_days.py` calendar): gather all signed+pending paper
|
||||
filings, **group by destination agency** (each MAC; NPI Enumerator Baltimore; each
|
||||
state agency), merge each group into ONE print job + a cover sheet (PW sender,
|
||||
destination, date, enclosed count, per-item order#/provider/NPI/form), one
|
||||
**Priority Mail** envelope per agency. Mark each order mailed with batch date +
|
||||
tracking. Phase 1: generate per-agency batched PDF + cover sheet + manifest for a
|
||||
human to print & drop. Phase 2: wire a print-mail API (Lob/Click2Mail).
|
||||
|
||||
## MAC routing
|
||||
855s route by the provider's **State** (855I/B/O all say "the MAC that services
|
||||
your State"). Mailing addresses: CMS.gov/Medicare/Provider-Enrollment-and-
|
||||
Certification. Need a **state → MAC → mailing-address** table to address envelopes
|
||||
+ to group the daily batch. `practice_state` intake field drives this.
|
||||
|
||||
## Implementation status (built + validated)
|
||||
- **mac_routing.py** — state→MAC (56 jurisdictions, 12 destinations) +
|
||||
NPI_ENUMERATOR (NPI Enumerator Services, Baltimore MD — VERIFIED from CMS-10114
|
||||
Rev. 02/25). MAC addresses still marked VERIFY before first live mail.
|
||||
- **npi_provider.py** — two-tier `access` strings; NPPES update/reactivation no
|
||||
longer "online-only"; surrogate answer surfaced in the admin todo. nppes-update
|
||||
now generates the CMS-10114 for e-signature (Standard path) via
|
||||
`_generate_10114_for_signing`.
|
||||
- **cms10114_pdf_filler.py** — fills the official CMS-10114 (flat PDF, text
|
||||
overlay): reason checkbox (change/reactivation/deactivation) + NPI + Section 2A
|
||||
identity + Section 4A certification name, with a signature anchor on the cert
|
||||
line. The signed form joins the daily batch to the NPI Enumerator (Baltimore).
|
||||
`test_cms10114.py` 27/27 pass.
|
||||
- **checkout.ts + service pages + intake** — client-facing copy stripped of
|
||||
mechanics; surrogate is the only optional, positively-framed ask (faster,
|
||||
never required, never share password, never mentions paper). Astro build green.
|
||||
- **Daily batched mail** — migration 089 (`paper_filing_batches` +
|
||||
`esign_records.paper_batch_id/filing_destination_key`); `batch_cover_sheet.py`
|
||||
(per-agency cover + merged print job); `daily_paper_batch.py` worker
|
||||
(group by destination, self-gated to postal working days); `pw-paper-batch`
|
||||
systemd timer. `test_paper_batch.py` 15/15 pass.
|
||||
- **State/adjacent matrix** — A/B/C/D no-login classification added to
|
||||
`state-healthcare-compliance-opportunities.md`; CLIA (CMS-116) + state CSR are
|
||||
the cleanest A-category additions that reuse the daily batch flow.
|
||||
|
||||
## TODO before first live mail (manual / verify)
|
||||
1. Fill the real MAC provider-enrollment PO Box addresses in `mac_routing.py`
|
||||
(marked VERIFY) from each MAC's current enrollment page.
|
||||
2. ~~Confirm CMS-10114 paper-for-changes acceptance + obtain the form PDF~~
|
||||
~~build `cms10114_pdf_filler.py`~~ **DONE** — verified against CMS-10114
|
||||
Rev. 02/25 (address = NPI Enumerator Services, Baltimore MD); filler built +
|
||||
wired into `npi_provider._generate_10114_for_signing`; `test_cms10114.py`
|
||||
27/27 pass. Remaining nicety: org (Entity Type 2 / Section 4B) overlay path
|
||||
(currently flagged for manual completion when NPI-2 detected).
|
||||
3. Run migration 089 on the DB; confirm the worker picks up a signed test filing
|
||||
and produces the per-agency cover + merged PDF in MinIO.
|
||||
4. Phase 2: wire a print-mail API (Lob/Click2Mail) to auto-mail the merged PDF
|
||||
and fill `tracking_number`.
|
||||
54
docs/healthcare-no-login-value-add.md
Normal file
54
docs/healthcare-no-login-value-add.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Healthcare value-add: "no logins required" — verified third-party submission paths
|
||||
|
||||
Researched against the CMS-855I PDF (05/23), the NPPES/NPI Enumerator process, and
|
||||
the public OIG/SAM databases. This is the HONEST capability map for the cold-email
|
||||
pitch: many providers struggle with PECOS/NPPES/I&A logins (forgotten passwords,
|
||||
identity-proofing, multi-factor, "the system won't let me in"). For most of what we
|
||||
sell, **the provider never needs to log in** — we prepare the paperwork, they sign a
|
||||
single paper form (or e-sign), and we file it by mail or as the preparer.
|
||||
|
||||
## What we CAN do without the provider's online login
|
||||
|
||||
| Service | Paper/no-login path | Provider's only job | Verified source |
|
||||
|---|---|---|---|
|
||||
| **Medicare PECOS Revalidation** | CMS-855I/855B/855A **paper** application mailed to the provider's **MAC** (revalidation is a checkbox reason in Section 1A). | **Sign** the form (wet/original signature). We prepare 100% of it. | CMS-855I: "submit your application with **original signatures**… to your designated MAC… by mail." |
|
||||
| **NPPES / NPI data update** (address, taxonomy, contact) | **CMS-10114** paper NPI Application/Update mailed to the **NPI Enumerator (CMS NPI Enumerator Services, 7500 Security Blvd, Baltimore, MD 21244)**; Enumerator staff key it into NPPES. | Sign the paper form. **No NPPES/I&A login at all.** | NPI Enumerator paper process (Baltimore, MD; 800-465-3203; CMS-10114 Rev. 02/25). |
|
||||
| **NPI Reactivation / enrollment reactivation** | Same paper-855 path to the MAC (reactivation is a Section 1A reason). | Sign. | CMS-855 instructions. |
|
||||
| **Medicare Enrollment (new)** | Paper CMS-855I/855B to the MAC with original signature. | Sign + provide info. | CMS-855I. |
|
||||
| **OIG / SAM Exclusion Screening** | We screen against the **public** OIG LEIE + SAM.gov databases by name/NPI. | **Nothing — zero provider involvement.** No login, no signature. | OIG LEIE + SAM.gov are public federal databases. |
|
||||
|
||||
## The ONE honesty caveat (don't overclaim)
|
||||
- CMS-855I Section 15: **"As an individual practitioner, you are the only person who can
|
||||
sign this application. The authority to sign… may not be delegated."** So the
|
||||
provider must personally **sign** the enrollment/revalidation form — but that's a
|
||||
pen on paper we hand them, NOT a login. A third party CANNOT sign the 855 for them,
|
||||
and CANNOT impersonate them in PECOS. Our value is removing the *computer/login*
|
||||
burden, not the signature.
|
||||
- For group/org filings (855B/855A), an **Authorized or Delegated Official** signs —
|
||||
again on paper, no login needed.
|
||||
- We never need their PECOS/NPPES password. We prepare, they sign, we mail/track.
|
||||
|
||||
## The pitch (why this matters to them)
|
||||
Providers routinely get stuck on: forgotten I&A passwords, identity-proofing
|
||||
failures, MFA to a phone they changed, "PECOS is down / won't load," and the sheer
|
||||
time of navigating CMS portals. Our differentiator:
|
||||
|
||||
> **You don't need to log in to anything.** We fill out the official CMS forms for
|
||||
> you, send you one to sign, and mail it to the right place — or file it for you as
|
||||
> your preparer. No PECOS password. No NPPES login. No fighting the government
|
||||
> website. (For exclusion screening you don't even sign — we just do it.)
|
||||
|
||||
## Mailing destinations (for credibility in copy)
|
||||
- NPI/NPPES paper: **CMS NPI Enumerator Services, Mail Stop DO-01-51, 7500 Security Blvd, Baltimore, MD 21244**
|
||||
- 855 enrollment/revalidation: the provider's **MAC** (varies by state/jurisdiction;
|
||||
we determine and route it).
|
||||
|
||||
## MESSAGING RULE (important)
|
||||
In the cold email we sell the **relief**, never the **mechanics**. Do NOT mention
|
||||
paper forms, the MAC, the NPI Enumerator, CMS-855/CMS-10114, or "we mail it" — that's
|
||||
our method and competitors shouldn't see it. The email only says what the provider
|
||||
does NOT have to deal with:
|
||||
"No logins. No portals. No headaches. You don't need a PECOS password, identity
|
||||
verification, the government website, or to sit on hold with Medicare. We do the
|
||||
work; all you do is say yes."
|
||||
The signature requirement is handled at onboarding, not advertised in the cold email.
|
||||
|
|
@ -18,14 +18,15 @@
|
|||
|
||||
| Resource | Spec |
|
||||
|----------|------|
|
||||
| OS | Windows Server 2022 |
|
||||
| IP / SSH | 108.181.102.34 (OpenSSH for Windows, **port 22422**) |
|
||||
| OS | Windows Server 2019 (10.0.17763) |
|
||||
| vCPU | 2 |
|
||||
| RAM | 4 GB |
|
||||
| Disk | 40 GB SSD |
|
||||
| Software | Microsoft Office 2021 + Python 3.12 |
|
||||
| Software | Microsoft Word (Office 16.0) + Python 3.13 |
|
||||
| Service | docserver_worker.py (polls MinIO, converts via Word COM) |
|
||||
|
||||
Pixel-perfect DOCX→PDF conversion via Microsoft Word. Worker polls MinIO `to-convert/` bucket, converts via Word COM, uploads PDF to `converted/`. No HTTP server needed — MinIO is the transport. Requires RDP login after reboot (Word COM needs interactive session). LibreOffice headless is the automatic fallback.
|
||||
Pixel-perfect DOCX→PDF conversion via Microsoft Word. Worker polls MinIO `to-convert/` bucket, converts via Word COM, uploads PDF to `converted/`. No HTTP server needed — MinIO is the transport (outbound-only; works behind any NAT). Runs under the SYSTEM account in session 0; **self-healing** — retries MinIO on outage instead of exiting, and the `PW-DocserverWorker` task restarts on failure + re-fires every 5 min if the process dies (no RDP needed for normal operation; RDP/`fix_dcom.bat` only if Word COM itself breaks). Heartbeat at `minio://performancewest/docserver-heartbeat.json` (60s). LibreOffice headless is the automatic fallback. Details: `docserver/README.md`.
|
||||
|
||||
## Email Servers
|
||||
|
||||
|
|
|
|||
182
docs/ink-signature-plotter.md
Normal file
182
docs/ink-signature-plotter.md
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
# Ink-signature pen-plotter pipeline
|
||||
|
||||
Produces a **genuine original ink signature** on a printed CMS form from a
|
||||
signature the provider drew online, by redrawing their own stroke paths with a
|
||||
pen mounted on a 3-axis motion system (a Creality CR-10 V2 here; any
|
||||
Marlin/GRBL machine works).
|
||||
|
||||
## Why this exists
|
||||
|
||||
The Standard (no-login) CMS filing path mails a paper form that must carry an
|
||||
**original ink signature** — the CMS-10114 states verbatim: *"All signatures
|
||||
must be original and signed in ink. Applications with signatures deemed not
|
||||
original will not be processed. Stamped, faxed or copied signatures will not be
|
||||
accepted."* A printed/stamped digital signature image is a copy. A pen plotter
|
||||
drawing real ink onto the one original sheet is **original, in ink, never
|
||||
copied** — categorically different from the three banned methods (stamp / fax /
|
||||
photocopy).
|
||||
|
||||
> **Interpretive risk (read this):** CMS guidance does not explicitly bless or
|
||||
> ban robotic/autopen signatures for the 855/10114. A reviewer could argue a
|
||||
> machine-applied mark isn't the provider's own hand. Treat the plotter as the
|
||||
> *fast* path and keep a true wet-signature mail-out as the conservative default
|
||||
> for filings where a rejection is costly, until real-world acceptance is
|
||||
> confirmed on a few live filings.
|
||||
|
||||
## Data flow
|
||||
|
||||
```
|
||||
signature pad (online) esign_records
|
||||
capture strokes (0..1) ───────► signature_vector (JSONB) [migration 090]
|
||||
+ raster PNG ───────► signature_data (digital stamp / audit)
|
||||
signature_anchors (form's signing box)
|
||||
│
|
||||
▼
|
||||
ink_signature_plotter.py (hardware-independent, fully tested)
|
||||
fit_strokes_to_box() strokes -> PDF points, fit anchor box, flip Y, rest on rule
|
||||
pdf_points_to_bed_mm() PDF pt -> bed mm via PlotterConfig (jig offset, 1pt=0.3528mm)
|
||||
emit_gcode() -> Marlin/GRBL G-code (Z pen lift, or M280 servo/BLTouch)
|
||||
render_signature_on_pdf() -> stamp strokes onto the real PDF (visual proof)
|
||||
render_preview_svg() -> toolpath preview
|
||||
send_gcode_serial() -> stream to /dev/ttyUSB0 (gated, dry_run=True default)
|
||||
│
|
||||
▼
|
||||
ink_signature_cli.py end-to-end: load record -> gcode + preview [+ --plot]
|
||||
```
|
||||
|
||||
## Coordinate frames
|
||||
|
||||
| Frame | Origin | Units |
|
||||
|---|---|---|
|
||||
| Capture box (signature pad) | top-left | fraction 0..1 |
|
||||
| PDF / signature anchors | bottom-left | points (1in = 72pt) |
|
||||
| Plotter bed (CR-10) | homed corner (front-left) | mm (1pt = 0.35278mm) |
|
||||
|
||||
A **paper jig** (corner stop on the bed) fixes the sheet so PDF (0,0) maps to
|
||||
`(jig_x_mm, jig_y_mm)`. The signature anchor box (same one the digital stamper
|
||||
uses) places the ink exactly on the cert line.
|
||||
|
||||
## CR-10 V2 retrofit (reversible)
|
||||
|
||||
1. **Pen holder:** print a spring-loaded CR-10 pen holder (clips to the X
|
||||
carriage / hotend shroud). The spring keeps even contact pressure.
|
||||
2. **Pen-up/down:**
|
||||
- *Default (Z mode):* pen fixed; G-code lifts/drops Z (`pen_up_mm` /
|
||||
`pen_down_mm`). The spring forgives over-press.
|
||||
- *Optional (servo/BLTouch mode):* `--servo-pen` emits `M280 P0 S<angle>` to
|
||||
deploy/stow instead of moving Z. Useful if you actuate the pen with a servo
|
||||
or repurpose the BLTouch.
|
||||
3. **Registration:** tape a corner jig to the bed so every sheet sits in the
|
||||
same place. The BLTouch can probe a fixed point to set a repeatable pen-touch
|
||||
Z reference.
|
||||
4. **Pen:** a smooth gel/rollerball refill gives the most hand-written, wet-ink
|
||||
look. Avoid dry fiber tips.
|
||||
5. **Linux:** the CR-10 enumerates as a CH340 serial device (`/dev/ttyUSB0`,
|
||||
115200 baud). No drivers needed — we stream G-code ourselves.
|
||||
|
||||
## Machine profiles
|
||||
|
||||
The pipeline is machine-agnostic via named profiles (`--profile`):
|
||||
|
||||
| Profile | Machine | Dialect | Pen lift | Bed/reach |
|
||||
|---|---|---|---|---|
|
||||
| `cr10` (default) | Creality CR-10 V2 (home station) | Marlin | Z move | 300×300 mm rectangular |
|
||||
| `axidraw` | AxiDraw / iDraw A4 pen plotter | Marlin/GRBL | servo (M280) | 210×297 mm rectangular |
|
||||
| `lineus` | Line-us folding pen-arm (pocket) | Line-us GCode | pen Z per move | small fan-shaped annulus |
|
||||
|
||||
`load_profile()` returns a `PlotterConfig`; CLI flags (`--jig-x/-y`,
|
||||
`--pen-down/-up`, `--servo-pen`) override individual fields.
|
||||
|
||||
## Portable option: Line-us (pocket pen-arm)
|
||||
|
||||
When away from the home CR-10, the **Line-us** is a palm-size folding 2-link arm
|
||||
that draws with a real pen. It speaks its own GCode subset over **WiFi (TCP
|
||||
1337)** or **USB serial**, acks each command with `"ok"`, and encodes pen height
|
||||
as the **Z value of each move** (low Z = pen down, high Z = pen up), not mm.
|
||||
|
||||
Because the arm's reachable area is a **small fan-shaped annulus** in front of
|
||||
its shoulder pivot (not a rectangular bed), two things differ from the CR-10:
|
||||
|
||||
1. **Reach checking.** `check_reach()` validates every planned point against the
|
||||
annulus (`reach_min_units..reach_max_units` from the shoulder). The CLI prints
|
||||
the report and **refuses to `--plot` on Line-us if any point is out of reach**
|
||||
(an unreachable point would distort the signature).
|
||||
2. **Jig solving.** The signature must be slid into the sweet spot. `--solve-jig`
|
||||
calls `compute_jig_offset_for_box(box, cfg, vector=...)`, which aims the centre
|
||||
of the **actual fitted ink extent** (not the full cell, which can be far wider
|
||||
than the signature) at the annulus mid-radius and reach-checks the result. It
|
||||
then applies the computed `jig_x_mm/jig_y_mm` automatically.
|
||||
|
||||
A small registration jig (a corner stop + a marked cell on a card) holds the
|
||||
paper so the solved offset is repeatable.
|
||||
|
||||
```bash
|
||||
# Generate gcode + preview for Line-us, auto-solving the jig (safe, dry-run):
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114 \
|
||||
--profile lineus --solve-jig
|
||||
|
||||
# Plot over WiFi (default host line-us.local:1337), sheet in the jig:
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114 \
|
||||
--profile lineus --solve-jig --plot --lineus-host line-us.local
|
||||
|
||||
# Or plot over USB serial instead of WiFi:
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114 \
|
||||
--profile lineus --solve-jig --plot --lineus-usb --port /dev/ttyACM0
|
||||
```
|
||||
|
||||
`send_lineus()` defaults to `dry_run=True` (same gating as the CR-10 path); it
|
||||
only moves the arm with `--plot`.
|
||||
|
||||
## Calibration
|
||||
|
||||
```bash
|
||||
# 1. Draw just the signature-box outline on a blank sheet (dry-run first to
|
||||
# inspect the gcode/preview, then --plot with a sheet in the jig):
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114 --test-box
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114 --test-box \
|
||||
--plot --home --port /dev/ttyUSB0
|
||||
|
||||
# 2. Adjust --jig-x / --jig-y until the rectangle lands on the cert line, and
|
||||
# --pen-down until the pen draws cleanly without digging in.
|
||||
```
|
||||
|
||||
## Plotting a signature
|
||||
|
||||
```bash
|
||||
# Generate gcode + SVG preview (safe anywhere, no hardware):
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114
|
||||
|
||||
# Plot it (sheet loaded in jig, calibrated):
|
||||
python scripts/workers/ink_signature_cli.py --order CO-XXXX --doc cms10114 \
|
||||
--plot --home --port /dev/ttyUSB0 \
|
||||
--jig-x 22 --jig-y 24 --pen-down -0.2
|
||||
```
|
||||
|
||||
`send_gcode_serial` defaults to `dry_run=True`; the CLI only plots with `--plot`.
|
||||
|
||||
## Verification (no hardware required)
|
||||
|
||||
`scripts/tests/test_ink_signature.py` (43 checks) proves the geometry:
|
||||
- strokes fit inside the anchor box, aspect preserved, Y flipped, ink on the rule
|
||||
- PDF-pt → bed-mm uses the jig offset + correct unit scale, stays on the bed
|
||||
- G-code framing (pen up/down, feeds, park), servo mode, over-bed warning
|
||||
- machine profiles (cr10 / axidraw / lineus) load with the right dialect/bed
|
||||
- Line-us reach check rejects out-of-reach plots; `--solve-jig` brings the
|
||||
signature into reach; the Line-us emitter homes, encodes pen Z, and warns
|
||||
on out-of-reach; `send_lineus()` is dry-run safe over both TCP and USB
|
||||
- `render_signature_on_pdf` stamps the strokes onto the **real CMS-10114 cert
|
||||
page** inside the signature cell (label ≤ y, ink ≥ bottom rule)
|
||||
|
||||
Because the PDF preview and the G-code share the same `fit_strokes_to_box`
|
||||
geometry, the preview is a faithful digital twin of what the pen will draw.
|
||||
|
||||
## Files
|
||||
|
||||
| File | Role |
|
||||
|---|---|
|
||||
| `api/migrations/090_esign_signature_vector.sql` | `signature_vector` JSONB column |
|
||||
| `site/public/portal/esign/index.html` | captures stroke paths alongside the PNG |
|
||||
| `api/src/routes/portal-esign-generic.ts` | stores the (size-bounded) vector |
|
||||
| `scripts/workers/services/ink_signature_plotter.py` | geometry + G-code + preview + serial |
|
||||
| `scripts/workers/ink_signature_cli.py` | end-to-end CLI (generate / calibrate / plot) |
|
||||
| `scripts/tests/test_ink_signature.py` | hardware-free correctness tests |
|
||||
BIN
docs/legal/AG-response-David-Sgro-BCP-26-05-025816-DRAFT.docx
Normal file
BIN
docs/legal/AG-response-David-Sgro-BCP-26-05-025816-DRAFT.docx
Normal file
Binary file not shown.
176
docs/legal/AG-response-David-Sgro-BCP-26-05-025816-DRAFT.md
Normal file
176
docs/legal/AG-response-David-Sgro-BCP-26-05-025816-DRAFT.md
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
# DRAFT — FOR ATTORNEY REVIEW BEFORE SENDING
|
||||
|
||||
**This is a draft response to a Pennsylvania Office of Attorney General consumer-complaint
|
||||
mediation request. It contains legal positions that should be reviewed and approved by
|
||||
licensed counsel before transmission. Footnotes/【bracketed notes】 flag items to verify or
|
||||
decide. Do not send on letterhead until counsel signs off and the bracketed items are
|
||||
resolved.**
|
||||
|
||||
---
|
||||
|
||||
Performance West Inc.
|
||||
525 Randall Ave, Ste 100-1195
|
||||
Cheyenne, WY 82001
|
||||
info@performancewest.net | (888) 411-0383
|
||||
|
||||
May 【__】, 2026
|
||||
|
||||
VIA EMAIL (bmauser@attorneygeneral.gov) AND U.S. MAIL
|
||||
|
||||
Brett W. Mauser, Agent
|
||||
Commonwealth of Pennsylvania
|
||||
Office of Attorney General — Bureau of Consumer Protection
|
||||
15th Floor, Strawberry Square
|
||||
Harrisburg, PA 17120
|
||||
|
||||
**Re: David Sgro — Complaint No. BCP-26-05-025816**
|
||||
|
||||
Dear Mr. Mauser:
|
||||
|
||||
Thank you for your letter of May 7, 2026 and for the opportunity to respond to the
|
||||
complaint filed by Mr. David Sgro. Performance West Inc. ("Performance West") takes
|
||||
consumer concerns seriously and welcomes the chance to clarify the facts and bring this
|
||||
matter to an amicable conclusion. We respond to each of Mr. Sgro's concerns below.
|
||||
|
||||
## Summary of our position
|
||||
|
||||
Performance West sends business-to-business informational and marketing emails to
|
||||
telecommunications providers using **publicly available contact information that those
|
||||
providers themselves filed with the Federal Communications Commission.** Such email is
|
||||
lawful under the federal CAN-SPAM Act, which governs commercial email and permits
|
||||
business-to-business outreach on an opt-out basis. As soon as Mr. Sgro asked not to be
|
||||
contacted, his address was removed from our mailing program, and he has since been placed
|
||||
on our permanent do-not-contact (suppression) list. We regret any frustration Mr. Sgro
|
||||
experienced and have taken steps to ensure he receives no further messages.
|
||||
|
||||
## The facts
|
||||
|
||||
**1. The source of the email address was a public government filing, not "scraping" of
|
||||
private data.**
|
||||
Mr. Sgro's company, Dataspindle LLC, is a registered voice service provider and is listed in
|
||||
the FCC's **Robocall Mitigation Database (RMD)** — a public database the FCC requires voice
|
||||
providers to file in and maintains for public inspection. Mr. Sgro's RMD record (RMD0007035,
|
||||
FRN 0026522417) lists his business contact email, dave@dataspindle.com, as the public point
|
||||
of contact. Performance West obtained that address from the public FCC RMD filing. We did not
|
||||
obtain it from any private or confidential source. Collecting and using a business contact
|
||||
address that a company has voluntarily published in a public government database is not
|
||||
unlawful.
|
||||
|
||||
**2. The conduct at issue is commercial email, which is governed by the federal CAN-SPAM
|
||||
Act — not the statute Mr. Sgro cites.**
|
||||
Mr. Sgro's complaint asserts a violation of the "Unsolicited Telecommunication Advertisement
|
||||
Act." 【COUNSEL TO CONFIRM: Pennsylvania's Unsolicited Telecommunication Advertisement Act,
|
||||
73 P.S. § 2250.1 et seq., addresses unsolicited *facsimile* and *telephone* advertisements;
|
||||
it is a fax/telemarketing statute and does not regulate commercial *email*. Confirm cite and
|
||||
scope before relying on this.】 Performance West sent Mr. Sgro **email**, not a fax or a
|
||||
telephone solicitation. The statute Mr. Sgro relies upon does not apply to the conduct he
|
||||
describes.
|
||||
|
||||
Commercial email in the United States is governed by the federal CAN-SPAM Act of 2003
|
||||
(15 U.S.C. §§ 7701–7713). CAN-SPAM:
|
||||
- applies to commercial email sent to **business** recipients (there is no exemption either
|
||||
way for B2B);
|
||||
- is an **opt-out** regime — it does **not** require a recipient's prior consent before a
|
||||
commercial email may be sent, and lawful unsolicited commercial email is permitted;
|
||||
- **preempts** state laws that would expressly regulate the use of commercial email, except
|
||||
to the extent a state law prohibits falsity or deception (15 U.S.C. § 7707(b)).
|
||||
|
||||
Performance West's messages contained accurate, non-deceptive header and subject-line
|
||||
information, identified the sender, included Performance West's valid physical postal address,
|
||||
and included a functioning unsubscribe mechanism — the requirements CAN-SPAM imposes.
|
||||
|
||||
**3. Mr. Sgro's opt-out request was received and honored; he is now permanently suppressed.**
|
||||
Our records show Mr. Sgro unsubscribed on April 13, 2026, and he reports having blocked our
|
||||
sending domain. CAN-SPAM directs senders to honor an opt-out request within ten (10) business
|
||||
days; we removed him from the relevant mailing upon his request.
|
||||
【COUNSEL/JUSTIN TO CONFIRM AND COMPLETE: Our list-management records indicate that, due to an
|
||||
inadvertent re-import of a public-data list, Mr. Sgro's business address was re-added to a
|
||||
mailing segment on April 26, 2026, which may have resulted in one or more additional messages
|
||||
after his April 13 opt-out. If that occurred, we should (a) say so plainly, (b) explain it was
|
||||
an inadvertent processing error rather than a refusal to honor the opt-out, and (c) confirm it
|
||||
is corrected. Verify exactly what, if anything, was sent after April 13 before finalizing this
|
||||
paragraph — do not assert "no further emails were sent" unless that is verified true.】
|
||||
To prevent any recurrence, Mr. Sgro's address (dave@dataspindle.com) and the dataspindle.com
|
||||
domain have been added to Performance West's **permanent global suppression (do-not-contact)
|
||||
list**. He will receive no further commercial email from Performance West.
|
||||
|
||||
**4. Performance West did not threaten or refuse to stop.**
|
||||
Mr. Sgro states that he was told Performance West "believes he has done nothing wrong and has
|
||||
no intention of stopping." 【JUSTIN TO CONFIRM the substance of any phone/email exchange with
|
||||
Mr. Sgro so we can address this accurately. Our position is that we honor opt-outs; if a
|
||||
discussion conveyed a different impression, we should clarify that any commercial mailing to
|
||||
him has stopped and will not resume.】 To be clear for the record: Performance West has stopped
|
||||
emailing Mr. Sgro and will not resume.
|
||||
|
||||
**5. No transaction or financial harm.**
|
||||
As Mr. Sgro's complaint states, he purchased no product or service from Performance West
|
||||
("Products or Services Purchased: NONE") and paid nothing. There is no transaction, refund, or
|
||||
monetary issue in dispute. The only relief Mr. Sgro seeks is to stop receiving email — which
|
||||
has already been accomplished.
|
||||
|
||||
## Note regarding Mr. Sgro's replies / our responses
|
||||
|
||||
【JUSTIN/COUNSEL: Mr. Sgro's complaint references continued "emails." To the extent any of the
|
||||
communications he received were **direct replies to messages Mr. Sgro himself sent to us**
|
||||
(for example, a reply answering or acknowledging his own email), those are transactional or
|
||||
relationship communications responding to his inbound contact, not commercial solicitations,
|
||||
and are not unsolicited marketing. If applicable, include a short factual description here of
|
||||
which messages were Performance West's marketing emails versus replies to Mr. Sgro's own
|
||||
correspondence. Only include this if accurate and verifiable.】
|
||||
|
||||
## Resolution
|
||||
|
||||
Performance West has taken the following steps:
|
||||
1. Removed Mr. Sgro's address from all marketing mailings;
|
||||
2. Added dave@dataspindle.com and the dataspindle.com domain to our permanent do-not-contact
|
||||
suppression list, so no further commercial email will be sent;
|
||||
3. Reviewed our list-import process to prevent a previously-suppressed address from being
|
||||
re-added.
|
||||
|
||||
We believe these measures fully address Mr. Sgro's stated concern — that he no longer wishes
|
||||
to be contacted — and we consider the matter resolved on our end. We are glad to confirm any
|
||||
of the above to your office in writing.
|
||||
|
||||
Please contact me directly with any questions.
|
||||
|
||||
Respectfully,
|
||||
|
||||
Justin Hannah
|
||||
Performance West Inc.
|
||||
info@performancewest.net
|
||||
(888) 411-0383
|
||||
|
||||
---
|
||||
|
||||
## INTERNAL NOTES — NOT PART OF THE LETTER (delete before sending)
|
||||
|
||||
**Deadline:** AG letter dated May 7, 2026; response requested within 21 days → on/before
|
||||
**May 28, 2026**. 【Confirm current date relative to deadline — if past, send immediately and
|
||||
note that the complaint copy was just received/processed.】
|
||||
|
||||
**Strengths of our position:**
|
||||
- His cited statute (Unsolicited Telecommunication Advertisement Act) is a fax/telemarketing
|
||||
law, not an email law — counsel should confirm and lead with this.
|
||||
- CAN-SPAM is opt-out, permits B2B cold email, and preempts most state email-content laws.
|
||||
- The address came from his own public FCC RMD filing.
|
||||
- No purchase, no money, no transactional harm — this is a mediation, not an enforcement
|
||||
action; AG just wants it resolved. The cleanest resolution is "he's permanently suppressed."
|
||||
|
||||
**The one real exposure — must be handled honestly:**
|
||||
- listmonk records show his lists 3 & 6 were re-created/"confirmed" on **April 26, 2026** (after
|
||||
his April 13 opt-out), and campaigns went to those lists on **May 11, May 27, and June 11,
|
||||
2026.** listmonk does not retain a per-recipient send log and does not date the global
|
||||
blocklist, so we cannot currently prove whether he was globally suppressed (which would have
|
||||
excluded him) or only list-unsubscribed (which a re-import would have overridden) during
|
||||
those May–June sends.
|
||||
- BEFORE finalizing, verify: (a) was he globally **blocklisted** on/around April 13, or only
|
||||
unsubscribed from one list? (b) did any message actually go to him after April 13? If yes,
|
||||
the letter must acknowledge the inadvertent re-import rather than claim a clean record.
|
||||
- If SendGrid was the sending platform in the March–April window, pull SendGrid Email Activity
|
||||
for dave@dataspindle.com for the authoritative per-message timestamps.
|
||||
|
||||
**Do NOT, in the signed letter:**
|
||||
- Claim "no emails were sent after he opted out" unless verified true.
|
||||
- Assert legal conclusions about the PA statute without counsel's confirmation of the cite/scope.
|
||||
|
||||
**Recommend:** licensed PA counsel review and finalize. This draft is a starting point only.
|
||||
20
docs/legal/AG-response-David-Sgro-SENT-NOTE.md
Normal file
20
docs/legal/AG-response-David-Sgro-SENT-NOTE.md
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# PA AG Complaint BCP-26-05-025816 (David Sgro / dataspindle.com) — Status
|
||||
|
||||
- **Complaint filed:** 2026-04-13 by David Sgro (Quakertown, PA) with PA OAG
|
||||
Bureau of Consumer Protection, agent Brett W. Mauser.
|
||||
- **AG mediation letter:** dated 2026-05-07, 21-day response window.
|
||||
- **Response sent:** emailed to the AG on 2026-06-11 (per Justin).
|
||||
|
||||
## Suppression status (must remain true)
|
||||
- dave@dataspindle.com is `blocklisted` in the main listmonk (global, excluded
|
||||
from all campaigns). Not present in the HC listmonk.
|
||||
- dataspindle.com + dave@dataspindle.com added to the legal do-not-contact list
|
||||
in `scripts/_email_exclusions.py` (DO_NOT_CONTACT_DOMAINS / _EMAILS).
|
||||
- `listmonk_import.upsert_subscriber` now refuses to (re-)import or re-confirm
|
||||
any suppressed/do-not-contact address — closes the duplicate-import gap that
|
||||
re-added him to FCC lists on 2026-04-26.
|
||||
|
||||
## Root-cause of the re-contact
|
||||
A duplicate import in `listmonk_import.py` re-added an existing (previously
|
||||
unsubscribed) subscriber to lists with status="confirmed", overriding the
|
||||
opt-out. Fixed by the do-not-contact gate above.
|
||||
BIN
docs/legal/Office-of-Attorney-General_Envelope-108633.pdf
Normal file
BIN
docs/legal/Office-of-Attorney-General_Envelope-108633.pdf
Normal file
Binary file not shown.
214
docs/legal/patent-risk-mechanical-wet-signature.md
Normal file
214
docs/legal/patent-risk-mechanical-wet-signature.md
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
# Patent-risk analysis: remote signature capture + mechanical wet-ink reproduction
|
||||
|
||||
Status: internal patent-RISK research. **Not legal advice and not a freedom-to-
|
||||
operate (FTO) opinion.** A real FTO requires a patent attorney to search live
|
||||
claims and read them against our implementation. This memo identifies where risk
|
||||
is low (mature/expired prior art) vs. where a targeted FTO search is warranted.
|
||||
|
||||
Companion docs: `docs/legal/remote-mechanical-wet-signature-precedent.md`,
|
||||
`docs/plans/remote-wet-signature-products.md`.
|
||||
|
||||
What we do (the accused "system," broken into components):
|
||||
1. Capture a hand-drawn signature in a browser as **vector strokes** (x, y, t).
|
||||
2. Store it + an audit trail (`esign_records`), send a JWT no-login signing link.
|
||||
3. Generate/fill a PDF form; stamp a digital signature image (existing path).
|
||||
4. **Reproduce the captured strokes in real ink on paper with a pen plotter /
|
||||
Line-us arm** (the novel-feeling part).
|
||||
5. Mail/file the document; track fulfillment.
|
||||
|
||||
## TL;DR
|
||||
|
||||
- **Components 1-3 and 5** are ubiquitous, decades-old techniques (signature
|
||||
capture, e-sign workflow, PDF fill, mailing automation). **Patent risk: low**,
|
||||
but the *e-signature workflow* space is litigious (DocuSign, RPost, etc.), so a
|
||||
targeted FTO on any **specific workflow feature** is prudent before scaling.
|
||||
- **Component 4** (drawing a signature in ink with a machine) sits on **very old,
|
||||
expired prior art**: signature-duplicating machines (Hawkins polygraph, 1803),
|
||||
autopens (1930s-1942), pen plotters (1950s-1980s), CNC/G-code motion (1950s+).
|
||||
The *idea* of a machine writing a signature is firmly in the public domain.
|
||||
**Patent risk on the core concept: low.**
|
||||
- The realistic risk is **not** the broad concept but **narrow, recent claims**
|
||||
on a *specific combination/method* (e.g. "capture an e-signature online, then
|
||||
transmit it to a robotic pen to apply wet ink for a regulated filing"). A
|
||||
firsthand title sweep of 1.58M recent grants (2021-2025) found **no such
|
||||
patent**; the e-sign players (DocuSign/Adobe/Silanis) hold only *electronic*
|
||||
workflow patents. This reduces, but does not eliminate, the need for an
|
||||
attorney FTO (which must also cover pre-2021 and pending claims).
|
||||
|
||||
## 1. Signature capture (vector strokes in a browser)
|
||||
|
||||
- **Prior art is overwhelming and old.** Electronic signature pads (Topaz,
|
||||
Wacom), tablet/stylus capture, and HTML5 `<canvas>` signature capture have been
|
||||
standard for 15-25+ years. Capturing (x, y, t) stroke data is basic digitizer
|
||||
technique predating the web.
|
||||
- **Risk: low** for the act of capturing strokes. Any patent broad enough to
|
||||
cover "capture a signature on a touchscreen" would almost certainly be invalid
|
||||
over prior art. Avoid copying a *specific patented capture algorithm* (e.g. a
|
||||
particular biometric/pressure-analysis method) - we use plain stroke capture.
|
||||
|
||||
## 2. E-signature workflow + audit trail + no-login link (JWT)
|
||||
|
||||
- **This is the litigious zone of the three software components.** Companies with
|
||||
e-signature/e-delivery patent portfolios have actively asserted them:
|
||||
- **RPost** (Registered Email / e-signature patents) has a history of
|
||||
licensing/litigation around proof-of-delivery and e-signature.
|
||||
- **DocuSign** holds many patents on signing *workflows*, "envelopes," routing,
|
||||
and tamper-evidence.
|
||||
- **But:** post-*Alice v. CLS Bank* (573 U.S. 208 (2014)), many abstract
|
||||
"do-it-on-a-computer" software/business-method patents are vulnerable to
|
||||
invalidation under 35 U.S.C. § 101. Generic e-sign workflow claims have been
|
||||
narrowed/invalidated.
|
||||
- **Risk: low-moderate.** Our workflow (JWT link, store signature + IP/UA/time,
|
||||
resume a pipeline) is generic and well-trodden. The risk is asserting a
|
||||
*specific patented feature* (e.g. a particular tamper-evidence/seal method, a
|
||||
specific routing/orchestration claim). **Do a targeted FTO before building any
|
||||
distinctive workflow feature** (sequential multi-party routing, a proprietary
|
||||
audit-seal, etc.).
|
||||
|
||||
## 3. PDF generation / form fill / digital stamp
|
||||
|
||||
- **Ubiquitous, mature.** Filling AcroForm fields and overlaying an image onto a
|
||||
PDF is standard library functionality (pypdf, reportlab, PDFBox, etc.) used by
|
||||
millions of applications. **Risk: low.**
|
||||
|
||||
## 4. Mechanical wet-ink reproduction (pen plotter / robotic arm)
|
||||
|
||||
This is the component that *feels* novel but is built on the oldest prior art:
|
||||
|
||||
- **Signature-duplicating machines: 1803.** John Isaac Hawkins patented the
|
||||
"polygraph" pantograph signature copier (used extensively by Jefferson).
|
||||
- **Autopen: 1930s-1942.** The "Robot Pen" (1930s) and De Shazo's commercially
|
||||
successful autopen (1942, Navy order) mass-reproduced signatures in ink. By
|
||||
mid-century there were 500+ autopens in Washington.
|
||||
- **Pen plotters: 1950s-1980s.** X-Y pen plotters (Calcomp 1959; HP 7470A 1980s)
|
||||
draw arbitrary vector paths in ink - exactly our motion problem.
|
||||
- **CNC / G-code motion control: 1950s+.** Numerically-controlled multi-axis
|
||||
motion (which a CR-10/3D printer is) is decades old.
|
||||
- (Sources: Wikipedia "Autopen," retrieved firsthand; well-documented hardware
|
||||
history.)
|
||||
- **Conclusion:** "a machine that applies a person's signature in ink by
|
||||
following a stored path" is **firmly in the public domain.** No one can hold a
|
||||
valid patent on the *concept*. **Risk on the core mechanism: low.**
|
||||
|
||||
Residual risk is only on **narrow modern improvements**, e.g.:
|
||||
- A *specific* signature-reproduction algorithm (pressure/velocity modeling to
|
||||
mimic natural handwriting) that someone recently patented. We use plain
|
||||
fit-to-box stroke replay; avoid copying a specific patented "natural-motion"
|
||||
method without checking.
|
||||
- A *specific combined method claim* tying online e-signature capture to a
|
||||
robotic ink applicator for filings. We found no such patent, but this is the
|
||||
one area an attorney FTO should specifically probe (handwriting-robot startups,
|
||||
e.g. companies in the "robot-written mail" space, may hold method patents on
|
||||
*their* pipelines - those would be narrow to their implementations).
|
||||
|
||||
## 5. Mailing / fulfillment automation
|
||||
|
||||
- **Mature and generic.** Batch mailing, address routing, print-and-mail
|
||||
workflows are old and widely practiced. **Risk: low.** (Note RPost-style
|
||||
proof-of-delivery patents exist; we are not claiming a proprietary e-delivery
|
||||
receipt mechanism.)
|
||||
|
||||
## Recent-grant prior-art sweep (2021-2025, firsthand query)
|
||||
|
||||
To probe the one real risk zone (a recent method patent tying online signature
|
||||
capture to robotic ink application, and e-sign workflow patents our flow might
|
||||
read on), we ran a firsthand title search against a full USPTO grant dataset
|
||||
(PatentsView-derived, **1,575,344 patents granted 2021-06 to 2025-09**). This is
|
||||
a **title-level** sweep of recent grants, **not** a claims-level FTO, and it does
|
||||
not cover pre-2021 art - but it directly tests "did anyone recently patent our
|
||||
specific combination?" The answer is essentially no:
|
||||
|
||||
- **Signature + (ink|pen|stylus|wet) + (robot|machine|apparatus|device): 0
|
||||
relevant hits.** All matches were unrelated (wireless-comms "signatures,"
|
||||
printer ink-color flushing). **No "machine applies a signature in ink" patent
|
||||
appears in 5 years of grants.**
|
||||
- **autopen: 0 hits. signature+plotter: 0. signature+reproduce: 0.**
|
||||
- **"writing/drawing robot": only ornamental DESIGN patents** (D1090657,
|
||||
D1058630 - cover a device's *appearance*, not a signing method) plus an
|
||||
unrelated Yaskawa robot-withdrawal utility patent. Nothing signature-specific.
|
||||
- **"handwriting + machine": only handwriting *extraction* (reading) via ML**
|
||||
(12175799), i.e. the opposite of writing.
|
||||
- **E-signature workflow space is owned by the expected players, all purely
|
||||
electronic (no ink/paper):**
|
||||
- **DocuSign, Inc.** - many recent grants on document models, recipient
|
||||
routing/notification, OCR, contract generation (e.g. 12411896 "Document
|
||||
graph"; RE50043 associating third-party content with online signing).
|
||||
- **Adobe Inc.** - electronic-signature *capture UI* (11132105, 11159328,
|
||||
11750670 "signature collection within an online conference").
|
||||
- **Silanis Technology, Inc.** - 11093652 "Web-based method and system for
|
||||
applying a legally enforceable signature on an electronic document" (the
|
||||
single closest hit by name) - but it is **purely electronic**; it does not
|
||||
apply ink to paper, so it does not read on our mechanical reproduction.
|
||||
- **Tamper/seal:** 11743053 "Electronic signature system and tamper-resistant
|
||||
device" - electronic; relevant only if we built a proprietary tamper-seal
|
||||
(we do not).
|
||||
|
||||
**Interpretation:** the recent-patent landscape is consistent with the prior-art
|
||||
analysis above. The litigious e-sign players hold **electronic-workflow** patents
|
||||
(read them before building any distinctive workflow feature), but **no one holds
|
||||
a recent patent on reproducing a captured signature in ink with a machine for a
|
||||
filing** - our specific, novel-feeling combination. This *reduces* (does not
|
||||
eliminate) the residual risk flagged in section 4.
|
||||
|
||||
**Caveats:** (1) title-only, recent-grant (2021-2025) - misses pre-2021 patents
|
||||
(many e-sign core patents predate 2021) and any in-force patent whose title does
|
||||
not contain these words; (2) does not read claims; (3) does not cover pending
|
||||
applications. **Still not an FTO** - a patent attorney must read live claims
|
||||
(including pre-2021 and pending) against our implementation before launch.
|
||||
|
||||
Method: queried the patent grant parquet directly via DuckDB (title LIKE
|
||||
filters). Dataset coverage and the specific hits above were retrieved firsthand
|
||||
2026-06-07.
|
||||
|
||||
## What would actually create exposure (avoid these without FTO)
|
||||
|
||||
1. Copying a **named competitor's specific feature** (a particular tamper-seal,
|
||||
a specific multi-party routing UX, a specific "robot handwriting realism"
|
||||
algorithm).
|
||||
2. Implementing a **distinctive method** and marketing it as such (the more
|
||||
specific/novel our claim of novelty, the more likely it overlaps a method
|
||||
patent - and the more attractive we are as a target).
|
||||
3. Building the **RON / e-notary** layer without checking notary-tech patents.
|
||||
|
||||
## Recommendations
|
||||
|
||||
1. **Now (low cost):** keep the implementation **generic and built on
|
||||
public-domain techniques** (plain stroke capture, standard PDF libs, standard
|
||||
G-code/CNC motion, autopen-class reproduction). This is our best defense - we
|
||||
are practicing decades-old art.
|
||||
2. **Before scaling / raising / public launch:** commission a **freedom-to-operate
|
||||
search** from a patent attorney focused on two questions:
|
||||
(a) any live method patent tying **online e-signature capture → robotic ink
|
||||
application** for documents/filings; (b) any e-signature **workflow** patent
|
||||
our specific features might read on.
|
||||
3. **Defensive posture:** document our **prior-art basis** (this memo + the
|
||||
hardware history) so that if anyone asserts a broad patent, we can argue
|
||||
invalidity/non-infringement. Consider a **defensive publication** of our
|
||||
pipeline (a public description) to create prior art preventing others from
|
||||
patenting the same combination later.
|
||||
4. **Do not patent-troll-bait:** avoid over-claiming novelty in marketing; frame
|
||||
the service as "we file your documents with an original ink signature," not as
|
||||
a patented invention.
|
||||
|
||||
## Honest limits of this memo
|
||||
|
||||
- We ran a **title-level sweep of recent grants (2021-2025)** (see section above)
|
||||
but did **not** run a full **claims-level** search across all years; reading
|
||||
live claims against our code requires a patent attorney. The recent-grant sweep
|
||||
supports the low-risk *concept* assessment but is **not an FTO clearance.**
|
||||
- Patent risk is jurisdiction- and claim-specific and changes as patents issue;
|
||||
re-check before any major launch.
|
||||
|
||||
## Sources
|
||||
|
||||
- Prior-art hardware history (autopen 1803/1930s/1942, plotters, CNC):
|
||||
Wikipedia "Autopen" (retrieved firsthand 2026-06-07), corroborated by
|
||||
general hardware history.
|
||||
- *Alice Corp. v. CLS Bank Int'l*, 573 U.S. 208 (2014) - § 101 abstract-idea
|
||||
invalidity framework (well-known; confirm citation before reliance).
|
||||
- Litigious-player context (RPost, DocuSign patent portfolios): general industry
|
||||
knowledge plus the firsthand recent-grant sweep above (DocuSign/Adobe/Silanis
|
||||
hits) - confirm specifics with counsel before relying.
|
||||
- Recent-grant prior-art sweep: USPTO patent grant dataset (PatentsView-derived,
|
||||
2021-2025, 1.58M patents), queried firsthand via DuckDB 2026-06-07. Specific
|
||||
patent numbers cited above are real hits from that dataset.
|
||||
335
docs/legal/remote-mechanical-wet-signature-precedent.md
Normal file
335
docs/legal/remote-mechanical-wet-signature-precedent.md
Normal file
|
|
@ -0,0 +1,335 @@
|
|||
# Legal research: remote mechanical wet-signature - authenticity & acceptance
|
||||
|
||||
Status: internal legal-RISK research memo. **Not legal advice.** Engage counsel
|
||||
before relying on the machine-applied wet-ink path for any filing where rejection
|
||||
or challenge is costly. Companion product doc:
|
||||
`docs/plans/remote-wet-signature-products.md`.
|
||||
|
||||
Use case under analysis: a person draws their **own** signature online; we
|
||||
reproduce **their own captured strokes in real ink on paper** with a pen plotter
|
||||
(CR-10 / Line-us), then file/mail the document. Question: is that a valid,
|
||||
authentic, "original" signature, and where is it accepted vs. prohibited?
|
||||
|
||||
Last verified: 2026-06-07. Primary sources were retrieved firsthand; see each
|
||||
section. Where no direct precedent exists, this memo says so explicitly.
|
||||
|
||||
---
|
||||
|
||||
## TL;DR risk assessment
|
||||
|
||||
- **General contract / common-law signing:** Very low risk. A signature need not
|
||||
be in the signer's own hand; it is valid if made *by the signer or by another
|
||||
at the signer's direction, with intent to authenticate.* A machine the signer
|
||||
directs is squarely within this rule. (Firmly established.)
|
||||
- **Electronic-signature contexts (ESIGN/UETA):** Low risk, but note these laws
|
||||
validate *electronic* signatures; our plotter output is a *physical ink* mark,
|
||||
so ESIGN/UETA are supportive-by-analogy on the intent principle but are not the
|
||||
governing authority for a paper original.
|
||||
- **Federal autopen precedent:** Favorable but politically contested. DOJ/OLC
|
||||
(2005) blessed presidential autopen signing; presidents have used it; no court
|
||||
has invalidated an autopen signature. But 2024-2026 saw active political/legal
|
||||
challenges (Biden pardons), so the topic is live. (Established opinion;
|
||||
unsettled at the margins.)
|
||||
- **"Original / wet ink, no stamps/copies" filing rules (e.g. Medicare
|
||||
CMS-855):** **HIGHEST RISK and NO DIRECT PRECEDENT.** Whether a plotter-applied
|
||||
ink mark is an "original ink" signature or a prohibited "stamp/copy/facsimile"
|
||||
is **untested**. A reviewer could plausibly argue either way. Treat as the fast
|
||||
path with a true client-wet-sign fallback until acceptance is confirmed.
|
||||
|
||||
---
|
||||
|
||||
## 1. Federal autopen precedent (DOJ/OLC, 2005)
|
||||
|
||||
**Firmly established (the opinion exists and concluded favorably):**
|
||||
|
||||
- *Whether the President May Sign a Bill by Directing That His Signature Be
|
||||
Affixed to It*, Op. O.L.C. (July 7, 2005) (the "Nielson memo"), conventionally
|
||||
cited **29 Op. O.L.C. 97**. Retrieved firsthand from justice.gov; the published
|
||||
summary reads verbatim:
|
||||
|
||||
> "The President need not personally perform the physical act of affixing his
|
||||
> signature to a bill he approves and decides to sign in order for the bill to
|
||||
> become law. Rather, the President may sign a bill within the meaning of
|
||||
> Article I, Section 7 by directing a subordinate to affix the President's
|
||||
> signature to such a bill, for example by autopen."
|
||||
|
||||
Source: https://www.justice.gov/olc/opinion/whether-president-may-sign-bill-directing-his-signature-be-affixed-it
|
||||
|
||||
- The opinion's reasoning rests on the long-settled **common-law signature
|
||||
doctrine**: signing "in person" does not require the signer's own hand; it is
|
||||
enough that the signature is affixed by the signer or by another acting at the
|
||||
signer's direction and on the signer's behalf, with intent to adopt it. (This
|
||||
is the same agency principle discussed in §2.)
|
||||
|
||||
**Practical record (verified background):**
|
||||
|
||||
- President Obama was the first to **sign legislation** by autopen - the 2011
|
||||
PATRIOT Act provisions extension (signed by directed autopen while he was in
|
||||
France), and the Jan 3, 2013 fiscal-cliff/tax bill (autopen while in Hawaii).
|
||||
- President Biden directed autopen use for a May 2024 FAA funding extension while
|
||||
traveling.
|
||||
- Source: Wikipedia "Autopen" (secondary; corroborates widely-reported events),
|
||||
https://en.wikipedia.org/wiki/Autopen
|
||||
|
||||
**Interpretive / unsettled:**
|
||||
|
||||
- The constitutionality of presidential autopen signing **has never been tested
|
||||
in court** - it rests on the OLC opinion (executive-branch legal advice, not
|
||||
binding precedent).
|
||||
- 2024-2026: a live political/legal dispute over whether **Biden-era pardons**
|
||||
signed by autopen are valid. The Fourth Circuit in *Rosemond v. Hudgins* (4th
|
||||
Cir. 2024) held pardons need not even be in writing - cutting *against* any
|
||||
argument that a defective signature voids a pardon. Per reporting, DOJ
|
||||
investigated the autopen-pardon allegations and was "ultimately unable to move
|
||||
forward with making a case." (Wikipedia "Autopen," citing AP/WaPo.) Net: no
|
||||
authority has *invalidated* an autopen signature; the challenge is political.
|
||||
|
||||
**Takeaway:** Federal practice and the controlling executive-branch opinion treat
|
||||
a machine-affixed signature, made at the signer's direction, as a *valid* signing
|
||||
of the document. The contested cases involve *someone else* directing the
|
||||
machine; our use case (the signer's own captured strokes, with the signer's
|
||||
authorization) is the *stronger* posture.
|
||||
|
||||
---
|
||||
|
||||
## 2. Common-law: a signature need not be in the signer's own hand
|
||||
|
||||
**Firmly established (black-letter law):**
|
||||
|
||||
- The universal rule: a "signature" is any mark or symbol **executed or adopted
|
||||
with present intent to authenticate** a writing. It may be made by hand, by
|
||||
print, by stamp, by mark (an "X"), or **by another person at the signer's
|
||||
direction** (the agency/amanuensis principle). Hand-of-the-signer is not
|
||||
required.
|
||||
|
||||
- Codified analogues confirming the principle:
|
||||
- **UCC § 1-201(b)(37):** "'Signed' includes using any symbol executed or
|
||||
adopted with present intention to adopt or accept a writing." (Retrieved
|
||||
firsthand: https://www.law.cornell.edu/ucc/1/1-201)
|
||||
- **Statute of Frauds / Restatement** practice: a signature "by the party to be
|
||||
charged or by his agent" satisfies the writing requirement - i.e., an
|
||||
authorized agent (or a device the principal directs) may sign.
|
||||
|
||||
- The amanuensis doctrine: when one person signs another's name **in that
|
||||
person's presence and at their direction**, the law treats it as the
|
||||
principal's own signature, not as a third party's act. This is the doctrinal
|
||||
home for "I authorized this machine to write my name."
|
||||
|
||||
**Interpretive / uncertain:**
|
||||
|
||||
- The precise case citations vary by jurisdiction; the *principle* is universal
|
||||
but a filing reviewer applying a *specific* "original ink" rule (see §4) is not
|
||||
deciding a common-law signature question - they are applying an administrative
|
||||
anti-fraud rule, which can be stricter than the common law allows.
|
||||
|
||||
**Takeaway:** As a matter of contract/property/general law, reproducing one's own
|
||||
signature by a directed machine is a valid signature. The risk does not live
|
||||
here; it lives in administrative "original/wet/no-copies" rules (§4).
|
||||
|
||||
---
|
||||
|
||||
## 3. ESIGN Act & UETA (electronic signatures)
|
||||
|
||||
**Firmly established (statutory text):**
|
||||
|
||||
- **ESIGN, 15 U.S.C. § 7001(a):** a signature/contract/record "may not be denied
|
||||
legal effect, validity, or enforceability solely because it is in electronic
|
||||
form." (Retrieved firsthand: https://www.law.cornell.edu/uscode/text/15/7001)
|
||||
- **ESIGN, 15 U.S.C. § 7006(5):** "electronic signature" = "an electronic sound,
|
||||
symbol, or process, attached to or logically associated with a contract or
|
||||
other record and **executed or adopted by a person with the intent to sign**
|
||||
the record." (https://www.law.cornell.edu/uscode/text/15/7006)
|
||||
- **UETA** (adopted in ~49 states) is parallel: an electronic signature satisfies
|
||||
any law requiring a signature, if the parties agreed to transact electronically.
|
||||
|
||||
**The critical limit / why this is only partial support:**
|
||||
|
||||
- ESIGN/UETA validate **electronic** signatures. Our plotter produces a
|
||||
**physical ink** mark on paper - that is **not** an electronic signature, so
|
||||
ESIGN/UETA are **not the governing authority** for the paper original.
|
||||
- They are nonetheless useful for the *intent* principle: the captured online
|
||||
draw is itself a valid electronic signature (intent to sign), which supports
|
||||
the authorization to reproduce it in ink.
|
||||
- ESIGN also has **carve-outs** - it does *not* override requirements for certain
|
||||
documents (e.g., wills, certain notices), and federal agencies may set format
|
||||
rules. So an agency demanding a wet original is not displaced by ESIGN.
|
||||
|
||||
**Takeaway:** The online capture is a clean electronic signature under ESIGN. But
|
||||
ESIGN does not answer whether the *ink reproduction* satisfies a *paper-original*
|
||||
rule - that is governed by the specific agency rule in §4.
|
||||
|
||||
---
|
||||
|
||||
## 4. "Original / signed in ink / no stamps or copies" rules - the real risk
|
||||
|
||||
This is the high-risk, **no-direct-precedent** zone.
|
||||
|
||||
**Firmly established (the rules exist and are strict):**
|
||||
|
||||
- **Medicare CMS-855 / CMS-10114 enrollment forms** require **original
|
||||
signatures** and direct that the application be mailed "with original
|
||||
signatures." Retrieved firsthand from the CMS-855B PDF
|
||||
(https://www.cms.gov/medicare/cms-forms/cms-forms/downloads/cms855b.pdf):
|
||||
- "Send this completed application **with original signatures** and all required
|
||||
documentation to your designated MAC."
|
||||
- "**signatures must be original.**"
|
||||
- The CMS-10114 / 855 family historically states (widely published in the form
|
||||
instructions) that signatures must be original and in ink, and that **stamped,
|
||||
faxed, or copied signatures will not be accepted** and applications with
|
||||
signatures deemed not original will not be processed. (We rely on the form
|
||||
text; quote the exact current edition before client-facing use.)
|
||||
|
||||
**No direct precedent (the key gap):**
|
||||
|
||||
- There is **no CMS ruling, sub-regulatory guidance, or case** we could locate
|
||||
that decides whether a **pen-plotter / autopen ink mark** counts as an
|
||||
"original ink" signature or as a prohibited "stamp/copy/facsimile." The rule
|
||||
was written to bar photocopies, fax images, and rubber stamps; a plotter
|
||||
drawing wet ink onto the *one original sheet* is **factually different from all
|
||||
three** (it is original, in ink, not copied) - but a reviewer has discretion.
|
||||
|
||||
**Why a reviewer could go either way:**
|
||||
|
||||
- *For acceptance:* the mark is genuinely wet ink, applied once to the original
|
||||
sheet, reproducing the signer's own authorized signature - none of the three
|
||||
banned methods (stamp/fax/copy) literally applies.
|
||||
- *Against acceptance:* the autopen mark is forensically distinguishable from a
|
||||
hand signature (even pressure / uniform indentation - see §6), and a strict
|
||||
reviewer may treat any *machine-replicated* signature as a "stamp/copy" in
|
||||
spirit, or as "not the provider's own hand."
|
||||
|
||||
**Takeaway:** For "original ink" administrative filings, the machine-wet-ink path
|
||||
is **unadjudicated**. Do not represent it as guaranteed-accepted. Keep a true
|
||||
client-wet-sign fallback; consider confirming on a small number of live filings
|
||||
before scaling; and never describe the mechanism to the client/agency in a way
|
||||
that invites a "stamp/copy" characterization.
|
||||
|
||||
---
|
||||
|
||||
## 5. Where autopen/mechanical signatures are explicitly accepted or barred
|
||||
|
||||
**Accepted / tolerated (verified or well-established):**
|
||||
|
||||
- **Federal legislation signing** by the President (OLC 2005; actual practice).
|
||||
- **General commercial documents** under UCC/common law (any symbol adopted with
|
||||
intent).
|
||||
- **Routine correspondence, checks (historically), certificates** - the original
|
||||
and largest autopen market was government/Treasury check-signing and
|
||||
congressional mail (background, Wikipedia "Autopen").
|
||||
|
||||
**Restricted / requires special treatment (flag for per-context research):**
|
||||
|
||||
- **Notarized & recorded instruments** (deeds, etc.): generally require the
|
||||
signer's act before the notary; a *pre-applied* machine signature is risky
|
||||
unless executed in the notary's presence (see §7). VERIFY per state.
|
||||
- **Wills / testamentary instruments:** strict execution formalities; many require
|
||||
the testator's signature (or a proxy signing *in the testator's presence and at
|
||||
their direction*, witnessed). Machine pre-application is high-risk. VERIFY.
|
||||
- **Documents with explicit "original ink / no copies" rules** (CMS-855, some
|
||||
court filings, some immigration/ATF forms): unadjudicated - §4.
|
||||
- **IRS / SEC / agency e-filing:** these increasingly *prefer electronic*
|
||||
filing/signature; where they accept paper, the "original signature" question
|
||||
recurs. VERIFY per program.
|
||||
|
||||
**No reliable blanket source** says "autopen is categorically banned" or
|
||||
"categorically fine" across all filings. It is **context-specific**.
|
||||
|
||||
---
|
||||
|
||||
## 6. Forgery / fraud line: own-signature-with-authorization vs. third-party
|
||||
|
||||
**Firmly established principle:**
|
||||
|
||||
- The dividing line is **authorization + intent**. Reproducing *your own*
|
||||
signature, that *you* drew and authorized, with intent to sign *this* document,
|
||||
is a valid signature (your own act). Applying *someone else's* signature
|
||||
without authority is forgery; applying it *with* authority and in their
|
||||
presence/at their direction is valid (amanuensis/agency).
|
||||
|
||||
**What establishes valid authorization (build these into the product):**
|
||||
|
||||
- Captured intent at signing time: the signer drew the signature, checked the
|
||||
attestation/perjury box, and **expressly authorized reproduction in ink** on
|
||||
the specific document.
|
||||
- A clear, document-specific authorization record (per-document, not a blanket
|
||||
"sign anything" mandate), timestamped, IP/UA logged. (We already store much of
|
||||
this in `esign_records`; add an explicit "authorize ink reproduction" consent.)
|
||||
|
||||
**Forensic note (relevant to detectability and to the §4 risk):**
|
||||
|
||||
- Autopen/plotter marks have **even pressure and uniform indentation**, which is
|
||||
how examiners distinguish them from natural handwriting (pressure varies in a
|
||||
human hand). (Wikipedia "Autopen," citing the mechanism.) This is why a strict
|
||||
"original" reviewer *might* identify and question a machine mark - and why
|
||||
variable-pressure / natural-motion reproduction (using the captured stroke
|
||||
timing) reduces, but does not eliminate, the risk.
|
||||
|
||||
**Takeaway:** Our use case sits on the **valid** side of the forgery line
|
||||
(own signature, own authorization, document-specific intent). The residual risk
|
||||
is administrative acceptance (§4), not forgery.
|
||||
|
||||
---
|
||||
|
||||
## 7. Notarization & witnessing of a machine-applied signature
|
||||
|
||||
**Established constraints (general; verify per state):**
|
||||
|
||||
- A notary attests that the signer **appeared and signed (or acknowledged the
|
||||
signature) before the notary.** A signature **pre-applied by a machine off-site**
|
||||
is hard to notarize as "signed in my presence" - though "acknowledgment" (the
|
||||
signer appears and confirms an already-made signature is theirs) may be
|
||||
available in some states.
|
||||
- **Witnessing** (wills, some POAs) similarly contemplates the signer's act in
|
||||
the witnesses' presence, or a directed proxy signing in the signer's presence.
|
||||
- **RON (Remote Online Notarization)**, now legal in most states, is designed for
|
||||
*electronic* signatures executed live on camera - a better fit for the
|
||||
electronic capture than for an off-site ink reproduction.
|
||||
|
||||
**Takeaway:** Do **not** assume a machine-applied ink signature can be notarized
|
||||
or witnessed like a live signature. For notarized/witnessed instruments, use live
|
||||
signing (in person or RON), not the plotter. The plotter path is best for
|
||||
**non-notarized** filings.
|
||||
|
||||
---
|
||||
|
||||
## Recommendations for the product
|
||||
|
||||
1. **Lead with electronic-signature-accepted services.** Where ESIGN/UETA
|
||||
electronic signatures are accepted, no ink reproduction is needed and risk is
|
||||
low. (E.g., most corporate consents, many filings.)
|
||||
2. **For "original ink" filings (CMS-855 etc.):** keep the machine-wet-ink path as
|
||||
the *fast* option, but (a) maintain a **true client-wet-sign fallback**, (b)
|
||||
capture an **explicit per-document authorization to reproduce in ink**, (c)
|
||||
do not expose the mechanism to client or agency, and (d) confirm acceptance on
|
||||
a few live filings before scaling. Get a written legal opinion before relying
|
||||
on it at volume.
|
||||
3. **Never use the plotter for notarized/witnessed instruments** (wills, deeds,
|
||||
many POAs). Route those to live/RON signing.
|
||||
4. **Document the authorization chain** in `esign_records` (drawn strokes,
|
||||
attestation, ink-reproduction consent, timestamp, IP/UA) so the
|
||||
own-signature-with-authorization posture is provable.
|
||||
5. **Prefer natural-motion reproduction** (use captured stroke timing/pressure
|
||||
where possible) over uniform autopen strokes to reduce forensic
|
||||
distinguishability - while understanding this does not change the legal rule.
|
||||
|
||||
## Sources retrieved firsthand (2026-06-07)
|
||||
|
||||
- DOJ/OLC opinion landing page (summary + holding):
|
||||
justice.gov/olc/opinion/whether-president-may-sign-bill-directing-his-signature-be-affixed-it
|
||||
- CMS-855B application PDF ("signatures must be original"):
|
||||
cms.gov/medicare/cms-forms/cms-forms/downloads/cms855b.pdf
|
||||
- 15 U.S.C. § 7001 and § 7006 (ESIGN), Cornell LII
|
||||
- UCC § 1-201 ("Signed"), Cornell LII
|
||||
- Wikipedia "Autopen" (secondary, for background + the 2011/2013/2024-2026 events
|
||||
and the forensic even-pressure note) - corroborate against primary news before
|
||||
client-facing use.
|
||||
|
||||
## Caveats on this memo
|
||||
|
||||
- This is research, **not legal advice**, and not a substitute for counsel.
|
||||
- The OLC opinion is executive-branch advice, not binding precedent.
|
||||
- The exact CMS-10114 "stamped/faxed/copied... will not be accepted" wording
|
||||
should be re-quoted from the **current** form edition before any client-facing
|
||||
or filing-facing use.
|
||||
- Case citations stated as "black-letter"/principle should be pinned to specific
|
||||
controlling cases in the relevant jurisdiction by counsel before reliance.
|
||||
74
docs/name-reservation-product.md
Normal file
74
docs/name-reservation-product.md
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
# Selling name availability: sell a Name RESERVATION, not a "check"
|
||||
|
||||
Decision (2026-06-09): the product to sell is a **state Name Reservation**, not a
|
||||
bare "name check." Here's why, with the real state mechanics.
|
||||
|
||||
## The key distinction: a search is a snapshot, a reservation is a binding hold
|
||||
- A **name search** (what our TX open-data API and a SOSDirect/SilverFlume search
|
||||
do) is a non-binding *snapshot*. It tells you the name looks free *right now*. It
|
||||
does not stop someone else from taking it tomorrow, and it is not the SOS's official
|
||||
word. Charging for a snapshot is weak value and invites "I paid and then lost the
|
||||
name" complaints.
|
||||
- A **name reservation** is the authoritative, binding action: the Secretary of State
|
||||
*holds the name for you* for a fixed window. This is a real deliverable with a real
|
||||
filing receipt - exactly the kind of thing we should sell.
|
||||
|
||||
## What each state actually offers (public fee schedules)
|
||||
### Texas
|
||||
- **SOSDirect online name search: $1.00 per search** (statutory fee, requires a
|
||||
SOSDirect login). Non-binding snapshot.
|
||||
- **Preliminary determination by phone/email: free** (call 512-463-5555 or email
|
||||
Corporations) - also non-binding, and slow/manual.
|
||||
- **Name Reservation (Form 501): $40 state fee, holds the name 120 days, renewable.**
|
||||
This is the binding hold and the thing worth selling.
|
||||
|
||||
### Nevada
|
||||
- **SilverFlume name availability: free** (but the portal is behind Incapsula bot
|
||||
protection, so we cannot automate it - and a free snapshot is low value anyway).
|
||||
- **Name Reservation: $25 state fee, holds the name 90 days.** The binding hold.
|
||||
|
||||
## Product recommendation
|
||||
1. **Free instant pre-check (lead magnet, not a SKU):** keep the TX open-data API
|
||||
check on the order form as a *free* "looks available / looks taken" instant signal.
|
||||
It costs us nothing, reduces friction, and qualifies the lead. Label it clearly as
|
||||
a preliminary check, not a guarantee. (NV pre-check returns "we'll verify manually"
|
||||
since NV is bot-blocked.)
|
||||
2. **Sell the Name Reservation as the paid SKU.** Flat service fee + the state fee at
|
||||
cost. This is the authoritative hold the customer actually wants, and it's a clean,
|
||||
deliverable-backed product:
|
||||
- `name-reservation-tx`: service fee + **$40** TX state fee (Form 501, 120 days).
|
||||
- `name-reservation-nv`: service fee + **$25** NV state fee (90 days).
|
||||
- or a generic `name-reservation` with the state chosen at intake and the gov fee
|
||||
resolved per state (cleaner, matches how foreign-qualification fans out).
|
||||
3. **Bundle it into the formation / DEXIT flow:** offer "reserve the name now" as an
|
||||
add-on/step before the full formation or conversion, so the customer locks the name
|
||||
while the rest of the paperwork is prepared. Natural upsell, removes the "what if I
|
||||
lose the name while you file?" objection.
|
||||
|
||||
## Pricing note (house rule: use the higher price on any mismatch)
|
||||
Suggested service fee in the $49-$99 range on top of the state fee, billed as a flat
|
||||
fee with the government fee passed through at cost and labeled as such (consistent
|
||||
with our other corporate SKUs and the no-hidden-fees trust posture).
|
||||
|
||||
## Fulfillment reality (be honest about automation)
|
||||
- **TX reservation (Form 501)** is filed via SOSDirect (login-gated) or by mail/fax.
|
||||
SOSDirect filing automation is **not yet verified** (same as TX formation), so the
|
||||
reservation would start **admin-assisted** until that flow is proven by the e2e
|
||||
harness. The $1 SOSDirect search and the $40 reservation both require the SOSDirect
|
||||
account we use for filing.
|
||||
- **NV reservation** is filed on SilverFlume, which is Incapsula-blocked for
|
||||
automation, so NV reservation is **admin-assisted** (a person files it). Still a
|
||||
perfectly good paid product - the customer pays for the outcome (a held name), not
|
||||
for our automation.
|
||||
- Both: capture the name + entity type at intake, file the reservation, deliver the
|
||||
state confirmation/receipt through the portal. The free pre-check gates obviously
|
||||
bad names before the customer pays.
|
||||
|
||||
## Next steps to ship this
|
||||
1. Add `name-reservation` SKU(s) to `api/src/service-catalog.ts` with per-state gov
|
||||
fee (TX $40 / NV $25) and create the matching ERPNext Items.
|
||||
2. Add an admin-assisted `NameReservationHandler` (or reuse the MCS150-style
|
||||
admin-assisted pattern) that records the order and surfaces an admin to-do to file
|
||||
the reservation, then attaches the SOS receipt.
|
||||
3. Keep the free instant TX pre-check on the form; relabel as preliminary.
|
||||
4. Offer the reservation as a step in the formation + DEXIT intake.
|
||||
281
docs/plan.intl-compliance-expansion.md
Normal file
281
docs/plan.intl-compliance-expansion.md
Normal file
|
|
@ -0,0 +1,281 @@
|
|||
# Plan — International Compliance-Services Expansion (UK / AU / IE / NZ)
|
||||
|
||||
_Drafted 2026-06-19. **Planning only — nothing implemented yet.** Builds on the
|
||||
US FMCSA/DOT cold-email + filing model. Sister doc to
|
||||
`docs/campaign-deliverability-plan.md`, `docs/foreign-incorporation-guide.md`,
|
||||
and `docs/billing.md`._
|
||||
|
||||
## Goal
|
||||
|
||||
Replicate the US "regulatory-burden compliance services" model (sell filing /
|
||||
renewal / monitoring services to small operators, acquired via legal unsolicited
|
||||
B2B email) in other English-speaking markets that allow cold B2B email. Target
|
||||
markets, ranked: **UK ⭐, Australia ⭐, Ireland, New Zealand.** (Canada & South
|
||||
Africa excluded — opt-in-only marketing law; see deliverability doc / prior memo.)
|
||||
|
||||
This doc answers the **two blocking questions** before any market entry:
|
||||
|
||||
1. **Must we be incorporated / locally registered to legally sell this service
|
||||
type in-region?** (and to send the marketing)
|
||||
2. **Merchant processing**: how do we take ecommerce payments from in-region
|
||||
customers, and how do we remit any **fees to the authorities** on their behalf?
|
||||
|
||||
Everything else (template localization, list sourcing, burner sending) is
|
||||
deferred to follow-up docs once these two gates are cleared.
|
||||
|
||||
---
|
||||
|
||||
## Question 1 — Do we need a local entity?
|
||||
|
||||
Two separate legal tests. Don't conflate them.
|
||||
|
||||
- **(a) To OPERATE the business** (sell a filing/agent service to locals).
|
||||
- **(b) To send the MARKETING** (cold B2B email into that country).
|
||||
|
||||
For (b) none of these countries require a local entity — the anti-spam laws
|
||||
(UK PECR, AU Spam Act, IE ePrivacy, NZ UEMA) bind on **conduct** (sender ID +
|
||||
unsubscribe + B2B-consent basis), not on where the sender is incorporated. A
|
||||
foreign sender can lawfully email; it just must comply with the rules. So the
|
||||
entity question is really about (a): operating, contracting, and getting paid.
|
||||
|
||||
| Market | Local entity legally required to operate? | Reality / why |
|
||||
|---|---|---|
|
||||
| **UK** | **No** (can trade as overseas entity), but **strongly advised** | A foreign company can sell services into the UK. BUT: (i) UK merchant acquirers/Stripe UK want a UK or EEA entity for GBP settlement + lower fees; (ii) **VAT registration** likely required (see Q2); (iii) credibility — UK SMEs distrust a US filing agent for their O-licence. A **UK Ltd** is cheap (~£12/yr Companies House) and removes all three frictions. **No UK-resident director required.** |
|
||||
| **Australia** | **No** to sell remotely; **registration triggered** if "carrying on business in Australia" | Foreign co can sell in. Once you're "carrying on business in AU" you must register as a **foreign company with ASIC (ARBN)** OR form a local **Pty Ltd**. Pty Ltd is cleaner BUT **requires at least one director who ordinarily resides in Australia** (Corporations Act s201A) — this is the real blocker; needs a resident director / nominee service. GST registration required once turnover ≥ A$75k (see Q2). |
|
||||
| **Ireland** | **No**, but EU-presence helps | Foreign (incl. UK post-Brexit, US) co can sell in. An **Irish Ltd requires at least one EEA-resident director** OR a **s137 non-resident bond** (~€25k insurance bond, ~€2k/yr). VAT registration required (Q2). If we already have a UK Ltd, can often sell into IE from UK without a separate IE entity. |
|
||||
| **New Zealand** | **No**, low bar to localize | Foreign co can sell in. NZ company formation is fast/cheap BUT **requires one director living in NZ (or in Australia AND a director of an AU company)** — Companies Act 1993 s10. GST registration once turnover ≥ NZ$60k. Smallest market; defer. |
|
||||
|
||||
### Sharper question: does the *service itself* (acting as filing agent) require a license?
|
||||
|
||||
This is the one to verify per-vertical before launch — being someone's agent for
|
||||
a government filing can be a regulated activity.
|
||||
|
||||
| Market | Filing-agent licensing for transport compliance? | Notes / open item |
|
||||
|---|---|---|
|
||||
| **UK** | **No license to be a paid agent**, but the **Transport Manager** role on an O-licence is statutory (must hold a CPC and be a real person of repute). We can sell **prep / monitoring / renewal admin**, and optionally broker **external Transport Manager CPC holders**, but we **cannot ourselves "be" the Transport Manager** without a qualified person. **VERIFY: don't market as providing the TM unless we contract real CPC holders.** |
|
||||
| **AU** | **No agent license** for NHVR/CoR advisory or NHVAS prep. NHVAS auditors must be approved, but we'd sell prep, not audit. Low risk. |
|
||||
| **IE** | Same as UK (EU-harmonized: Transport Manager CPC required on the operator licence). |
|
||||
| **NZ** | Transport Service Licence has a "fit and proper person" + certificate requirements; advisory/prep is unregulated. |
|
||||
|
||||
**Recommendation (Q1):**
|
||||
1. **UK first.** Form a **UK entity** (no resident director/member needed, cheap,
|
||||
unlocks Stripe UK + GBP + VAT + credibility). Sell prep/monitoring/renewal;
|
||||
partner with external CPC Transport Managers rather than claiming to be one.
|
||||
|
||||
**Entity choice — LLP (chosen) vs Ltd:** Going with a **UK LLP** for
|
||||
**tax pass-through** (no corporation tax at entity level; profits taxed in
|
||||
members' hands). Trade-offs to plan around:
|
||||
- **LLP needs ≥2 members** (a Ltd can be a single person). Need a second
|
||||
member/designated member.
|
||||
- Pass-through is **not** zero UK tax: non-UK-resident members with **UK-source
|
||||
trading profit** owe **UK self-assessment**; the LLP files a **partnership
|
||||
return (SA800)**. So two layers of personal filing, not entity tax.
|
||||
- **US tax:** a UK LLP defaults to a **partnership** for US purposes (or
|
||||
check-the-box) → flows to US members' returns; watch for extra US filing.
|
||||
- **VAT obligation is identical to a Ltd** (see Q2). No saving there.
|
||||
- **No UK-resident member required** for an LLP — good.
|
||||
2. **AU second.** Start by **selling remotely as the existing entity** (legal) to
|
||||
validate demand; only stand up a **Pty Ltd (needs resident-director nominee)**
|
||||
or **ASIC ARBN** once revenue justifies it / once "carrying on business" is
|
||||
triggered.
|
||||
3. **IE / NZ** deferred — both need a resident-director or bond workaround and are
|
||||
smaller; revisit after UK proves the playbook.
|
||||
|
||||
---
|
||||
|
||||
## Question 2 — Merchant processing & remitting fees to authorities
|
||||
|
||||
Two money flows, kept strictly separate (same separation we already enforce in
|
||||
`docs/billing.md`: **our service fee** vs **government filing fee**):
|
||||
|
||||
- **Flow A — collect from customer** (ecommerce checkout, multi-currency).
|
||||
- **Flow B — pay the authority** the actual government fee on the customer's behalf.
|
||||
|
||||
### Flow A — Collecting payment (merchant processing)
|
||||
|
||||
Today's stack (`api/src/routes/checkout.ts`): **Stripe Checkout (card + ACH),
|
||||
PayPal Orders v2, SHKeeper crypto**; Stripe Subscriptions for recurring;
|
||||
Adyen aspirational/not live. We extend this, we don't replace it.
|
||||
|
||||
| Market | Best acquiring approach | Currency / settlement | Notes |
|
||||
|---|---|---|---|
|
||||
| **UK** | **Stripe UK** under the new **UK Ltd** | Settle **GBP** to a UK/EEA business account (Wise, Airwallex, Revolut Business, or a UK high-street acct) | Lowest fees, local card success rates, supports **BACS Direct Debit** (the UK ACH analog — good for recurring monitoring subs) and local methods. PayPal UK as fallback. |
|
||||
| **AU** | **Stripe AU** (needs AU entity) **or** sell via existing Stripe charging in **AUD as a foreign business** initially | AUD; settle via Airwallex/Wise AUD until Pty Ltd exists | Stripe supports AUD on a non-AU account but settlement/fees are worse; **PayID/BECS Direct Debit** need a local Stripe. Start cross-border, localize when entity lands. |
|
||||
| **IE** | Stripe (UK or IE entity), **EUR**, SEPA Direct Debit | EUR | If UK Ltd exists, can run IE sales through it in EUR. |
|
||||
| **NZ** | Stripe NZ (needs NZ entity) or cross-border NZD | NZD | Defer. |
|
||||
|
||||
**Multi-currency mechanics (low-lift path):**
|
||||
- Stripe can present/settle multiple currencies on one account; quickest start is
|
||||
**charge in local currency on the existing/US or new UK account**, accept FX
|
||||
until per-market entities exist.
|
||||
- Use **Wise Business / Airwallex** to hold GBP/AUD/EUR/NZD and avoid double FX.
|
||||
- Keep **ERPNext as system of record** (multi-currency invoices already supported)
|
||||
exactly as in `docs/billing.md`; add per-market price lists + tax templates.
|
||||
|
||||
**Surcharge note:** our card surcharge model (`docs/billing.md`) is **illegal/capped
|
||||
in several of these markets** — **UK & EU cap/ban surcharges on consumer cards
|
||||
(PSD2 surcharging ban); AU allows surcharge only up to actual cost of acceptance
|
||||
(RBA rules).** ⚠️ **Do NOT copy the US 3% card surcharge into UK/EU/AU.** Bake
|
||||
processor cost into price or absorb it there.
|
||||
|
||||
### Flow A.1 — Sales tax / VAT / GST on OUR service fee
|
||||
|
||||
This is mandatory homework, not optional. Selling services to local businesses
|
||||
generally creates a tax-collection obligation.
|
||||
|
||||
| Market | Tax | Registration trigger | Mechanic |
|
||||
|---|---|---|---|
|
||||
| **UK** | **VAT 20%** | If UK-established: register at **£90k** turnover. **If we sell from a non-UK entity into UK, threshold can be £0** (non-established taxable person) → register from first sale. A UK Ltd is simpler. B2B may use **reverse charge** (customer self-accounts) which can reduce our collection burden — **VERIFY per service**. | Register for VAT, charge 20% (or reverse-charge B2B), file quarterly (MTD). |
|
||||
| **AU** | **GST 10%** | Register at **A$75k** turnover (lower/zero for some non-resident supplies) | Charge 10%, remit to ATO (BAS). B2B reverse-charge may apply for non-resident suppliers. |
|
||||
| **IE** | **VAT 23%** | Non-established → effectively from first B2B sale; reverse charge common for B2B | File via Revenue. |
|
||||
| **NZ** | **GST 15%** | A$/NZ$60k | Defer. |
|
||||
|
||||
**Open item:** for **B2B** sales the **reverse charge** mechanism may mean the
|
||||
*customer* accounts for VAT/GST, dramatically simplifying our obligation — but it
|
||||
depends on whether the supply is "digital service" vs "professional service" and
|
||||
our establishment status. **Get a one-off cross-border VAT opinion before launch.**
|
||||
|
||||
### Flow B — Paying the government authority on the customer's behalf
|
||||
|
||||
This is the operationally hard part. In the US we front/relay the filing fee. The
|
||||
analog per market:
|
||||
|
||||
| Market | Authority + typical fee | How fees are paid | Our remittance mechanism |
|
||||
|---|---|---|---|
|
||||
| **UK** | **Traffic Commissioner / DVSA** — O-licence app ~£257 + ~£401 grant + ~£401/5yr; **DVSA** for MOT/tacho; **Companies House** for any co. admin | Mostly **GOV.UK online card/Direct Debit**, agent can pay on behalf | Pay via a **UK business debit card** (from the UK Ltd's bank) at GOV.UK; pass-through the exact fee to customer with no surcharge. Need a funded GBP account (Wise/Revolut/UK bank). |
|
||||
| **AU** | **NHVR** (registration/accreditation), state road agencies, **ASIC** | NHVR Portal card payment; state portals | Pay via **AU business card**; needs AUD float. Until Pty Ltd, may need customer to pay authority directly while we do prep-only (avoids handling AU gov payments cross-border). |
|
||||
| **IE** | **RSA** / Dept of Transport, CRO (companies) | gov.ie / RSA online card | EUR business card. |
|
||||
| **NZ** | **NZTA** (TSL, RUC) | NZTA online | Defer. |
|
||||
|
||||
**Key design decisions for Flow B:**
|
||||
1. **Pass-through, never markup, the government fee** — same rule as US billing
|
||||
(surcharges apply to service fees only, not filing fees — `docs/billing.md`).
|
||||
Display gov fee as a separate, at-cost line item.
|
||||
|
||||
**Card to pay the authorities — funding rail (decided):** GOV.UK / DVSA /
|
||||
Companies House all take **Visa/Mastercard**, so we need a GBP-funded card.
|
||||
Options:
|
||||
- **Stripe Issuing (UK/EU): yes, virtual cards exist.** Stripe Issuing offers
|
||||
**virtual + physical Visa** in the **UK and EU** (not US-only), funded from
|
||||
the Stripe balance, with per-card limits. Good for **programmatic per-filing
|
||||
virtual cards** later. Caveat: needs **Issuing approval/eligibility**, Visa
|
||||
network only, pitched for platform/expense use — an application, not
|
||||
instant-on.
|
||||
- **Wise Business / Revolut Business (preferred for launch):** one product gives
|
||||
**real UK account details (sort code + acct no.)** that receive
|
||||
**Faster Payments / BACS / CHAPS**, PLUS **virtual + physical debit cards**,
|
||||
PLUS multi-currency GBP/EUR/AUD holding. Fund GBP via **Faster Payments**
|
||||
(instant, free, ~£1M cap) and pay authorities with the attached virtual card.
|
||||
No prepaid card and no Stripe Issuing approval needed.
|
||||
- **Transfer-rail note:** you fund an **account that has a card attached**, not a
|
||||
card directly. Use **Faster Payments** for top-ups (instant/free). **CHAPS**
|
||||
(£25-35) only for high-value one-offs; **BACS** (3-day batch) for Direct
|
||||
Debit/payroll, not ad-hoc. Use **Stripe Issuing** only if/when we want
|
||||
per-filing programmatic cards.
|
||||
2. **Two models for who pays the authority:**
|
||||
- **(i) We pay (agent model):** we hold a funded local-currency business card,
|
||||
pay GOV.UK/NHVR directly, recoup via the customer's checkout. Best UX, needs
|
||||
local banking + float + reconciliation. **UK = yes (UK Ltd + Wise/Revolut).**
|
||||
- **(ii) Customer pays the authority directly (prep-only model):** we charge
|
||||
only our service fee; customer enters their own card at the gov portal. **No
|
||||
gov-money handling, no float, no entity needed for Flow B.** Best for AU/NZ
|
||||
market-validation phase and avoids money-transmission questions.
|
||||
3. **Avoid looking like a money transmitter.** Fronting third-party gov fees at
|
||||
scale can edge toward regulated payment activity. Keep it as **agency
|
||||
disbursement of a clearly-itemized pass-through cost**, not a stored-value /
|
||||
FX product. **VERIFY threshold with counsel if volume grows.**
|
||||
|
||||
**Recommendation (Q2):**
|
||||
- **UK:** UK Ltd → **Stripe UK (GBP, no card surcharge) + Wise/Revolut GBP
|
||||
account** for both collecting (Flow A) and paying GOV.UK (Flow B, agent model).
|
||||
Register for VAT. ERPNext stays system of record.
|
||||
- **AU/IE/NZ:** launch **prep-only / customer-pays-authority** (Flow B model ii) on
|
||||
cross-border Stripe in local currency to validate demand **before** committing to
|
||||
a local entity + resident director + local acquiring.
|
||||
|
||||
---
|
||||
|
||||
## Cost / friction summary (entity + payments to launch)
|
||||
|
||||
| Market | Entity to operate | Hard blocker | Payments-in | Pay-authority | Verdict |
|
||||
|---|---|---|---|---|---|
|
||||
| **UK** ⭐ | UK Ltd (no resident dir, ~£12/yr) | VAT registration | Stripe UK / GBP, no surcharge | Agent model via GBP card | **Go first** |
|
||||
| **AU** ⭐ | None to start; Pty Ltd later | Pty Ltd needs **AU-resident director** | Cross-border AUD → Stripe AU later | Prep-only first | **Go second, prep-only** |
|
||||
| **IE** | UK Ltd can serve; IE Ltd needs **EEA director / €25k bond** | Director/bond | Stripe EUR | Prep-only / agent | Defer |
|
||||
| **NZ** | NZ co needs **NZ/AU-resident director** | Director | Cross-border NZD | Prep-only | Defer |
|
||||
|
||||
---
|
||||
|
||||
## Open questions (need answers before build)
|
||||
|
||||
1. **Cross-border VAT/GST opinion** — does B2B **reverse charge** cover our service
|
||||
so we don't have to collect? (UK + AU + IE). Single biggest unknown for Q2.
|
||||
2. **UK LLP formation** — confirm no-resident-member is fine, **line up the
|
||||
required 2nd member/designated member**, pick a registered-office/agent
|
||||
provider (mirror `docs/foreign-incorporation-guide.md`). Confirm LLP
|
||||
pass-through vs the extra UK SA800 + members' self-assessment + US
|
||||
partnership-filing burden is acceptable vs a single-member Ltd. Banking:
|
||||
**Wise vs Revolut Business vs Airwallex** for the GBP account + virtual card
|
||||
(Flow B); decide whether to also apply for **Stripe Issuing** later.
|
||||
3. **AU resident-director nominee** — cost/availability of a nominee director
|
||||
service if/when we localize; or stick to ARBN (foreign-company) route.
|
||||
4. **Money-transmission line** — confirm fronting GOV.UK fees as itemized
|
||||
pass-through disbursement does not trigger payment-institution licensing at our
|
||||
volumes.
|
||||
5. **Transport Manager (UK/IE)** — confirm we can sell prep/monitoring without
|
||||
holding the statutory TM CPC ourselves, and line up external CPC holders to
|
||||
broker if we want to offer the full O-licence package.
|
||||
6. **Surcharge legality** — strip the US card surcharge from all UK/EU/AU pricing;
|
||||
reprice to absorb processor cost. (Confirmed needed, just needs implementation.)
|
||||
7. **Vertical fit** — this doc assumes the **transport/trucking** analog (closest
|
||||
to FMCSA). See the **Vertical portability matrix** below for how the rest of the
|
||||
US stack ports; **healthcare does NOT port (NHS, no billing-enrollment model).**
|
||||
|
||||
---
|
||||
|
||||
## Vertical portability matrix (US stack → UK / European-English markets)
|
||||
|
||||
European English-speaking ≈ **UK + Ireland (+ Malta, negligible)**. Each vertical is
|
||||
judged on the same two gates as the US playbook: **(1) is there a recurring
|
||||
regulatory clock to sell against, and (2) can we actually get emails** (every UK
|
||||
public register lists the regulated entity but **not** its email, so all of these
|
||||
collapse to the same spine: **free public register × Companies House join ×
|
||||
scrape-published-emails / paid append** — build it once, run all verticals on it).
|
||||
|
||||
| US vertical (ours) | UK/EU analog | Recurring clock? | Email/data path | Verdict |
|
||||
|---|---|---|---|---|
|
||||
| **Formation + annual report + registered agent** | **Companies House**: formation, **confirmation statement (annual)**, registered office, **ECCT identity verification** (2025) | ✅ annual | Companies House **free bulk register** (no email) → enrich | ⭐ Best 1:1 transfer; ~5M cos; **but saturated** (1stFormations/Tide) |
|
||||
| **TCPA / data-privacy** | **ICO data protection fee** — every UK business processing personal data pays £40–£2,900/yr; **PECR** is the marketing law itself | ✅ **mandatory annual**, widely missed | **ICO public register** (name+status, no email) → can flag the *unregistered* → enrich | ⭐ **Sleeper / lead UK product.** Mandatory, recurring, under-served, we already operate under this law |
|
||||
| **Trucking / FMCSA** | **O-licence** (Traffic Commissioner/DVSA) | ✅ 5-yr + ongoing | O-licence register (no email) × Companies House × scrape | ⭐ Main plan; ~85k UK + ~4k IE operators |
|
||||
| **EPA RCRA hazardous waste** | **Environment Agency** waste carrier/broker registration (renew **3-yr**) + hazardous waste producer | ✅ 3-yr | EA public carrier/broker register (limited contact) → enrich | ✅ Decent niche, clear clock, public register |
|
||||
| **Employment / contractor classification** | **IR35 / off-payroll working**, worker status | ⚠️ event-driven, no registry | no registry; reach via contractor/accountant channels | ⚠️ Real pain but **not list/cold-email driven** → inbound/content |
|
||||
| **Telecom (CRTC / FCC 499 / USAC)** | **Ofcom** comms-provider notification + annual admin charge; **CCTS→ADR (CISAS/Ombudsman)** | ✅ annual admin charge | Ofcom lists exist, **no rich email register** like FCC RMD | ⚠️ Small universe, weak data, niche |
|
||||
| **FMC ocean (NVOCC/forwarders)** | **BIFA membership, AEO, CDS customs** | ⚠️ mostly one-time/voluntary | BIFA member list, no clean email feed | ⚠️ Niche, weak clock |
|
||||
| **Healthcare (Medicare/PECOS/Medicaid/CLIA/DEA)** | **NHS single-payer kills the billing-enrollment model.** Only **GMC revalidation (5yr)/NMC (3yr)** + **CQC provider registration** map | ⚠️ revalidation is **personal attestation** | GMC/NMC registers (no email); CQC has provider contact | ❌ **Worst transfer — skip.** No Medicare-enrollment analog; don't spend burner infra here |
|
||||
|
||||
### Takeaways
|
||||
1. **Two verticals beat trucking for the UK launch:**
|
||||
- **Companies House corporate services** — most direct transfer of our entire
|
||||
formation/RA/annual-report engine, but the most crowded market.
|
||||
- **ICO data protection fee** ⭐ — the sleeper: mandatory + recurring + widely
|
||||
ignored, the public register lets us target the **non-compliant**, per-deal
|
||||
value is small but volume is enormous, and we already understand PECR.
|
||||
2. **Healthcare does NOT port** — entire US healthcare stack assumes fee-for-service
|
||||
billing the NHS doesn't have. Exclude from UK/IE.
|
||||
3. **One enrichment spine serves all** — Companies House-anchored verticals
|
||||
(corporate, ICO, trucking, waste) are all **Tier-2 "one hop to email"** (per
|
||||
`docs/vertical-lead-source-analysis.md`); telecom/FMC/healthcare are Tier-3/4.
|
||||
4. **Lead UK products:** **ICO data-protection-fee + Companies House corporate
|
||||
services**, alongside the **O-licence** trucking stream.
|
||||
|
||||
## Next docs (after Q1/Q2 cleared)
|
||||
|
||||
- `plan.uk-olicence-stream.md` — UK Traffic Commissioner O-licence product,
|
||||
template localization, Companies House entity-type segmentation (Ltd/LLP/PLC =
|
||||
legal cold B2B; sole traders/partnerships = need soft opt-in).
|
||||
- `plan.au-nhvr-stream.md` — NHVR / Chain of Responsibility, inferred-consent list
|
||||
sourcing from published business addresses.
|
||||
- `plan.uk-ico-fee-stream.md` — ICO data-protection-fee renewal product; target the
|
||||
unregistered/lapsed from the ICO public register; PECR-compliant outreach.
|
||||
- `plan.uk-companies-house-stream.md` — confirmation statement + registered office +
|
||||
ECCT identity verification; the enrichment spine (Companies House bulk × SIC).
|
||||
168
docs/plan.mx-exclusion-gaps.md
Normal file
168
docs/plan.mx-exclusion-gaps.md
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
# Plan: close the MX-exclusion gaps in the trucking warmup
|
||||
|
||||
**Status:** ALL THREE FIXES SHIPPED 2026-06-20 (Fix 1+3 `9eeed47`, Fix 2 `bc93d93`).
|
||||
**Owner context:** warmup day 17; big operators (Google/Microsoft/Proofpoint/
|
||||
Mimecast/Barracuda/Cisco/Broadcom) are EXCLUDED until day 30, then re-introduced
|
||||
via `mx_daily_caps()`. This plan fixes three holes that let throttling/consumer
|
||||
MX operators through during that window.
|
||||
|
||||
## What shipped (2026-06-20, commit `9eeed47`)
|
||||
- **Fix 1 (DONE):** `CONSUMER_MX_OPERATORS` (mx:yahoodns.net, mx:icloud.com,
|
||||
comcast/charter/centurylink/windstream/tds/earthlink) folded into
|
||||
`WARMUP_EXCLUDE_OPERATORS`, used by both the `fetch_carriers()` exclusion SQL
|
||||
and `mx_daily_caps()` (same day-30 ramp). Verified live: warmup-eligible pool
|
||||
= 353,909 carriers after the fix (not starved), and `mx_daily_caps()` returns
|
||||
cap 0 for mx:yahoodns.net during warmup.
|
||||
- **Fix 3 (DONE):** `infra/cron/pw-mx-tag` installed to `/etc/cron.d/` (05:45 UTC
|
||||
daily, `--only-unsent --limit-domains 20000`). Verified: a 200-domain test run
|
||||
tagged 216 domains; idempotent/bounded.
|
||||
- **Fix 2 (DONE):** `select_sendable_carriers()` now bounds the untagged (NULL
|
||||
mx_provider) bucket with a single shared `untagged_cap` (env
|
||||
`MAIN_UNTAGGED_MX_CAP`, default `max(quota, 200)` = no-starve / no behavior
|
||||
change today). Only ~3,035 distinct verified-sendable untagged domains remain,
|
||||
so pw-mx-tag drains them in its first run; tighten the cap to a fraction of
|
||||
quota afterward to prefer the tagged long tail. Commit `bc93d93`.
|
||||
|
||||
---
|
||||
|
||||
## Background: how the two MX layers work today
|
||||
|
||||
Sender reputation is judged by the **receiving operator (MX)**, not the recipient
|
||||
domain string. There are two independent gates in `scripts/build_trucking_campaigns.py`:
|
||||
|
||||
1. **`fetch_carriers()` big-MX EXCLUSION** (SQL `big_mx_exclude`): during warmup
|
||||
(`main_warmup_day() <= MAIN_BIG_MX_EXCLUDE_UNTIL_DAY`, currently day 30) it
|
||||
drops carriers whose `mx_provider IN BIG_MX_OPERATORS`. `mx_provider IS NULL`
|
||||
is deliberately KEPT (so the pool isn't starved before tagging completes).
|
||||
2. **`select_sendable_carriers()` per-MX THROTTLE** (`mx_daily_caps` +
|
||||
`per_op` cap): bounds how many of a run's quota go to each KNOWN operator so
|
||||
we never concentrate on one. NULL is NOT capped (would collapse onto one
|
||||
bucket and starve the pool).
|
||||
|
||||
`mx_provider` is populated by `scripts/mx_tag_carriers.py`, which resolves each
|
||||
domain's MX and returns either a **clean label** (`google`, `microsoft`,
|
||||
`proofpoint`, `mimecast`, `cisco`, `barracuda`, `broadcom`, `godaddy`, `zoho`,
|
||||
`rackspace`) or, for everything else, an **`mx:<root-domain>` prefix** (e.g.
|
||||
`mx:yahoodns.net`, `mx:icloud.com`, `mx:comcast.net`).
|
||||
|
||||
---
|
||||
|
||||
## The three gaps (with live numbers, 2026-06-20)
|
||||
|
||||
### Gap 1 — consumer/throttling MX behind the `mx:` prefix are NOT excluded
|
||||
`BIG_MX_OPERATORS` only lists the clean labels. The big consumer mailbox
|
||||
operators get tagged with the `mx:` prefix and so slip BOTH gates during warmup:
|
||||
|
||||
| mx_provider | sendable carriers | why it's a problem |
|
||||
| --- | --- | --- |
|
||||
| `mx:yahoodns.net` | **283,113** | Yahoo Small Business / AOL custom domains — same aggressive consumer filtering + complaint-driven blocking as consumer Yahoo. By far the biggest hole. |
|
||||
| `mx:icloud.com` | **24,985** | Apple iCloud+ Custom Domain — Apple consumer filtering; iCloud was the biggest consumer leak we already scrubbed from Listmonk. |
|
||||
| `mx:comcast.net` | 12,251 | Comcast consumer infra; historically bouncy. |
|
||||
| `mx:charter.net` | 5,860 | Spectrum/Charter consumer. |
|
||||
| `mx:centurylink.net` / `mx:windstream.net` / `mx:tds.net` / `mx:earthlink-vadesecure.net` | ~8,100 | Legacy/satellite ISP consumer mail; many already in `DEAD_ISP_DOMAINS` as literal domains but NOT caught when a custom domain points its MX there. |
|
||||
|
||||
`mx:yahoodns.net` alone is **283k** carriers that look "long-tail/safe" to the
|
||||
warmup but actually filter like a big operator. This is the headline fix.
|
||||
|
||||
> NOTE: the literal-domain layer (`BLOCKED_EMAIL_DOMAINS` incl. the Yahoo family,
|
||||
> Apple, dead ISPs) already blocks `someone@yahoo.com` / `@icloud.com`. The hole
|
||||
> is a **custom domain whose MX points at Yahoo/iCloud** — invisible to the
|
||||
> string layer, only visible via MX tagging. That's exactly what this closes.
|
||||
|
||||
### Gap 2 — 315,892 untagged (NULL) carriers are sent to unvetted
|
||||
`mx_provider IS NULL` is kept by both gates by design (anti-starvation). With
|
||||
**315,892** sendable NULLs vs 1,187,054 tagged, a meaningful slice of every run
|
||||
goes to domains we've never MX-resolved — some of which are Google/MS/Yahoo we'd
|
||||
otherwise exclude. This is acceptable as a bootstrap but should shrink over time.
|
||||
|
||||
### Gap 3 — `mx_tag_carriers.py` is not on a cron
|
||||
There is no `infra/cron/pw-mx-tag` (confirmed: no cron references it). So the NULL
|
||||
backlog only shrinks when someone runs it by hand. New carriers imported by the
|
||||
FMCSA census downloader land as NULL and stay NULL. Without continuous tagging,
|
||||
Gaps 1 and 2 slowly re-open.
|
||||
|
||||
---
|
||||
|
||||
## Proposed fixes
|
||||
|
||||
### Fix 1 — exclude consumer/throttling `mx:` operators during warmup (HIGH)
|
||||
Add an explicit set of `mx:`-prefixed operators that should be treated like the
|
||||
big operators during warmup, and fold them into BOTH the exclusion and the
|
||||
throttle. Keep it data-driven and documented.
|
||||
|
||||
```python
|
||||
# scripts/build_trucking_campaigns.py
|
||||
# Consumer / aggressively-filtering mailbox operators that mx_tag_carriers.py
|
||||
# labels with the "mx:" prefix (no clean label). They throttle/complaint-block
|
||||
# like the big operators, so hold them out during warmup too. (yahoodns =
|
||||
# Yahoo Small Business + AOL custom domains; icloud = Apple custom domains.)
|
||||
CONSUMER_MX_OPERATORS = (
|
||||
"mx:yahoodns.net", "mx:icloud.com", "mx:comcast.net", "mx:charter.net",
|
||||
"mx:centurylink.net", "mx:windstream.net", "mx:tds.net",
|
||||
"mx:earthlink-vadesecure.net",
|
||||
)
|
||||
# Everything held out of the warmup pool entirely (until MAIN_BIG_MX_EXCLUDE_UNTIL_DAY).
|
||||
WARMUP_EXCLUDE_OPERATORS = BIG_MX_OPERATORS + CONSUMER_MX_OPERATORS
|
||||
```
|
||||
- In `fetch_carriers()`: build `big_mx_exclude` from `WARMUP_EXCLUDE_OPERATORS`
|
||||
(not just `BIG_MX_OPERATORS`).
|
||||
- In `mx_daily_caps()`: give `CONSUMER_MX_OPERATORS` the same `big` ramp as the
|
||||
clean big operators after day 30 (so they re-introduce gradually, not all at
|
||||
once on day 31).
|
||||
- Keep it behind the existing `MAIN_SKIP_BIG_MX` switch so it's reversible.
|
||||
|
||||
**Effect:** removes ~330k consumer-MX carriers from the warmup-window pool; the
|
||||
long tail of genuinely small/self-hosted systems carries the volume, which is the
|
||||
whole point of the warmup strategy.
|
||||
|
||||
### Fix 2 — bound the NULL bucket with a small cap (MEDIUM)
|
||||
Don't exclude NULL (still anti-starvation), but give it a real per-run cap in
|
||||
`select_sendable_carriers()` instead of "uncapped". E.g. treat unknown/NULL like
|
||||
`__default__` but at a fraction (say 40/run) so an untagged Google/Yahoo domain
|
||||
can't flood a run. Pairs with Fix 3 (continuous tagging) to shrink the bucket.
|
||||
|
||||
### Fix 3 — put `mx_tag_carriers.py` on a daily cron (MEDIUM)
|
||||
Add `infra/cron/pw-mx-tag` (model on `pw-listmonk-scrub`) running e.g. 05:45 UTC
|
||||
(before the 08:00 trucking builder), tagging the next N thousand NULL domains/day:
|
||||
```
|
||||
45 5 * * * deploy cd /opt/performancewest && docker compose exec -T workers \
|
||||
python3 -m scripts.mx_tag_carriers --limit-domains 20000 \
|
||||
>> /var/log/pw-mx-tag.log 2>&1
|
||||
```
|
||||
Install to `/etc/cron.d/` (deploy.sh doesn't run ansible). This continuously
|
||||
shrinks the 315k NULL backlog and keeps newly-imported carriers tagged, so Fixes
|
||||
1 & 2 stay effective.
|
||||
|
||||
---
|
||||
|
||||
## Validation plan (verify before/after, no sends triggered)
|
||||
|
||||
1. **Dry-run the selector** before/after Fix 1 and diff the per-MX composition of
|
||||
a simulated run (the builder has `list_segments()` / quota selection paths that
|
||||
can be exercised read-only). Assert 0 carriers from `CONSUMER_MX_OPERATORS`
|
||||
are selected while `main_warmup_day() <= 30`.
|
||||
2. **SQL sanity:** `SELECT mx_provider, count(*) ... WHERE listmonk_sent_at IS NULL
|
||||
GROUP BY 1` — confirm the excluded operators drop out of the candidate pool.
|
||||
3. **Cron (Fix 3):** run `mx_tag_carriers --limit-domains 1000` once by hand,
|
||||
confirm the NULL count falls and no errors; then install the cron and confirm
|
||||
the next-day count fell again (idempotent, bounded).
|
||||
4. **Regression:** confirm the long-tail pool is still large enough to hit daily
|
||||
quota at warmup caps (so we don't starve the send). If the long tail is too
|
||||
small after excluding 330k consumer-MX, that's a signal to either lower the
|
||||
daily quota or accept a smaller controlled slice of one consumer operator.
|
||||
|
||||
---
|
||||
|
||||
## Open questions / decisions for owner
|
||||
|
||||
- **Re-introduction after day 30:** treat `CONSUMER_MX_OPERATORS` identically to
|
||||
the big operators (same ramp), or keep Yahoo/iCloud custom domains excluded
|
||||
*longer* (they convert worse and complain more)? Recommendation: same ramp, but
|
||||
watch the reputation monitor's per-operator reject% and pull back if Yahoo
|
||||
spikes.
|
||||
- **NULL cap size (Fix 2):** 40/run is a guess; tune against how fast Fix 3 drains
|
||||
the backlog.
|
||||
- **Should `mx:` consumer exclusion be permanent (not just warmup)?** For a
|
||||
B2B compliance product, a carrier reachable only at a Yahoo/iCloud custom
|
||||
domain is a low-value, high-complaint segment regardless of warmup. Worth
|
||||
considering a permanent down-weight, not just a warmup hold.
|
||||
|
|
@ -1,252 +1,164 @@
|
|||
# Plan
|
||||
|
||||
## Status: COMPLETE (all phases implemented + validated 2026-06-02)
|
||||
Offer healthcare regulatory filings as a **two-tier model** (internal mechanics;
|
||||
the "paper" alternative is NEVER surfaced to the client):
|
||||
|
||||
| Phase | What | Status |
|
||||
|-------|------|--------|
|
||||
| 1 | Hazmat/PHMSA handler + product (`hazmat-phmsa`, $149) | ✅ |
|
||||
| 1.5 | Order-form bundle/mutual-exclusion enforcement (server-side) | ✅ |
|
||||
| 2 | State-trucking intake form (slug-gated) + REQUIRED_FIELDS + admin-todo fields | ✅ |
|
||||
| 2.5 | BOC-3 authority-aware (active/pending/revoked/none) + upsell-approve follow-ups | ✅ |
|
||||
| 2.6 | Pipeline activation gating (`require_active` edges, FMCSA poll, waiting_on_activation) | ✅ |
|
||||
| 3 | State emissions (non-CA) product `state-emissions` ($199) | ✅ |
|
||||
| 4 | Order landing pages for all state/hazmat/emissions slugs (48 pages build) | ✅ |
|
||||
| Adv | Prerequisite-aware DOT lookup + state recommendations | ✅ |
|
||||
| 5 | Campaign builder deficiency segments + LP routing + --list-segments | ✅ |
|
||||
| Val | Consistency checker (24/24) + campaign segment test (synthetic) | ✅ |
|
||||
- **Standard service (default):** we handle the filing end-to-end. Client signs
|
||||
ONE certification and we submit + track to confirmation. (Internally this is the
|
||||
paper path — 855 to the MAC, CMS-10114 to the NPI Enumerator (Baltimore MD) — but we
|
||||
never say "paper" to the client; it's just "we file it for you.")
|
||||
- **Expedited (faster, framed positively at intake):** we ask if they can
|
||||
**electronically grant us CMS I&A Surrogate access**. We position this as
|
||||
*reducing the number of steps on our end so we can bulk-file faster* — never as
|
||||
"the alternative is paper." If yes, we file online same-day. If no, we silently
|
||||
fall back to Standard. Same price either way; surrogacy is a delegation, not
|
||||
password sharing.
|
||||
|
||||
**Remaining ops (not code):** create the 6 Listmonk source-campaign templates and
|
||||
set their `CAMPAIGN_*_ID` envs (`CAMPAIGN_FOR_HIRE_ID`, `CAMPAIGN_IRP_IFTA_ID`,
|
||||
`CAMPAIGN_INTRASTATE_ID`, `CAMPAIGN_WEIGHT_TAX_ID`, `CAMPAIGN_EMISSIONS_ID`,
|
||||
`CAMPAIGN_HAZMAT_ID`). Until set, those segments are reported by
|
||||
`--list-segments` but skipped by the scheduled run. Optional follow-up: a
|
||||
client-side incompatibility UX hint in the order form (server already enforces).
|
||||
This pass verifies the no-login paper path per service, reconciles the doc/code
|
||||
contradiction, and makes "standard = paper / expedited = surrogate" consistent
|
||||
everywhere it's surfaced.
|
||||
|
||||
## Goal
|
||||
|
||||
Make every trucker deficiency type we flag actually *fulfillable*: each flagged
|
||||
deficiency must have (1) a service handler that can complete the work, (2) a
|
||||
checkout/order path, and (3) an intake form that collects **all** information
|
||||
that handler needs before the job runs. Only after fulfillment is complete and
|
||||
verified do we extend the campaign builder to email those deficiency segments.
|
||||
Every healthcare service (federal sold + state/adjacent to add) has a verified
|
||||
**Standard (paper, no-login)** path and, where a CMS/portal exists, an
|
||||
**Expedited (surrogate/delegated)** upsell. No surface should ever present
|
||||
surrogate as *required* when a paper path exists; paper is always the default.
|
||||
|
||||
## Scope / affected areas
|
||||
- `api/src/routes/checkout.ts` (~L2155-2207) — already has the two-tier copy, BUT
|
||||
treats NPPES update/reactivation as **"online-only, surrogate required"** with
|
||||
NO standard fallback (`NPPES_ONLY_SLUGS`, `hasNppesOnly`). The directive says:
|
||||
give those a Standard paper path too (CMS-10114 to NPI Enumerator (Baltimore MD)) and make surrogate the
|
||||
*expedited* option, not the only option.
|
||||
- `scripts/workers/services/npi_provider.py` — `access` strings call NPPES
|
||||
update/reactivation "NPPES via CMS I&A surrogate access (online-only)". Must
|
||||
become "Standard: CMS-10114 paper to NPI Enumerator (Baltimore MD), client signs;
|
||||
Expedited: NPPES via I&A surrogate." Also `_STANDARD_FILING_SLUGS` currently
|
||||
excludes `nppes-update` (it has no 855) — needs a CMS-10114 paper path instead.
|
||||
- `scripts/document_gen/templates/cms855_pdf_filler.py` — working 855 paper path
|
||||
(fills 855I/B/O/A + cert-page signature anchor). **Gap:** no CMS-10114 filler
|
||||
for the NPPES standard path → likely a small new `cms10114_pdf_filler.py`.
|
||||
- `docs/healthcare-no-login-value-add.md` — already documents the CMS-10114 paper
|
||||
path; promote it to the canonical "Standard vs Expedited" matrix.
|
||||
- `site/src/pages/services/healthcare/{npi-revalidation,medicare-enrollment}.astro`
|
||||
— already describe expedited/surrogate; npi-reactivation/nppes-update order
|
||||
pages need the same two-tier framing.
|
||||
- `site/src/components/intake/steps/NpiIntakeStep.astro` + intake manifest — add
|
||||
the surrogate-access question framed positively: "Can you electronically grant
|
||||
us CMS I&A Surrogate access? It lets us bulk-file faster and cuts steps on our
|
||||
end." Optional; declining is fine and never mentions paper. The captured answer
|
||||
routes fulfillment internally (surrogate vs our Standard path).
|
||||
- `docs/state-healthcare-compliance-opportunities.md` + `new-sector-compliance-
|
||||
targets.md` — extend the two-tier classification to state/adjacent services.
|
||||
|
||||
Deficiency flags in play (live counts):
|
||||
for_hire (19,811), interstate_irp_ifta (19,761), intrastate_authority (14,081),
|
||||
state_emissions (12,424), state_weight_tax (6,289), state_permit (3,418),
|
||||
mcs150_overdue (4,539), hazmat (514), zero_fleet (134).
|
||||
|
||||
Files / systems:
|
||||
- `scripts/workers/services/__init__.py` — handler registry
|
||||
- `scripts/workers/services/state_trucking.py` — IRP/IFTA/weight-tax/permit/intrastate handler (admin-todo only today)
|
||||
- `scripts/workers/services/mcs150_update.py` — MCS-150 + reactivation (real FMCSA filing)
|
||||
- `scripts/workers/services/boc3_filing.py` — BOC-3 (Playwright)
|
||||
- **NEW** `scripts/workers/services/hazmat_phmsa.py` — only fully-missing fulfillment path
|
||||
- `site/src/lib/intake_manifest.ts` — per-service intake steps + pricing/meta
|
||||
- `site/src/components/intake/steps/DOTIntakeStep.astro` — unified DOT intake (no state-trucking sections today)
|
||||
- **NEW** `site/src/components/intake/steps/StateTruckingIntakeStep.astro` — state filing fields
|
||||
- `api/src/routes/compliance-orders.ts` — `COMPLIANCE_SERVICES` (products) + `REQUIRED_FIELDS` (validation; **none defined for any DOT/state-trucking slug today**)
|
||||
- `api/src/routes/checkout.ts` — slug allowlist
|
||||
- `api/src/routes/dot-lookup.ts` — recommended-services mapping
|
||||
- **NEW** `site/src/pages/order/*.astro` — landing pages for state-trucking + hazmat (none exist)
|
||||
- `scripts/build_trucking_campaigns.py` — campaign builder (extend last)
|
||||
|
||||
## Key findings (grounding)
|
||||
|
||||
1. **Fulfillment handlers already exist** for ~98% of flags. The single fully
|
||||
missing path is **hazmat / PHMSA registration** (no handler, product, page).
|
||||
2. **State-trucking intake collects nothing.** All 13 state slugs map to
|
||||
`["review"]` in `intake_manifest.ts` with a comment "info collected at
|
||||
checkout" — but checkout collects no per-filing fields. So IRP has no
|
||||
vehicle/weight/jurisdiction data, IFTA has no fleet/base-state, NY HUT has no
|
||||
vehicle list, intrastate-authority has no insurance/authority-type, etc. The
|
||||
handler's admin todo is therefore incomplete and an admin must chase the
|
||||
customer for data.
|
||||
3. **`REQUIRED_FIELDS` has zero entries** for any DOT or state-trucking slug, so
|
||||
the API performs no intake validation for these orders.
|
||||
4. **No dedicated order landing pages** for IRP/IFTA/state-tax/permit/intrastate
|
||||
or hazmat. Checkout works by slug, but campaign emails have no clean LP to
|
||||
drive conversions.
|
||||
5. **State emissions** flags (NY/CO/MD/NJ/MA/etc., 12,424) only map to a product
|
||||
for CA (CARB via `ca-mcp-carb`). Non-CA emissions have no product — decide
|
||||
whether to build or fold into existing state DOT/permit service.
|
||||
Out of scope this pass: building the actual surrogate Playwright automation
|
||||
(expedited fulfillment can stay human-in-PECOS for now), email-stream machinery,
|
||||
pricing changes.
|
||||
|
||||
## Approach (concrete ordered steps)
|
||||
|
||||
### Phase 1 — Close the hazmat fulfillment gap (only fully-missing path)
|
||||
1. Add `HazmatPHMSAHandler` in `scripts/workers/services/hazmat_phmsa.py`
|
||||
(admin-assisted, mirrors `state_trucking.py`: creates admin_todo with PHMSA
|
||||
registration steps, sends status email). Slug `hazmat-phmsa`.
|
||||
2. Register `"hazmat-phmsa": HazmatPHMSAHandler` in `services/__init__.py`.
|
||||
3. Add product to `COMPLIANCE_SERVICES`, meta to `intake_manifest.ts`, slug to
|
||||
checkout allowlist.
|
||||
|
||||
### Phase 1.5 — Order-form incompatibility enforcement (bundles vs components, dupes)
|
||||
Today the batch endpoint (`compliance-orders.ts` POST `/batch`) only dedupes and
|
||||
hard-codes one case (drop standalone `fcc-499a` when `fcc-499a-499q` present).
|
||||
There is no general rule preventing a customer from selecting a **bundle plus its
|
||||
own components** (e.g. `dot-full-compliance` + `mcs150-update` + `boc3-filing`, or
|
||||
`state-trucking-bundle` + `irp-registration`), or other incompatible combos. This
|
||||
double-charges and creates duplicate filings.
|
||||
|
||||
Build a single source of truth for service relationships and enforce it:
|
||||
- Add `BUNDLE_COMPONENTS` map (bundle slug -> component slugs) covering
|
||||
`dot-full-compliance`, `state-trucking-bundle`, `new-carrier-bundle`,
|
||||
`fcc-full-compliance`, plus the DB `service_bundles` rows.
|
||||
- Add `INCOMPATIBLE_PAIRS` / mutually-exclusive groups (e.g. `usdot-reactivation`
|
||||
vs `carrier-closeout`; `fcc-499a` vs `fcc-499a-499q`; emergency-temp-authority
|
||||
vs mc-authority where applicable).
|
||||
- Server-side (authoritative) in `/batch`: when a bundle is present, **drop any of
|
||||
its components** from the cart (keep the bundle), reject hard-incompatible pairs
|
||||
with a clear error, and keep dedup. Generalize the existing 499a special-case
|
||||
into this map.
|
||||
- Client-side (order form / cart UI): disable/grey out a component when its parent
|
||||
bundle is selected (and vice-versa: selecting all components suggests the bundle),
|
||||
and prevent selecting mutually-exclusive options, with an inline explanation.
|
||||
Mirror the server map so UX matches enforcement.
|
||||
|
||||
### Phase 2 — Make state-trucking intake actually collect required data
|
||||
4. Build `StateTruckingIntakeStep.astro` (one shared step, sections shown by
|
||||
slug, mirroring `DOTIntakeStep.astro`'s section-gating pattern):
|
||||
- Carrier identity: legal name, DOT#, MC#, base state, contact (prefill from DOT lookup).
|
||||
- IRP/IFTA: power units w/ VIN+plate+gross-weight rows, operating jurisdictions, fuel type.
|
||||
- Weight-distance (OR/NY/KY/NM/CT): vehicle list + gross weights + (OR) declared combined weight.
|
||||
- CA MCP+CARB: fleet engine model-years for CARB Clean Truck Check, CA# if any.
|
||||
- Intrastate authority: authority type, insurance carrier + policy#, cargo, BOC-3 on file?
|
||||
- State DOT / OSOW: as needed.
|
||||
5. Update `intake_manifest.ts`: replace `["review"]` with
|
||||
`["state-trucking", "review"]` for the 13 slugs; wire the step into the Wizard.
|
||||
6. Add `REQUIRED_FIELDS` entries in `compliance-orders.ts` for each state-trucking
|
||||
slug + the DOT slugs (mcs150, ucr, boc3, dot-registration, mc-authority, etc.)
|
||||
so intake is validated server-side. Mirror handler "Intake data needed" docstrings.
|
||||
7. Update `state_trucking.py` handler to read + surface the new intake fields in
|
||||
the admin todo (so admins get vehicle lists, jurisdictions, insurance, etc.).
|
||||
|
||||
### Phase 2.5 — Make BOC-3 authority-aware (preexisting authority handling)
|
||||
The BOC-3 attaches to a carrier's operating authority (MC/FF/MX docket). Today
|
||||
`boc3_filing.py` only reads `commonAuthorityStatus`/`contractAuthorityStatus`/
|
||||
`brokerAuthorityStatus` to print a status string and otherwise always files a
|
||||
fresh BOC-3. That can be wrong/wasteful depending on the preexisting authority.
|
||||
Add branching off the live FMCSA authority state:
|
||||
- **Active authority:** file/refresh BOC-3 only. (current behavior)
|
||||
- **Pending authority:** file BOC-3 + flag that active insurance must be on file
|
||||
for the authority to activate; create follow-up todo.
|
||||
- **Revoked/inactive authority:** file BOC-3 **and** flag/upsell reinstatement
|
||||
(OP-1 reinstatement + $80 gov fee, route via `usdot-reactivation`/`mc-authority`
|
||||
reinstatement branch). BOC-3 alone does not reinstate.
|
||||
- **No authority (USDOT only):** BOC-3 has nothing to attach to — flag that MC
|
||||
authority (`mc-authority`) is likely needed first; do not silently file.
|
||||
Implementation: have `process()/handle()` read full authority status (reuse
|
||||
`_check_boc3_status`, expanded to return structured fields), select the branch,
|
||||
adjust the admin-todo + customer email, and emit a `recommended_followups` list
|
||||
the order timeline / upsell can surface. No automatic charge for the follow-up —
|
||||
surface it for the customer/admin to approve.
|
||||
|
||||
### Phase 2.6 — Prerequisite/activation gating (wait for FMCSA "active", not just "submitted")
|
||||
There are real FMCSA dependency chains where a downstream filing must wait for an
|
||||
upstream item to be **active at the agency**, not merely submitted by us. The
|
||||
existing `pipeline_orchestrator.py` models ordering via `wait_for`, but a step is
|
||||
treated as satisfied when `pipeline_step_status == "completed"` (= our handler
|
||||
finished), which is NOT the same as FMCSA showing it active.
|
||||
|
||||
True prerequisites to enforce:
|
||||
- **MC Authority (OP-1)** requires an **active USDOT**.
|
||||
- **Authority activation** requires **BOC-3 on file + insurance (BMC-91) on file**,
|
||||
then a **mandatory ~21-day vetting/protest period** before it goes active.
|
||||
BOC-3 + insurance CAN be filed while authority is pending (parallel OK).
|
||||
- **IRP / IFTA / intrastate-authority / UCR** that depend on *active* authority
|
||||
(or active USDOT) must wait for that activation, not just for the prior order to
|
||||
be submitted.
|
||||
|
||||
Implementation:
|
||||
- Add an "activation gate" to the orchestrator: for dependency edges flagged
|
||||
`require_active: true`, poll FMCSA (mobile QC API for USDOT status; L&I for
|
||||
authority/BOC-3/insurance) and only mark the dependency satisfied when the
|
||||
agency reports active. Until then, hold the downstream step in a
|
||||
`waiting_on_activation` state with a next-poll timestamp.
|
||||
- Encode the 21-day authority vetting window as an expected-activation estimate so
|
||||
the timeline/customer comms set correct expectations.
|
||||
- Expand `PIPELINES` edges with `require_active` flags (USDOT→MC, USDOT→IRP/IFTA/
|
||||
UCR/intrastate, authority-active→IRP-for-hire/intrastate).
|
||||
- Standalone (non-bundle) orders: when a single service is ordered whose
|
||||
prerequisite isn't active yet, surface a clear "blocked until X is active"
|
||||
status + recommended prerequisite order rather than filing prematurely.
|
||||
|
||||
### Phase 3 — Decide + handle state emissions (non-CA)
|
||||
8. Either: (a) add a generic `state-emissions` service handler+product covering
|
||||
NY/CO/MD/NJ/MA clean-truck/ACT programs, or (b) map those flags to
|
||||
`state-dot-registration` / advisory-only. (Open question — see below.)
|
||||
|
||||
### Phase 4 — Order landing pages
|
||||
9. Create `site/src/pages/order/*.astro` for: irp-ifta (combined), state weight
|
||||
taxes (one templated page per state or a single state-aware page),
|
||||
ca-mcp-carb, intrastate-authority, hazmat-phmsa. Reuse existing order-page
|
||||
layout (e.g. `boc3-filing.astro`, `ucr-registration.astro` as templates).
|
||||
|
||||
### Phase 5 — Extend campaign builder (only after 1-4 verified)
|
||||
10. Add new campaign segments to `build_trucking_campaigns.py` keyed off
|
||||
`deficiency_flags`: for-hire/BOC-3+UCR, IRP/IFTA, intrastate-authority,
|
||||
state weight-tax (per-state), CA MCP/CARB, hazmat. Each links to its LP.
|
||||
11. Create the corresponding Listmonk source campaigns (templates) and wire IDs.
|
||||
1. **Confirm the CMS-10114 paper path** for NPPES data updates AND NPI
|
||||
reactivation (not just initial enumeration): paper CMS-10114 mailed to NPI
|
||||
Enumerator (Baltimore MD), client signature only, no I&A login.
|
||||
Cite the official source. This is what makes NPPES services "Standard, no
|
||||
login" instead of surrogate-required. (We currently have no CMS-10114 PDF.)
|
||||
2. **Lock the two-tier matrix for the 6 federal services.** For each slug record:
|
||||
Standard path (form, mail destination, client's only action = sign / nothing),
|
||||
Expedited path (surrogate scope: PECOS and/or NPPES; what client grants),
|
||||
and whether expedited is even applicable (screening = public, no portal, so
|
||||
no expedited tier). Confirm the 855 wet-signature-cannot-be-delegated caveat
|
||||
applies to Standard; surrogate covers Expedited.
|
||||
3. **Reconcile checkout.ts.** Plan the edit so:
|
||||
- NPPES update/reactivation no longer present surrogate as *required* — remove
|
||||
the "online-only / required for those" language.
|
||||
- The surrogate ask is framed as the **faster, fewer-steps** option, never
|
||||
against a "paper" alternative. Audit/strip the existing copy that leaks
|
||||
mechanics to the client (e.g. "we'll send your CMS-855 to sign", "submit it
|
||||
to your MAC") — replace with neutral "we file it and track it for you."
|
||||
- Declining surrogate silently routes to our Standard path; no client-facing
|
||||
mention of paper/MAC/Fargo/form numbers.
|
||||
4. **Reconcile npi_provider.py.** Update `access` strings + `_STANDARD_FILING_SLUGS`
|
||||
so nppes-update/reactivation generate the CMS-10114 (or 855 reactivation)
|
||||
paper + e-sign, and the admin todo reflects Standard-default / Expedited-if-
|
||||
surrogate-granted. Mirror the existing 855 generate→upload→esign flow.
|
||||
5. **MAC + Fargo routing rule.** Document which Standard filings go where
|
||||
(855 → provider's MAC by state/jurisdiction; CMS-10114 → NPI Enumerator (Baltimore MD)). Confirm
|
||||
`practice_state` intake field drives MAC envelope addressing.
|
||||
7. **Daily batched-mail fulfillment (Standard path).** Design the operational
|
||||
flow for paper filings that are signed + pending submission:
|
||||
- On each **postal working day morning** (skip weekends + federal/USPS
|
||||
holidays), gather ALL signed-and-pending paper filings, **group by
|
||||
destination agency/address** (each MAC, the NPI Enumerator (Baltimore MD), each
|
||||
state Medicaid/CLIA agency).
|
||||
- For each destination, **merge all that day's documents into one print job**
|
||||
plus a **cover sheet** (Performance West sender, destination agency, date,
|
||||
enclosed-count, per-item list of order# / provider / NPI / form). One
|
||||
**Priority Mail envelope per agency** → saves postage + handling.
|
||||
- Mark each included order as "mailed" with the batch date + tracking #.
|
||||
- Build this as a worker (a `daily_paper_batch` job + a cover-sheet generator
|
||||
in document_gen), mirroring existing worker/cron patterns
|
||||
(`infra/cron/*`, `business_days.py` for the working-day calendar). Decide:
|
||||
fully-automated print-to-PDF batch that a human prints + drops, vs.
|
||||
print-API (Lob/Click2Mail) auto-mail. **Recommend phase 1 = generate the
|
||||
per-agency batched PDF + cover sheet + manifest for a human to print & mail;
|
||||
phase 2 = wire a print-mail API.**
|
||||
8. **Extend two-tier to state/adjacent services.** For each (State Medicaid
|
||||
enroll/reval, CAQH re-attest, payer credentialing, DEA renewal, state CSR,
|
||||
PDMP, CLIA, license renewal+CME) classify:
|
||||
- **Standard (no-login):** paper/mail-in form + one client signature?
|
||||
(e.g. CLIA = CMS-116 paper to state; Medicaid varies — some paper.) These
|
||||
feed the same daily batched-mail flow, grouped by their state agency.
|
||||
- **Expedited (delegated):** the lightest legitimate delegation that avoids a
|
||||
client *login* — e.g. CAQH "authorized administrator/org" grant, Medicaid
|
||||
"delegated official" on the app, payer EDI/CAQH attestation rights, an LOA.
|
||||
Distinguish "client signs one authorization once" (acceptable, still
|
||||
no-login) from "client must log in / share credentials" (never).
|
||||
- Flag services that are genuinely portal-only with NO paper standard so
|
||||
marketing never claims "no logins" for them.
|
||||
9. **Sequence the rollout** by (Standard-feasibility first) × revenue, and write
|
||||
the two doc updates + the small code edits (checkout.ts, npi_provider.py,
|
||||
optional cms10114_pdf_filler.py, and the daily batch worker + cover sheet).
|
||||
All gated on approval.
|
||||
|
||||
## Validation (how each part is verified)
|
||||
|
||||
- **Handlers:** unit-invoke each handler with a synthetic `order_data` dict in a
|
||||
throwaway script; assert an `admin_todos` row is created with the expected
|
||||
fields and (dev mode) no live filing fires. Confirm `SERVICE_HANDLERS` resolves
|
||||
every new slug.
|
||||
- **Intake completeness (the core ask):** write a check that, for every slug,
|
||||
cross-references `REQUIRED_FIELDS[slug]` against the fields the intake step
|
||||
emits and against the keys the handler reads — fail if a handler-needed field
|
||||
is never collected. This is the verifiable "we collect all needed info" metric.
|
||||
- **Checkout/products:** assert every flagged slug exists in `COMPLIANCE_SERVICES`,
|
||||
`SERVICE_META`, checkout allowlist, and `SERVICE_HANDLERS` (one consistency test).
|
||||
- **Order pages:** build site (`astro build` / existing build script) and confirm
|
||||
each new `/order/<slug>` route renders; smoke-load locally.
|
||||
- **Campaign builder:** run `build_trucking_campaigns.py --dry-run` and assert
|
||||
each new segment selects a nonzero, deduped audience pointing at a valid LP.
|
||||
- **End-to-end:** place a test order per new slug through checkout in dev, verify
|
||||
intake validation blocks missing fields, and the handler produces a complete
|
||||
admin todo.
|
||||
- **Source-grounded:** every Standard (paper) and Expedited (delegation) claim
|
||||
cites the official instruction (CMS-855 instr, CMS-10114 instr, CMS-116 for
|
||||
CLIA, state Medicaid enrollment page, CAQH/payer docs). No unsourced claim.
|
||||
- **Consistency sweep:** after edits, `grep` for "online-only" / "required" /
|
||||
"surrogate" / "no login" across checkout.ts, npi_provider.py, and the service
|
||||
pages — confirm none present surrogate as *required* where a paper path exists,
|
||||
and Standard is the default on every surface.
|
||||
- **Standard path mechanism check:** `cms855_pdf_filler.fill_cms855("855i",...)`
|
||||
still yields filled PDF + cert anchor (read-only smoke render). If CMS-10114
|
||||
filler is built, same smoke render proves a signable Baltimore-bound PDF.
|
||||
- **Expedited path check:** confirm the surrogate-grant CTA + `ia_surrogacy`
|
||||
success action + admin todo together let a human file in PECOS/NPPES same-day;
|
||||
surrogate scope wording matches what CMS I&A actually grants (PECOS vs NPPES).
|
||||
- **Matrix completeness:** every service (federal + state) has Standard + (where
|
||||
applicable) Expedited rows with a definite client-action column and source;
|
||||
no "unknown" and no service that's portal-only-but-marketed-as-no-login.
|
||||
|
||||
## Open questions / decisions
|
||||
|
||||
**RESOLVED (per user 2026-06-02):**
|
||||
1. **BOC-3 follow-ups + prerequisite blockers → upsell-approve, advise pre-order
|
||||
where possible.** Two layers:
|
||||
- *Pre-order advisory (preferred):* extend the existing DOT Compliance Check
|
||||
tool (`site/public/tools/dot-compliance-check/`) + `dot-lookup` recommended
|
||||
services to be **prerequisite-aware**. When a recommended service needs an
|
||||
active prerequisite (e.g. IRP needs active authority), show the dependency,
|
||||
pre-select the prerequisite, order the cart correctly, and state the ~21-day
|
||||
authority activation expectation — all before payment.
|
||||
- *Post-order upsell-approve:* when a handler discovers a blocker mid-fulfillment
|
||||
(e.g. BOC-3 ordered but authority revoked → needs reinstatement), write a
|
||||
`recommended_followups` entry on the order and render a one-click, pre-filled
|
||||
"Add this service" card on the order timeline/portal. Customer confirms + pays
|
||||
via the existing checkout. **No auto-charge.**
|
||||
- *Standalone checkout guard:* if a service is bought directly and its prereq
|
||||
isn't active at FMCSA, warn + offer to add the prereq rather than filing
|
||||
something unfulfillable.
|
||||
2. **State emissions (non-CA): build a real product.** Add a `state-emissions`
|
||||
service (handler + product + intake + page) covering NY/CO/MD/NJ/MA clean-truck
|
||||
/ Advanced Clean Trucks programs (CA stays on `ca-mcp-carb`).
|
||||
3. **Pre-order advisory: yes.** Covered by 1 above — reuse the compliance-check
|
||||
tool as the advisory surface.
|
||||
|
||||
**STILL OPEN:**
|
||||
4. Pricing for `hazmat-phmsa` and `state-emissions`.
|
||||
**DEFAULT:** `hazmat-phmsa` = $149 (admin-assisted PHMSA registration; gov fee
|
||||
$25 placardable-hazmat reg billed at cost). `state-emissions` = $199
|
||||
(NY/CO/MD/NJ/MA clean-truck / ACT advisory + registration assist).
|
||||
5. Vehicle-list intake fidelity.
|
||||
**DEFAULT:** lightweight up front — collect fleet count + base/operating states
|
||||
+ fuel type + gross-weight bracket at intake; collect full per-vehicle
|
||||
VIN/plate/weight rows via a post-order follow-up form only when the specific
|
||||
filing requires it (IRP, weight-distance taxes). Keeps conversion high.
|
||||
6. Standalone-order prereq guard.
|
||||
**DEFAULT:** warn + offer to add the prerequisite (pre-selected), allow override
|
||||
("file anyway"). Never a hard block.
|
||||
7. Long-term home for the reviewable plan (`docs/plans/` used here; no
|
||||
`side_panel` tool in this harness).
|
||||
1. **NPPES update/reactivation Standard path:** ✅ RESOLVED — CMS-10114 paper IS
|
||||
accepted for *changes AND reactivation* (verified against CMS-10114 Rev. 02/25,
|
||||
Section 1A boxes #2 Change / #4 Reactivation). Mailing address is the NPI
|
||||
Enumerator in **Baltimore MD** (the old Fargo PO Box 6059 is retired). Both
|
||||
nppes-update and npi-reactivation are Standard-default + surrogate-expedited.
|
||||
2. **Build `cms10114_pdf_filler.py` this pass?** Needed for a real NPPES Standard
|
||||
path. Recommend: yes if step 1 confirms paper, mirroring the 855 filler;
|
||||
otherwise defer.
|
||||
3. **State Medicaid scope:** classify the mechanism generically + verify top ~5
|
||||
states by our lead density now; template the rest. (50-state research is a
|
||||
separate effort.)
|
||||
4. **CAQH / payer credentialing tier:** almost certainly Expedited = "client
|
||||
signs one authorization, no login" (category C). Confirm we market that as
|
||||
"no logins for you" with precise wording.
|
||||
5. **Expedited pricing/positioning:** RESOLVED — expedited is **not** a paid
|
||||
tier and we never expose "paper" as the alternative. It's an intake question
|
||||
framed positively ("electronically granting surrogate access lets us bulk-file
|
||||
faster / fewer steps on our end"). If yes → online; if no → silent Standard
|
||||
fallback. Same price. No price delta, no separate product, no mention of paper.
|
||||
6. **Client-facing messaging rule:** never surface mechanics to the client —
|
||||
no "paper", "CMS-855", "CMS-10114", "MAC", or "Fargo" in any client copy
|
||||
(cold email, order page, checkout, intake). The only client-visible choice is
|
||||
the positive surrogate question; everything else is "we file it for you." This
|
||||
applies to the checkout copy audit in step 3.
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue