Description
The String CRM connects WordPress and WooCommerce with the String CRM platform while also providing a native WordPress form builder.
Core capabilities:
- Build forms directly in WordPress and store submissions locally.
- Style form submit buttons with backward-compatible solid colors or sanitized two-color gradients, including safe theme custom-property fallbacks.
- Resolve signed context from any published public WordPress detail post, including validated
?type=cash|drive&id=POST_IDlinks from a separate page, and attach a validated String Product relation or the WordPress title to the resulting Submission without adding an automatic visible context field. - Prefill hidden or visible fields from the page title, a sanitized URL parameter, a configured WordPress custom field/meta key, or the previous page URL, with an optional read-only frontend display. Referrer values are intended for attribution and may be empty when browsers suppress them.
- Generate a same-site dynamic CTA URL for the current published public post with
[string_request_url type="cash" url="/request/"]; no post ID, title, or price is hardcoded. - Optionally send successful form submissions to String as CRM submissions.
- Map WordPress content such as products, doctors, cars, courses, or other post types to String Products or Services.
- Map WooCommerce order statuses to String Lead Journey stages and statuses.
- Synchronize WooCommerce customers to String contacts/leads.
- Synchronize each WooCommerce order as a separate String Submission while reusing the same String client when email/phone matches.
- Set the String source of new WooCommerce cart/order Submissions to
WordPressautomatically and expose WooCommerce order/cart sync state inside The String CRM > Customers. - View WooCommerce Customers in a unified CRM-style profile with Overview, Submissions, Orders, Carts, and Appointments tabs, stitched anonymous-to-known timeline, String status, lifetime deal size, product affinity, and bought-together insights.
- Create a String Submission immediately for an identifiable WooCommerce cart: logged-in customers are known from their account, while guests are linked once email or phone is captured. Add/remove/quantity changes update the same Submission and are appended as String notes; clearing all items closes that cart journey, and a later add starts a new cart Submission even in the same WooCommerce session.
- Keep the cart Active before checkout, use the normal WooCommerce mapping for Pending payment / Failed payment after checkout starts, and move an unpaid pending checkout to Abandoned cart after the inactivity timeout.
- Attach mapped product/category context and order details such as total, currency, payment method, billing/shipping summary, notes, coupons, and line items.
- Track WooCommerce storefront product behaviour (search, list view/filter/sort, product view/click/share/review, add/remove from cart) in a local Product Events log. Browser ID, Activity Session, Cart Journey, and customer identity are tracked separately so a known shopper can be recognized across visits while carts remain independent.
- Queue identified storefront events for the String universal commerce-event API. String Automations own WhatsApp reminders, waits, eligibility checks, and frequency caps; the WordPress plugin sends no reminder itself.
- Automatic create/update synchronization with rate-limit-aware retry and backfill handling.
- Optional one-way WooCommerce coupon synchronization with store-bound identity, resumable reconciliation, and lifecycle retries.
- Arabic/RTL and English/LTR WordPress admin support.
A String account is optional for local form collection. String External Partner API credentials are required only when remote synchronization features are enabled by an administrator.
External service: String
This plugin can connect to the String service at https://production.thestring.net after an authorized WordPress administrator configures String External Partner API credentials or enables a synchronization feature that requires them.
Depending on the features enabled, the plugin may send:
- WooCommerce storefront behaviour events, product context, page URL/referrer, UTM campaign data, available advertising click/cookie identifiers, a pseudonymous first-party Browser ID and Activity Session ID, and customer name/email/phone when the shopper is identified, so String can store commerce activity and run configured automations. Browser cookies do not contain email or phone. Anonymous guest product events remain local until identity is known. The plugin does not inject Meta, TikTok, Snap, or other advertising pixels.
- String External Partner client credentials to obtain an API access token.
- WordPress form definitions and selected routing/catalog identifiers.
- Form submissions and the fields configured by the administrator, including selected Branch/Product values, signed current page/product/doctor/car title context, source/tracking data, and uploaded attachments when enabled.
- Selected WordPress or WooCommerce content mapped to String Product/Service fields, including names, descriptions, pricing, SKU/stock, URLs, categories, currencies, relationship IDs, and stable integration identifiers.
- WooCommerce workflow/status mappings used by String Lead Journey synchronization.
- WooCommerce customer identity and billing contact details.
- WooCommerce order details including order status, total, currency, payment method, billing/shipping summary, customer note, coupon codes, and line-item names.
- When Coupon Sync is enabled, WooCommerce coupon definitions including discount semantics, spend/usage limits, product/category restrictions, expiry, free-shipping eligibility, and privacy-preserving hashes for restricted email entries. Raw restricted customer emails are not transmitted.
- When the WooCommerce cart journey is enabled, checkout identity (email/phone), cart total, currency, line-item names, and cart/checkout URLs. The Submission is created as soon as identity is available. Commerce labels are derived independently from canonical WooCommerce events; only WooCommerce order states use the existing Lead Journey mapping. Follow-up messages remain configured separately in String Automations.
The plugin also retrieves String account/catalog data needed for configured integrations, such as forms, branches, products, services, sources, categories, currencies, stages, and statuses.
Service website: https://thestring.net/
Privacy policy: https://thestring.net/privacy-policy/
No String API connection is made until an authorized administrator configures the connection or enables a synchronization feature that requires it. If the administrator changes the API URL in Connection settings, requests are sent to that configured HTTPS endpoint instead.
Privacy
The String CRM stores form submissions in the WordPress database. Stored information can include submitted values, source URL, an irreversible hash derived from the visitor IP address, assignment information, synchronization status/error details, and timestamps. Accepted file uploads are stored in the WordPress uploads directory.
When String synchronization is enabled, configured submission and integration data may also be transmitted to String as described above. The plugin adds suggested text to WordPress’s Privacy Policy Guide so site owners can document this processing.
Deactivation, replacement updates, and uninstall are intentionally non-destructive: String connection credentials, Content Sync mappings, queue/backfill state, site UUID, cart/order linkage metadata, forms, and entries are preserved so an update or reinstall cannot disconnect the site or silently remove business records.
Installation
- Install and activate The String CRM.
- Open The String CRM in WordPress admin to create a form.
- Add a form to a page using its generated
[string_form id="123"]shortcode. - Optional: open The String CRM -> Connection and enter your String External Partner API URL, Client ID, and Client Secret.
- Optional: enable form synchronization, configure Content Sync, or enable Coupons Sync for WooCommerce coupon definitions.
FAQ
-
Do I need a String account?
-
No for local WordPress form collection. A String account and External Partner API credentials are required only for features that synchronize data with String.
-
Does the plugin send visitor data to String automatically after activation?
-
No. Remote synchronization requires an administrator to configure the String connection and enable the relevant feature.
-
Can I build forms directly in WordPress?
-
Yes. The plugin includes a form builder, stores submissions locally, and can optionally send successful submissions to String.
-
Can I sync WordPress content such as doctors, cars, courses, or products?
-
Yes. Content Sync can map selected WordPress post types and fields to String Products or Services, depending on the mapping configured by the administrator.
-
Does Content Sync support WooCommerce?
-
Yes. WooCommerce Products can be mapped to String Products. Customers and orders can also be synchronized when their mappings are enabled.
-
How are WooCommerce orders synchronized?
-
Each order resolves its customer using billing email and normalized phone. Existing String clients are reused when matched; otherwise a Contact can be created first. Each WooCommerce order is stored as its own String Submission, so repeat customers can have multiple separate submissions under the same String client.
-
Can WooCommerce order statuses be mapped to String?
-
Yes. WooCommerce order statuses can be mapped to String Lead Journey stages/statuses. Orders then use the relevant mapped String status automatically.
-
Do I need to press Sync Now after every order?
-
No. Normal operation is automatic. Manual synchronization is intended for initial backfill, repair, or full re-sync.
-
How are large catalogs handled?
-
The plugin reads the String Business Partner request limit and processes large synchronization jobs in safe batches. HTTP 429 responses are treated as temporary pauses and are retried rather than permanently failing the item.
-
What happens to data when I uninstall the plugin?
-
Uninstall is intentionally non-destructive in the current plugin: connection credentials, Content Sync settings, queue state, forms, and business records are preserved until an explicit confirmed data-removal flow is provided.
Reviews
There are no reviews for this plugin.
ডেভেলপার এবং কন্ট্রিবিউটর
“The String CRM” is open source software. The following people have contributed to this plugin.
কন্ট্রিবিউটরTranslate “The String CRM” into your language.
ডেভেলপমেন্ট এ আগ্রহী?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.20.23
- Display independent WooCommerce commerce labels for active, cleared, abandoned, and ordered journeys.
- Stop cart lifecycle changes from overwriting the linked Submission CRM pipeline status; WooCommerce order-status mapping remains unchanged.
1.20.22
- Let the first due WooCommerce event batch run immediately instead of holding it behind an empty-queue synchronization lock.
- Preserve asynchronous batch delivery; storefront requests still do not wait for String when no event is ready.
1.20.21
- Record each synchronized WooCommerce cart action as its own String Submission note so it appears as a separate Activity Log entry.
- Mark individual cart actions synchronized only after String accepts their corresponding note, so acknowledged activities are not resent on normal retries.
1.20.20
- Populate the String Source selector when changing an existing mapping to WooCommerce Orders / Submissions, including immediately after a successful source refresh.
1.20.19
- Store and advance WooCommerce cart journeys locally when commerce event tracking is enabled, without requiring a String cart-to-Submission mapping.
- Keep remote String Submission creation and status synchronization optional and mapping-dependent.
1.20.18
- Commerce event tracking is now explicitly opt-in and consent-aware.
- API credentials can be managed outside WordPress with
STRINGFORM_API_URL,STRINGFORM_CLIENT_ID, andSTRINGFORM_CLIENT_SECRET. - Page/referrer query strings are removed, public AJAX actions are rate-limited, raw event PII is administrator-only, and failed delivery retries are bounded.
1.20.17
- Queue authoritative WooCommerce cart abandonment, payment failure, purchase, order status, cancellation, and refund events.
- Keep retries idempotent with deterministic SHA-256 message IDs and link server events to the existing String client and Submission.
- Carry the checkout browser ID onto authoritative order events so first-touch and last-touch attribution stay connected without adding browser ad pixels.
1.20.16
- Add cart viewed, cart updated, checkout started, and payment info entered storefront events.
- Send cart contents, value, currency, stable cart journey ID, and the existing String Submission ID when available.
- Deduplicate repeated server hooks inside the same request while preserving each queued event’s stable retry message ID.
1.20.15
- Send WooCommerce commerce batches with the canonical
woocommerceprovider and customer key. - Capture page URL, path, referrer, canonical UTM campaign fields, user agent, and available Meta/TikTok/Snap/Google/Microsoft click identifiers on storefront events.
- Reuse existing merchant ad cookies when present without injecting a second browser pixel.
1.20.14
- Restored the visible Events tab in The String CRM admin navigation.
- Added a dedicated Events page that reuses the existing WooCommerce storefront event log and filters.
- Restored Product Events access without bringing back the old top-level Entries model.
1.20.13
- Added an explicit Refresh String sources action to WooCommerce Orders / Submissions mapping.
- Empty/stale Source catalog cache is retried directly against String before showing an empty selector.
- Source API errors now show the actual response and explicitly identify the required sources.read scope for 403 responses.
- Preserves a previously saved source ID if the remote catalog is temporarily unavailable.
1.20.11
- Fix logged-in shoppers not creating an Active cart Submission until checkout on themes/custom AJAX flows.
- Reconcile the current cart immediately after classic WooCommerce and Woo Blocks add/remove events, while retaining the normal PHP hooks as the primary path.
- Add a late frontend fallback for non-empty logged-in carts; unchanged snapshots reuse the same cart journey and never create a duplicate Submission.
1.20.10
- Added a manual Fresh Sync action on Customers to reconcile local WooCommerce/customer records with String CRM.
- Resolves missing String Client IDs from existing String Submission IDs first, then falls back to phone-first client lookup and email lookup.
- Persists recovered client links back to carts, orders, browser identities and product events without creating duplicate customers or submissions.
- Shows the last Fresh Sync result and leaves unresolved customers explicitly marked as Not linked.
1.20.8
- Fix Customers admin styling after the Entries-to-Customers menu restructure by loading plugin assets using both the WordPress hook and explicit plugin page slug.
- Keep the legacy Entries route hidden and styled for backward-compatible bookmarks.
1.20.6
- Replaced the separate Entries area with Customers as the primary CRM record screen.
- Customer list now combines identities from form submissions, WooCommerce carts/orders, browser identities, and product activity.
- Form entries are treated as Submissions inside the matching customer profile instead of living in a separate global Entries screen.
- Customer table now shows Submissions, Orders, Carts, Product activity, String client, contact information, and last activity.
- Existing customer profiles keep Overview, Submissions, Orders, Carts, and Appointments; the Submissions tab now includes both form submissions and commerce submissions.
- Legacy Entries URLs remain compatible but render the new Customers screen, preserving old bookmarks without exposing a second record model.
1.20.1
- Phone-first WooCommerce identity resolution: if checkout phone and email belong to different String clients, the cart/order Submission belongs to the phone client instead of failing.
- Sends primary/secondary phone and email roles with WooCommerce cart and order Submission Additional Data; it does not auto-merge client contact records.
- Keeps one progressive checkout Submission; if email identifies Client A first and a later phone identifies Client B, the same Submission moves to Client B.
- Does not merge the two String clients automatically.
1.20.0
- Smart phone fallback: a high-confidence Egyptian local mobile number such as 010/011/012/015 is normalized with +20 even when the checkout/address country is different; customer country is never overwritten by phone country.
- Identity resilience: a valid email can create/sync the String client even when the supplied phone fails String phone/country formatting validation. Phone uniqueness conflicts are never bypassed.
- Keeps explicit international (+ / 00 / calling-code) normalization global and unchanged.
1.19.9
- Separate customer identity from activity/session/cart lifecycle: long-lived Browser ID (180 days, refreshed by activity), 2-hour inactivity Activity Sessions, and independent Cart Journeys.
- Persist a known browser-to-customer association server-side for up to 180 days from the shopper’s latest commerce activity; the first-party browser cookie contains only a pseudonymous ID, not email/phone.
- When a guest supplies email/phone, stitch anonymous Product Events from the same Browser ID for the previous 24 hours, even when they belong to multiple Activity Sessions.
- Cross-device identity: a laptop and phone keep separate Browser IDs, but the same normalized phone/email resolves to the same String Client ID. Each device then remembers that identity independently.
- A remembered browser identity also feeds the cart tracker after the Woo guest session expires, so a returning known shopper can create a new Active cart Submission without re-entering the same phone/email.
- If a browser later presents a different explicit phone/email, stop carrying the previous browser identity into the new observation; already-identified historical events are never reassigned.
- Product Events admin now shows Browser ID, Activity Session, and resolved String Client ID separately.
1.18.8
- Keep Cleared cart inside the same WooCommerce session and the same String Submission; clearing the cart no longer rotates the cart journey key.
- Adding a product again after Cleared cart reactivates the existing Submission as Active cart and restarts the inactivity timer.
- Record an explicit Cart reactivated activity note in String while retaining the exact product-added activity.
- Preserve one cart journey across add/remove/quantity/clear/reactivate activity until checkout is recovered or the WooCommerce session genuinely changes.
1.18.5
- WooCommerce cart/order Submissions now resolve the String
WordPresssource automatically and send that source on creation. - Added a WooCommerce section inside The String CRM > Customers with Orders and Carts tabs.
- Orders show customer identity, cart state, WooCommerce payment/order status, total, String Submission ID, sync state, last sync/error, and WordPress source.
- Carts show captured identity, active/abandoned/failed/recovered state, linked Woo order/payment status, total, String Submission ID, and sync result.
- Commerce Entries read WooCommerce orders and the plugin cart table directly, so they do not create a second copy of the order data.
1.18.4
- Cart lifecycle now distinguishes checkout Pending payment from pre-checkout Active cart.
- Creating a WooCommerce order keeps the same Submission and uses the existing Pending payment Lead Journey mapping while the abandonment timer continues.
- If the pending checkout remains unpaid past the configured timeout, the same Submission moves to Abandoned cart and cannot be reset by background Pending-payment re-sync.
- An explicit WooCommerce Failed status now becomes a terminal failed cart state and uses the existing WooCommerce Failed -> String status mapping (for example Failed payment) instead of later being overwritten as Abandoned cart.
- A real retry from Failed/Cancelled/Abandoned back to Pending restarts the inactivity timer on the same Submission.
- No WhatsApp/recovery automation was added to the plugin; all follow-up remains in String Automations.
1.18.3
- Fixed cart -> order duplicate Submissions by attaching the existing cart Submission to the WooCommerce order before the order is first saved/live-synced.
- Added an early woocommerce_new_order adoption hook as a second guard so Pending payment continues on the same Active/Abandoned cart journey.
1.18.2
- Fix Pending payment cart lifecycle: creating a Woo order no longer marks the cart recovered before payment/checkout completion.
- Active cart now moves to Abandoned cart after the configured timeout even when WooCommerce has already created a Pending payment order.
- Preserve Abandoned cart on later Pending payment order syncs instead of resetting it from the Woo status mapping.
- Add a request-driven fallback scan in addition to WP-Cron so 5/10-minute transitions are more reliable on hosts with delayed cron.
- Clarify that Active cart and Abandoned cart are String CRM statuses, not WooCommerce order statuses.
1.17.16
- Harden WordPress database queries for Plugin Directory security checks by using prepared identifier placeholders and static query shapes.
- Fix translation calls so translatable strings use literal text as required by WordPress internationalization standards.
1.17.15
- Improve HPOS/admin live-order automatic synchronization when an early incomplete save occurs before final billing identity or line items are available.
- Include billing identity and line-item details in live-order change detection.
- Retry later hooks in the same request after a failed foreground sync instead of incorrectly treating the failed attempt as complete.
- Improve support for phone-only guest orders using unambiguous international numbers without a leading plus sign.
- Keep persistent queues/backfill as retry and repair paths while successful live saves remain deduplicated.
For older release history, see changelog.txt included with the plugin.
