Websites, Halo Data and other systems
Feed your listings to a website, chart them in Halo Data, and tell your other systems what happens.
A listing doesn't stop at the directory. Everything here is under Connections.
Your website
Choose Feed a website, pick a website and which kinds and regions of listing it takes, and say where their pages live, such as /places. Halo adds a collection to the website, with an entry and a page for each published listing, its photo included. It takes someone who can edit websites.
Nothing reaches readers until someone publishes the website. Listings arrive as draft entries, and whoever publishes it sees them like any other change.
Halo CRM keeps what it writes. An entry's title, address, whether it's on the website, and the fields the feed fills come from the listing, so change them in the directory. In Halo CMS they show as read-only, under Kept by Halo CRM, with a link to the listing. Fields the feed doesn't fill are the website's own, and stay when the listing changes.
Deleting an entry in Halo CMS takes that listing off the website: the feed leaves it out rather than writing it again. Restoring the entry from the Trash puts it back, with whatever changed meanwhile. If it's deleted for good, the listing's page in Halo CRM says so and offers Put it back.
Where a listing is. Its page, under On websites, names each website that takes it, says whether readers see it or it's waiting for the next publish, and links to its entry in Halo CMS and its page on the website.
Feeds bring websites up to date shortly after a listing or the business that runs it changes. Refresh now does it at once, for when you're about to publish. Each refresh shows in your jobs, and the audit log records what it added, changed and withdrew.
Change alters which listings it takes, or pauses it. What it no longer takes comes off the website at its next publish.
Disconnect stops the feed. The collection and its entries stay, and published pages don't change. The website can edit them from then on. Connecting and disconnecting both take someone who can edit websites.
A feed waits while its website or collection is in the Trash, and picks up again if that's restored.
Forms on your website
A Form block can also send what's filled in to the Inbox, for a form businesses use to ask to join. Each one arrives in the Inbox saying which website and page it came from, with a link to the response. See forms and search.
Halo Data
Choose a workspace and Connect, and the directory appears in Halo Data as a connection like any other, refreshed every six hours. It has four tables: crm_listings, crm_businesses, crm_listing_stats and crm_activities. Build datasets, charts and reports on them as you would on any source.
People's names, emails and phone numbers are never in these tables, so someone can report on your directory without seeing them. Listings and businesses in the Trash, and their stats and activity, stay out too. Connecting takes someone who can manage connections.
Who can read them. The tables hold businesses' plans, prices and status, and listings that aren't published yet, so reading them in Halo Data takes access to Halo CRM, as opening it does. Analysts, and members set to No access in Halo CRM, can't query datasets on them, sample them or see their values in the catalog, even after the tables are disconnected, and an overlay can't join them. A public link, an embed, a scheduled email or a website's figures built on them shows nothing.
When they stop. The page says why the tables aren't refreshing: Halo Data is off for your organization, their connection is in the Trash, or it was deleted for good. Whoever manages Halo CRM hears once when they stop. Halo Data's page for the connection says Halo CRM keeps it, with a way back here, and doesn't let anyone change its tables by hand.
The Developer API reads listings and businesses too. It gives a listing's phone, the number its page gives visitors, and never contacts, emails, a business's own phone or street address, or your notes.
How listings are doing
A listing's page shows its numbers for the last 30 days, and its business sees them on the extranet, which gives it a reason to keep the listing right.
Halo doesn't count website visits by itself yet. The numbers here are ones your own systems send, a day's value of any metric at a time, such as views, clicks or leads.
To send them, add a source under Sources that posts to Halo, and copy its token. That token is all it takes: no one's session, and no API key.
curl https://api.usehalo.net/v1/public/crm/stats \
-H "Authorization: Bearer hci_..." \
-H "Content-Type: application/json" \
-d '{"items": [{"listingId": "...", "day": "2026-11-05", "metric": "views", "value": 120}]}'Up to 5,000 items at a time. A listing's id is in the address of its page. Metrics are lowercase letters, numbers and underscores. Numbers add up, so sending one day's numbers twice counts them twice.
Your other systems
Owners and Admins can add a webhook, and Halo posts to that address when something happens: a listing is published, a proposal is applied, a business signs up. Use crm.* for everything from Halo CRM, or name the events you want.
The events are crm.listing.created, updated, published, archived and deleted, crm.business.created, updated and deleted, crm.proposal.opened and applied, crm.signup.received and crm.subscription.changed. Each body is JSON with event, createdAt and data. X-Halo-WebhookDelivery is the same on every retry of one delivery, so use it to ignore repeats.
The signing secret is shown once, so copy it when it appears. Each request has an X-Halo-Signature, which is sha256= and the HMAC-SHA256 of X-Halo-Timestamp, a dot and the body. Check it, and reject old timestamps, to be sure a request is from Halo. New secret replaces it, and the old one stops straight away.
What was sent shows the latest 50 deliveries and how each was answered, for working out why something didn't arrive. A delivery that fails is tried up to six times, over about 31 hours, and Send again tries it once more after that. Send a test tries the address now. Change alters the address or events, or switches a webhook off, which also stops what's still being retried.
An organization can have 25 webhooks and 200 sources.
If you're the developer on the other end, Webhooks has every event, its payload, and how to check the signature and drop repeats.