Integrations & Apps
How-to guides from the Revamp365 Help Center.
Create Your Website With AI
Revamp365 builds a lead-gen website for your business in about a minute. Your free address goes live immediately; AI enriches the design into an editable draft you can refine and publish.
Create your site
- Go to Integrations & Apps → Websites.
- Click Create your website (Dealmaker includes this feature).
- Answer a few quick questions — business name, what you do, your market, and a look you prefer.
- Click Build my website.
You land on a full-screen progress view while AI assembles your site. When it is ready, click Start editing.
Edit and publish
- Click any text on the canvas to change it.
- The toolbar shows Live or Changes not live.
- When you are happy, click Publish changes to replace what visitors see.
Your starter page stays live at your free address until you publish the new design.
Start over with AI
Open the ⋯ menu → Start over with AI. This replaces your current draft only — your live site stays up until you publish the new version. A progress panel shows stages like writing copy and choosing imagery.
Already have a site from texting setup?
If you completed SMS setup first, your site may already exist. Open Websites → Edit website to customize it the same way.
For hand-editing details, see edit your website.
Read Inbound Lead Logs and Retry Failed Leads
Every POST your inbound webhook receives is recorded so you can confirm a lead arrived, inspect its raw payload, and re-run anything that did not land as a contact. The log lives next to your outbound deliveries inside the Webhooks screen.
Open the inbound logs
- Open Integrations & Apps, then Webhooks.
- Click the Logs tab.
- Switch the segmented toggle to Inbound events (the heading reads Inbound logs, marked BETA).
You can also land here directly at /integrations/webhooks?tab=logs. Filter the table by Source, Status, and a From/To date range; click Clear filters to reset. Use Refresh to pull the latest events.
Read a log row
Each row shows the source name and event ID, when it was received, a status pill, the linked contact (if one was created or merged), and any error. Click a row to open the detail modal, which has four tabs:
- Overview — status, event type, received/processed times, retry count, the payload event hash, and the full error message.
- Raw payload — the exact JSON body your source sent, pretty-printed.
- Headers — request headers (cookies,
Authorization, and X-Revamp-Signature are stripped for safety).
- Contact — the resulting contact, with a link to open it.
What each status means
| Status |
Meaning |
| Received |
Accepted and queued; processing has not finished. |
| Processing |
The job is running right now. |
| Processed |
A contact was created or merged successfully. |
| Failed |
The processing job threw an error (see the error message). |
| Validation Failed |
The payload failed validation — most often a missing/invalid email and phone. |
| Ignored |
Skipped on purpose: no usable phone, email, or external_id, or the source was deleted before processing. |
A · 2x next to a status means the event has been retried that many times.
Retry a failed lead
Only events in Failed, Processing (stuck), or Validation Failed can be retried — those rows show a retry icon, and the detail modal shows a Retry button.
- Click the retry icon on the row, or open the row and click Retry.
- Confirm the prompt. Revamp resets the event to Received, clears the error, increments the retry count, and re-dispatches it to the
inbound-leads queue.
- Click Refresh after a moment to see the new status.
The background job retries on its own up to 3 times with backoff before it lands in Failed, so a manual retry is mainly for events you have since corrected (for example, after fixing field mapping on the source). Retrying a Validation Failed event only helps if the underlying source now sends a valid email or phone.
Notes and gotchas
- Identical payloads from the same source within 24 hours are treated as duplicates and are not re-logged, so you will not see double entries from a retried Zapier task.
- An Ignored event with "neither a normalizable phone, email, nor external_id" means the form did not send a contactable field — fix the form or the mapping, not the log.
- If your source uses a signing secret, a bad
X-Revamp-Signature is rejected before a log is written, so a missing log can mean a signature mismatch.
To change how incoming fields land on a contact, see map inbound lead fields to Revamp contact fields.
Map Inbound Lead Fields to Revamp Contact Fields
When a webhook posts a lead into Revamp365, the Field mapping step of an Inbound Lead Source tells the system which incoming JSON field becomes which contact field. Leave it empty and Revamp auto-detects common shapes; map it when your payload uses nested or unusual field names.
Open the field mapping editor
- Go to Integrations & Apps, then Webhooks.
- Open the Receive Data tab (marked BETA).
- Click New source, or Edit an existing source, then advance to the Field mapping step (step 3 of the Basics, Security, Field mapping, Test, Done wizard).
Paste a sample to unlock path pickers
At the top of the editor, paste one real JSON body your source sends into the Paste a sample payload box. Revamp flattens it into dot-paths (for example data.lead.email_address or contacts[0].phone) and those paths become selectable in every field's picker. Without a sample you can still type a path by hand.
Map each canonical field
Fields are grouped so you map the right thing to the right column:
| Group |
Canonical keys |
Stored on the contact as |
| Identity |
email, phone, first_name, last_name |
email, phone (normalized to E.164), first/last name |
| Mailing address |
address, city, state, zip |
mailing_* columns |
| Property address |
property_address, property_city, property_state, property_zip |
Most Recent Property (mrp_*) columns |
| Lead lifecycle |
lead_source, lead_status, lead_temperature, lead_manager_email |
lead fields; lead_manager_email auto-assigns the matching team user |
| Classification & lists |
contact_type, deal_type, price_range, counties, lists, tags |
array fields, union-merged with existing |
| Provenance & notes |
external_id, notes |
external_id (dedup), notes (saved as a timeline note) |
Each row has two modes:
- From payload — pick or type the source path. The value is read from the incoming JSON.
- Static value — type a literal (such as
Facebook Ads) applied to every lead, regardless of payload. Stored internally as static: plus your text.
Use the X at the end of a row to clear a mapping.
Capture anything else as custom fields
Under Custom fields, click Add custom field, name it, and point it at a payload path or a static value. Each entry is saved as custom_fields.<name>. If no matching custom field definition exists yet, Revamp creates a text custom field automatically (capped at 50 auto-created fields per account), so unmapped extras are never silently dropped.
What happens when mapping is empty
With no mapping saved, Revamp runs a heuristic pass that recognizes:
first_name / last_name, or a single full_name / name it splits into two.
phone, mobile, cell, phone_number, or a phone_numbers array.
email directly or inside an emails array.
- Property fields like
property_street or subject_property_address.
Test before you trust it
On the Test step, paste a sample and click Send test. It is a dry run — nothing is written. The Preview shows whether the lead would create a new contact or merge into an existing one (dedup checks external_id, then phone, then email), plus the normalized phone and email. Switch to Canonical to confirm each field landed where you intended.
A few rules to keep in mind:
- On a merge, scalar fields only fill blanks; existing
lead_source and lead_status are preserved. Tags and the other array fields are union-merged.
- A lead with no usable phone, email, or external_id is ignored, so map at least one identity field.
To watch real submissions and replay failures, see Read Inbound Lead Logs and Retry Failed Leads.
Connect Carrot Website Forms to Revamp365
Carrot website form submissions can drop straight into your Revamp365 Contacts CRM through an Inbound Lead Source webhook. Carrot posts Gravity Forms submissions as application/x-www-form-urlencoded with labels like Name, Phone, Email, and Property Address (City) — Revamp auto-detects those, so no field mapping is required.
Create the Inbound Lead Source
The webhook URL lives inside an Inbound Lead Source you create in-app.
- Open Integrations & Apps, then Webhooks.
- Click the Receive Data tab (marked BETA).
- Click New source to launch the 5-step wizard: Basics, Security, Field mapping, Test, Done.
- On Basics, give it a recognizable name (for example Carrot — Main Site). Optionally set a Default lead source label like
Carrot and Default tags that get attached to every contact from this source.
- On Security, leave HMAC signing off. The Security step notes that simple forms like Carrot can skip it — the long random token in the webhook URL is what protects the endpoint.
- Click through Field mapping (skip it — see below) and finish to the Done step.
If you run several Carrot sites, create one source per site so each gets its own stats and webhook URL.
Get and use the webhook URL
The Done step shows your Webhook URL, which follows this pattern:
https://app.revamp365.ai/api/webhooks/inbound-leads/{token}
The {token} is unique and secret. Click Copy to grab it. The endpoint accepts POST requests with Content-Type: application/json or application/x-www-form-urlencoded.
In Carrot:
- Open your Carrot dashboard and go to the lead/webhook integration settings for your site.
- Add a new webhook and paste the Revamp URL as the destination. Carrot posts form submissions as form-urlencoded Gravity Forms fields, which this endpoint accepts with zero mapping.
- Leave HMAC off on the Revamp source — Carrot cannot send a signature header.
- Save the webhook, then submit a test lead from your Carrot site. The new contact appears under Contacts CRM within seconds.
Field mapping (only if needed)
Leave field mapping empty for Carrot. Revamp auto-detects Gravity Forms labels such as Name, Phone, Email, and Property Address (City), as well as canonical keys like first_name / email / phone. At least one of email or phone must be present — new contacts are deduplicated against existing ones by external ID, then phone, then email.
Open the Field mapping step only if a custom form sends unusual or nested keys. There you paste a sample payload and point each canonical field at a JSON dot-path (or a static: literal). Canonical destinations include:
| Group |
Fields |
| Identity |
email, phone, first_name, last_name |
| Mailing address |
address, city, state, zip |
| Property (seller) |
property_address, property_city, property_state, property_zip |
| Lifecycle |
lead_source, lead_status, lead_temperature, lead_manager_email |
| Classification |
contact_type, deal_type, price_range, counties, lists, tags |
For a deeper walkthrough, see map inbound lead fields to Revamp contact fields.
Confirm it worked and handle errors
A successful POST returns HTTP 202. Other responses to watch for:
404 — token is wrong or the source is inactive.
415 — Content-Type was not JSON, form-urlencoded, or multipart.
413 — payload exceeds the 128 KB limit.
429 — more than 200 requests in a minute for one source.
Use the wizard's Test step to send a sample payload and preview the contact that would be created or merged without writing anything. After a real submission, open the Logs tab to confirm processing, or read inbound lead logs and retry failed leads if a lead does not show up.
Edit Your Website
Your website lives at Integrations & Apps → Websites (or /websites). The editor opens in Simple mode by default: click any text on your homepage to edit it.
Status: Live vs changes not live
The toolbar shows one clear status:
- Live — visitors see your current published version.
- Changes not live — you have edits saved as a draft. Click Publish changes to put them live.
Edits autosave. Watch for Saving… then Saved next to the status.
Publishing
Use the single Publish changes button in the toolbar (or the site overview panel). A checklist shows exactly what will go live before you confirm.
Until you publish, visitors keep seeing the last live version. Use View live site to open your public address.
Advanced editing
Open the ⋯ menu and choose Advanced editing to unlock:
- Multiple pages and blog posts
- Add section palette
- Visual / Preview / Code views
- Per-page visibility (hide pages from your live site)
Locked lead form
The lead-capture form and SMS opt-in CTA are locked — they send leads to your CRM and include required opt-in language for texting. Revamp365 keeps that copy aligned with carrier requirements server-side.
More actions (⋯ menu)
- Share draft link — preview URL for unpublished edits
- Start over with AI — rebuilds your draft (live site stays up until you publish)
- Version history — restore a previous snapshot into your draft
- Your web address — custom domain setup
Plan and limits
Websites is included with Dealmaker. Caps: 25 pages, 100 blog posts, 80 sections per page; images max 5 MB (JPEG, PNG, WebP, or GIF).
If leads stop appearing, confirm you published your changes and the locked opt-in blocks are still on the page.
Connect Jotform, Google Forms, or Any HTML Form to Revamp365
Any tool that can POST JSON, including Jotform, Google Forms (via Apps Script), or a hand-coded HTML form, can drop new leads straight into your CRM. Revamp365 gives each source its own webhook URL and turns submissions into contacts automatically.
Create the inbound source
- Go to Integrations & Apps -> Webhooks, then open the Receive Data tab (marked BETA).
- Click New source and name it (for example, "Jotform - Seller Form") so you can spot it in logs.
- Optionally set a Default lead source and Default tags. Tags here are unioned with any the payload sends.
- Click Save and continue. On the Done step, copy your Webhook URL — it looks like
/api/webhooks/inbound-leads/{token}.
Point your form at the URL
Send a POST with header Content-Type: application/json. Either email or phone is required; everything else is optional.
{
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "5125550100",
"address": "123 Main St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"tags": ["website-lead"],
"notes": "Submitted via Jotform"
}
- Jotform: add a Webhooks integration, but because Jotform posts form-encoded data, route it through a middle layer (Zapier, Make, or a small script) that re-sends JSON.
- Google Forms: use a Google Apps Script
onFormSubmit trigger with UrlFetchApp.fetch(url, { contentType: 'application/json', payload: JSON.stringify(...) }).
- HTML form: post via
fetch() from JavaScript with a JSON body.
Field names Revamp365 understands
With no mapping configured, these keys map automatically. Aliases are also accepted.
| Canonical key |
Common aliases |
first_name / last_name |
name, full_name, firstName |
phone |
mobile, cell, phone_number |
email |
emails[] |
address, city, state, zip |
mailing_address, postal_code |
tags, notes, lead_source |
source |
For odd payload shapes, use the wizard's Field mapping step to point any JSON path (including static: values) at a canonical field.
Add a signature (recommended)
On the Security step, enable Require an HMAC signature. Copy the secret immediately — it is shown once. Your sender must then include header X-Revamp-Signature equal to hmac_sha256(rawBody, secret), or the request is rejected.
Test, then go live
- Use the wizard's Test step to paste a sample payload and preview the canonical result plus whether it would create or merge — no contact is written.
- A live submission returns HTTP
202 with an event_id. Validation errors return 400.
- Limits: 200 requests/minute per source, 128 KB max body, and identical bodies within 24 hours are treated as duplicates.
After a real submission, confirm it in Webhooks -> Logs. To preview payloads safely first, see test an inbound lead payload without creating a contact.
Preview an Inbound Lead Payload Without Creating a Contact
Revamp365 lets you paste the exact JSON your form or automation would POST and see precisely what would happen — without writing anything to your CRM. Use this dry run to confirm your field mapping before going live.
Where to find the test panel
- Open Integrations & Apps, then Webhooks.
- Click the Receive Data tab (marked BETA). The header reads "Receive data."
- Click New source to create one, or the pencil Edit icon on an existing source.
- In the wizard, advance to the Test step (the steps are Basics, Security, Field mapping, Test, Done).
The test panel only appears once a source is saved. If you see "Save the basics first, then return here to test," finish the Basics step first.
Run the dry run
- On the Test step ("Test with a sample payload"), paste your JSON into the Incoming JSON box. Click Load sample to drop in a starter payload (name, email, phone, address, tags, notes).
- Click Send test.
The payload must be a single JSON object — an array or malformed JSON is rejected client-side with a clear message. Nothing is written: this only normalizes the payload and checks for a match.
Read the result
The result area has three tabs:
| Tab |
What it shows |
| Preview |
The create-vs-merge outcome plus normalized phone and email |
| Canonical |
The full normalized field map Revamp365 derived from your payload |
| Raw |
The complete JSON response from the endpoint |
The Preview tab shows one of two outcomes:
- Would create a new Contact (green) — no existing contact matched. A new lead would be created with
lead_status=NEW and contact_type=['lead'].
- Would merge with contact #N (amber) — a match was found by phone, email, or external ID. It lists the matched contact's name, email, and phone. Merges fill blanks only: empty columns get updated, tags are unioned, and existing
lead_source and lead_status are preserved.
Matching ignores phone formatting (it compares the last 10 digits) and lowercases the email, so (512) 555-0100 and 5125550100 resolve to the same contact.
Tips
- Edit your mapping on the Field mapping step, then re-run the test to confirm values land in the right canonical fields.
- Check the Canonical tab to verify array fields like
tags, counties, and deal_type parsed correctly from comma-separated strings.
- This preview does not check your HMAC signature. To validate signing, see secure inbound lead webhooks with HMAC.
When the preview matches your expectation, copy the webhook URL from the Done step and point your source at it.
Secure Inbound Lead Webhooks With HMAC Signature Verification
A public inbound webhook URL accepts any POST that knows the link. Adding an HMAC-SHA256 signing secret means Revamp365 rejects every request that is not signed with your secret, so spoofed or replayed payloads never become contacts.
Turn on signature verification
- Open Integrations & Apps, then Webhooks (or go straight to
/integrations/webhooks?tab=receive).
- Open the Receive Data tab (marked BETA).
- Click New source, or open an existing source with the Edit (pencil) button.
- In the wizard, go to the Security step.
- On a new source, check Require an HMAC signature. On an existing source, click Generate secret.
- Copy the secret immediately. The banner reads "Copy this secret now — it will not be shown again." Revamp365 stores it encrypted and never redisplays it.
Once enabled, the source card shows a blue HMAC badge, and unsigned requests are refused.
How the signature works
Compute a hex HMAC-SHA256 of the exact raw request body using your secret, then send it in the X-Revamp-Signature header.
| Item |
Value |
| Algorithm |
HMAC-SHA256, lowercase hex |
| Signed content |
The raw JSON body, byte-for-byte |
| Header |
X-Revamp-Signature |
| Secret |
A 64-character hex string |
Server-side pseudocode mirrors what Revamp365 verifies:
signature = hmac_sha256(raw_request_body, secret) // hex digest
header "X-Revamp-Signature" = signature
Sign the bytes you actually transmit. Re-serializing or pretty-printing the JSON after signing changes the body and breaks the match.
What happens on a bad signature
- A missing or wrong
X-Revamp-Signature returns 404 Not found — the same response as an unknown URL, so probers learn nothing.
- Other guardrails still apply: the body must be
application/json, stay under 128 KB, and stay within 200 requests per minute per source.
- Identical bodies inside a 24-hour window are treated as duplicates and acknowledged without creating a second contact.
Rotate the secret
If a secret leaks, open the source's Security step and click Rotate. The confirmation warns that "the current secret will stop working immediately," so update your sender with the new value first. Rotating does not pause the source or change its URL.
Test before you depend on it
The in-app Test step previews field mapping only and does not check the signature. To prove end-to-end signing works, send one real signed POST from your tool, then read the inbound lead logs: a signed, valid payload lands as Received or Processed, while a signature failure never reaches the log at all.
Configure signing on the sender side in your automation platform, such as Make.com, and keep the secret in that platform's credential store rather than in plain workflow steps.
Choose Which Contact Events Are Sent Through an Outbound Webhook
Each outbound webhook destination only fires for the events you subscribe it to. Choosing the right events keeps your CRM, Zapier, or Make scenario from being flooded with updates it does not need.
Open the events picker
- Go to Integrations & Apps → Webhooks and open the Send Data tab.
- Click Add destination to create a new one, or the edit (pencil) icon on an existing destination.
- Scroll to the Events section. New destinations come with the seven Contact events pre-selected.
To create a destination from scratch first, see create an outbound webhook destination.
Pick your events
Events are grouped into categories. Tick individual events, use a category's Select all, or use Select all events at the top. The Search events box filters the list by name.
| Category |
Events available |
| Contact |
AI Summary Updated, Tag Added, Tag Removed, Lead Status Changed, Lead Temperature Changed, Contact Created, Note Added |
| Deal |
Deal Created, Deal Stage Changed, Deal Closed Won, Deal Closed Lost |
| SMS |
SMS Received, SMS Keyword Matched, SMS Opt-Out Received |
| Call |
Call Completed, Call No Answer, Voicemail Left, Human Call Logged |
| AI Agent |
AI Agent Qualified, Disqualified, Success, Fallback, Replied |
| Booking |
Booking Created, Canceled, Rescheduled, No Show, Completed |
| Task/Note |
Task Created |
You must select at least one event before the Create or Update button enables.
Watch for high-frequency events
Events tagged Debounced (SMS Received, SMS Keyword Matched, AI Agent Replied) are limited to one delivery per contact every 5 seconds so a chatty lead cannot flood your endpoint. Events tagged New are the recently added non-contact categories.
Two more behaviors to keep in mind:
- A single action can fire multiple events. Adding a tag sends Tag Added immediately, then AI Summary Updated about 30 seconds later when the summary regenerates.
- SMS Keyword Matched only fires when an inbound text matches one of your configured Keyword Responses.
Narrow Call deliveries with filters
When you select any Call event, a Call delivery filters panel appears. Leave a filter empty to send all matching calls, or restrict deliveries by:
- Interest level — hot, warm, cold, unknown
- Sentiment — positive, neutral, negative, unknown
- Duration — over or under a threshold in seconds
- Outcome — successful, voicemail, no answer
Save and verify
Click Create or Update. The right-hand JSON payload preview shows a sample of what each selected category sends. A destination only delivers while it is marked Active, and each account is capped at 10 destinations.
After saving, trigger a matching event and confirm it arrived in the outbound webhook delivery logs.
Rotate an Outbound Webhook Signing Secret Safely
Revamp365 generates a 64-character signing secret once, when you create an outbound webhook destination. There is no in-place "regenerate secret" button, so you rotate safely by standing up a replacement destination and retiring the old one with no gap in delivery.
When to rotate
- The secret was committed to a repo, pasted in a ticket, or shared in chat.
- A teammate with access left, or you suspect the value leaked.
- You are doing routine periodic credential hygiene.
What you cannot do
Editing a destination changes its URL, label, events, and filters only — the secret stays fixed for the life of that destination. The single way to get a fresh secret is to create a new destination. You can hold up to 10 destinations per account, which gives you room to overlap old and new during the swap.
Rotate without dropping events
Open the destination list under Integrations & Apps → Webhooks → Send Data.
- Click Add destination.
- Enter the same URL as your live destination, give it a Label like "Zapier (new secret)", and select the same events and filters.
- Click Create. A green panel shows the new secret: "Save this secret because you will need it to verify webhook signatures." Copy it now — this is the only time it is shown in full.
4. Update your receiver to accept the new secret. Verify the X-Webhook-Signature header, which is an HMAC-SHA256 of the raw JSON body keyed with the secret. See Verify outbound webhook HMAC signatures.
5. Have your receiver accept either the old or the new secret for a short overlap window so in-flight deliveries keep validating.
6. Confirm new deliveries succeed in the Logs tab.
7. Open the old destination, toggle it to Inactive to stop sends, watch for a clean period, then click the trash icon to delete it. Deleting keeps its delivery logs.
8. Remove the old secret from your receiver once only the new destination is firing.
Old vs new during rotation
| Item |
Old destination |
New destination |
| URL |
Your live receiver |
Same receiver |
| Secret |
Compromised value |
Fresh 64-char hex |
| State during swap |
Active, then Inactive, then deleted |
Active |
| Logs after delete |
Retained |
Retained |
Reveal a secret you already have
To check the current value before rotating, click the eye icon on a destination to reveal its stored secret, then the copy icon. Secrets are encrypted at rest, so this is the only way to read one back.
Notes
- This page is available on paid plans; free accounts are redirected.
- Deliveries are attempted once with no automatic retry, so finish your receiver changes before deleting the old destination.
- Match every event and filter on the new destination, or you will silently stop sending some events after deleting the old one.
Connect a Podio App to Revamp365 in the CRM Sync Wizard
Connecting Podio lets item changes in a Podio app flow into Revamp365 as contacts and trigger automations. The setup runs through a six-step wizard on the Dealmaker plan.
Open the Podio connection wizard
- Go to Integrations & Apps in the left navigation.
- Find the Podio card and click Open. This requires the Dealmaker plan (admins also have access).
- On the Podio hub, stay on the Connections tab.
- Click Add Connection to launch the Add CRM Connection wizard. The CRM integration is in Beta.
Work through the six steps
The wizard shows a progress bar across the top. You move with Next and Back.
| Step |
What you do |
| 1. Provider |
Provider is preset to Podio. Enter a Connection Name (for example, "My Podio Workspace"). |
| 2. Credentials |
Enter your Podio App ID and Podio App Token. |
| 3. Test Connection |
Click Test Connection to validate credentials and load mappable fields. |
| 4. Webhook Events |
Choose which Podio events trigger syncs. |
| 5. Sync Conditions |
Optionally add rules so only matching items sync. |
| 6. Field Mapping |
Map Podio fields to Revamp contact fields. |
Find your App ID and App Token
In Podio, open the app, then go to App → Developer → App Token. Copy the App ID and App Token into step 2. The Next button stays disabled until both fields are filled.
Choose webhook events
A separate webhook is registered for each event you select. Options are:
- Item Created (
item.create) — new leads added to the app
- Item Updated (
item.update) — existing lead fields changed
- Item Deleted (
item.delete) — leads removed from the app
- Comment Created (
comment.create) — new comments on items
Item Created and Item Updated are selected by default. Select at least one to continue. Podio must reach a public HTTPS URL, so localhost setups typically fail with a 400 error.
Save the connection
On step 6, you must map at least phone or email for the Save Connection button to activate. You also have to complete the Test Connection step first. Saving registers the webhooks with Podio and creates the active connection.
After saving, the new card shows its status, App ID, last sync time, event count, and synced-lead count. Use the Configure button to revisit inbound filters, field mapping, and outbound triggers later.
Next steps
- Map Podio fields to Revamp contact fields
- Choose Podio sync events
- Use CRM sync conditions
- Read CRM sync logs
If a save fails with "Podio API error: 400," your webhook base URL is not publicly reachable. See pause, resume, and troubleshoot CRM sync.
Use CRM Sync Conditions to Filter Which Records Sync
Sync conditions let you filter which incoming CRM records actually become contacts in Revamp365. Add rules to your connection and only leads that match flow in; everything else is logged and skipped.
Where to find sync conditions
Sync conditions live inside each CRM connection, not in a global setting.
- Open Integrations & Apps, then your Podio integration.
- On the Connections tab, find the connection and click Configure.
- In the left nav of the configuration screen, choose Inbound filters.
The Inbound filters tab shows your subscribed Podio events and the Sync Conditions editor. A badge on the tab shows how many rules are currently set.
Build a rule
Each rule has three parts: a field, an operator, and (for most operators) a value.
- Click Add Condition. A row appears defaulting to
Lead Status / Equals.
- Pick a field from the dropdown.
- Pick an operator.
- Type the value to match. For
Is Empty and Is Not Empty, no value is needed.
Add as many rows as you need, and use Remove to delete one.
Match logic (AND / OR)
At the top, choose how rules combine:
- All Rules (AND) — a lead must satisfy every rule to sync.
- Any Rule (OR) — a lead syncs if it matches at least one rule.
If you add no rules, every lead syncs.
Available operators
| Operator |
Matches when the field… |
| Equals |
exactly equals the value |
| Does Not Equal |
is anything other than the value |
| Contains |
includes the value as text |
| Does Not Contain |
does not include the value |
| Starts With |
begins with the value |
| Is Empty |
is blank, null, or an empty list |
| Is Not Empty |
has any value |
Matching is case-insensitive, and for list fields like Tags, Contains checks each tag.
Fields you can filter on
You filter on Revamp's canonical lead fields (the normalized result of your inbound mapping), not raw Podio field names. Options include Phone, Email, First/Last/Full Name, Notes, Lead Status, Lead Temperature, AI Campaign Status, Lead Tracking Campaign, Date Lead Came In, Full/Property Address, City, State, ZIP, Assigned User, Tags, Opt Out Status, and Do Not Contact.
Save and verify
Click Save changes. Conditions apply to records processed after you save; they do not retroactively remove contacts already synced.
When a lead fails your conditions, Revamp does not create or update a contact. The incoming event is marked filtered and recorded, so nothing is silently lost. To confirm what passed or was filtered, check the CRM sync logs.
Sync conditions only control what comes in. To decide which Revamp changes get pushed back out to Podio, set Podio sync events instead.
Pause, Resume, and Troubleshoot a CRM Sync Connection
Your Podio connection runs two directions: inbound items flowing into Revamp365 and outbound contact updates pushed back to Podio. You control each side separately and can pause pushes without losing any configuration.
Open the connection
- Go to Integrations & Apps and find the Podio card.
- Click Open (requires the Dealmaker plan or an admin account).
- On the Connections tab, locate the connection card. The colored badge shows its state: green active or red errored.
Pause and resume outbound pushes
Outbound pushes send your Revamp365 contact edits back to the linked Podio item. To stop them temporarily:
- Click Configure on the connection card.
- Open the Outbound triggers category in the left nav.
- Check Pause all outbound pushes (keeps settings; nothing is sent to Podio).
- Click Save changes.
The connection card's Outbound badge then reads Paused. To resume, uncheck the box and save again. To switch outbound off entirely (rather than pause), click Turn off outbound in the same panel — the badge changes to Off.
Stopping inbound items
There is no inbound pause toggle. Inbound items arrive through a registered Podio webhook, so the only way to fully stop them is to Delete the connection (kebab ⋮ menu), which deregisters the webhook. You can narrow what flows in instead by editing Inbound filters under Configure. For a deeper look at what arrived, see read CRM sync logs.
Test and re-trigger a connection
The kebab (⋮) menu on each card has two diagnostic actions:
| Action |
What it does |
| Test connection |
Re-fetches your Podio app fields. A green "Connection is healthy" toast confirms the credentials still work. |
| Trigger sync |
Queues a fresh inbound poll and shows "Sync started." |
Run Test connection first whenever something looks off — it isolates a credential problem from a mapping problem in seconds.
Recover an errored connection
A connection flips to errored automatically after 10 consecutive failed events. When that happens:
- Read the red error message banner on the card — it shows the most recent failure reason.
- Run Test connection. If it fails, the Podio app token or app ID is wrong or revoked; delete and recreate the connection with current credentials.
- If the test passes, the failures were data-related (for example, a removed Podio field). Fix the mapping under Configure → Inbound mapping, where at least phone or email must stay mapped.
- Click Trigger sync to confirm events process cleanly again.
Quick reference
- Outbound badge: On, Paused, or Off — controlled under Outbound triggers.
- Status badge: active or errored (10+ failures).
- App ID, Last Sync, Events, and Synced Leads counters sit on each card for a fast health check.
Pausing outbound never deletes your field mappings, sync conditions, or event subscriptions, so you can resume exactly where you left off.
Troubleshoot Lead Capture From a Hosted Compliance Website
When a visitor submits the form on your hosted compliance/marketing site but no contact appears in your CRM, the break is almost always in one of four places: the page isn't live, a required field failed validation, the background queue isn't running, or the payload had no usable phone or email. Work the checks below in order.
How a hosted-site lead becomes a contact
- The visitor submits the form, which posts to
/{your-slug}/lead.
- Revamp365 stores the raw submission, then queues a background job on the
inbound-leads queue.
- The job creates (or merges into) a contact with Lead source = Website, the tag Hosted Site Lead, Lead status = NEW, and a "Lead captured" entry on the contact timeline.
If any step fails, the contact never lands. Note: leads from the Manus-designed live site are processed immediately (synchronously); the standard editor/Vue form uses the queue.
Step 1 — Confirm the page is actually published
A hosted page only accepts form posts when it is publicly visible. If it isn't, the URL returns 404 and the form can't submit.
- Open your public URL (
https://yourdomain/your-slug) in a private window.
- A 404 means the page is unpublished. Re-publish it from the Websites editor
— see Use the Websites editor for your compliance page or regenerate via Generate a hosted compliance website with AI.
Step 2 — Check the visitor entered valid required fields
The form rejects the submission unless all of these are present and valid:
| Field |
Requirement |
| Name |
Required (first or last name derived) |
| Email |
Required, valid format |
| Phone |
Required, valid 10-digit US number |
| Property address |
Required |
SMS consent is an optional checkbox. The form also rate-limits to 12 submissions per minute per visitor, so rapid repeat testing can be throttled.
Step 3 — Make sure a queue worker is running
The contact is created by a background job, not during the page request. If no queue worker is processing the inbound-leads queue, submissions sit unprocessed and no contact appears.
- Confirm your worker process is up.
- After a worker starts, pending jobs run and the missing contacts appear.
Step 4 — Verify the payload had a phone or email
The job ignores any submission that has no usable phone, email, or external ID. A garbled phone with no email produces no contact by design. Re-test with a clean 10-digit number and a real email.
Where to look (and a key limitation)
Once a worker runs, the fastest confirmation is the contact itself: search your contacts for the test email or phone, or filter by the Hosted Site Lead tag. See Use tags, saved views, filters, and lists.
Important: the Integrations & Apps → Webhooks → Logs tab (and its retry button) only shows leads from external webhook endpoints — Zapier, Make, Carrot, and custom forms. Hosted-site submissions are tracked separately and do not appear there, so there is no in-app retry for them. Re-submit the form to retry. For webhook-sourced leads instead, see Read inbound lead logs and retry failed leads.
Connect Make.com to Revamp365 Inbound Lead Webhooks
Make.com (formerly Integromat) can push leads into your Revamp365 Contacts CRM by POSTing JSON to a per-source webhook URL. Each scenario sends one lead, Revamp deduplicates it, and a new or merged contact appears within seconds.
Create an inbound lead source
- Open Integrations & Apps → Webhooks.
- Click the Receive Data tab (marked BETA), then New source.
- Work through the 5-step wizard:
- Basics — name the source (e.g. Make — Facebook Leads), optionally set a Default lead source and Default tags.
- Security — optional HMAC signing (see below).
- Field mapping — skip unless your payload uses unusual key names.
- Test — paste sample JSON and confirm the preview.
- Done — copy the Webhook URL. It looks like
https://revamp365.ai/api/webhooks/inbound-leads/YOUR_TOKEN.
Build the Make scenario
After your trigger module, add the HTTP → Make a request module and configure it:
| Setting |
Value |
| URL |
Your Revamp webhook URL |
| Method |
POST |
| Body type |
Raw |
| Content type |
JSON (application/json) |
In Request content, map your trigger output into a JSON body. You must send an email or a phone:
{
"first_name": "{{1.first_name}}",
"last_name": "{{1.last_name}}",
"email": "{{1.email}}",
"phone": "{{1.phone}}",
"property_address": "{{1.address}}",
"lead_source": "Make"
}
Run the scenario once. A success returns HTTP 202 with {"success": true, "event_id": 123}. The lead processes asynchronously, and lead_status is set to NEW on new contacts.
Optional: sign requests with HMAC
Make supports custom headers, so you can require a signature. On the Security step, check Require an HMAC signature and save — the secret is generated automatically and shown once. Then add a header to the HTTP module:
X-Revamp-Signature: <hex hmac_sha256 of the raw body using your secret>
Send the bare hex digest with no sha256= prefix. A missing or wrong signature returns 404. For the full signing recipe, see secure inbound lead webhooks with HMAC.
Test and monitor
- Use the wizard's Test step before going live. It is a dry run — nothing is written — and the Preview tab shows whether a contact would be created or merged.
- After real traffic flows, open Webhooks → Logs and choose Inbound events to see each POST, its status, and the linked contact.
Limits and common errors
| Response |
Cause |
400 |
Malformed JSON, or no email/phone after normalization |
404 |
Wrong token, inactive source, or bad HMAC signature |
413 |
Body over 128 KB |
415 |
Content-Type is not JSON |
429 |
More than 200 requests per minute to one source |
Identical payloads to the same source within 24 hours are deduplicated and return the same event_id, so re-running a scenario will not create duplicate contacts.
Choose Inbound and Outbound Podio Sync Events
Revamp365 syncs with Podio in two independent directions: inbound (Podio item changes create or update Revamp contacts) and outbound (Revamp contact changes push back to the linked Podio item). You choose the trigger events for each direction separately.
Where sync events live
Inbound and outbound events are set in two different places:
| Direction |
Where you set it |
When |
| Inbound (Podio → Revamp) |
Add CRM Connection wizard, "Webhook Events" step |
At connection creation only |
| Outbound (Revamp → Podio) |
Connection's Configure dialog, "Outbound triggers" |
Any time after creation |
Open Integrations → Podio → Connections to find your connections and the Add Connection and Configure buttons.
Choose inbound Podio events
Inbound events are picked while you create the connection. On the Webhook Events step, select which Podio events trigger a sync into Revamp:
- Item Created (
item.create) — new leads added to the app
- Item Updated (
item.update) — existing lead fields changed
- Item Deleted (
item.delete) — leads removed from the app
- Comment Created (
comment.create) — new comments on items
Item Created and Item Updated are selected by default. Pick at least one event to continue. Revamp registers a separate webhook with Podio for each event type you select.
Inbound event subscriptions are fixed once the connection is saved. The Configure dialog shows them read-only under "Podio events subscribed." To change them, create a new connection.
Choose outbound Revamp events
Outbound pushes are off until you turn them on. In the connection's Configure dialog, open Outbound triggers and click Turn on outbound. Then check the Revamp events that should push to the matching Podio item:
- Contact fields updated
- Contact created
- Lead status changed
- Lead temperature changed
- Tag added / Tag removed
- Note added
- AI summary updated
If you clear every box, Revamp keeps "Contact fields updated" selected so at least one trigger remains. Outbound pushes only update Podio items that are already linked to a Revamp contact.
To stop pushes without losing your selections, check Pause all outbound pushes. Settings are kept; nothing is sent to Podio.
Save your choices
- Set inbound conditions and field mapping (phone or email is required) before saving.
- Under Outbound triggers, choose your push events.
- Click Save changes.
Refine each direction
- Filter which inbound leads sync with sync conditions.
- Match fields in both directions on the field mapping page.
- Check what actually synced in the CRM sync logs.
Inbound and outbound run on their own toggles, so you can receive Podio leads without pushing anything back, or vice versa.
Create an Outbound Webhook Destination
Stream real-time contact, deal, SMS, call, AI agent, booking, and task events from Revamp365 to Zapier, Make, your CRM, or any URL that accepts POST requests. A destination is a single endpoint plus the events you want it to receive.
Open the Send Data tab
- Go to Integrations & Apps from the main navigation.
- Open the Webhooks card ("Send CRM events to HTTPS endpoints").
- You land on the Send Data tab, which lists every destination you have configured.
Webhooks are a paid feature, so a Free plan is redirected away from this page.
Add a destination
- Click Add destination in the top right.
- Enter the URL that should receive the events (for example
https://hooks.zapier.com/...). It must be a valid, publicly reachable HTTPS address.
- Enter an optional Label (such as "My Zapier Hook") so you can recognize it later.
- Select at least one event. See choosing which events to send for the full catalog and filters.
- Click Create.
Save your signing secret
When the destination is created, Revamp365 shows a signing secret once. Copy it immediately with the Copy button.
- Every delivery includes an
X-Webhook-Signature header, an HMAC-SHA256 hash of the JSON body keyed with this secret.
- Your receiver uses the secret to confirm the request genuinely came from Revamp365. See verify outbound webhook HMAC signatures.
- You can reveal the secret again later with the eye icon on the destination card.
Limits and behavior
| Detail |
Value |
| Destinations per account |
10 maximum |
| URL length |
Up to 2,048 characters |
| Events per destination |
1 to 50 |
| Request method |
POST with Content-Type: application/json |
| Signature header |
X-Webhook-Signature (HMAC-SHA256) |
| Delivery timeout |
15 seconds |
| Retries |
None — each event is attempted once |
Because there are no automatic retries, your endpoint should return a 2xx status quickly. Private, internal, and reserved IP addresses are rejected for security, so localhost and LAN URLs will not deliver.
Manage existing destinations
Each card on the Send Data tab gives you controls to:
- Toggle Active/Inactive — a new destination is Active by default; an Inactive one stops receiving events without being deleted.
- Edit — change the URL, label, selected events, or payload options.
- Delete — remove the destination. Existing delivery logs are kept.
After your first events fire, open the delivery logs to confirm each POST returned a success status and to inspect the exact payload your endpoint received.
Customize Hosted Website Branding, Sections, and Compliance Copy
The Websites editor lets you reshape the lead-gen site that Revamp365 generates during A2P activation: rearrange blocks, rewrite copy, add pages, and publish without touching the compliance pieces that keep your SMS traffic approved.
Open the editor
- Go to Integrations & Apps, find the Websites card, and click Open.
- If you see "Your website isn't ready yet," finish A2P compliance activation first — click Go to A2P Registration. The site is generated during that step.
The Websites editor is included on Dealmaker. If you don't see it yet, your plan or your A2P setup isn't complete. For the first build, see generate a hosted compliance website with AI.
Edit pages and blocks
The center canvas is a live, edge-to-edge preview. The left rail lists your Pages; the Add blocks palette below it drops new sections in.
- Select any block on the canvas to open its fields in the right inspector.
- Reorder blocks by dragging the grip handle that appears on hover.
- Delete a block with the trash icon (locked blocks show a lock instead).
- Add a block from the palette: Hero, Heading, Text, Image, Feature grid, Process steps, Testimonials, FAQ, Service areas, Blog list, Button, or Spacer.
List-style blocks edit as one item per line. FAQ uses Question | Answer, Testimonials use Name | Quote, and Feature grid accepts plain lines or Title | Description.
Edits save automatically — watch the Saved / Saving… / Save failed status in the toolbar.
Branding and section backgrounds
Your brand color and logo come from your A2P compliance profile, so they aren't edited in this screen. What you can control per section: select a block that starts a band, then set Section background in the inspector.
| Option |
Result |
| Default (auto) |
Alternating tone chosen for you |
| Light / Dark |
Solid light or dark band |
| Brand color |
Fills with your brand color |
| Gradient |
Brand gradient band |
Open the Preview tab to see the band; it applies on the live page after you publish.
SEO and adding pages
- Set the Page title and Meta description (SEO) in the inspector. The page URL shows below as
/{slug}/{path}.
- Click Add in the Pages rail to create a Page or Blog post. Limits: up to 25 pages and 100 blog posts, 80 blocks per page.
- Image uploads accept JPEG, PNG, WebP, or GIF up to 5 MB (no SVG).
Compliance copy is locked
Blocks marked with a lock — the lead form, the SMS opt-in CTA, and legal text — are "managed automatically for SMS compliance" and can't be edited or deleted. The Privacy Policy, Terms of Service, and Opt-In nav links are locked for the same reason. See use the Websites editor for your compliance page.
Rebuild and publish
- Rebuild with AI regenerates a fresh draft from your business details. Confirm the prompt — it replaces your current draft, but your live site stays up until you publish, and the build runs for a few minutes in the background.
- Publish (toolbar) takes the whole site live. Use the per-page Publish / Unpublish toggle for individual pages, then View live to check the result.
If forms aren't capturing leads after publishing, see troubleshoot hosted compliance site lead capture.
Domains and Hosting for Websites
The Domains & hosting panel in the Websites editor shows where visitors reach your site today, whether a custom domain is connected, and how to add one. Open it from the Website editor toolbar — the button is labeled Domains & hosting.
Platform address
Every site has a Revamp365 platform URL (your /{slug} address on the hosted sites host). This URL always works, even after you connect a custom domain. Visitors who bookmark the platform link can still reach your site.
Publish before connecting a domain
Custom domains attach to a published site. If your site is still a draft, publish it from the Website editor first — the Domains panel shows a reminder until you do.
Two ways to add a custom domain
- Buy a domain — search for an available name included with your Dealmaker plan (one free domain per site on eligible extensions). See claim your included website domain.
- Connect a domain I own — point a domain you already registered at your site by adding DNS records. See connect a domain you own to your website.
You can connect one custom domain per site. Release the current domain before attaching a different one.
Status indicators
- Publish status — whether the site is live at the platform URL.
- Custom domain — Waiting for DNS, Verifying DNS, or Live while setup completes. Use Continue setup to reopen the DNS checklist if you closed the wizard mid-flow.
Related articles
- Add DNS records for your website domain
- Use the Websites editor for your compliance page
Connect a Domain You Own to Your Website
Connect an apex domain you already own (for example yourbusiness.com) so visitors reach your Revamp365 site at https://yourbusiness.com instead of only the platform URL.
Open the connect flow
- Open Integrations & Apps → Websites and publish your site if it is still a draft.
- Click Domains & hosting in the editor toolbar.
- On the hosting summary, click Connect domain I own.
Enter your domain
Type your apex domain — the root name you bought at your registrar. The input shows an https:// prefix for clarity; Revamp365 strips it before saving.
Subdomains are not supported. Use yourbusiness.com, not www.yourbusiness.com or blog.yourbusiness.com. If you enter a subdomain, the wizard blocks the request before it reaches the server.
What happens next
After you click Connect domain, Revamp365 creates the domain attachment and shows a DNS records checklist. Add each record at your registrar, then wait for verification — usually 5–30 minutes, sometimes up to 48 hours.
Full walkthrough: add DNS records for your website domain.
Troubleshooting
- Publish first — the connect buttons stay disabled until the site is published.
- Domain already in use — each site supports one custom domain; release the existing domain before attaching another.
- Stuck on DNS — reopen Continue setup from the hosting summary and use Check now on the DNS step.
Add DNS Records for Your Website Domain
After you connect a domain you own, Revamp365 shows the exact DNS records to add at your registrar (GoDaddy, Namecheap, Cloudflare, Google Domains, etc.). Until these records propagate, the custom domain stays in Waiting for DNS or Verifying DNS.
Open the DNS checklist
- Open Domains & hosting from the Website editor.
- If setup is in progress, click Continue setup on the hosting summary — or finish the Connect domain I own flow until you land on the DNS records step.
The header shows Add DNS records for yourdomain.com and a progress strip: Add DNS records → Verifying DNS → Live.
Records you will see
Revamp365 typically asks for two records:
| Type |
Purpose |
| TXT |
Proves you control the domain (Revamp365 verification token at _revamp365-challenge.yourdomain.com). |
| CNAME |
Points your apex domain at the Revamp365 sites host (sites.revamp365.ai). |
Your checklist shows the exact Name / Host and Value for each record. Use Copy on a row or Copy all to paste into registrar notes.
Add records at your registrar
- Log in to the company where you bought the domain.
- Open DNS management (sometimes labeled DNS, Advanced DNS, or DNS records).
- Add each record exactly as shown — type, host/name, and value must match.
- Save changes. Some registrars use
@ for the apex; others want the bare domain — follow your registrar's convention for the host field.
Verification and polling
Revamp365 checks DNS automatically about every 12 seconds. You can also click Check now for an immediate poll.
- Waiting for DNS — records not detected yet; keep waiting after you save at the registrar.
- Verifying DNS — records found; Revamp365 is finishing SSL and routing setup.
- Live — visitors can use
https://yourdomain.com. SSL may take a few more minutes to show as fully active in browsers.
How long it takes
Most domains verify in 5–30 minutes. Global DNS can take up to 48 hours in rare cases. If nothing changes after a day, confirm you did not typo the TXT value and that the CNAME points at sites.revamp365.ai.
Related articles
- Connect a domain you own to your website
- Domains and hosting for websites
Claim Your Included Website Domain
Dealmaker includes one free domain per published website on eligible extensions (typically .com, .net, and .org). Search inside the Websites editor, claim the name, and Revamp365 registers it and connects it automatically — you pay $0 today when the free purchase path is enabled for your account.
Before you search
- Publish your site from the Website editor.
- Open Domains & hosting and click Buy a domain.
Search and select
- Enter at least two characters of the name you want (without the extension).
- Click Search. Results show retail value with a Free 1st year badge on eligible names.
- Click a row to select it, then click Continue.
Premium and unavailable names are hidden — if nothing appears, try a different spelling or another extension from the eligible list shown under the search box.
Confirm and claim
The claim step summarizes the domain, shows retail value crossed out, and confirms You pay $0 today. Click Claim free domain to register and attach it.
Requirements:
- One free domain per site — release an existing custom domain before claiming another.
- Profile contact info — your account needs a full name and valid contact email (ICANN registrant requirements). If claim fails, update your profile under Settings → Basic (
/settings/profile) and try again.
After claim
When registration finishes, the wizard shows Registered & connected. Visitors can open https://yournewdomain.com; SSL may take a few minutes to become fully active.
Your platform URL still works for visitors who have that link.
Related articles
- Domains and hosting for websites
- Use the Websites editor for your compliance page
Map Podio Fields to Revamp Contact Fields
Field mapping tells Revamp which Podio field feeds each contact field when leads sync in. You set it per connection in the inbound mapping screen, and at least one of phone or email must be mapped before you can save.
Open the inbound mapping screen
- Go to Integrations & Apps and open the Podio card.
- On the Connections tab, find your connection and click Configure.
- In the sync settings dialog, select Inbound mapping from the left nav.
If you have not connected an app yet, set that up first in the Podio CRM sync wizard.
Map each field
The editor shows two columns: Revamp Field on the left and CRM Field on the right. For each Revamp field you want to fill, click its CRM Field box and pick the matching Podio field. Each option lists the Podio field name and its type, like Phone (phone).
Standard rows you can map include:
| Revamp field |
Typical Podio source |
| Phone / Email |
Contact phone, email |
| First Name / Last Name / Full Name |
Name field |
| Lead Status / Lead Temperature |
Category fields |
| Lead Tracking Campaign |
Source or campaign field |
| Date Lead Came In |
Created date |
| Notes / Communication Log |
Text or comment field |
| Assigned User, Tags, Opt Out Status, Do Not Contact |
Matching Podio fields |
Leave any row blank to skip it. Unmapped fields are simply not written.
Address fields
Address leads with a single Full Address field, which is recommended because most Podio apps store the whole address in one place. If your app splits it, click Use separate address fields to reveal Property Address, City, State, and ZIP rows.
Map custom fields
Under Additional field mappings, click Add field to map any other Revamp field — including your own custom CRM fields — to a Podio field. Pick the Revamp field on the left and the Podio field on the right. Each Revamp field can be used once, so already-mapped fields drop out of the picker.
Save
- Click Save changes in the footer. The footer shows a running count of how many fields are mapped, like "3 inbound · 0 outbound fields mapped."
- Saving fails with an error if neither Phone nor Email is mapped — map at least one and try again.
- Each save creates a new active mapping version, so prior mappings are kept in history.
Next steps
- Decide which Podio events feed the sync in choose Podio sync events.
- Filter which leads come in with CRM sync conditions.
- Confirm leads land correctly by reading the CRM sync logs.
Read Inbound and Outbound CRM Sync Logs
CRM sync logs show every record that moved between Revamp365 and your connected CRM, so you can confirm a lead synced, see what changed, and retry a push that failed.
Open the sync logs
- Go to Integrations & Apps in the left sidebar.
- Open your Podio or Salesforce card.
- Click the Sync logs tab. The page lists inbound and outbound activity across all connections for that provider.
Read a row
Each row is one sync event. The default columns are Date, Connection, Direction, External record, Contact, Event / operation, Status, and Error.
- Direction is
inbound (received from the CRM) or outbound (pushed to the CRM).
- Contact links to the matched Revamp365 contact when one exists.
- Click any row to expand full detail, including connection, provider, attempts, and a What changed field-level diff (shown on inbound syncs).
Use the Fields button to show, hide, drag-reorder, or resize columns. Attempts and Provider are hidden by default.
What the statuses mean
Status values depend on direction.
| Direction |
Statuses |
| Inbound |
Received, Queued, Processed, Filtered, Coalesced, Ignored, Failed |
| Outbound |
Pending, Success, Skipped, Failed, Dead |
Green means it landed (Processed / Success), yellow is in progress (Queued / Received / Pending), and red flags a problem (Failed / Dead).
Filter and find logs
- Type in the Search box to match an external record ID, event type, or error message.
- Click Filters to open categories: Direction & Status, Connection, Date (Today through This Month presets, plus a custom range), Event / operation, and Record & contact. The Errors only toggle surfaces just the failures.
- Use Sort to order by newest, status, connection, or most attempts.
- Save a filter set as a Team or Private view from the left rail, then reselect it later.
Retry a failed outbound push
When an outbound row shows Failed or Dead, a refresh icon appears in the Actions column.
- Click the refresh icon on that row.
- The push is requeued and the row resets to Pending.
The retry needs an active outbound field mapping on the connection. If none exists, you'll see a "No active outbound mapping" message instead of a queued retry. Inbound rows are read-only and cannot be retried here.
Inbound versus webhook lead logs
These logs cover structured CRM record sync (Podio, Salesforce). For raw webhook lead intake and per-lead retries from form submissions, see read inbound lead logs and retry failed leads.
Read Outbound Webhook Delivery Logs and Retry Failed Deliveries
Every outbound webhook Revamp365 sends is recorded with its HTTP result, timing, and full payload. Use the Logs tab to confirm deliveries landed, diagnose failures, and re-send the ones that did not.
Open the delivery logs
- Go to Integrations & Apps > Webhooks.
- Open the Logs tab.
- Click Outbound deliveries in the direction switcher (the default All view mixes outbound sends with inbound lead events).
The All view shows direction, timestamp, source/destination, event, status, and contact. Switch to Outbound deliveries to filter and retry.
Filter and read each delivery
Two dropdowns narrow the outbound list: a status filter (All Statuses, Success, Failed, Pending Retry) and an event filter. The table columns are:
| Column |
What it shows |
| Date |
When the delivery was attempted |
| Contact |
Linked contact ID, or — if none |
| Event |
The event that triggered the send |
| Status |
success, failed, or pending_retry |
| HTTP |
Response status code returned by your endpoint |
| Time |
Round-trip response time in milliseconds |
Click any row to expand it. The detail panel shows the Error message, the first 1,000 characters of the Response Body, and the complete JSON Payload that was sent. A delivery counts as success only when your endpoint returns a 2xx code within the 15-second timeout; anything else is logged as failed with the HTTP code or exception in the error field.
Retry a failed delivery
Revamp365 does not auto-retry — each event is sent once, so a failed row stays failed until you act.
- Find the row with a red failed status.
- Click the refresh icon at the right end of that row (it appears only on failed rows).
- The status changes to pending_retry and a toast confirms "Webhook retry queued".
The retry re-sends the original payload to the same destination and writes a brand-new log entry for the new attempt, so watch for a fresh success or failed row at the top of the list. The original row stays as pending_retry for history.
Two retries are blocked on purpose:
- Successful deliveries cannot be retried.
- If the destination was deleted after the failure, retry is rejected — recreate the destination, then trigger a fresh event.
When a retry keeps failing
A repeat failure is almost always on the receiving side. Check the expanded Error and HTTP values:
- 401 / 403 — your endpoint is rejecting the signature. Confirm your handler validates the
X-Webhook-Signature header. See verify outbound webhook HMAC signatures.
- 404 / connection errors — the URL moved or the host is unreachable; update the destination on the Send Data tab.
- Timeout — your endpoint took longer than 15 seconds to respond; return a 2xx immediately and process asynchronously.
Delivery logs are kept for 90 days, then pruned automatically, so export or investigate failures before they age out.
Verify the HMAC Signature on Outbound Webhook Deliveries
Every outbound webhook Revamp365 sends is signed so your receiving endpoint can confirm the request is genuine and unaltered. Validate that signature before you act on the payload.
What Revamp365 sends
Each delivery is an HTTP POST with a JSON body and these headers:
| Header |
Value |
X-Webhook-Signature |
HMAC-SHA256 of the raw request body, hex-encoded |
Content-Type |
application/json |
The signature is computed as HMAC-SHA256(raw_json_body, your_signing_secret). The signing secret is the per-destination value generated when you create the destination.
Find your signing secret
- Open Integrations & Apps, then Webhooks, and stay on the Send Data tab.
- When you first create a destination, the secret is shown once in a green panel ("Save this secret because you will need it to verify webhook signatures"). Copy it then.
- To retrieve it later, click the eye icon on the destination card to reveal it, then use the copy button.
Store the secret as a server-side environment variable. Never expose it in client-side code.
Verify on your endpoint
- Read the raw request body as bytes — do not re-serialize the parsed JSON, or whitespace and key order will change the bytes and break the match.
- Compute
HMAC-SHA256 over that raw body using your signing secret, hex-encoded.
- Compare your result to the
X-Webhook-Signature header using a constant-time comparison.
- If they match, process the payload. If not, reject with
401 and stop.
Node.js example
const crypto = require('crypto');
function isValid(rawBody, headerSig, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody, 'utf8')
.digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(headerSig || '');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
PHP example
$expected = hash_hmac('sha256', $rawBody, $secret);
$valid = hash_equals($expected, $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '');
Key behaviors to plan for
- Use a constant-time compare (
crypto.timingSafeEqual, hash_equals) rather than ===, to avoid timing attacks.
- One delivery attempt. A failed delivery is not retried automatically. If your endpoint is down or rejects the request, re-send it manually from the Logs tab.
- 15-second timeout. Respond with a
2xx status quickly; do heavy work after you have replied.
- Rotating the secret changes the signature immediately. Deploy the new secret to your endpoint at the same time you rotate it. See rotate the outbound webhook signing secret.
If verification keeps failing, the usual cause is hashing the parsed-and-re-serialized JSON instead of the raw bytes. Log both your computed hex digest and the received header side by side to spot the difference.
Outbound webhooks: stream contact events to your own systems
What outbound webhooks do
An outbound webhook endpoint is a URL you control that Revamp365 will HTTPS POST a JSON event to whenever something interesting happens in your CRM. Use this to mirror contact changes into your data warehouse, trigger a Slack alert, fire a Zap, or update an external system.
Time to set up: ~5 minutes. Result: events streamed to your endpoint with HMAC-signed payloads, automatic retries, and full delivery logs.
Outbound webhooks are different from inbound lead webhooks (which receive leads into Revamp). See Send leads into Revamp365 for the inbound flow.
Events you can subscribe to
Each endpoint has its own event allowlist. The current set:
| Event |
Fires when |
contact_created |
A new Contact is added to the CRM (any source). |
lead_status_changed |
Lead status moves (e.g. NEW → QUALIFIED → WON). |
lead_temperature_changed |
Temperature changes (Cold / Cool / Warm / Hot). |
tag_added |
A tag is added to a Contact. |
tag_removed |
A tag is removed. |
note_added |
A timeline note is added to a Contact. |
ai_summary_updated |
The AI summary on a Contact is regenerated. |
One user action can fire multiple events. Adding a tag fires tag_added, then ~30 seconds later ai_summary_updated when the summary regenerates. Build your receiver to be idempotent.
Step 1 — Create an endpoint
- Open Integrations & Apps → Webhooks → Endpoints.
- Click Add endpoint.
- Enter your receiving URL. Must be
https:// and resolve to a public host (not a private IP).
- Optionally enter a label ("Slack alerts", "Snowflake mirror", etc.).
- Tick the events you want pushed. Select All sends everything.
- Click Save.
A signing secret is shown once on creation. Copy it before closing the dialog. You need it to verify the HMAC on every incoming POST.
Step 2 — What the POST looks like
Every event arrives as a JSON document with a stable shape:
POST /your-endpoint HTTP/1.1
Host: your.app
Content-Type: application/json
X-Webhook-Signature: sha256=<hex_hmac_of_request_body>
X-Webhook-Event: tag_added
X-Webhook-Delivery: 01HZX…<ulid>
{
"event": "tag_added",
"delivery_id": "01HZX…",
"occurred_at": "2026-04-27T18:14:22Z",
"contact": {
"id": 12345,
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "+15125550100",
"lead_status": "QUALIFIED",
"tags": ["seller", "motivated", "hot-lead"]
},
"change": {
"tag": "hot-lead"
}
}
Always trust contact.id for matching, not name/email.
Step 3 — Verify the HMAC signature
Before processing the body, verify the X-Webhook-Signature header. Reject any request whose signature doesn't match.
The signature is hmac_sha256(raw_body, signing_secret), hex-encoded, prefixed with sha256=.
Node.js (Express)
const crypto = require('crypto');
app.post('/revamp-webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = (req.get('X-Webhook-Signature') || '').replace(/^sha256=/, '');
const expected = crypto
.createHmac('sha256', process.env.REVAMP_WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (sig.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString('utf8'));
// … process …
res.sendStatus(202);
});
PHP (Laravel)
$raw = $request->getContent();
$sig = str_replace('sha256=', '', $request->header('X-Webhook-Signature', ''));
$expected = hash_hmac('sha256', $raw, config('services.revamp.webhook_secret'));
if (! hash_equals($expected, $sig)) {
abort(401);
}
$event = json_decode($raw, true);
Retries + status
Your endpoint should respond with a 2xx status as quickly as possible. Anything else (timeouts > 15s, 4xx, 5xx) is treated as a failure.
| Log status |
Meaning |
success |
Endpoint returned 2xx within 15s. |
pending_retry |
Failed once. Will retry with exponential backoff. |
failed |
All retries exhausted. Manual Retry button is available. |
Open Webhooks → Delivery Logs to inspect every POST: full request body, headers, response status, response time, and the retry count.
Limits + safety
| Limit |
Default |
| Endpoints per user |
10 |
| Receiver timeout |
15 seconds |
| Max payload size |
1 MB |
| Private / loopback URLs |
Blocked (SSRF guard) |
Endpoints to private IPs (10.x, 192.168.x, 169.254.x, etc.) are rejected on save. Use a public ingress or a tunnel service for local development.
Troubleshooting
| What you see |
Likely cause |
Fix |
| Endpoint won't save — "URL not allowed" |
SSRF guard rejecting private host. |
Use a public domain. Tunnels (ngrok, Cloudflare) work. |
All deliveries failed with no response body |
Receiver timing out (> 15s). |
Acknowledge fast (queue work + return 202 immediately). |
| Receiver gets 401 from your own check |
Reading parsed JSON instead of raw body for HMAC. |
HMAC over raw bytes — no JSON re-serialization. |
| Same contact triggers 3 events at once |
Working as designed — one user action ⇒ multiple events. |
De-dupe in your receiver using delivery_id. |
| Endpoint disappeared |
Deleted by an admin. Logs are kept. |
Recreate the endpoint; logs remain searchable. |
FAQ
Is the order of events guaranteed?
No. Process events idempotently. occurred_at tells you when the source change happened.
Can I rotate the signing secret?
Yes — edit the endpoint, click Rotate secret. Old secret stops working immediately, so update your verifier in the same window.
What's the difference between this and CRM Sync?
CRM Sync is a managed integration with Podio/Salesforce that does field mapping. Outbound webhooks are raw event streams to any URL — bring your own translation layer.
Do deletes fire an event?
Not currently. Add it to your wishlist with support if you need it.
Are deletes of an endpoint reversible?
Endpoints are hard-deleted, but Delivery Logs for past traffic are retained. Recreate the endpoint with the same URL to resume.
Connect and sync your Podio CRM
Overview
The Podio integration keeps a Podio app and your Revamp365 contacts in sync. Inbound, it pulls leads from your Podio app into Revamp as contacts whenever items are created or updated. Outbound (optional), it pushes changes you make to a contact in Revamp back to the matching Podio item, so the two stay aligned.
Available on the Dealmaker plan. The Podio CRM connection is currently in beta. Each connection syncs one Podio app — add more connections to sync more apps.
Before you start
You'll need three things:
- A Dealmaker Revamp365 plan.
- A Podio account with the app you want to sync (for example, a Leads or Sellers app).
- That app's App ID and an App Token.
To find them in Podio: open the app, open its menu and choose Modify app, then open the Developer page. The App ID is shown there, and you can generate an App Token on the same page.
You can revoke and regenerate the App Token in Podio at any time. If you ever rotate it, just update the connection's credentials in Revamp.
Connect your Podio app
Open Integrations & Apps in the left sidebar, open the Podio card, and on the Connections tab click Add Connection. The wizard walks through six steps:
- Name — give the connection a recognizable name (e.g. "Podio – Seller Leads").
- Credentials — paste your Podio App ID and App Token.
- Test connection — Revamp validates your credentials and loads the app's fields for mapping. If this fails, re-check the App ID and token.
- Webhook events — choose which Podio events trigger a sync: Item created, Item updated, Item deleted, and/or Comment created. A separate webhook is registered with Podio for each one you pick.
- Sync conditions — optionally filter which items flow in (see Filter which leads come in below). Leave empty to sync every item.
- Field mapping — map Podio fields to Revamp fields. At least phone or email is required.
Click Save Connection. Saving registers the webhooks with Podio and activates the connection. From then on, new and updated Podio items that match your settings flow into Revamp automatically.
Map your fields
Field mapping tells Revamp which Podio field feeds each Revamp field. For each Revamp field on the left, pick the Podio field from the dropdown on the right.
Map at least phone or email. Revamp uses these to match an incoming Podio item to an existing contact so you don't get duplicates. You can't save a mapping without one of them.
| Revamp field |
What it does |
| Phone / Email |
Contact details — and the match key used to de-duplicate. |
| First / Last / Full Name |
The contact's name. |
| Full Address |
The property address. Most Podio apps store it in one field; expand Use separate address fields if yours splits street/city/state/ZIP. |
| Lead Status / Lead Temperature |
Pipeline stage and priority. |
| Lead Tracking Campaign |
The campaign or source a lead came from. Stored as the contact's Lead Source. |
| Date Lead Came In |
The original lead date from Podio, instead of the date Revamp first saw it. |
| Communication Log |
A Podio text field whose contents are posted to the contact's timeline as a sync entry. |
| Tags |
Added to the contact's tags (existing tags are never removed). |
| Do Not Contact |
Compliance flag on the contact. |
Map any other field, including custom fields
Below the standard fields, the Additional field mappings section connects any Revamp field to any Podio field — including the custom CRM fields you've created in Revamp. Click Add field, pick the Revamp field on the left and the Podio field on the right, and repeat for as many as you need.
To map one of your custom fields, create it first in Revamp (on the Contacts page), then reopen the mapping — it appears in the Revamp-field picker as a choice.
What happens when a lead syncs
- Create or link, never duplicate. Revamp matches the Podio item to an existing contact by external id, then phone, then email. If nothing matches it creates a new contact; otherwise it links to the one you already have.
- Timeline entry. Each sync adds a CRM sync entry to the contact's timeline showing what changed. A mapped Communication Log posts its own timeline entry (the same log text won't post twice).
- Idempotent updates. Re-syncing the same item updates the same contact. Mapped fields are authoritative on update — but a blank Podio value never wipes existing contact data, and tags are only added.
- Sync logs. The Podio Sync Logs tab shows every inbound event, its status, and which contact it touched.
Push changes back to Podio (two-way)
Outbound sync is optional and off by default. When it's on, edits you make to a linked contact in Revamp are pushed to the matching Podio item.
- Open the connection's settings and go to Outbound triggers.
- Click Turn on outbound.
- Choose which Revamp changes should push: contact fields updated, contact created, lead status changed, lead temperature changed, tag added or removed, note added, or AI summary updated.
- Open Outbound mapping and map the Revamp fields you want to send to their Podio fields (custom fields included).
- Save.
Outbound only works on already-linked contacts. A contact must first be linked to a Podio item through a successful inbound sync before Revamp can push to it. A brand-new Revamp contact that has never synced from Podio won't push until it's linked.
Inbound and outbound won't ping-pong: a change that arrives from Podio is tagged so it doesn't immediately bounce back out. Use Pause outbound to stop all pushes temporarily without losing your settings.
Filter which leads come in
By default, every item from your subscribed events syncs. Use Sync conditions — in the wizard, or under Inbound filters in the connection settings — to sync only items that match rules you set, for example only items where a Status field equals "New Lead". Leave the conditions empty to sync everything.
Troubleshooting and things to watch for
- Save is blocked. Map at least a phone or email field — one of them is required.
- You can't change events later. The Podio events a connection listens to are chosen when it's created. To listen to a different set, create a new connection.
- One app per connection. Each connection syncs a single Podio app. Add another connection for another app.
- Outbound isn't pushing. Confirm outbound is on, the contact has synced from Podio at least once (so it's linked), and the connection isn't paused.
- New leads aren't appearing. Check the Podio Sync Logs tab. A "filtered" event didn't match your sync conditions; also confirm the right events are subscribed and the item has a mapped phone or email.
- A custom field isn't in the picker. Create the custom field in Revamp first, then reopen the mapping.
- "Podio API error: 400" when saving. Podio couldn't reach the webhook URL it needs to register. On the live app this is already configured — if you hit it, contact support.
FAQ
Does it sync items that already existed in Podio? Sync is event-driven — items flow in as they're created or updated in Podio after you connect. Editing an existing item in Podio will sync it.
Will it overwrite my Revamp data? Mapped fields update from Podio on each sync, but blank Podio values never erase existing contact data, and tags are only ever added.
Can I sync more than one Podio app? Yes — create one connection per app.
Is my data pushed back to Podio automatically? Only if you turn on outbound sync, and only for contacts linked to a Podio item.
Send Revamp365 contact events to Zapier, Make, or a custom webhook
Quick start
Revamp365 can send contact activity to any tool that accepts HTTPS webhooks. Create a Send Data destination, choose the contact events you want, copy the signing secret, and Revamp will POST each event to your URL.
- Go to Integrations & Apps - Webhooks - Send Data.
- Click Add destination.
- Enter the receiving URL from Zapier, Make, your CRM, or your own app.
- Select the events that should be sent.
- Save the destination and copy the signing secret shown after creation.
- Open Logs to confirm deliveries and retry failed attempts.
Events you can send
Each destination has its own event list. Select only what the receiving system needs.
| Event |
Fires when |
contact_created |
A new contact is created. |
lead_status_changed |
A contact's lead status changes. |
lead_temperature_changed |
A contact's lead temperature changes. |
tag_added |
A tag is added to a contact. |
tag_removed |
A tag is removed from a contact. |
note_added |
A note is added to the contact timeline. |
ai_summary_updated |
The contact AI summary is regenerated. |
One action can send more than one event. For example, adding a tag can send tag_added, then an ai_summary_updated event after the summary refreshes. Use the delivery id or your own idempotency key to avoid duplicate work in the receiving system.
Zapier setup
- Create a Zap and choose the app you want to trigger from Revamp data.
- Add Webhooks by Zapier - Catch Hook.
- Copy the Zapier hook URL.
- In Revamp, open Webhooks - Send Data and add that URL as a destination.
- Trigger a matching contact event in Revamp, then test the Zapier trigger to inspect the payload.
Make.com setup
- Create a scenario with the Webhooks - Custom webhook trigger.
- Copy the webhook URL Make gives you.
- Add that URL as a Send Data destination in Revamp.
- Run the scenario once, then trigger a matching event in Revamp so Make can learn the payload shape.
Custom app setup
Your endpoint should accept a JSON POST, verify the signature, enqueue any slow work, and return a 2xx response quickly.
POST /revamp-webhook HTTP/1.1
Content-Type: application/json
X-Webhook-Signature: sha256=<hex_hmac_of_request_body>
X-Webhook-Event: tag_added
{
"event": "tag_added",
"occurred_at": "2026-05-02T15:30:00Z",
"contact": {
"id": 12345,
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "+15125550100",
"lead_status": "QUALIFIED",
"tags": ["seller", "hot-lead"]
},
"changes": {
"tag": "hot-lead"
}
}
Verify signatures
Every destination gets a signing secret. Revamp signs the raw request body with HMAC-SHA256 and sends it in X-Webhook-Signature.
const crypto = require('crypto');
function isValidRevampSignature(rawBody, signatureHeader, secret) {
const received = String(signatureHeader || '').replace(/^sha256=/, '');
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return received.length === expected.length
&& crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));
}
Verify against the raw request body, not JSON that has been parsed and re-stringified. Re-stringifying changes whitespace and key order, which changes the signature.
Monitor deliveries
Open Webhooks - Logs - Outbound deliveries to inspect each delivery. Logs include event type, destination URL, response status, response body, response time, payload, and retry state.
| Status |
Meaning |
success |
The destination returned a 2xx response. |
pending_retry |
The delivery failed and has been queued for another attempt. |
failed |
Retries are exhausted or manual retry is available. |
Troubleshooting
- Destination will not save: make sure the URL starts with
https:// and points to a public host.
- Zapier or Make never sees a request: confirm the destination is active and subscribed to the event you triggered.
- Signature verification fails: verify the raw body before parsing JSON, and make sure you copied the latest secret.
- Deliveries time out: return a 2xx response quickly and process slow work asynchronously.
- Unexpected duplicate work: make your receiver idempotent because contact activity can produce multiple related events.
FAQ
Is this the same as Receive Data? No. Send Data pushes Revamp events out to your tools. Receive Data accepts lead payloads from tools like Zapier, Make, Carrot, and forms.
Can I have more than one destination? Yes. Use separate destinations for separate tools, teams, or event sets.
Can I retry a failed delivery? Yes. Open Logs, switch to Outbound deliveries, and click retry on a failed row.
Using the Property Data API
Overview
The Property Data API lets you pull our computed property valuations and enriched property records programmatically — from your own software, a spreadsheet tool, or a no-code platform. Every response is a transformed, value-added product (it always carries our computed ARV/AVM), so you can use the data in your downstream workflows.
There are two products, both billed per query:
- ARV / AVM Valuation — our computed after-repair value and automated valuation for an address.
- Enriched Property Record — that same valuation plus property details and owner name & mailing address.
Available on Pro+ and Dealmaker. API access is included with your paid plan — there's no separate application or approval. Usage is pay-as-you-go and draws from your prepaid credit balance.
Get your API key
- Go to Integrations & Apps in the left sidebar.
- Find the Property Data API card and click Open.
- Enter a label (e.g. "Production") and click Create key.
- Copy the key shown — it starts with
rvk_live_ and is shown once. Store it somewhere safe; you can't view it again. If you lose it, just create a new one and revoke the old.
You can create multiple keys (one per app/environment) and revoke any of them at any time from the same screen. Revoking a key immediately stops it from working.
Authentication
Send your key as a Bearer token on every request:
Authorization: Bearer rvk_live_xxxxxxxxxxxxxxxxxxxxxxxx
(An X-API-Key: rvk_live_... header also works if a Bearer token is inconvenient for your client.)
Base URL
All endpoints live under /api/v1/data on your Revamp365 account domain, for example:
https://app.revamp365.ai/api/v1/data
Quickstart
Check that your key works (this call is free and never charges you):
curl -H "Authorization: Bearer rvk_live_YOUR_KEY" \
"https://app.revamp365.ai/api/v1/data/ping"
A successful response shows your plan, rate limit, prepaid balance, and remaining daily spend headroom:
{
"success": true,
"plan": "dealmaker",
"rate_limit": 120,
"balance_cents": 4250,
"daily_spend_cap_cents": 5000,
"today_spend_cents": 75,
"today_remaining_cents": 4925
}
Endpoint: ARV / AVM Valuation
GET /api/v1/data/valuation
Identify the property by any one of: a full address, structured fields (street, city, state, zip), or a Revamp365 property_id. Optional hints — sqft, property_type, lat, lng, county — can improve accuracy.
curl -H "Authorization: Bearer rvk_live_YOUR_KEY" \
"https://app.revamp365.ai/api/v1/data/valuation?address=123+Main+St,+Austin,+TX+78701"
{
"success": true,
"data": {
"avm": 312000,
"arv": 358000,
"source": "mls",
"accuracy_score": 0.91,
"comp_count": 8,
"valued": true,
"valued_at": "2026-06-07T18:20:00+00:00"
},
"meta": {
"request_id": "…",
"billable_units": 1,
"unit_type": "per_query",
"valued": true,
"cost": 0.05,
"cached": false
}
}
Endpoint: Enriched Property Record
GET /api/v1/data/property
Same inputs as the valuation endpoint. Returns the computed valuation block plus property details and owner information.
curl -H "Authorization: Bearer rvk_live_YOUR_KEY" \
"https://app.revamp365.ai/api/v1/data/property?address=123+Main+St,+Austin,+TX+78701"
{
"success": true,
"data": {
"valuation": { "avm": 312000, "arv": 358000, "comp_count": 8, "valued": true },
"address": "123 Main St",
"city": "Austin", "state": "TX", "zip": "78701",
"beds": 3, "baths": 2, "sqft": 1800, "year_built": 1995,
"lot_sqft": 6000, "assessed_value": 240000,
"last_sale_price": 250000, "last_sale_date": "2023-01-01",
"lat": 30.26, "lng": -97.74,
"owner_name": "Jane Doe",
"mailing_address": "PO Box 1 Austin TX 78701"
},
"meta": { "request_id": "…", "billable_units": 1, "unit_type": "per_query", "valued": true, "cost": 0.10, "cached": false }
}
Pricing & billing
You're billed per query at your plan's rate. Charges draw from your prepaid credit balance (the same balance skip tracing and AI usage use).
| Product |
Endpoint |
Pro+ |
Dealmaker |
| ARV / AVM Valuation |
/valuation |
$0.10 / query |
$0.05 / query |
| Enriched Property Record |
/property |
$0.15 / query |
$0.10 / query |
- You only pay for results. If we can't produce a valuation (no comparable sales), the call returns
"valued": false with "billable_units": 0 and you're not charged. /property still returns the property + owner details in that case, free.
- No charge for misses. If no property is found (404) or the data provider is unavailable (502), you're not charged.
- Cached results still bill. A repeated lookup may be served from cache (
"cached": true) and is billed normally — you still receive a deliverable result.
- Each response's
meta.cost (US dollars) and meta.billable_units tell you exactly what that call cost.
Keep a funded balance. If your prepaid balance can't cover a call, the API returns 402 before doing any work. Top up (or enable auto top-up) on your billing page to keep requests flowing. A per-account daily spend cap also protects you from runaway usage — once reached, calls return 429 until the next day.
Safe retries (idempotency)
If a request times out or your network blips, retrying could otherwise charge you twice. To make retries safe, send an Idempotency-Key header with a unique value per logical request:
curl -H "Authorization: Bearer rvk_live_YOUR_KEY" \
-H "Idempotency-Key: my-request-9f2c1a" \
"https://app.revamp365.ai/api/v1/data/valuation?address=123+Main+St"
Any retry sent with the same Idempotency-Key is billed at most once — the repeat returns the result with "billable_units": 0. Use a fresh key for each new lookup.
Rate limits
Each key is limited to 120 requests per minute. If you exceed it you'll get a 429 with a Retry-After header (and X-RateLimit-* headers) — back off and retry after the indicated delay.
Errors
| Status |
Meaning |
What to do |
| 401 |
Missing, invalid, revoked, or expired key. |
Check the Authorization header / create a new key. |
| 402 |
Insufficient prepaid balance. Body includes balance_cents and required_cents. |
Top up credits (or enable auto top-up), then retry. |
| 403 |
Plan no longer Pro+/Dealmaker, access revoked, or billing past due. |
Resubscribe / resolve billing, or contact support. |
| 404 |
No property matched your input. Not charged. |
Refine the address or supply a property_id. |
| 429 |
Rate limit exceeded, or your daily spend cap was reached. |
Honor Retry-After, or wait until the cap resets. |
| 502 |
Upstream data provider was temporarily unavailable. Not charged. |
Retry shortly (an Idempotency-Key makes this safe). |
Error bodies are JSON. Most look like { "success": false, "message": "…" }; the 402 body uses the credits shape (error, balance_cents, required_cents).
Code samples
Node (axios)
import axios from 'axios';
const api = axios.create({
baseURL: 'https://app.revamp365.ai/api/v1/data',
headers: { Authorization: `Bearer ${process.env.REVAMP_API_KEY}` },
});
const { data } = await api.get('/valuation', { params: { address: '123 Main St, Austin, TX 78701' } });
console.log(data.data.avm, data.data.arv, data.meta.cost);
PHP
$response = Http::withToken($apiKey)
->get('https://app.revamp365.ai/api/v1/data/property', [
'address' => '123 Main St, Austin, TX 78701',
]);
$record = $response->json('data');
Data freshness
MLS-sourced figures are typically same-day; public-record attributes refresh on a 24–48 hour cycle; ownership is pulled fresh. Valuations are model estimates, not appraisals.
Need help?
Use /api/v1/data/ping to confirm your key and balance, and check API Logs (from the API Access screen) to see every request with its status, units, cost, and latency. Each response also includes a meta.request_id — include it when contacting support.
CRM sync: two-way Podio integration and Salesforce read-only
What CRM sync does (BETA)
CRM Sync connects Revamp365 to an external CRM and keeps records in lock-step. Today the supported providers are:
- Podio — full two-way sync (inbound webhooks from Podio + outbound pushes from Revamp).
- Salesforce — read-only view of existing connections. New Salesforce connections from Revamp are not yet enabled.
Time to connect Podio: ~15 minutes for a single app. Result: Contact changes in Revamp flow into Podio (and vice versa) with field-level mapping and conditional filters.
Where to find it
- Sidebar → Integrations & Apps → Apps → Podio (or Salesforce). Direct URL:
/integrations/app/podio.
- The hub has two tabs:
- Connections — add / edit / delete CRM connections.
- Sync Logs — every inbound + outbound sync event.
The old /integrations/webhooks?tab=crm-connections URL still works but redirects here.
Connect a Podio app (six-step wizard)
- Credentials — paste your Podio
app_id and app_token. (Podio Developer → API Keys → API key for your app.)
- Direction — pick whether this connection is inbound, outbound, or both. Most customers pick both.
- Event types (inbound) — which Podio events should push into Revamp:
item.create — new Podio item creates a Revamp Contact.
item.update — Podio item edit updates the matching Contact.
item.delete — Podio item delete soft-deletes the Contact.
comment.create — Podio comment becomes a Revamp timeline note.
- Conditions — optional filter expressions (e.g. only items where Status = Hot Lead).
- Field mapping — pair every Podio field with a Revamp Contact field. Unmapped Podio fields are ignored. Unmapped Revamp fields stay blank.
- Outbound events — pick which Revamp events push back to Podio:
contact_created
contact.updated
lead_status_changed
lead_temperature_changed
tag_added / tag_removed
note_added
ai_summary_updated
Click Test on the connection card after saving — Revamp will fetch the Podio app schema and confirm the connection is healthy.
Field mapping in detail
Each Revamp Contact field can be mapped to a Podio field by name. The mapping is stored as JSON on the connection (mapping_json for inbound, outbound_mapping_json for outbound). Examples:
| Revamp field |
Podio field |
Notes |
email |
"Email" (Podio email field type) |
Lowercased on inbound. |
phone |
"Phone" (Podio phone field type) |
Normalized to E.164 on inbound. |
first_name / last_name |
Two text fields, or split a "Full Name" |
Configurable in mapping. |
lead_status |
Single-select Category |
Option values must match Revamp's lead-status set. |
tags |
Multi-select Category |
Unioned on update. |
custom_fields.* |
Any Podio field |
Stored on the Revamp Contact's custom-field bag. |
Sync conditions (filters)
Conditions apply before the sync — events that don't match are dropped (logged as filtered). Examples:
- Only items where Podio "Status" is "Active Lead".
- Only items created in the last 30 days.
- Only Revamp Contacts with
contact_type containing "seller".
Use conditions to keep the sync narrow during rollout, then loosen them once you trust the mapping.
Sync Logs
Open Podio Sync Logs (or Salesforce Sync Logs). Each row is one sync event with direction (inbound / outbound) and one of:
| Inbound status |
Meaning |
received |
Webhook arrived from Podio, queued. |
queued |
Awaiting processing. |
processed |
Contact created or updated. |
filtered |
Conditions excluded the event. |
failed |
Mapping or processing error. |
| Outbound status |
Meaning |
pending |
Queued for push to Podio. |
success |
Podio accepted the change. |
skipped |
No mapping change to push. |
failed |
Podio rejected — see error column. |
dead |
Repeated failures, retries exhausted. |
Click any row to see the raw payload (both directions) and the resolved field-by-field changes.
Outbound rate limiting + pause
Outbound pushes can be throttled per connection (default: 60 / minute) to stay inside Podio's API limits. You can also pause outbound to a connection temporarily — for example during a bulk import — and unpause it once you're done.
- Trigger sync — manually send all queued outbound items now.
- Test — read a sample item from Podio to verify credentials.
- Delete — remove the connection. Sync logs are kept.
Salesforce (read-only)
The Salesforce hub looks the same as Podio's, but creating a new connection from inside Revamp is not yet enabled. If your account already has a Salesforce connection (provisioned by support), you can:
- View existing connections in the Connections tab.
- Inspect Salesforce Sync Logs for everything that's flowed through.
Reach out in support if you'd like a Salesforce connection set up.
Troubleshooting
| What you see |
Likely cause |
Fix |
| "Test" fails immediately |
Bad app_id / app_token. |
Re-copy from Podio Developer. Token is per-app, not per-account. |
| Inbound items not appearing |
Webhook subscription in Podio expired. |
Edit connection → save again to re-subscribe. |
All inbound events are filtered |
Conditions too strict. |
Open the connection → loosen or remove conditions. |
Outbound stuck on pending |
Connection paused or rate-limited. |
Connection card → unpause / raise rate limit. |
| Field maps to wrong column |
Field renamed in Podio after mapping. |
Re-open the wizard's Field Mapping step → re-map → save. |
| Same Contact created twice |
Mapping doesn't include email or phone for dedup. |
Map at least email or phone as the dedup key. |
FAQ
Will outbound sync overwrite a value I set in Podio by hand?
By default, yes — outbound pushes are authoritative for the mapped fields. If you want one-way protection, exclude the field from the outbound mapping.
How does Revamp dedup against Podio items?
Connection stores the Podio item id alongside the Revamp Contact id. Subsequent updates target the same item.
Can I sync deals + tasks too?
Today only Contacts are synced. Deals + tasks are on the roadmap.
What about HubSpot, Pipedrive, or GoHighLevel?
Not yet. For unsupported CRMs, use outbound webhooks + your own translation layer.
Why is the whole CRM hub labeled Beta?
Mapping ergonomics + conflict-resolution rules are still maturing. Sync is real and reliable; we just want flexibility to evolve the UI without surprising you.